w3m-img merge (w3m-0.2.4+cvs-1.278-img-2.2.patch.gz)

* NEWS: w3m-img merge
* .cvsignore: add w3mimgdisplay, w3mimgsize
* XMakefile: add image.c to SRCS
	     add image.o to OBJS
             add IMGDISPLAY, IMGSIZE
* config.h.dist: USE_IMAGE, IMGSIZE, IMGDISPLAY
* configure: add find_imlib
		ask use_image
	(config.h) add $imgtarget to EXT_TARGETS
		   $def_use_image
		   IMGSIZE, IMGDISPLAY
* fm.h (MAX_IMAGE): added
* fm.h (DEFAULT_PIXEL_PER_CHAR): fix for USE_IMAGE
* fm.h (DEFAULT_PIXEL_PER_LINE): added
* fm.h (B_REDRAW_IMAGE): added
* fm.h (IMG_FLAG_SKIP): added
* fm.h (IMG_FLAG_AUTO): added
* fm.h (IMG_FLAG_START): added
* fm.h (IMG_FLAG_STOP): added
* fm.h (IMG_FLAG_NEXT): added
* fm.h (IMG_FLAG_UNLOADED): added
* fm.h (IMG_FLAG_LOADED): added
* fm.h (IMG_FLAG_ERROR): added
* fm.h (MapArea): added
* fm.h (MapList): s/urls/alts/, add area
* fm.h (ImageCache): added
* fm.h (Image): added
* fm.h (Anchor): add image
* fm.h (Buffer): add imarklist, image_flag, need_reshape
* fm.h (RG_FRAME_SRC): added
* fm.h (ALIGN_MIDDLE): added
* fm.h (ALIGN_TOP): added
* fm.h (ALIGN_BOTTOM): added
* fm.h (QuietMessage): added
* fm.h (Imgdisplay): added
* fm.h (Imgsize): added
* fm.h (activeImage): added
* fm.h (displayImage): added
* fm.h (autoImage): added
* fm.h (useExtImageViewer): added
* fm.h (image_source): added
* fm.h (view_unseenobject): change default if USE_IMAGE
* fm.h (set_pixel_per_char): added
* fm.h (pixel_per_line): added
* fm.h (set_pixel_per_line): added
* fm.h (image_scale): added
* proto.h (dispI): added
* proto.h (stopI): added
* proto.h (deleteImage): added
* proto.h (getAllImage): added
* proto.h (loadImage): added
* proto.h (getImage): added
* proto.h (getImageSize): added
* proto.h (process_img): add width arg
* proto.h (loadImageBuffer): added
* proto.h (follow_map_menu): add a_img arg
* proto.h (getMapXY): added
* proto.h (newMapArea): added
* proto.h (touch_cursor): added
* proto.h (cURLcode): added
* proto.h (initImage): added
* proto.h (termImage): added
* proto.h (addImage): added
* proto.h (drawImage): added
* proto.h (clearImage): added
* anchor.c (addMultirowsImg): added
* buffer.c (discardBuffer): deleteImage if USE_IMAGE
* buffer.c (reshapeBuffer): buf->need_reshape check
* display.c (fmTerm): if activeImage, stop load image
* display.c (fmInit): if displayImage, initImage
* display.c (image_touch): added
* display.c (draw_image_flag): added
* display.c (redrawLineImage): added
* display.c (displayBuffer): buf->need_reshape = TRUE
			mode == B_REDRAW_IMAGE
			image flag checks
			force redraw image in mode == B_REDRAW_IMAGE
			displayBuffer if need reshape
			drawImage
* display.c (redrawNLine): redrawLineImage
* display.c (redrawLineImage): added
* display.c (disp_message_nsec): return immediately if QuietMessage
* etc.c (reset_signals): ignore SIGUSR1
* file.c (frame_source): added
* file.c (_MoveFile): added
* file.c (cur_baseURL): added
* file.c (cur_document_code): added
* file.c (cur_iseq): added
* file.c (loadGeneralFile): fix fmInitialized and prevtrap checks
			save cur_baseURL
			image_source load
			loadImageBuffer for "image/*"
			frame_source flag
			fix b->type when proc is loadImageBuffer
* file.c (process_img): add width arg
		parse height and width attr, align
		fix for inline-image
* file.c (process_input): fix for form <input type="image">
* file.c (HTMLtagproc1): pass h_env->limit to process_img()
		fix <img_alt> for inline-image
		save cur_baseURL
* file.c (HTMLlineproc2body): fix <img_alt> for inline-image
* file.c (loadHTMLstream): fix for inline-image
		fix fmInitialized and prevtrap checks
		save cur_document_code
		save image_flag
* file.c (loadGopherDir): save cur_document_code
		fix fmInitialized and prevtrap checks
* file.c (loadImageBuffer): added for inline-image
* file.c (save2tmp): fix fmInitialized and prevtrap checks
* frame.c (frame_download_source): set RG_FRAME_SRC flag
		image check
* funcname.tab (DISPLAY_IMAGE): added
* funcname.tab (STOP_IMAGE): added
* html.c (ALST_IMG): add align, ismap
* html.c (ALST_AREA): add shape, coords
* html.c (ALST_IMG_ALT): add width, height, usemap, ismap, hseq,
			xoffset, yoffset, top_margin, bottom_margin
* html.c (AttrMap): add shape, coords, ismap, xoffset, yoffset
* html.h (ATTR_SHAPE): added
* html.h (ATTR_COORDS): added
* html.h (ATTR_ISMAP): added
* html.h (ATTR_XOFFSET): added
* html.h (ATTR_YOFFSET): added
* html.h (ATTR_TOP_MARGIN): added
* html.h (ATTR_BOTTOM_MARGIN): added
* html.h (SHAPE_UNKNOWN): added
* html.h (SHAPE_DEFAULT): added
* html.h (SHAPE_RECT): added
* html.h (SHAPE_CIRCLE): added
* html.h (SHAPE_POLY): added
* image.c: added
* main.c (fversion): add USE_IMAGE
* main.c (fusage): -ppl option
* main.c (MAIN): set_pixel_per_char if ppc specified
		-ppl option
		loadImage
* main.c (pushBuffer): deleteImage
* main.c (quitfm): termImage
* main.c (selBuf): deleteImage
* main.c (followA): fix for inline-image and map area
* main.c (query_from_followform): getMapXY()
* main.c (setOpt): displayBuffer B_REDRAW_IMAGE
* main.c (follow_map): fix calculate x, y
* main.c (dispI): added
* main.c (stopI): added
* map.c: include <math.h>
* map.c (inMapArea): added
* map.c (follow_map_menu): add a_img arg to handle inline-image
* map.c (follow_map_panel): use MapArea
* map.c (getMapXY): added
* map.c (newMapArea): added
* menu.c (smChBuf): deleteImage
* parsetagx.c (toAlign): align top, bottom, middle
* rc.c (P_SCALE): added
* rc.c (CMT_PIXEL_PER_LINE): added
* rc.c (CMT_DISP_IMAGE): added
* rc.c (CMT_AUTO_IMAGE): added
* rc.c (CMT_EXT_IMAGE_VIEWER): added
* rc.c (CMT_IMAGE_SCALE): added
* rc.c (CMT_IMGDISPLAY): added
* rc.c (CMT_IMGSIZE): added
* rc.c (show_param): P_PIXELS
* rc.c (set_param): P_PIXELS
* rc.c (sync_with_option): initImage
* rc.c (to_str): P_PIXELS
* table.c (feed_table_tag): fix <img> for inline-image
* tagtable.tab (image): added
* terms.c (wgetch): retry read when EINTR or EAGAIN
* terms.c (touch_cursor): added
* w3mimgdisplay.c: added
* w3mimgsize.c: added
* doc/README.func (DISPLAY_IMAGE): added
* doc/README.func (STOP_IMAGE): added
* doc/README.img: added
* doc-jp/README.func (DISPLAY_IMAGE): added
* doc-jp/README.func (STOP_IMAGE): added
* doc-jp/README.img: added
* scripts/w3mhelp.cgi.in: show dispI, stopI
* scripts/multipart/multipart.cgi.in: inline image support
From: Fumitoshi UKAI  <ukai@debian.or.jp>
This commit is contained in:
Fumitoshi UKAI
2002-01-31 17:54:47 +00:00
parent b244cb7b73
commit 9efbc08856
34 changed files with 3009 additions and 215 deletions
+2
View File
@@ -11,6 +11,8 @@ mktable
w3m
w3mbookmark
w3mhelperpanel
w3mimgdisplay
w3mimgsize
version.c
w3mhelp-lynx_en.html
w3mhelp-lynx_ja.html
+185 -1
View File
@@ -1,3 +1,187 @@
2002-02-01 Hironori Sakamoto <hsaka@mth.biglobe.ne.jp>
* w3m-img merge (w3m-0.2.4+cvs-1.278-img-2.2.patch.gz)
* NEWS: w3m-img merge
* .cvsignore: add w3mimgdisplay, w3mimgsize
* XMakefile: add image.c to SRCS
add image.o to OBJS
add IMGDISPLAY, IMGSIZE
* config.h.dist: USE_IMAGE, IMGSIZE, IMGDISPLAY
* configure: add find_imlib
ask use_image
(config.h) add $imgtarget to EXT_TARGETS
$def_use_image
IMGSIZE, IMGDISPLAY
* fm.h (MAX_IMAGE): added
* fm.h (DEFAULT_PIXEL_PER_CHAR): fix for USE_IMAGE
* fm.h (DEFAULT_PIXEL_PER_LINE): added
* fm.h (B_REDRAW_IMAGE): added
* fm.h (IMG_FLAG_SKIP): added
* fm.h (IMG_FLAG_AUTO): added
* fm.h (IMG_FLAG_START): added
* fm.h (IMG_FLAG_STOP): added
* fm.h (IMG_FLAG_NEXT): added
* fm.h (IMG_FLAG_UNLOADED): added
* fm.h (IMG_FLAG_LOADED): added
* fm.h (IMG_FLAG_ERROR): added
* fm.h (MapArea): added
* fm.h (MapList): s/urls/alts/, add area
* fm.h (ImageCache): added
* fm.h (Image): added
* fm.h (Anchor): add image
* fm.h (Buffer): add imarklist, image_flag, need_reshape
* fm.h (RG_FRAME_SRC): added
* fm.h (ALIGN_MIDDLE): added
* fm.h (ALIGN_TOP): added
* fm.h (ALIGN_BOTTOM): added
* fm.h (QuietMessage): added
* fm.h (Imgdisplay): added
* fm.h (Imgsize): added
* fm.h (activeImage): added
* fm.h (displayImage): added
* fm.h (autoImage): added
* fm.h (useExtImageViewer): added
* fm.h (image_source): added
* fm.h (view_unseenobject): change default if USE_IMAGE
* fm.h (set_pixel_per_char): added
* fm.h (pixel_per_line): added
* fm.h (set_pixel_per_line): added
* fm.h (image_scale): added
* proto.h (dispI): added
* proto.h (stopI): added
* proto.h (deleteImage): added
* proto.h (getAllImage): added
* proto.h (loadImage): added
* proto.h (getImage): added
* proto.h (getImageSize): added
* proto.h (process_img): add width arg
* proto.h (loadImageBuffer): added
* proto.h (follow_map_menu): add a_img arg
* proto.h (getMapXY): added
* proto.h (newMapArea): added
* proto.h (touch_cursor): added
* proto.h (cURLcode): added
* proto.h (initImage): added
* proto.h (termImage): added
* proto.h (addImage): added
* proto.h (drawImage): added
* proto.h (clearImage): added
* anchor.c (addMultirowsImg): added
* buffer.c (discardBuffer): deleteImage if USE_IMAGE
* buffer.c (reshapeBuffer): buf->need_reshape check
* display.c (fmTerm): if activeImage, stop load image
* display.c (fmInit): if displayImage, initImage
* display.c (image_touch): added
* display.c (draw_image_flag): added
* display.c (redrawLineImage): added
* display.c (displayBuffer): buf->need_reshape = TRUE
mode == B_REDRAW_IMAGE
image flag checks
force redraw image in mode == B_REDRAW_IMAGE
displayBuffer if need reshape
drawImage
* display.c (redrawNLine): redrawLineImage
* display.c (redrawLineImage): added
* display.c (disp_message_nsec): return immediately if QuietMessage
* etc.c (reset_signals): ignore SIGUSR1
* file.c (frame_source): added
* file.c (_MoveFile): added
* file.c (cur_baseURL): added
* file.c (cur_document_code): added
* file.c (cur_iseq): added
* file.c (loadGeneralFile): fix fmInitialized and prevtrap checks
save cur_baseURL
image_source load
loadImageBuffer for "image/*"
frame_source flag
fix b->type when proc is loadImageBuffer
* file.c (process_img): add width arg
parse height and width attr, align
fix for inline-image
* file.c (process_input): fix for form <input type="image">
* file.c (HTMLtagproc1): pass h_env->limit to process_img()
fix <img_alt> for inline-image
save cur_baseURL
* file.c (HTMLlineproc2body): fix <img_alt> for inline-image
* file.c (loadHTMLstream): fix for inline-image
fix fmInitialized and prevtrap checks
save cur_document_code
save image_flag
* file.c (loadGopherDir): save cur_document_code
fix fmInitialized and prevtrap checks
* file.c (loadImageBuffer): added for inline-image
* file.c (save2tmp): fix fmInitialized and prevtrap checks
* frame.c (frame_download_source): set RG_FRAME_SRC flag
image check
* funcname.tab (DISPLAY_IMAGE): added
* funcname.tab (STOP_IMAGE): added
* html.c (ALST_IMG): add align, ismap
* html.c (ALST_AREA): add shape, coords
* html.c (ALST_IMG_ALT): add width, height, usemap, ismap, hseq,
xoffset, yoffset, top_margin, bottom_margin
* html.c (AttrMap): add shape, coords, ismap, xoffset, yoffset
* html.h (ATTR_SHAPE): added
* html.h (ATTR_COORDS): added
* html.h (ATTR_ISMAP): added
* html.h (ATTR_XOFFSET): added
* html.h (ATTR_YOFFSET): added
* html.h (ATTR_TOP_MARGIN): added
* html.h (ATTR_BOTTOM_MARGIN): added
* html.h (SHAPE_UNKNOWN): added
* html.h (SHAPE_DEFAULT): added
* html.h (SHAPE_RECT): added
* html.h (SHAPE_CIRCLE): added
* html.h (SHAPE_POLY): added
* image.c: added
* main.c (fversion): add USE_IMAGE
* main.c (fusage): -ppl option
* main.c (MAIN): set_pixel_per_char if ppc specified
-ppl option
loadImage
* main.c (pushBuffer): deleteImage
* main.c (quitfm): termImage
* main.c (selBuf): deleteImage
* main.c (followA): fix for inline-image and map area
* main.c (query_from_followform): getMapXY()
* main.c (setOpt): displayBuffer B_REDRAW_IMAGE
* main.c (follow_map): fix calculate x, y
* main.c (dispI): added
* main.c (stopI): added
* map.c: include <math.h>
* map.c (inMapArea): added
* map.c (follow_map_menu): add a_img arg to handle inline-image
* map.c (follow_map_panel): use MapArea
* map.c (getMapXY): added
* map.c (newMapArea): added
* menu.c (smChBuf): deleteImage
* parsetagx.c (toAlign): align top, bottom, middle
* rc.c (P_SCALE): added
* rc.c (CMT_PIXEL_PER_LINE): added
* rc.c (CMT_DISP_IMAGE): added
* rc.c (CMT_AUTO_IMAGE): added
* rc.c (CMT_EXT_IMAGE_VIEWER): added
* rc.c (CMT_IMAGE_SCALE): added
* rc.c (CMT_IMGDISPLAY): added
* rc.c (CMT_IMGSIZE): added
* rc.c (show_param): P_PIXELS
* rc.c (set_param): P_PIXELS
* rc.c (sync_with_option): initImage
* rc.c (to_str): P_PIXELS
* table.c (feed_table_tag): fix <img> for inline-image
* tagtable.tab (image): added
* terms.c (wgetch): retry read when EINTR or EAGAIN
* terms.c (touch_cursor): added
* w3mimgdisplay.c: added
* w3mimgsize.c: added
* doc/README.func (DISPLAY_IMAGE): added
* doc/README.func (STOP_IMAGE): added
* doc/README.img: added
* doc-jp/README.func (DISPLAY_IMAGE): added
* doc-jp/README.func (STOP_IMAGE): added
* doc-jp/README.img: added
* scripts/w3mhelp.cgi.in: show dispI, stopI
* scripts/multipart/multipart.cgi.in: inline image support
2002-02-01 Fumitoshi UKAI <ukai@debian.or.jp>
* version.c.in: 0.2.5+cvs
@@ -2489,4 +2673,4 @@
* release-0-2-1
* import w3m-0.2.1
$Id: ChangeLog,v 1.286 2002/01/31 15:54:19 ukai Exp $
$Id: ChangeLog,v 1.287 2002/01/31 17:54:47 ukai Exp $
+5
View File
@@ -1,3 +1,8 @@
w3m 0.3?
* w3m-img merged: w3m now can display images! see doc/README.img
----------------------------------------------------------------
w3m 0.2.5 - 2002-01-31
* RFC2617: HTTP Digest authentication
+19 -3
View File
@@ -1,9 +1,9 @@
# $Id: XMakefile,v 1.19 2001/12/21 20:30:54 ukai Exp $
# $Id: XMakefile,v 1.20 2002/01/31 17:54:48 ukai Exp $
SRCS=main.c file.c buffer.c display.c etc.c search.c linein.c table.c local.c \
form.c map.c frame.c rc.c menu.c mailcap.c\
form.c map.c frame.c rc.c menu.c mailcap.c image.c\
func.c cookie.c history.c backend.c $(KEYBIND_SRC)
OBJS=main.o file.o buffer.o display.o etc.o search.o linein.o table.o local.o\
form.o map.o frame.o rc.o menu.o mailcap.o\
form.o map.o frame.o rc.o menu.o mailcap.o image.o\
func.o cookie.o history.o backend.o $(KEYBIND_OBJ)
LSRCS=terms.c conv.c url.c ftp.c anchor.c mimehead.c parsetagx.c\
tagtable.c istream.c
@@ -18,6 +18,8 @@ TARGET=w3m$(EXT)
BOOKMARKER=w3mbookmark$(EXT)
HELPER=w3mhelperpanel$(EXT)
INFLATE=inflate$(EXT)
IMGDISPLAY=w3mimgdisplay$(EXT)
IMGSIZE=w3mimgsize$(EXT)
TARGETS=$(TARGET) $(EXT_TARGETS)
HELP_ALLFILES=w3mhelp-w3m_en.html w3mhelp-w3m_ja.html \
w3mhelp-lynx_en.html w3mhelp-lynx_ja.html
@@ -88,6 +90,20 @@ $(INFLATE): inflate.o
inflate.o: inflate.c
$(CC) $(CFLAGS) $(Z_CFLAGS) -c inflate.c
$(IMGDISPLAY): w3mimgdisplay.o
$(CC) $(CFLAGS) `imlib-config --cflags` -o $(IMGDISPLAY) \
w3mimgdisplay.o `imlib-config --libs`
$(IMGSIZE): w3mimgsize.o
$(CC) $(CFLAGS) `imlib-config --cflags` -o $(IMGSIZE) \
w3mimgsize.o `imlib-config --libs`
w3mimgdisplay.o: w3mimgdisplay.c
$(CC) $(CFLAGS) `imlib-config --cflags` -c w3mimgdisplay.c
w3mimgsize.o: w3mimgsize.c
$(CC) $(CFLAGS) `imlib-config --cflags` -c w3mimgsize.c
gc/gc.a:
cd gc; $(MAKE) CC='$(CC)' CFLAGS='$(GCCFLAGS) $(GC_CFLAGS)' SPECIALCFLAGS='-I./\$(srcdir)/include $(GC_CFLAGS)'
+78 -1
View File
@@ -1,4 +1,4 @@
/* $Id: anchor.c,v 1.7 2001/12/14 17:10:54 ukai Exp $ */
/* $Id: anchor.c,v 1.8 2002/01/31 17:54:48 ukai Exp $ */
#include "fm.h"
#include "myctype.h"
#include "regex.h"
@@ -406,6 +406,83 @@ closest_prev_anchor(AnchorList *a, Anchor *an, int x, int y)
return an;
}
#ifdef USE_IMAGE
void
addMultirowsImg(Buffer *buf, AnchorList *al)
{
int i, j, k, col, ecol, pos;
Image *img;
Anchor a_img, a_href, a_form, *a;
Line *l, *ls;
if (al == NULL || al->nanchor == 0)
return;
for (i = 0; i < al->nanchor; i++) {
a_img = al->anchors[i];
img = a_img.image;
if (a_img.hseq < 0 || !img || img->rows <= 1)
continue;
for (l = buf->firstLine; l != NULL; l = l->next) {
if (l->linenumber == img->y)
break;
}
if (!l)
continue;
if (a_img.y == a_img.start.line)
ls = l;
else {
for (ls = l; ls != NULL;
ls = (a_img.y < a_img.start.line) ? ls->next : ls->prev) {
if (ls->linenumber == a_img.start.line)
break;
}
if (!ls)
continue;
}
a = retrieveAnchor(buf->href, a_img.start.line, a_img.start.pos);
if (a)
a_href = *a;
else
a_href.url = NULL;
a = retrieveAnchor(buf->formitem, a_img.start.line, a_img.start.pos);
if (a)
a_form = *a;
else
a_form.url = NULL;
col = COLPOS(ls, a_img.start.pos);
ecol = COLPOS(ls, a_img.end.pos);
for (j = 0; l && j < img->rows; l = l->next, j++) {
if (a_img.start.line == l->linenumber)
continue;
pos = columnPos(l, col);
a = registerImg(buf, a_img.url, l->linenumber, pos);
a->hseq = -a_img.hseq;
a->image = img;
a->end.pos = pos + ecol - col;
for (k = pos; k < a->end.pos; k++)
l->propBuf[k] |= PE_IMAGE;
if (a_href.url) {
a = registerHref(buf, a_href.url, a_href.target,
a_href.referer, l->linenumber, pos);
a->hseq = a_href.hseq;
a->end.pos = pos + ecol - col;
for (k = pos; k < a->end.pos; k++)
l->propBuf[k] |= PE_ANCHOR;
}
if (a_form.url) {
FormItemList *fi = (FormItemList *)a_form.url;
buf->formitem = putAnchor(buf->formitem, a_form.url,
a_form.target, &a, NULL,
l->linenumber, pos);
a->hseq = a_form.hseq;
a->end.pos = pos + ecol - col;
}
}
img->rows = 0;
}
}
#endif
void
addMultirowsForm(Buffer *buf, AnchorList *al)
{
+7 -1
View File
@@ -1,4 +1,4 @@
/* $Id: buffer.c,v 1.9 2001/12/26 18:17:57 ukai Exp $ */
/* $Id: buffer.c,v 1.10 2002/01/31 17:54:49 ukai Exp $ */
#include "fm.h"
#ifdef USE_MOUSE
@@ -80,6 +80,9 @@ discardBuffer(Buffer *buf)
int i;
Buffer *b;
#ifdef USE_IMAGE
deleteImage(buf);
#endif
clearBuffer(buf);
for (i = 0; i < MAX_LB; i++) {
b = buf->linkBuffer[i];
@@ -489,6 +492,9 @@ reshapeBuffer(Buffer *buf)
URLFile f;
Buffer sbuf;
if (!buf->need_reshape)
return;
buf->need_reshape = FALSE;
if (buf->sourcefile == NULL)
return;
init_stream(&f, SCM_LOCAL, NULL);
+3
View File
@@ -121,6 +121,7 @@ MODEL=Linux.i686-monster-ja
#undef USE_GOPHER
#define USE_EXTERNAL_URI_LOADER
#undef USE_ALARM
#undef USE_IMAGE
#define USE_HELP_CGI
#define DEF_EDITOR "/bin/vi"
@@ -140,6 +141,8 @@ MODEL=Linux.i686-monster-ja
#define HELP_FILE "w3mhelp.html"
#define HELP_CGI "w3mhelp"
#define W3MCONFIG "w3mconfig"
#define IMGSIZE "w3mimgsize"
#define IMGDISPLAY "w3mimgdisplay"
#define RC_DIR "~/.w3m"
#define BOOKMARK "bookmark.html"
Vendored
+43 -3
View File
@@ -1,5 +1,5 @@
#!/bin/sh
# $Id: configure,v 1.58 2002/01/29 19:08:49 ukai Exp $
# $Id: configure,v 1.59 2002/01/31 17:54:49 ukai Exp $
# Configuration.
#
@@ -418,6 +418,30 @@ find_ssl() {
fi
}
find_imlib() {
imlib_major=1
imlib_minor=9
imlib_micro=8
imlib_version=$imlib_major.$imlib_minor.$imlib_micro
echo "Checking Imlib."
if [ "x$IMLIB_CONFIG" = x ]; then
IMLIB_CONFIG=imlib-config
fi
version=`$IMLIB_CONFIG --version`
if [ "x$version" = x ]; then
echo "You don't have Imlib. Install Imlib (version >= $imlib_version)."
exit 1
fi
major=`echo "$version" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/'`
minor=`echo "$version" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/'`
micro=`echo "$version" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\3/'`
echo "The version of Imlib is $version."
if [ "$major" -ne $imlib_major -o "$minor" -ne $imlib_minor -o "$micro" -lt $imlib_micro ]; then
echo "Imlib is too old. Install Imlib (version >= $imlib_version)."
exit 1
fi
}
#--------------------------------------------------------------
if [ -n "$USER" ]; then
user=$USER
@@ -693,6 +717,15 @@ else
def_param "use_digest_auth" n
fi
ask_param "Inline image support (you need Imlib library)" use_image n
if [ "$use_image" = y ]; then
def_use_image="#define USE_IMAGE"
imgtarget='$(IMGDISPLAY) $(IMGSIZE)'
else
def_use_image="#undef USE_IMAGE"
imgtarget=''
fi
if [ "$use_color" = y ]; then
ask_param "ANSI color escape sequences support" use_ansi_color n
else
@@ -1891,6 +1924,10 @@ else
echo "You have IPv6 support."
fi
if [ "$use_image" = y ]; then
find_imlib
fi
rm -f _zmachdep$extension _zmachdep.c _zmachdep.o
echo "------------ Configuration done ------------"
@@ -1905,7 +1942,7 @@ case $dmodel in
esac
cvsver=`awk '\$1 ~ /[$]Id:/ { print \$3}' ChangeLog`
sed -e 's/^#define CURRENT_VERSION "\(.*\)+cvs.*"/#define CURRENT_VERSION "\1+cvs-'$cvsver'"/' version.c.in > version.c
sed -e 's/^#define CURRENT_VERSION "\(.*\)+cvs/#define CURRENT_VERSION "\1+cvs-'$cvsver'/' version.c.in > version.c
cur_ver=`sed -n 's/^#define CURRENT_VERSION *"w3m\/\([^"]*\)".*$/\1/p' version.c`
for h_in in w3mhelp-*_*.html.in
@@ -2016,7 +2053,7 @@ EXT=$extension
MATHLIB=$mathlib
Z_CFLAGS=$z_cflags
ZLIB=$zlib
EXT_TARGETS=\$(BOOKMARKER) \$(HELPER) $inflate
EXT_TARGETS=\$(BOOKMARKER) \$(HELPER) $inflate $imgtarget
GC_CFLAGS=$gc_cflags
GCLIB=$gclib $pthreadlib
GCTARGET=$gctarget
@@ -2057,6 +2094,7 @@ $def_use_w3mmailer
$def_use_nntp
$def_use_gopher
$def_use_alarm
$def_use_image
$def_use_help_cgi
#define DEF_EDITOR "$editor"
@@ -2076,6 +2114,8 @@ $def_use_help_cgi
#define HELP_FILE "w3mhelp.html"
#define HELP_CGI "w3mhelp"
#define W3MCONFIG "w3mconfig"
#define IMGSIZE "w3mimgsize"
#define IMGDISPLAY "w3mimgdisplay"
#define RC_DIR "~/.w3m"
#define BOOKMARK "bookmark.html"
+147 -7
View File
@@ -1,4 +1,4 @@
/* $Id: display.c,v 1.14 2002/01/16 15:37:06 ukai Exp $ */
/* $Id: display.c,v 1.15 2002/01/31 17:54:50 ukai Exp $ */
#include <signal.h>
#include "fm.h"
@@ -162,6 +162,10 @@ fmTerm(void)
move(LASTLINE, 0);
clrtoeolx();
refresh();
#ifdef USE_IMAGE
if (activeImage)
loadImage(IMG_FLAG_STOP);
#endif
#ifdef USE_MOUSE
if (use_mouse)
mouse_end();
@@ -182,6 +186,10 @@ fmInit(void)
initscr();
term_raw();
term_noecho();
#ifdef USE_IMAGE
if (displayImage)
initImage();
#endif
}
fmInitialized = TRUE;
}
@@ -208,6 +216,12 @@ static Buffer *save_current_buf = NULL;
char *delayed_msg = NULL;
#ifdef USE_IMAGE
static int image_touch = 0;
static int draw_image_flag = FALSE;
static Line *redrawLineImage(Buffer *buf, Line *l, int i);
#endif
void
displayBuffer(Buffer *buf, int mode)
{
@@ -222,9 +236,11 @@ displayBuffer(Buffer *buf, int mode)
buf->width = COLS;
if (buf->height == 0)
buf->height = LASTLINE + 1;
if (buf->width != INIT_BUFFER_WIDTH && buf->type
&& !strcmp(buf->type, "text/html"))
if ((buf->width != INIT_BUFFER_WIDTH && buf->type &&
!strcmp(buf->type, "text/html")) || buf->need_reshape) {
buf->need_reshape = TRUE;
reshapeBuffer(buf);
}
if (showLineNum) {
if (buf->lastLine && buf->lastLine->real_linenumber > 0)
buf->rootX = (int)(log(buf->lastLine->real_linenumber + 0.1)
@@ -237,10 +253,16 @@ displayBuffer(Buffer *buf, int mode)
else
buf->rootX = 0;
buf->COLS = COLS - buf->rootX;
if (mode == B_FORCE_REDRAW ||
mode == B_SCROLL ||
if (mode == B_FORCE_REDRAW || mode == B_SCROLL ||
#ifdef USE_IMAGE
mode == B_REDRAW_IMAGE ||
#endif
cline != buf->topLine || ccolumn != buf->currentColumn) {
if (mode == B_SCROLL && cline && buf->currentColumn == ccolumn) {
if (
#ifdef USE_IMAGE
!(activeImage && displayImage && draw_image_flag) &&
#endif
mode == B_SCROLL && cline && buf->currentColumn == ccolumn) {
int n = buf->topLine->linenumber - cline->linenumber;
if (n > 0 && n < LASTLINE) {
move(LASTLINE, 0);
@@ -258,14 +280,34 @@ displayBuffer(Buffer *buf, int mode)
}
redrawNLine(buf, n);
}
else
else {
#ifdef USE_IMAGE
if (activeImage &&
(mode == B_REDRAW_IMAGE ||
cline != buf->topLine || ccolumn != buf->currentColumn)) {
if (draw_image_flag)
clear();
clearImage();
loadImage(IMG_FLAG_STOP);
image_touch++;
draw_image_flag = FALSE;
}
#endif
redrawBuffer(buf);
}
cline = buf->topLine;
ccolumn = buf->currentColumn;
}
if (buf->topLine == NULL)
buf->topLine = buf->firstLine;
#ifdef USE_IMAGE
if (buf->need_reshape) {
displayBuffer(buf, B_FORCE_REDRAW);
return;
}
#endif
#ifdef USE_MOUSE
if (use_mouse)
#if LANG == JA
@@ -337,6 +379,14 @@ displayBuffer(Buffer *buf, int mode)
message(msg->ptr, buf->cursorX + buf->rootX, buf->cursorY);
standend();
refresh();
#ifdef USE_IMAGE
if (activeImage && displayImage && buf->img) {
/*
* loadImage(IMG_FLAG_START);
*/
drawImage();
}
#endif
#ifdef USE_BUFINFO
if (buf != save_current_buf) {
saveBufferInfo();
@@ -377,6 +427,23 @@ redrawNLine(Buffer *buf, int n)
}
if (n > 0)
clrtobotx();
#ifdef USE_IMAGE
if (!(activeImage && displayImage && buf->img))
return;
move(buf->cursorY, buf->cursorX);
for (i = 0, l = buf->topLine; i < LASTLINE; i++) {
if (i >= LASTLINE - n || i < -n)
l0 = redrawLineImage(buf, l, i);
else {
l0 = (l) ? l->next : NULL;
}
if (l0 == NULL && l == NULL)
break;
l = l0;
}
getAllImage(buf);
#endif
}
#define addKanji(pc,pr) (addChar((pc)[0],(pr)[0]),addChar((pc)[1],(pr)[1]))
@@ -549,6 +616,77 @@ redrawLine(Buffer *buf, Line *l, int i)
return l->next;
}
#ifdef USE_IMAGE
Line *
redrawLineImage(Buffer *buf, Line *l, int i)
{
int j, pos, rcol, ncol;
int column = buf->currentColumn;
Anchor *a;
int x, y, sx, sy, w, h;
if (l == NULL)
return NULL;
if (l->width < 0)
l->width = COLPOS(l, l->len);
if (l->len == 0 || l->width - 1 < column)
return l->next;
pos = columnPos(l, column);
rcol = COLPOS(l, pos);
for (j = 0; rcol - column < buf->COLS && pos + j < l->len; j++) {
if (rcol - column < 0) {
rcol = COLPOS(l, pos + j + 1);
continue;
}
a = retrieveAnchor(buf->img, l->linenumber, pos + j);
if (a && a->image && a->image->touch < image_touch) {
Image *image = a->image;
ImageCache *cache;
cache = image->cache = getImage(image, baseURL(buf),
buf->image_flag);
if (cache) {
if ((image->width < 0 && cache->width > 0) ||
(image->height < 0 && cache->height > 0)) {
image->width = cache->width;
image->height = cache->height;
buf->need_reshape = TRUE;
}
x = (int)((rcol - column + buf->rootX) * pixel_per_char);
y = (int)(i * pixel_per_line);
sx = (int)((rcol - COLPOS(l, a->start.pos)) * pixel_per_char);
sy = (int)((l->linenumber - image->y) * pixel_per_line);
if (sx == 0 && x + image->xoffset >= 0)
x += image->xoffset;
else
sx -= image->xoffset;
if (sy == 0 && y + image->yoffset >= 0)
y += image->yoffset;
else
sy -= image->yoffset;
if (image->width > 0)
w = image->width - sx;
else
w = (int)(8 * pixel_per_char - sx);
if (image->height > 0)
h = image->height - sy;
else
h = (int)(pixel_per_line - sy);
if (w > (int)((buf->COLS - rcol + column) * pixel_per_char))
w = (int)((buf->COLS - rcol + column) * pixel_per_char);
if (h > (int)(LASTLINE * pixel_per_line - y))
h = (int)(LASTLINE * pixel_per_line - y);
addImage(cache, x, y, sx, sy, w, h);
image->touch = image_touch;
draw_image_flag = TRUE;
}
}
rcol = COLPOS(l, pos + j + 1);
}
return l->next;
}
#endif
int
redrawLineRegion(Buffer *buf, Line *l, int i, int bpos, int epos)
{
@@ -850,6 +988,8 @@ message(char *s, int return_x, int return_y)
void
disp_message_nsec(char *s, int redraw_current, int sec, int purge, int mouse)
{
if (QuietMessage)
return;
if (!fmInitialized) {
fprintf(stderr, "%s\n", conv_to_system(s));
return;
+2
View File
@@ -10,6 +10,7 @@ COOKIE
DELETE_PREVBUF 前のバッファを消去します(主に local-CGI 用)
DICT_WORD 入力した単語を辞書コマンドで調べます
DICT_WORD_AT カーソル位置の単語を辞書コマンドで調べます
DISPLAY_IMAGE 画像の読込/表示を再開します
DOWN 画面を1行下にスクロールします
DOWNLOAD 文書のソースをファイルに保存します
EDIT ソースファイルをエディタで編集します
@@ -99,6 +100,7 @@ SHELL
SHIFT_LEFT 画面全体を左にずらします
SHIFT_RIGHT 画面全体を右にずらします
SOURCE HTMLのソースを表示します
STOP_IMAGE 画像の読込/表示を停止します
SUBMIT フォームにサブミットします
SUSPEND サスペンド
UP 画面を1行上にスクロールします
+253
View File
@@ -0,0 +1,253 @@
w3m でインライン画像を表示
2002/01/31
坂本 浩則
はじめに
w3m でインライン画像を表示する拡張です。以下に置いてあります。
http://www2u.biglobe.ne.jp/~hsaka/w3m/index-ja.html#img
patch/w3m-0.2.4-img-2.2.patch.gz
patch/README.img-ja
機能
・X11 上の端末(xterm,kterm,rxvt,...)上に画像(GIF,PNG,JPEG 等)を表示します。
・img タグで指定されたインライン画像を表示できます。
width,height 属性に応じて必要な領域を確保してレンダリングします。
align 属性に対応しています。
・Content-type: image/* な画像ファイルを直接表示できます。
・map タグに対応しています。
area タグの shape, coords 属性を認識し、メニュー表示から選択できます。
・img タグの ismap 属性に対応しています。
座標値を ?<x>,<y> として URL に追加して送ります。
・input タグの type=image 属性で指定されたインライン画像を表示できます。
座標値を <name>.x=<x>&<name>.y=<y> として送ります。
・非同期に画像を読み込みます。
・画像をキャッシュできます。
キー操作
DISPLAY_IMAGE
画像の読込/表示を再開します。
STOP_IMAGE
そのバッファの画像の読込/表示を停止します。
SET_OPTION display_image=toggle
画像の読込/表示を切替えます。
デフォルトのキーマップはありませんので、~/.w3m/keymap に
keymap X DISPLAY_IMAGE
keymap C-c STOP_IMAGE
keymap t SET_OPTION display_image=toggle
の様に記述して使用してください。
コマンドラインオプション
-ppc <pixel>
一文字あたりの幅(pixel 値)を指定します。デフォルトは自動設定。
正しく設定されない場合は端末の font の大きさに必ず合わせてください。
-ppl <pixel>
一行あたりの幅(pixel 値)を指定します。デフォルトは自動設定。
正しく設定されない場合は端末の font の大きさに必ず合わせてください。
オプションパネル
pixel_per_char
一文字あたりの幅(pixel 値)を指定します。デフォルトは自動設定。
正しく設定されない場合は端末の font の大きさに必ず合わせてください。
pixel_per_line
一行あたりの幅(pixel 値)を指定します。デフォルトは自動設定。
正しく設定されない場合は端末の font の大きさに必ず合わせてください。
display_image
インライン画像を表示します。デフォルトは ON。
auto_image
インライン画像を自動で読み込みます。デフォルトは ON。
OFF の場合は、コマンド DISPLAY_IMAGE で読み込みを開始します。
ext_image_viewer
コマンド VIEW_IMAGE('I')の場合や Content-type: image/* である
画像ファイルを外部ビューワで表示します。デフォルトは ON。
OFF の場合は、インライン画像として直接表示します。
image_scale
画像のスケールを指定します。デフォルトは 100(%)。
小さい font と共に使う場合には値を小さくすると有用。
imgdisplay
インライン画像を表示するためのコマンド。デフォルトは w3mimgdisplay。
下記の "w3mimgdisplay の設定" を参考にしてオプション設定してください。
imgsize
インライン画像の大きさを得るためのコマンド。デフォルトは w3mimgsize。
必要なもの
* w3m-0.2.4.tar.gz
http://w3m.sourceforge.net/
http://sourceforge.net/projects/w3m/
http://prdownloads.sourceforge.net/w3m/
* Imlib-1.9.8 (1.9.10 以上推奨)
libungif-4.1.0b1 推奨
インストール
gunzip -c DIST/w3m-0.2.4.tar.gz | tar -xvf -
cd w3m-0.2.4
gunzip -c DIST/w3m-0.2.4-img-2.2.patch.gz | patch -p1
configure
# Inline image support (you need Imlib library)
# と聞かれますので y と答えてください。
# menu は有効にしてください。
make
# w3mimgdisplay, w3mimgsize を make する時に Imlib が必要です。
make install
# w3mimgdisplay, w3mimgsize は必ず $LIB(PREFIX/lib/w3m) へ
# install してください。
w3mimgdisplay の設定
w3mimgdisplay は以下のオプションを受け付けますので端末に合わせて
オプション設定パネルで(または -o オプションで)設定してください。
-x <offset_x>
端末上に画像を表示する X 方向の原点。デフォルトは 2 ですが、
xterm や kterm ではスクロールバーの幅を計算して加えようとします。
(正しく出来ないかもしれません。)
Eterm では 5 にすべきかもしれません。
-y <offset_y>
端末上に画像を表示する Y 方向の原点。デフォルトは 2。
Eterm では 5 にすべきかもしれません。
-bg <background>
端末の背景色。デフォルトは自動設定。
#RRGGBB で指定する場合は # をエスケープして設定してください。
例)
w3m -o 'imgdisplay=w3mimgdisplay -x 5 -bg "#cccccc"'
更新記録
2002/01/31 w3m-0.2.4-img-2.2
* w3m-0.2.4+cvs-1.278 ベース。
2002/01/29 w3m-0.2.4-img-2.1
* w3m-0.2.4+cvs-1.268 ベース。
2002/01/28 w3m-0.2.4-img-2.0
* w3m-0.2.4+cvs-1.265 ベース。
* pixel_per_char, pixel_per_line を自動設定するようにした。
* 端末の背景色を自動設定するようにした。
* 画像処理関係のソースを image.c に分離。
2002/01/08 w3m-0.2.4-img-1.18
* w3m-0.2.4 ベース。
2001/12/29 w3m-0.2.3.2-img-1.17
* w3m-0.2.3.2+cvs-1.196 ベース。
2001/12/25 w3m-0.2.3.2-img-1.16.1
* [w3m-dev 02698] Thanks > かずひこ@kondara.org さん
2001/12/22 w3m-0.2.3.2-img-1.16
* w3m-0.2.3.2 ベース。
2001/12/20 w3m-0.2.3.1-img-1.15
* w3m-0.2.3.1 ベース。
* Content-Transfer-Encoding で送られて来た画像を表示可能にした。
2001/11/29
* ChangLog 1.71 時点の CVS ソースに対してマージ開始
2001/11/17 w3m-0.2.2-img-1.14
* w3m-0.2.2 ベース。
2001/11/14 w3m-0.2.1-inu-1.6-img-1.13
* w3m-0.2.1-inu-1.6 ベース。
2001/11/05 w3m-0.2.1-inu-1.5-img-1.12
* w3m-0.2.1-inu-1.5 ベース。
* <area><map> が使えなくなっていたバグの修正。
* kterm 上で xwnmo を使った場合に対応。
2001/10/03 w3m-0.2.1-inu-1.4-img-1.11
* w3m-0.2.1-inu-1.4 ベース。
* 標準入力から読み込む時に落ちるバグの修正。
* configure の修正。Thanks > 深川さん。
2001/08/01 w3m-0.2.1-img-1.10
* 画像の位置の微調整。
* スケールのバグ修正。
2001/07/31 w3m-0.2.1-img-1.9
* initImgdisplay() の修正。Thanks > David.
2001/07/29 w3m-0.2.1-img-1.8
* configure の修正。Thanks > 坂根さん。
2001/07/28 w3m-0.2.1-img-1.7
* configure, XMakefile が patch に入って無かった。
* 画像を表示しない場合の処理をオリジナルに近づけた。
* [w3m-dev 02121] に対応。
2001/07/27 w3m-0.2.1-img-1.6
* README.img を doc-jp へ移動。doc/README.img を作成。
* インライン画像対応部分を USE_IMAGE マクロで分離。
* configure でインライン画像対応を選択できる様にした。
* configure で Imlib をチェックする様にした。
2001/07/26 w3m-0.2.1-img-1.5
* w3mimgdisplay は必要になるまで立ち上げない様にした。
* w3mimgdisplay が落ちた時に、w3mimgdisplay を再立ち上げできる様にした。
* <img align=middle の場合の計算間違いの修正。
* [w3m-dev 02118] に対応。
* funcname.tab が間違っていたので修正。
2001/07/25 w3m-0.2.1-img-1.4
* w3mimgdisplay を環境変数 WINDOWID を見る様に改良。
また、text window の推量部分も改良。
* image タグを img タグと同じものとして追加。
* [w3m-dev 02090], [w3m-dev 02097] に対応。
2001/07/14 w3m-0.2.1-img-1.3
* ext_image_viewer が OFF の場合は画像を直接フレーム表示可能にした。
* Option Panel が SEGV するバグの修正。
2001/07/13 w3m-0.2.1-img-1.2
* 画像のスケールを指定出来る様にした。
* SIGUSR1 のブロックに関する修正。
2001/07/12 w3m-0.2.1-img-1.1
* キー入力中以外は SIGUSR1, SIGWINCH をブロックする様にした。
* バグ修正。
2001/07/11 w3m-0.2.1-img-1.0
* MGL 版の画像読み込みを採用。
2001/07/10 w3m-0.2.1-img-0.5
* 描画の高速化。w3mimgdisplay で不要な XSync() を止めた。
不要な drawImage() を止めた。
2001/07/08 w3m-0.2.1-img-0.4
* w3mimgdisplay での Window の取得や offset_x のデフォルト値の改良。
* <img align=middle の場合の計算間違いの修正。
* <img align=left|center|right では <div></div> を使う様にしてみた。
* w3mimgdisplay では SIGINT を無視する様にした。
* w3mimgsize もオプション設定できる様にした。
2001/07/07 w3m-0.2.1-img-0.3
* kterm に限らず、X11 上の端末では画像を描画できる様にした。
2001/07/06 w3m-0.2.1-img-0.2
* README.img を作成。
* kterm-6.2.0-img-0.2.patch を w3m-0.2.1-img-0.2.patch に含める様にした。
* コードの整理、安全側への修正
2001/07/04 w3m-0.2.1-img-0.1
* バージョン管理開始。
* Imlib 対応版。
2001/06/30
* XPM 版でほぼ実装完了。
2001/06/19
* MGL 版に刺激を受けて img への対応のテストを開始。
-----------------------------------
坂本 浩則 <hsaka@mth.biglobe.ne.jp>
http://www2u.biglobe.ne.jp/~hsaka/
+2
View File
@@ -10,6 +10,7 @@ COOKIE View cookie list
DELETE_PREVBUF Delete previous buffer (mainly for local-CGI)
DICT_WORD Execute dictionary command (see README.dict)
DICT_WORD_AT Execute dictionary command for word at cursor
DISPLAY_IMAGE Restart loading and drawing of images
DOWN Scroll down one line
DOWNLOAD Save document source to file
EDIT Edit current document
@@ -99,6 +100,7 @@ SHELL Execute shell command
SHIFT_LEFT Shift screen left
SHIFT_RIGHT Shift screen right
SOURCE View HTML source
STOP_IMAGE Stop loading and drawing of images
SUBMIT Submit form
SUSPEND Stop loading document
UP Scroll up one line
+189
View File
@@ -0,0 +1,189 @@
Inline image support of w3m
2002/01/31
H. Sakamoto
Introduction
This is the extension for w3m to support inline image.
The patch for w3m-0.2.4 is available on the following site.
http://www2u.biglobe.ne.jp/~hsaka/w3m/index.html#img
patch/w3m-0.2.4-2.2.patch.gz
patch/README.img
Support
* Display inline image (GIF,PNG,JPEG, etc.) on terminals
(xterm,rxvt, etc.) of X11.
* Support inline image of <img> tag.
Support of attributes "width", "height", and "align".
* Direct display of image file which header is "Content-type: image/*"
* Support of <map> tag.
Support of attributes "shape" and "coords" of <area> tag.
* Support of an attribute "ismap" of <img> tag.
"w3m" adds coordinate of the cursor as ?<x>,<y> to url, and sends url.
* Support of an attribute "type=image" of <input> tag.
"w3m" sends coordinate of the cursor as <name>.x=<x>&<name>.y=<y>.
* Asynchronous loading of image files.
* Using cache of image file as pixmap.
Key functions
DISPLAY_IMAGE
Restart loading and drawing of images.
STOP_IMAGE
Stop loading and drawing of images in the current buffer.
SET_OPTION display_image=toggle
Toggle loading and drawing of images.
These functions are not keybinded as default.
Specify the following keymaps in ~/.w3m/keymap.
keymap X DISPLAY_IMAGE
keymap C-c STOP_IMAGE
keyamp t SET_OPTION display_image=toggle
Comandline options
-ppc <pixel>
# of pixels per character. The default value is automatically
detected. Must fit the width of font of terminal.
-ppl <pixel>
# of pixels per character. The default value is automatically
detected. Must fit the height of font of terminal.
Option panel
pixel_per_char
# of pixels per character. The default value is automatically
detected. Must fit the width of font of terminal.
pixel_per_line
# of pixels per character. The default value is automatically
detected. Must fit the height of font of terminal.
display_image
Display of inline image. The default is ON.
auto_image
Automatic loading of inline image. The default is ON.
If it is OFF, loading starts with a command DISPLAY_IMAGE.
ext_image_viewer
Use external image viewer, when a command VIEW_IMAGE or
view of image file which header is "Content-type: image/*".
The default is ON. If it is OFF, the image is directly displaied.
image_scale
Scale of image (%). The default value is 100(%).
imgdisplay
External command to display image". The default value is "w3mimgdisplay".
See "Setting w3mimgdisplay".
imgsize
External command to get size of image. The default value is "w3mimgsize".
Required programs
* w3m-0.2.4
http://w3m.sourceforge.net/
http://sourceforge.net/projects/w3m/
http://prdownloads.sourceforge.net/w3m/
* Imlib-1.9.8 (1.9.10 is recommendable.)
libungif-4.1.0b1 is recommendable.
Install
gunzip -c DIST/w3m-0.2.4.tar.gz | tar -xvf -
cd w3m-0.2.4
gunzip -c DIST/w3m-0.2.4-img-2.2.patch.gz | patch -p1
configure
# When you are asked "Inline image support (you need Imlib library)",
# answer "y".
# Select menu.
make
# To make "w3mimgdisplay" and "w3mimgsize", Imlib is required.
make install
# Must install "w3mimgdisplay" and "w3mimgsize" to $LIB(PREFIX/lib/w3m).
Setting w3mimgdisplay
"w3mimgdisplay" has the following options. Set options to fit terminal.
-x <offset_x>
The X origin of display of image on terminal. The default value is 2.
If the terminal is "xterm", the width of scroll bar is added.
If the terminal is "Eterm", it may be better to specify 5.
-y <offset_y>
The Y origin of display of image on terminal. The default value is 2.
If the terminal is "Eterm", it may be better to specify 5.
-bg <background>
Background color of terminal. The default value is automatically
detected. When the color is specified as #RRGGBB, escape '#'.
ex.)
w3m -o 'imgdisplay=w3mimgdisplay -x 5 -bg "#cccccc"'
Change log
2002/01/31 w3m-0.2.4-img-2.2
* Based on w3m-0.2.4+cvs-1.278.
2002/01/29 w3m-0.2.4-img-2.1
* Based on w3m-0.2.4+cvs-1.268.
2002/01/28 w3m-0.2.4-img-2.0
* Based on w3m-0.2.4+cvs-1.265.
* pixel_per_char and pixel_per_line are automatically detected.
* The bckground color of terminal is automatically detected.
* The source code to display images is moved to image.c
2002/01/08 w3m-0.2.4-img-1.18
* Based on w3m-0.2.4
2001/12/29 w3m-0.2.3.2-img-1.17
* Based on w3m-0.2.3.2+cvs-1.196.
2001/12/25 w3m-0.2.3.2-img-1.16.1
* [w3m-dev 02698] Thanks > Kazuhiko-san
2001/12/22 w3m-0.2.3.2-img-1.16
* Based on w3m-0.2.3.2.
2001/12/20 w3m-0.2.3.1-img-1.15
* Based on w3m-0.2.3.1.
* Support display of image with Content-Transfer-Encoding.
2001/11/29
* Start merge against CVS source (ChangeLog 1.71)
2001/11/17 w3m-0.2.2-img-1.14
* Based on w3m-0.2.2.
2001/11/14 w3m-0.2.1-inu-1.6-img-1.13
* Based on w3m-0.2.1-inu-1.6.
2001/11/05 w3m-0.2.1-inu-1.5-img-1.12
* Based on w3m-0.2.1-inu-1.5.
* Fixed the bug for <area>, <map>.
* Fixed the problem with xwnmo on kterm.
2001/10/03 w3m-0.2.1-inu-1.4-img-1.11
* Based on w3m-0.2.1-inu-1.4.
* Fixed bug when reading from stdin.
* Fixed "configure". Thanks > Fukagawa-san.
2001/08/01 w3m-0.2.1-img-1.10
* Adjust image position.
* Fixed scaling image.
2001/07/31 w3m-0.2.1-img-1.9
* Fixed initImgdisplay(). Thanks > David.
2001/07/29 w3m-0.2.1-img-1.8
* Fixed "configure".
2001/07/28 w3m-0.2.1-img-1.7
* Sorry, w3m-0.2.1-img-1.6 is not complete.
* Added "configure" and "Makefile" to the patch.
2001/07/27 w3m-0.2.1-img-1.6
* Created doc/README.img.
-------------------------------------------
Hironori Sakamoto <hsaka@mth.biglobe.ne.jp>
http://www2u.biglobe.ne.jp/~hsaka/
+2 -1
View File
@@ -1,4 +1,4 @@
/* $Id: etc.c,v 1.17 2002/01/21 17:57:27 ukai Exp $ */
/* $Id: etc.c,v 1.18 2002/01/31 17:54:50 ukai Exp $ */
#include "fm.h"
#include <pwd.h>
#include "myctype.h"
@@ -1054,6 +1054,7 @@ reset_signals(void)
#ifdef SIGPIPE
signal(SIGPIPE, SIG_IGN);
#endif
signal(SIGUSR1, SIG_IGN);
}
void
+523 -118
View File
File diff suppressed because it is too large Load Diff
+92 -3
View File
@@ -1,4 +1,4 @@
/* $Id: fm.h,v 1.45 2002/01/31 03:55:35 ukai Exp $ */
/* $Id: fm.h,v 1.46 2002/01/31 17:54:51 ukai Exp $ */
/*
* w3m: WWW wo Miru utility
*
@@ -73,7 +73,14 @@ void bzero(void *, int);
#define PAGER_MAX_LINE 10000 /* Maximum line kept as pager */
#define FNLEN 80
#ifdef USE_IMAGE
#define MAX_IMAGE 1000
#define DEFAULT_PIXEL_PER_CHAR 7.0 /* arbitrary */
#define DEFAULT_PIXEL_PER_LINE 14.0 /* arbitrary */
#else
#define DEFAULT_PIXEL_PER_CHAR 8.0 /* arbitrary */
#endif
#define MINIMUM_PIXEL_PER_CHAR 4.0
#define MAXIMUM_PIXEL_PER_CHAR 32.0
@@ -157,6 +164,7 @@ void bzero(void *, int);
#define B_FORCE_REDRAW 1
#define B_REDRAW 2
#define B_SCROLL 3
#define B_REDRAW_IMAGE 4
/* Buffer Property */
#define BP_NORMAL 0x0
@@ -219,6 +227,17 @@ extern int REV_LB[];
#define IN_URL 0x100
#define IN_CHAR 0x200
#define IMG_FLAG_SKIP 1
#define IMG_FLAG_AUTO 2
#define IMG_FLAG_START 0
#define IMG_FLAG_STOP 1
#define IMG_FLAG_NEXT 2
#define IMG_FLAG_UNLOADED 0
#define IMG_FLAG_LOADED 1
#define IMG_FLAG_ERROR 2
/*
* Macros.
*/
@@ -263,10 +282,21 @@ typedef unsigned short Lineprop;
typedef unsigned char Linecolor;
#endif
typedef struct _MapArea {
char *url;
char *alt;
#ifdef MENU_MAP
#ifdef USE_IMAGE
char shape;
short *coords;
int ncoords;
#endif
#endif
} MapArea;
typedef struct _MapList {
Str name;
TextList *urls;
TextList *alts;
GeneralList *area;
struct _MapList *next;
} MapList;
@@ -290,6 +320,33 @@ typedef struct {
short pos;
} BufferPoint;
#ifdef USE_IMAGE
typedef struct _imageCache {
char *url;
ParsedURL *current;
char *file;
char loaded;
int index;
short width;
short height;
} ImageCache;
typedef struct _image {
char *url;
char *ext;
short width;
short height;
short xoffset;
short yoffset;
short y;
short rows;
char *map;
char ismap;
int touch;
ImageCache *cache;
} Image;
#endif
typedef struct _anchor {
char *url;
char *target;
@@ -299,6 +356,9 @@ typedef struct _anchor {
int hseq;
short y;
short rows;
#ifdef USE_IMAGE
Image *image;
#endif
} Anchor;
#define NO_REFERER ((char*)-1)
@@ -347,6 +407,7 @@ typedef struct _Buffer {
FormList *formlist;
MapList *maplist;
HmarkerList *hmarklist;
HmarkerList *imarklist;
ParsedURL currentURL;
ParsedURL *baseURL;
char *baseTarget;
@@ -371,6 +432,8 @@ typedef struct _Buffer {
#ifdef USE_SSL
char *ssl_certificate;
#endif
char image_flag;
char need_reshape;
} Buffer;
@@ -515,6 +578,7 @@ struct readbuffer {
/* flags for loadGeneralFile */
#define RG_NOCACHE 1
#define RG_FRAME 2
#define RG_FRAME_SRC 4
struct html_feed_environ {
struct readbuffer *obuf;
@@ -587,6 +651,9 @@ struct cookie {
#define ALIGN_CENTER 0
#define ALIGN_LEFT 1
#define ALIGN_RIGHT 2
#define ALIGN_MIDDLE 4
#define ALIGN_TOP 5
#define ALIGN_BOTTOM 6
#define VALIGN_MIDDLE 0
#define VALIGN_TOP 1
@@ -647,6 +714,7 @@ global char ArgvIsURL init(FALSE);
global char MetaRefresh init(FALSE);
global char fmInitialized init(FALSE);
global char QuietMessage init(FALSE);
extern char GlobalKeymap[];
extern char EscKeymap[];
@@ -746,6 +814,14 @@ global int displayLink init(FALSE);
global int retryAsHttp init(TRUE);
global int showLineNum init(FALSE);
global int show_srch_str init(TRUE);
#ifdef USE_IMAGE
global char *Imgdisplay init(IMGDISPLAY);
global char *Imgsize init(IMGSIZE);
global int activeImage init(FALSE);
global int displayImage init(TRUE);
global int autoImage init(TRUE);
global int useExtImageViewer init(TRUE);
#endif
global char *Editor init(DEF_EDITOR);
#ifndef USE_W3MMAILER
global char *Mailer init(DEF_MAILER);
@@ -759,6 +835,9 @@ global char *ftppasswd init(NULL);
global int ftppass_hostnamegen init(TRUE);
#endif
global int do_download init(FALSE);
#ifdef USE_IMAGE
global char *image_source init(NULL);
#endif
global char *UserAgent init(NULL);
global int NoSendReferer init(FALSE);
global char *AcceptLang init(NULL);
@@ -857,7 +936,11 @@ global TextList *Cookie_reject_domains;
global TextList *Cookie_accept_domains;
#endif /* USE_COOKIE */
#ifdef USE_IMAGE
global int view_unseenobject init(FALSE);
#else
global int view_unseenobject init(TRUE);
#endif
#if defined(USE_SSL) && defined(USE_SSL_VERIFY)
global int ssl_verify_server init(FALSE);
@@ -875,6 +958,12 @@ global char *ssl_forbid_method init(NULL);
global int is_redisplay init(FALSE);
global int clear_buffer init(TRUE);
global double pixel_per_char init(DEFAULT_PIXEL_PER_CHAR);
global int set_pixel_per_char init(FALSE);
#ifdef USE_IMAGE
global double pixel_per_line init(DEFAULT_PIXEL_PER_LINE);
global int set_pixel_per_line init(FALSE);
global double image_scale init(100);
#endif
global int use_lessopen init(FALSE);
#ifdef JP_CHARSET
+8 -3
View File
@@ -1,4 +1,4 @@
/* $Id: frame.c,v 1.9 2002/01/25 14:59:14 ukai Exp $ */
/* $Id: frame.c,v 1.10 2002/01/31 17:54:51 ukai Exp $ */
#include "fm.h"
#include "parsetagx.h"
#include "myctype.h"
@@ -385,7 +385,7 @@ frame_download_source(struct frame_body *b, ParsedURL *currentURL,
w3m_dump |= DUMP_FRAME;
buf = loadGeneralFile(b->url,
baseURL ? baseURL : currentURL,
b->referer, flag, b->request);
b->referer, flag | RG_FRAME_SRC, b->request);
w3m_dump &= ~DUMP_FRAME;
is_redisplay = FALSE;
break;
@@ -399,7 +399,12 @@ frame_download_source(struct frame_body *b, ParsedURL *currentURL,
b->url = parsedURL2Str(&buf->currentURL)->ptr;
b->source = buf->sourcefile;
b->type = buf->type;
if (buf->real_scheme != SCM_LOCAL) {
if ((buf->real_scheme != SCM_LOCAL)
#ifdef USE_IMAGE
|| (activeImage && !useExtImageViewer &&
buf->real_type && !strncasecmp(buf->real_type, "image/", 6))
#endif
) {
tmp = tmpfname(TMPF_FRAME, NULL);
rename(buf->sourcefile, tmp->ptr);
b->source = tmp->ptr;
+3 -1
View File
@@ -1,4 +1,4 @@
# $Id: funcname.tab,v 1.6 2002/01/22 16:59:11 ukai Exp $
# $Id: funcname.tab,v 1.7 2002/01/31 17:54:51 ukai Exp $
# macro name function name
#----------------------------
@@@ nulcmd
@@ -14,6 +14,7 @@ COOKIE cooLst
DELETE_PREVBUF deletePrevBuf
DICT_WORD dictword
DICT_WORD_AT dictwordat
DISPLAY_IMAGE dispI
DOWN ldown1
DOWNLOAD svSrc
EDIT editBf
@@ -107,6 +108,7 @@ SHELL execsh
SHIFT_LEFT shiftl
SHIFT_RIGHT shiftr
SOURCE vwSrc
STOP_IMAGE stopI
SUBMIT submitForm
SUSPEND susp
UP lup1
+18 -12
View File
@@ -1,4 +1,4 @@
/* $Id: html.c,v 1.7 2001/12/06 15:31:58 ukai Exp $ */
/* $Id: html.c,v 1.8 2002/01/31 17:54:51 ukai Exp $ */
#include "html.h"
/* Define HTML Tag Infomation Table */
@@ -23,8 +23,10 @@ unsigned char ALST_DL[] = { ATTR_COMPACT, ATTR_CORE };
unsigned char ALST_PRE[] = { ATTR_FOR_TABLE, ATTR_CORE };
#define MAXA_PRE MAXA_CORE + 1
unsigned char ALST_IMG[] =
{ ATTR_SRC, ATTR_ALT, ATTR_WIDTH, ATTR_HEIGHT, ATTR_USEMAP, ATTR_CORE };
#define MAXA_IMG MAXA_CORE + 5
{ ATTR_SRC, ATTR_ALT, ATTR_WIDTH, ATTR_HEIGHT, ATTR_ALIGN, ATTR_USEMAP,
ATTR_ISMAP, ATTR_CORE
};
#define MAXA_IMG MAXA_CORE + 7
unsigned char ALST_TABLE[] =
{ ATTR_BORDER, ATTR_WIDTH, ATTR_HBORDER, ATTR_CELLSPACING,
ATTR_CELLPADDING, ATTR_VSPACE, ATTR_CORE
@@ -61,8 +63,9 @@ unsigned char ALST_ISINDEX[] = { ATTR_ACTION, ATTR_PROMPT, ATTR_CORE };
#define MAXA_ISINDEX MAXA_CORE + 2
unsigned char ALST_MAP[] = { ATTR_NAME, ATTR_CORE };
#define MAXA_MAP MAXA_CORE + 1
unsigned char ALST_AREA[] = { ATTR_HREF, ATTR_ALT, ATTR_CORE };
#define MAXA_AREA MAXA_CORE + 2
unsigned char ALST_AREA[] =
{ ATTR_HREF, ATTR_ALT, ATTR_SHAPE, ATTR_COORDS, ATTR_CORE };
#define MAXA_AREA MAXA_CORE + 4
unsigned char ALST_BASE[] = { ATTR_HREF, ATTR_TARGET, ATTR_CORE };
#define MAXA_BASE MAXA_CORE + 2
unsigned char ALST_BODY[] = { ATTR_BACKGROUND, ATTR_CORE };
@@ -94,8 +97,11 @@ unsigned char ALST_INPUT_ALT[] =
ATTR_SELECTNUMBER, ATTR_ROWS, ATTR_TOP_MARGIN, ATTR_BOTTOM_MARGIN
};
#define MAXA_INPUT_ALT 16
unsigned char ALST_IMG_ALT[] = { ATTR_SRC };
#define MAXA_IMG_ALT 1
unsigned char ALST_IMG_ALT[] =
{ ATTR_SRC, ATTR_WIDTH, ATTR_HEIGHT, ATTR_USEMAP, ATTR_ISMAP, ATTR_HSEQ,
ATTR_XOFFSET, ATTR_YOFFSET, ATTR_TOP_MARGIN, ATTR_BOTTOM_MARGIN
};
#define MAXA_IMG_ALT 10
unsigned char ALST_NOP[] = { ATTR_CORE };
#define MAXA_NOP MAXA_CORE
@@ -278,16 +284,16 @@ TagAttrInfo AttrMAP[MAX_TAGATTR] = {
{"selected", VTYPE_NONE, 0}, /* 41 ATTR_SELECTED */
{"label", VTYPE_STR, 0}, /* 42 ATTR_LABEL */
{"readonly", VTYPE_NONE, 0}, /* 43 ATTR_READONLY */
{"shape", VTYPE_STR, 0}, /* 44 ATTR_SHAPE */
{"coords", VTYPE_STR, 0}, /* 45 ATTR_COORDS */
{"ismap", VTYPE_NONE, 0}, /* 46 ATTR_ISMAP */
{NULL, VTYPE_NONE, 0}, /* 44 Undefined */
{NULL, VTYPE_NONE, 0}, /* 45 Undefined */
{NULL, VTYPE_NONE, 0}, /* 46 Undefined */
{NULL, VTYPE_NONE, 0}, /* 47 Undefined */
{NULL, VTYPE_NONE, 0}, /* 48 Undefined */
{NULL, VTYPE_NONE, 0}, /* 49 Undefined */
{NULL, VTYPE_NONE, 0}, /* 50 Undefined */
/* Internal attribute */
{"xoffset", VTYPE_NUMBER, AFLG_INT}, /* 49 ATTR_XOFFSET */
{"yoffset", VTYPE_NUMBER, AFLG_INT}, /* 50 ATTR_YOFFSET */
{"top_margin", VTYPE_NUMBER, AFLG_INT}, /* 51 ATTR_TOP_MARGIN, */
{"bottom_margin", VTYPE_NUMBER, AFLG_INT}, /* 52 ATTR_BOTTOM_MARGIN, */
{"tid", VTYPE_NUMBER, AFLG_INT}, /* 53 ATTR_TID */
+15 -4
View File
@@ -1,4 +1,4 @@
/* $Id: html.h,v 1.5 2001/12/06 15:31:58 ukai Exp $ */
/* $Id: html.h,v 1.6 2002/01/31 17:54:51 ukai Exp $ */
#ifndef _HTML_H
#define _HTML_H
#ifdef USE_SSL
@@ -248,11 +248,16 @@ typedef struct {
#define ATTR_START 40
#define ATTR_SELECTED 41
#define ATTR_LABEL 42
#define ATTR_READONLY 43
#define ATTR_READONLY 43
#define ATTR_SHAPE 44
#define ATTR_COORDS 45
#define ATTR_ISMAP 46
/* Internal attribute */
#define ATTR_TOP_MARGIN 51
#define ATTR_BOTTOM_MARGIN 52
#define ATTR_XOFFSET 49
#define ATTR_YOFFSET 50
#define ATTR_TOP_MARGIN 51
#define ATTR_BOTTOM_MARGIN 52
#define ATTR_TID 53
#define ATTR_FID 54
#define ATTR_FOR_TABLE 55
@@ -301,6 +306,12 @@ typedef struct tag_attribute_info {
#define VTYPE_MLENGTH 9
#define VTYPE_TYPE 10
#define SHAPE_UNKNOWN 0
#define SHAPE_DEFAULT 1
#define SHAPE_RECT 2
#define SHAPE_CIRCLE 3
#define SHAPE_POLY 4
extern TagInfo TagMAP[];
extern TagAttrInfo AttrMAP[];
+528
View File
@@ -0,0 +1,528 @@
/* $Id: image.c,v 1.1 2002/01/31 17:54:51 ukai Exp $ */
#include "fm.h"
#include <sys/types.h>
#include <signal.h>
#include <errno.h>
#include <unistd.h>
#ifdef HAVE_WAITPID
#include <sys/wait.h>
#endif
#ifdef USE_IMAGE
static image_index = 0;
/* display image */
typedef struct _termialImage {
ImageCache *cache;
short x;
short y;
short sx;
short sy;
short width;
short height;
} TerminalImage;
static TerminalImage *terminal_image = NULL;
static int n_terminal_image = 0;
static int max_terminal_image = 0;
static FILE *Imgdisplay_rf = NULL, *Imgdisplay_wf = NULL;
static pid_t Imgdisplay_pid = 0;
static int openImgdisplay();
static void closeImgdisplay();
void
initImage()
{
if (activeImage)
return;
if (getCharSize())
activeImage = TRUE;
}
int
getCharSize()
{
FILE *f;
Str tmp;
int w = 0, h = 0;
tmp = Strnew();
if (!strchr(Imgdisplay, '/'))
Strcat_m_charp(tmp, LIB_DIR, "/", NULL);
Strcat_m_charp(tmp, Imgdisplay, " -test 2> /dev/null", NULL);
f = popen(tmp->ptr, "r");
if (!f)
return FALSE;
fscanf(f, "%d %d", &w, &h);
pclose(f);
if (!(w > 0 && h > 0))
return FALSE;
if (! set_pixel_per_char)
pixel_per_char = (int)(1.0 * w / COLS + 0.5);
if (! set_pixel_per_line)
pixel_per_line = (int)(1.0 * h / LINES + 0.5);
return TRUE;
}
void
termImage()
{
if (!activeImage)
return;
clearImage();
if (Imgdisplay_wf) {
fputs("2;\n", Imgdisplay_wf); /* ClearImage() */
fflush(Imgdisplay_wf);
}
closeImgdisplay();
}
static int
openImgdisplay()
{
int fdr[2], fdw[2];
char *cmd;
if (pipe(fdr) < 0)
goto err0;
if (pipe(fdw) < 0)
goto err1;
flush_tty();
Imgdisplay_pid = fork();
if (Imgdisplay_pid < 0)
goto err2;
if (Imgdisplay_pid == 0) {
/* child */
reset_signals();
signal(SIGINT, SIG_IGN);
#ifdef HAVE_SETPGRP
setpgrp();
#endif
close_tty();
close(fdr[0]);
close(fdw[1]);
dup2(fdw[0], 0);
dup2(fdr[1], 1);
close(2);
if (!strchr(Imgdisplay, '/'))
cmd = Strnew_m_charp(LIB_DIR, "/", Imgdisplay, NULL)->ptr;
else
cmd = Imgdisplay;
execl("/bin/sh", "sh", "-c", cmd, NULL);
exit(1);
}
close(fdr[1]);
close(fdw[0]);
Imgdisplay_rf = fdopen(fdr[0], "r");
Imgdisplay_wf = fdopen(fdw[1], "w");
activeImage = TRUE;
return TRUE;
err2:
close(fdw[0]);
close(fdw[1]);
err1:
close(fdr[0]);
close(fdr[1]);
err0:
Imgdisplay_rf = NULL;
Imgdisplay_wf = NULL;
Imgdisplay_pid = 0;
activeImage = FALSE;
return FALSE;
}
static void
closeImgdisplay()
{
if (Imgdisplay_rf)
fclose(Imgdisplay_rf);
if (Imgdisplay_wf)
fclose(Imgdisplay_wf);
if (Imgdisplay_pid)
kill(Imgdisplay_pid, SIGKILL);
Imgdisplay_rf = NULL;
Imgdisplay_wf = NULL;
Imgdisplay_pid = 0;
}
void
addImage(ImageCache * cache, int x, int y, int sx, int sy, int w, int h)
{
TerminalImage *i;
if (!activeImage)
return;
if (n_terminal_image >= max_terminal_image) {
max_terminal_image = max_terminal_image ? (2 * max_terminal_image) : 8;
terminal_image = New_Reuse(TerminalImage, terminal_image,
max_terminal_image);
}
i = &terminal_image[n_terminal_image];
i->cache = cache;
i->x = x;
i->y = y;
i->sx = sx;
i->sy = sy;
i->width = w;
i->height = h;
n_terminal_image++;
}
void
drawImage()
{
static char buf[64];
int j, draw = FALSE;
TerminalImage *i;
if (!activeImage)
return;
if (!n_terminal_image)
return;
for (j = 0; j < n_terminal_image; j++) {
i = &terminal_image[j];
if (!(i->cache->loaded == IMG_FLAG_LOADED &&
i->width > 0 && i->height > 0))
continue;
if (!(Imgdisplay_rf && Imgdisplay_wf)) {
if (!openImgdisplay())
return;
}
if (!draw) {
fputs("3;\n", Imgdisplay_wf); /* XSync() */
draw = TRUE;
}
if (i->cache->index > 0) {
i->cache->index *= -1;
fputs("0;", Imgdisplay_wf); /* DrawImage() */
}
else
fputs("1;", Imgdisplay_wf); /* DrawImage(redraw) */
sprintf(buf, "%d;%d;%d;%d;%d;%d;%d;%d;%d;",
(-i->cache->index - 1) % MAX_IMAGE + 1, i->x, i->y,
(i->cache->width > 0) ? i->cache->width : 0,
(i->cache->height > 0) ? i->cache->height : 0,
i->sx, i->sy, i->width, i->height);
fputs(buf, Imgdisplay_wf);
fputs(i->cache->file, Imgdisplay_wf);
fputs("\n", Imgdisplay_wf);
fputs("4;\n", Imgdisplay_wf); /* put '\n' */
again:
if (fflush(Imgdisplay_wf) != 0) {
switch (errno) {
case EINTR:
goto again;
default:
goto err;
}
}
if (!fgetc(Imgdisplay_rf))
goto err;
}
if (!draw)
return;
fputs("3;\n", Imgdisplay_wf); /* XSync() */
fputs("4;\n", Imgdisplay_wf); /* put '\n' */
again2:
if (fflush(Imgdisplay_wf) != 0) {
switch (errno) {
case EINTR:
goto again2;
default:
goto err;
}
}
if (!fgetc(Imgdisplay_rf))
goto err;
/*
touch_line();
touch_column(CurColumn);
#ifdef JP_CHARSET
if (CurColumn > 0 &&
CHMODE(ScreenImage[CurLine]->lineprop[CurColumn]) == C_WCHAR2)
touch_column(CurColumn - 1);
else if (CurColumn < COLS - 1 &&
CHMODE(ScreenImage[CurLine]->lineprop[CurColumn]) == C_WCHAR1)
touch_column(CurColumn + 1);
#endif
*/
touch_cursor();
refresh();
return;
err:
closeImgdisplay();
image_index += MAX_IMAGE;
}
void
clearImage()
{
if (!activeImage)
return;
n_terminal_image = 0;
}
/* load image */
static Hash_sv *image_hash = NULL;
static Hash_sv *image_file = NULL;
static GeneralList *image_list = NULL;
static ImageCache *image_cache = NULL;
static pid_t image_pid = 0;
static int need_load_image = FALSE;
static MySignalHandler
load_image_handler(SIGNAL_ARG)
{
need_load_image = TRUE;
SIGNAL_RETURN;
}
static MySignalHandler
load_image_next(SIGNAL_ARG)
{
need_load_image = TRUE;
loadImage(IMG_FLAG_NEXT);
SIGNAL_RETURN;
}
void
deleteImage(Buffer *buf)
{
AnchorList *al;
Anchor *a;
int i;
if (!buf)
return;
al = buf->img;
if (!al)
return;
for (i = 0, a = al->anchors; i < al->nanchor; i++, a++) {
if (a->image && a->image->cache &&
a->image->cache->loaded != IMG_FLAG_UNLOADED &&
a->image->cache->index < 0)
unlink(a->image->cache->file);
}
loadImage(IMG_FLAG_STOP);
}
void
getAllImage(Buffer *buf)
{
AnchorList *al;
Anchor *a;
ParsedURL *current;
int i;
if (!buf)
return;
al = buf->img;
if (!al)
return;
current = baseURL(buf);
for (i = 0, a = al->anchors; i < al->nanchor; i++, a++) {
if (a->image)
a->image->cache = getImage(a->image, current, buf->image_flag);
}
}
void
loadImage(int flag)
{
int wait_st;
if (flag == IMG_FLAG_STOP) {
if (image_pid) {
kill(image_pid, SIGKILL);
#ifdef HAVE_WAITPID
waitpid(image_pid, &wait_st, 0);
#else
wait(&wait_st);
#endif
image_pid = 0;
}
image_cache = NULL;
image_list = NULL;
image_file = NULL;
need_load_image = FALSE;
return;
}
if (flag == IMG_FLAG_NEXT && need_load_image) {
struct stat st;
if (image_pid) {
#ifdef HAVE_WAITPID
waitpid(image_pid, &wait_st, 0);
#else
wait(&wait_st);
#endif
image_pid = 0;
}
if (!stat(image_cache->file, &st)) {
image_cache->loaded = IMG_FLAG_LOADED;
if (getImageSize(image_cache)) {
if (Currentbuf)
Currentbuf->need_reshape = TRUE;
}
}
else {
image_cache->loaded = IMG_FLAG_ERROR;
}
image_cache = NULL;
drawImage();
}
need_load_image = FALSE;
if (flag == IMG_FLAG_START)
signal(SIGUSR1, load_image_handler);
else
signal(SIGUSR1, load_image_next);
if (image_cache)
return;
image_pid = 0;
if (!image_list)
return;
while (1) {
image_cache = (ImageCache *) popValue(image_list);
if (!image_cache) {
if (Currentbuf && Currentbuf->need_reshape)
displayBuffer(Currentbuf, B_NORMAL);
return;
}
if (image_cache->loaded == IMG_FLAG_UNLOADED)
break;
}
flush_tty();
if ((image_pid = fork()) == 0) {
Buffer *b;
reset_signals();
signal(SIGINT, SIG_IGN);
close_tty();
QuietMessage = TRUE;
fmInitialized = FALSE;
image_source = image_cache->file;
b = loadGeneralFile(image_cache->url, image_cache->current, NULL, 0,
NULL);
if (!b || !b->real_type || strncasecmp(b->real_type, "image/", 6))
unlink(image_cache->file);
kill(getppid(), SIGUSR1);
exit(0);
}
}
ImageCache *
getImage(Image * image, ParsedURL *current, int flag)
{
Str key;
ImageCache *cache;
if (!activeImage)
return;
if (!image_hash)
image_hash = newHash_sv(100);
if (image->cache)
cache = image->cache;
else {
key = Sprintf("%d;%d;%s", image->width, image->height, image->url);
cache = (ImageCache *) getHash_sv(image_hash, key->ptr, NULL);
}
if (cache && cache->index && abs(cache->index) <= image_index - MAX_IMAGE) {
struct stat st;
if (stat(cache->file, &st))
cache->loaded = IMG_FLAG_UNLOADED;
cache->index = 0;
}
if (!cache) {
if (flag == IMG_FLAG_SKIP)
return NULL;
cache = New(ImageCache);
cache->url = image->url;
cache->current = current;
cache->file = tmpfname(TMPF_DFL, image->ext)->ptr;
cache->index = 0;
cache->loaded = IMG_FLAG_UNLOADED;
cache->width = image->width;
cache->height = image->height;
putHash_sv(image_hash, key->ptr, (void *)cache);
pushText(fileToDelete, cache->file);
}
if (flag != IMG_FLAG_SKIP) {
if (cache->loaded == IMG_FLAG_UNLOADED) {
if (!image_file)
image_file = newHash_sv(100);
if (!getHash_sv(image_file, cache->file, NULL)) {
putHash_sv(image_file, cache->file, (void *)cache);
if (!image_list)
image_list = newGeneralList();
pushValue(image_list, (void *)cache);
}
}
if (!cache->index)
cache->index = ++image_index;
}
if (cache->loaded == IMG_FLAG_LOADED)
getImageSize(cache);
return cache;
}
int
getImageSize(ImageCache * cache)
{
Str tmp;
FILE *f;
int w = 0, h = 0;
if (!activeImage)
return 0;
if (!cache || cache->loaded != IMG_FLAG_LOADED ||
(cache->width > 0 && cache->height > 0))
return 0;
tmp = Strnew();
if (!strchr(Imgsize, '/'))
Strcat_m_charp(tmp, LIB_DIR, "/", NULL);
Strcat_m_charp(tmp, Imgsize, " ", shell_quote(cache->file), " 2> /dev/null",
NULL);
f = popen(tmp->ptr, "r");
if (!f)
return 0;
fscanf(f, "%d %d", &w, &h);
pclose(f);
if (!(w > 0 && h > 0))
return 0;
w = (int)(w * image_scale / 100 + 0.5);
if (w == 0)
w = 1;
h = (int)(h * image_scale / 100 + 0.5);
if (h == 0)
h = 1;
if (cache->width < 0 && cache->height < 0) {
cache->width = w;
cache->height = h;
}
else if (cache->width < 0) {
cache->width = (int)((double)cache->height * w / h + 0.5);
}
else if (cache->height < 0) {
cache->height = (int)((double)cache->width * h / w + 0.5);
}
if (cache->width == 0)
cache->width = 1;
if (cache->height == 0)
cache->height = 1;
tmp = Sprintf("%d;%d;%s", cache->width, cache->height, cache->url);
putHash_sv(image_hash, tmp->ptr, (void *)cache);
return 1;
}
#endif
+113 -15
View File
@@ -1,4 +1,4 @@
/* $Id: main.c,v 1.76 2002/01/31 04:49:42 ukai Exp $ */
/* $Id: main.c,v 1.77 2002/01/31 17:54:52 ukai Exp $ */
#define MAINPROGRAM
#include "fm.h"
#include <signal.h>
@@ -109,6 +109,9 @@ fversion(FILE * f)
#else
"lang=en"
#endif
#ifdef USE_IMAGE
",image"
#endif
#ifdef USE_COLOR
",color"
#ifdef USE_ANSI_COLOR
@@ -193,6 +196,10 @@ fusage(FILE * f, int err)
" -cols width specify column width (used with -dump)\n");
fprintf(f,
" -ppc count specify the number of pixels per character (4.0...32.0)\n");
#ifdef USE_IMAGE
fprintf(f,
" -ppl count specify the number of pixels per line (4.0...64.0)\n");
#endif
fprintf(f, " -dump dump formatted page into stdout\n");
fprintf(f,
" -dump_head dump response of HEAD request into stdout\n");
@@ -582,9 +589,24 @@ MAIN(int argc, char **argv, char **envp)
usage();
ppc = atof(argv[i]);
if (ppc >= MINIMUM_PIXEL_PER_CHAR &&
ppc <= MAXIMUM_PIXEL_PER_CHAR)
ppc <= MAXIMUM_PIXEL_PER_CHAR) {
pixel_per_char = ppc;
set_pixel_per_char = TRUE;
}
}
#ifdef USE_IMAGE
else if (!strcmp("-ppl", argv[i])) {
double ppc;
if (++i >= argc)
usage();
ppc = atof(argv[i]);
if (ppc >= MINIMUM_PIXEL_PER_CHAR &&
ppc <= MAXIMUM_PIXEL_PER_CHAR * 2) {
pixel_per_line = ppc;
set_pixel_per_line = TRUE;
}
}
#endif
else if (!strcmp("-num", argv[i]))
showLineNum = TRUE;
else if (!strcmp("-no-proxy", argv[i]))
@@ -961,8 +983,16 @@ MAIN(int argc, char **argv, char **envp)
resize_screen();
}
signal(SIGWINCH, resize_handler);
#endif
#ifdef USE_IMAGE
if (activeImage && displayImage)
loadImage(IMG_FLAG_NEXT);
#endif
c = getch();
#ifdef USE_IMAGE
if (activeImage && displayImage)
loadImage(IMG_FLAG_START);
#endif
#ifdef SIGWINCH
signal(SIGWINCH, resize_hook);
#endif
@@ -1145,6 +1175,9 @@ pushBuffer(Buffer *buf)
{
Buffer *b;
#ifdef USE_IMAGE
deleteImage(Currentbuf);
#endif
if (clear_buffer)
tmpClearBuffer(Currentbuf);
if (Firstbuf == Currentbuf) {
@@ -2121,6 +2154,10 @@ qquitfm(void)
void
quitfm(void)
{
#ifdef USE_IMAGE
if (activeImage)
termImage();
#endif
fmTerm();
#ifdef USE_COOKIE
save_cookies();
@@ -2169,8 +2206,13 @@ selBuf(void)
}
} while (!ok);
if (clear_buffer) {
for (buf = Firstbuf; buf != NULL; buf = buf->nextBuffer)
for (buf = Firstbuf; buf != NULL; buf = buf->nextBuffer) {
if (buf == Currentbuf)
continue;
#ifdef USE_IMAGE
deleteImage(buf);
#endif
if (clear_buffer)
tmpClearBuffer(buf);
}
displayBuffer(Currentbuf, B_FORCE_REDRAW);
@@ -2632,11 +2674,26 @@ followA(void)
Line *l;
Anchor *a;
ParsedURL u;
#ifdef USE_IMAGE
int x = 0, y = 0, map = 0;
#endif
char *url;
if (Currentbuf->firstLine == NULL)
return;
l = Currentbuf->currentLine;
#ifdef USE_IMAGE
a = retrieveCurrentImg(Currentbuf);
if (a && a->image && a->image->map) {
_followForm(FALSE);
return;
}
if (a && a->image && a->image->ismap) {
getMapXY(Currentbuf, retrieveCurrentImg(Currentbuf), &x, &y);
map = 1;
}
#endif
a = retrieveCurrentAnchor(Currentbuf);
if (a == NULL) {
_followForm(FALSE);
@@ -2672,7 +2729,12 @@ followA(void)
return;
}
#endif /* USE_NNTP */
loadLink(a->url, a->target, a->referer, NULL);
url = a->url;
#ifdef USE_IMAGE
if (map)
url = Sprintf("%s?%d,%d", a->url, x, y)->ptr;
#endif
loadLink(url, a->target, a->referer, NULL);
displayBuffer(Currentbuf, B_NORMAL);
}
@@ -2842,14 +2904,18 @@ query_from_followform(Str *query, FormItemList *fi, int multipart)
}
if (multipart) {
if (f2->type == FORM_INPUT_IMAGE) {
int x = 0, y = 0;
#ifdef USE_IMAGE
getMapXY(Currentbuf, retrieveCurrentImg(Currentbuf), &x, &y);
#endif
*query = Strdup(conv_form_encoding(f2->name, fi, Currentbuf));
Strcat_charp(*query, ".x");
form_write_data(body, fi->parent->boundary, (*query)->ptr,
"1");
Sprintf("%d", x)->ptr);
*query = Strdup(conv_form_encoding(f2->name, fi, Currentbuf));
Strcat_charp(*query, ".y");
form_write_data(body, fi->parent->boundary, (*query)->ptr,
"1");
Sprintf("%d", y)->ptr);
}
else if (f2->name && f2->name->length > 0 && f2->value != NULL) {
/* not IMAGE */
@@ -2870,14 +2936,18 @@ query_from_followform(Str *query, FormItemList *fi, int multipart)
else {
/* not multipart */
if (f2->type == FORM_INPUT_IMAGE) {
int x = 0, y = 0;
#ifdef USE_IMAGE
getMapXY(Currentbuf, retrieveCurrentImg(Currentbuf), &x, &y);
#endif
Strcat(*query,
Str_form_quote(conv_form_encoding
(f2->name, fi, Currentbuf)));
Strcat_charp(*query, ".x=1&");
Strcat(*query, Sprintf(".x=%d&", x));
Strcat(*query,
Str_form_quote(conv_form_encoding
(f2->name, fi, Currentbuf)));
Strcat_charp(*query, ".y=1");
Strcat(*query, Sprintf(".y=%d", y));
}
else {
/* not IMAGE */
@@ -3776,6 +3846,10 @@ setOpt(void)
}
if (set_param_option(opt))
sync_with_option();
#ifdef USE_IMAGE
if (activeImage)
displayBuffer(Currentbuf, B_REDRAW_IMAGE);
#endif
displayBuffer(Currentbuf, B_FORCE_REDRAW);
}
@@ -3817,12 +3891,8 @@ follow_map(struct parsed_tagarg *arg)
ParsedURL p_url;
a = retrieveCurrentImg(Currentbuf);
if (a != NULL)
x = Currentbuf->cursorX - Currentbuf->pos + a->start.pos +
Currentbuf->rootX;
else
x = Currentbuf->cursorX + Currentbuf->rootX;
url = follow_map_menu(Currentbuf, arg, x, Currentbuf->cursorY + 2);
x = Currentbuf->cursorX + Currentbuf->rootX;
url = follow_map_menu(Currentbuf, arg, a, x, Currentbuf->cursorY);
if (url == NULL || *url == '\0')
return;
if (*url == '#') {
@@ -4448,6 +4518,34 @@ curlno()
disp_message(tmp->ptr, FALSE);
}
#ifdef USE_IMAGE
void
dispI(void)
{
if (!displayImage)
initImage();
if (!activeImage)
return;
if (!displayImage || Currentbuf->image_flag == IMG_FLAG_SKIP) {
displayImage = TRUE;
if (!(Currentbuf->type && !strcmp(Currentbuf->type, "text/html")))
return;
Currentbuf->image_flag = IMG_FLAG_AUTO;
Currentbuf->need_reshape = TRUE;
displayBuffer(Currentbuf, B_REDRAW_IMAGE);
}
}
void
stopI(void)
{
if (!activeImage)
return;
Currentbuf->image_flag = IMG_FLAG_SKIP;
displayBuffer(Currentbuf, B_NORMAL);
}
#endif
#ifdef USE_MOUSE
static void
+204 -19
View File
@@ -1,18 +1,75 @@
/* $Id: map.c,v 1.4 2001/11/24 02:01:26 ukai Exp $ */
/* $Id: map.c,v 1.5 2002/01/31 17:54:52 ukai Exp $ */
/*
* client-side image maps
*/
#include "fm.h"
#include <math.h>
#ifdef MENU_MAP
#ifdef USE_IMAGE
static int
inMapArea(MapArea * a, int x, int y)
{
int i;
double r1, r2, s, c, t;
if (!a)
return FALSE;
switch (a->shape) {
case SHAPE_RECT:
if (x >= a->coords[0] && y >= a->coords[1] &&
x <= a->coords[2] && y <= a->coords[3])
return TRUE;
break;
case SHAPE_CIRCLE:
if ((x - a->coords[0]) * (x - a->coords[0])
+ (y - a->coords[1]) * (y - a->coords[1])
<= a->coords[2] * a->coords[2])
return TRUE;
break;
case SHAPE_POLY:
for (t = 0, i = 0; i < a->ncoords; i += 2) {
r1 = sqrt((double)(x - a->coords[i]) * (x - a->coords[i])
+ (double)(y - a->coords[i + 1]) * (y -
a->coords[i + 1]));
r2 = sqrt((double)(x - a->coords[i + 2]) * (x - a->coords[i + 2])
+ (double)(y - a->coords[i + 3]) * (y -
a->coords[i + 3]));
if (r1 == 0 || r2 == 0)
return TRUE;
s = ((double)(x - a->coords[i]) * (y - a->coords[i + 3])
- (double)(x - a->coords[i + 2]) * (y -
a->coords[i +
1])) / r1 / r2;
c = ((double)(x - a->coords[i]) * (x - a->coords[i + 2])
+ (double)(y - a->coords[i + 1]) * (y -
a->coords[i +
3])) / r1 / r2;
t += atan2(s, c);
}
if (fabs(t) > 2 * 3.14)
return TRUE;
break;
case SHAPE_DEFAULT:
return TRUE;
default:
break;
}
return FALSE;
}
#endif
char *
follow_map_menu(Buffer *buf, struct parsed_tagarg *arg, int x, int y)
follow_map_menu(Buffer *buf, struct parsed_tagarg *arg, Anchor *a_img, int x,
int y)
{
MapList *ml;
ListItem *al;
MapArea *a;
char *name;
TextListItem *t, *s;
int i, n, selected = -1;
int i, n, selected = -1, initial;
char **label;
int px, py, map = 0;
name = tag_get_value(arg, "link");
if (name == NULL)
@@ -22,24 +79,49 @@ follow_map_menu(Buffer *buf, struct parsed_tagarg *arg, int x, int y)
if (!Strcmp_charp(ml->name, name))
break;
}
if (ml == NULL)
if (ml == NULL || ml->area == NULL)
return NULL;
for (n = 0, t = ml->urls->first; t != NULL; n++, t = t->next) ;
n = ml->area->nitem;
if (n == 0)
return NULL;
label = New_N(char *, n + 1);
for (i = 0, t = ml->urls->first, s = ml->alts->first; t != NULL;
i++, t = t->next, s = s->next)
label[i] = *s->ptr ? s->ptr : t->ptr;
#ifdef USE_IMAGE
if (getMapXY(buf, a_img, &px, &py))
map = 1;
#endif
initial = -n;
for (i = 0, al = ml->area->first; al != NULL; i++, al = al->next) {
a = (MapArea *) al->ptr;
if (a) {
label[i] = *a->alt ? a->alt : a->url;
#ifdef USE_IMAGE
if (initial < 0 && map && inMapArea(a, px, py)) {
if (a->shape == SHAPE_DEFAULT) {
if (initial == -n)
initial = -i;
}
else
initial = i;
}
#endif
}
else
label[i] = "";
}
label[n] = NULL;
if (initial == -n)
initial = 0;
else if (initial < 0)
initial *= -1;
optionMenu(x, y, label, &selected, 0, NULL);
optionMenu(x, y, label, &selected, initial, NULL);
if (selected >= 0) {
for (i = 0, t = ml->urls->first; t != NULL; i++, t = t->next)
if (i == selected)
return t->ptr;
for (i = 0, al = ml->area->first; al != NULL; i++, al = al->next) {
if (al->ptr && i == selected)
return ((MapArea *) al->ptr)->url;
}
}
return NULL;
}
@@ -53,8 +135,9 @@ follow_map_panel(Buffer *buf, struct parsed_tagarg *arg)
{
Str mappage;
MapList *ml;
ListItem *al;
MapArea *a;
char *name;
TextListItem *t, *s;
ParsedURL pu;
name = tag_get_value(arg, "link");
@@ -69,15 +152,17 @@ follow_map_panel(Buffer *buf, struct parsed_tagarg *arg)
return NULL;
mappage = Strnew_charp(map1);
for (t = ml->urls->first, s = ml->alts->first; t != NULL;
t = t->next, s = s->next) {
parseURL2(t->ptr, &pu, baseURL(buf));
for (al = ml->area->first; al != NULL; al = al->next) {
a = (MapArea *) al->ptr;
if (!a)
continue;
parseURL2(a->url, &pu, baseURL(buf));
Strcat_charp(mappage, "<a href=\"");
Strcat_charp(mappage, html_quote(parsedURL2Str(&pu)->ptr));
Strcat_charp(mappage, "\">");
Strcat_charp(mappage, html_quote(s->ptr));
Strcat_charp(mappage, html_quote(a->alt));
Strcat_charp(mappage, " ");
Strcat_charp(mappage, html_quote(t->ptr));
Strcat_charp(mappage, html_quote(a->url));
Strcat_charp(mappage, "</a><br>\n");
}
Strcat_charp(mappage, "</body></html>");
@@ -86,6 +171,106 @@ follow_map_panel(Buffer *buf, struct parsed_tagarg *arg)
}
#endif
#ifdef USE_IMAGE
int
getMapXY(Buffer *buf, Anchor *a, int *x, int *y)
{
if (!buf || !a || !a->image || !x || !y)
return 0;
*x = (int)((buf->currentColumn + buf->cursorX
- COLPOS(buf->currentLine, a->start.pos) + 0.5)
* pixel_per_char) - a->image->xoffset;
*y = (int)((buf->currentLine->linenumber - a->image->y + 0.5)
* pixel_per_line) - a->image->yoffset;
if (*x <= 0)
*x = 1;
if (*y <= 0)
*y = 1;
return 1;
}
#endif
MapArea *
newMapArea(char *url, char *alt, char *shape, char *coords)
{
MapArea *a = New(MapArea);
#ifdef MENU_MAP
char *p;
int i, max;
#endif
a->url = url;
a->alt = alt ? alt : "";
#ifdef MENU_MAP
#ifdef USE_IMAGE
a->shape = SHAPE_RECT;
if (shape) {
if (!strcasecmp(shape, "default"))
a->shape = SHAPE_DEFAULT;
else if (!strncasecmp(shape, "rect", 4))
a->shape = SHAPE_RECT;
else if (!strncasecmp(shape, "circ", 4))
a->shape = SHAPE_CIRCLE;
else if (!strncasecmp(shape, "poly", 4))
a->shape = SHAPE_POLY;
else
a->shape = SHAPE_UNKNOWN;
}
a->coords = NULL;
a->ncoords = 0;
if (a->shape == SHAPE_UNKNOWN || a->shape == SHAPE_DEFAULT)
return a;
if (!coords) {
a->shape = SHAPE_UNKNOWN;
return a;
}
if (a->shape == SHAPE_RECT) {
a->coords = New_N(short, 4);
a->ncoords = 4;
}
else if (a->shape == SHAPE_CIRCLE) {
a->coords = New_N(short, 3);
a->ncoords = 3;
}
max = a->ncoords;
for (i = 0, p = coords; (a->shape == SHAPE_POLY || i < a->ncoords) && *p;) {
while (IS_SPACE(*p))
p++;
if (!IS_DIGIT(*p))
break;
if (a->shape == SHAPE_POLY) {
if (max <= i) {
max = i ? i * 2 : 6;
a->coords = New_Reuse(short, a->coords, max + 2);
}
a->ncoords++;
}
a->coords[i] = (short)atoi(p);
i++;
while (IS_DIGIT(*p))
p++;
if (*p != ',' && !IS_SPACE(*p))
break;
while (IS_SPACE(*p))
p++;
if (*p == ',')
p++;
}
if (i != a->ncoords || (a->shape == SHAPE_POLY && a->ncoords < 6)) {
a->shape = SHAPE_UNKNOWN;
a->coords = NULL;
a->ncoords = 0;
}
if (a->shape == SHAPE_POLY) {
a->ncoords = a->ncoords / 2 * 2;
a->coords[a->ncoords] = a->coords[0];
a->coords[a->ncoords + 1] = a->coords[1];
}
#endif
#endif
return a;
}
/* append frame URL */
static void
append_frame_info(Buffer *buf, Str html, struct frameset *set, int level)
+8 -3
View File
@@ -1,4 +1,4 @@
/* $Id: menu.c,v 1.13 2002/01/16 02:51:37 ukai Exp $ */
/* $Id: menu.c,v 1.14 2002/01/31 17:54:52 ukai Exp $ */
/*
* w3m menu.c
*/
@@ -1327,8 +1327,13 @@ smChBuf(void)
return;
for (i = 0, buf = Firstbuf; i < SelectV; i++, buf = buf->nextBuffer) ;
Currentbuf = buf;
if (clear_buffer) {
for (buf = Firstbuf; buf != NULL; buf = buf->nextBuffer)
for (buf = Firstbuf; buf != NULL; buf = buf->nextBuffer) {
if (buf == Currentbuf)
continue;
#ifdef USE_IMAGE
deleteImage(buf);
#endif
if (clear_buffer)
tmpClearBuffer(buf);
}
}
+7 -1
View File
@@ -1,4 +1,4 @@
/* $Id: parsetagx.c,v 1.7 2001/12/02 16:26:08 ukai Exp $ */
/* $Id: parsetagx.c,v 1.8 2002/01/31 17:54:53 ukai Exp $ */
#include "fm.h"
#include "myctype.h"
#include "indep.h"
@@ -73,6 +73,12 @@ toAlign(char *oval, int *align)
*align = ALIGN_RIGHT;
else if (strcasecmp(oval, "center") == 0)
*align = ALIGN_CENTER;
else if (strcasecmp(oval, "top") == 0)
*align = ALIGN_TOP;
else if (strcasecmp(oval, "bottom") == 0)
*align = ALIGN_BOTTOM;
else if (strcasecmp(oval, "middle") == 0)
*align = ALIGN_MIDDLE;
else
return 0;
return 1;
+42 -4
View File
@@ -1,4 +1,4 @@
/* $Id: proto.h,v 1.32 2002/01/31 03:55:35 ukai Exp $ */
/* $Id: proto.h,v 1.33 2002/01/31 17:54:56 ukai Exp $ */
/*
* This file was automatically generated by version 1.7 of cextract.
* Manual editing not recommended.
@@ -102,6 +102,13 @@ extern void rFrame(void);
extern void extbrz(void);
extern void linkbrz(void);
extern void curlno(void);
#ifdef USE_IMAGE
extern void dispI(void);
extern void stopI(void);
#else
#define dispI nulcmd
#define stopI nulcmd
#endif
#ifdef USE_ALARM
extern void setAlarm(void);
extern void setAlarmEvent(int sec, short status, int cmd, void *data);
@@ -137,7 +144,14 @@ extern void save_fonteffect(struct html_feed_environ *h_env,
struct readbuffer *obuf);
extern void restore_fonteffect(struct html_feed_environ *h_env,
struct readbuffer *obuf);
extern Str process_img(struct parsed_tag *tag);
#ifdef USE_IMAGE
extern void deleteImage(Buffer *buf);
extern void getAllImage(Buffer *buf);
extern void loadImage(int flag);
extern ImageCache *getImage(Image * image, ParsedURL *current, int flag);
extern int getImageSize(ImageCache * cache);
#endif
extern Str process_img(struct parsed_tag *tag, int width);
extern Str process_anchor(struct parsed_tag *tag, char *tagbuf);
extern Str process_input(struct parsed_tag *tag);
extern void process_select(struct parsed_tag *tag);
@@ -168,6 +182,9 @@ extern Buffer *loadHTMLString(Str page);
extern Buffer *loadGopherDir(URLFile *uf, Buffer *newBuf);
#endif /* USE_GOPHER */
extern Buffer *loadBuffer(URLFile *uf, Buffer *newBuf);
#ifdef USE_IMAGE
extern Buffer *loadImageBuffer(URLFile *uf, Buffer *newBuf);
#endif
extern void saveBuffer(Buffer *buf, FILE * f);
extern void saveBufferDelNum(Buffer *buf, FILE * f, int del);
extern Buffer *getshell(char *cmd);
@@ -316,11 +333,15 @@ extern void form_write_from_file(FILE * f, char *boundary, char *name,
char *filename, char *file);
extern void follow_map(struct parsed_tagarg *arg);
#ifdef MENU_MAP
extern char *follow_map_menu(Buffer *buf, struct parsed_tagarg *arg, int x,
int y);
extern char *follow_map_menu(Buffer *buf, struct parsed_tagarg *arg,
Anchor *a_img, int x, int y);
#else
extern Buffer *follow_map_panel(Buffer *buf, struct parsed_tagarg *arg);
#endif
#ifdef USE_IMAGE
extern int getMapXY(Buffer *buf, Anchor *a, int *x, int *y);
#endif
extern MapArea *newMapArea(char *url, char *alt, char *shape, char *coords);
extern Buffer *page_info_panel(Buffer *buf);
extern struct frame_body *newFrame(struct parsed_tag *tag, Buffer *buf);
extern struct frameset *newFrameSet(struct parsed_tag *tag);
@@ -397,6 +418,9 @@ extern void toggle_stand(void);
extern char getch(void);
extern void bell(void);
extern void sleep_till_anykey(int sec, int purge);
#ifdef USE_IMAGE
extern void touch_cursor();
#endif
#ifdef JP_CHARSET
extern char *GetSICode(char key);
extern char *GetSOCode(char key);
@@ -526,6 +550,11 @@ extern void reMark(void);
#define prevMk nulcmd
#define reMark nulcmd
#endif /* not USE_MARK */
#ifdef JP_CHARSET
extern char *cURLcode(char *url, char code);
#else
#define cURLcode(url,buf) (url)
#endif
#ifdef USE_MOUSE
extern void mouse(void);
@@ -539,6 +568,15 @@ extern void msToggle(void);
#define msToggle nulcmd
#endif /* not USE_MOUSE */
#ifdef USE_IMAGE
extern void initImage(void);
extern void termImage(void);
extern void addImage(ImageCache * cache, int x, int y, int sx, int sy, int w,
int h);
extern void drawImage(void);
extern void clearImage(void);
#endif
extern char *searchKeyData(void);
extern void initKeymap(void);
+50 -2
View File
@@ -1,4 +1,4 @@
/* $Id: rc.c,v 1.37 2002/01/25 15:13:55 ukai Exp $ */
/* $Id: rc.c,v 1.38 2002/01/31 17:54:56 ukai Exp $ */
/*
* Initialization file etc.
*/
@@ -52,11 +52,13 @@ static char *config_file = NULL;
#endif
#define P_PIXELS 8
#define P_NZINT 9
#define P_SCALE 10
#if LANG == JA
#define CMT_HELPER "外部ビューアの編集"
#define CMT_TABSTOP "タブ幅"
#define CMT_PIXEL_PER_CHAR "文字幅 (4.0...32.0)"
#define CMT_PIXEL_PER_LINE "一行の高さ (4.0...64.0)"
#define CMT_PAGERLINE "ページャとして利用した時に保存される行数"
#define CMT_HISTSIZE "保持するURL履歴の数"
#define CMT_SAVEHIST "URL履歴の保存"
@@ -65,6 +67,14 @@ static char *config_file = NULL;
#define CMT_ARGV_IS_URL "scheme のない引数も URL とみなす"
#define CMT_TSELF "targetが未指定の場合に_selfを使用する"
#define CMT_DISPLINK "リンク先の自動表示"
#ifdef USE_IMAGE
#define CMT_DISP_IMAGE "インライン画像を表示"
#define CMT_AUTO_IMAGE "インライン画像を自動で読み込む"
#define CMT_EXT_IMAGE_VIEWER "画像を外部ビューワで表示"
#define CMT_IMAGE_SCALE "画像のスケール(%)"
#define CMT_IMGDISPLAY "画像を表示するためのコマンド"
#define CMT_IMGSIZE "画像の大きさを得るためのコマンド"
#endif
#define CMT_MULTICOL "ファイル名のマルチカラム表示"
#define CMT_ALT_ENTITY "エンティティを ASCII の代替表現で表す"
#define CMT_FOLD_TEXTAREA "TEXTAREA の行を折り返して表示"
@@ -181,6 +191,7 @@ static char *config_file = NULL;
#define CMT_HELPER "External Viewer Setup"
#define CMT_TABSTOP "Tab width"
#define CMT_PIXEL_PER_CHAR "# of pixels per character (4.0...32.0)"
#define CMT_PIXEL_PER_LINE "# of pixels per line (4.0...64.0)"
#define CMT_PAGERLINE "# of reserved line when w3m is used as a pager"
#define CMT_HISTSIZE "# of reserved URL"
#define CMT_SAVEHIST "Save URL history"
@@ -189,6 +200,14 @@ static char *config_file = NULL;
#define CMT_ARGV_IS_URL "Force argument without scheme to URL"
#define CMT_TSELF "Use _self as default target"
#define CMT_DISPLINK "Automatic display of link URL"
#ifdef USE_IMAGE
#define CMT_DISP_IMAGE "Display of inline image"
#define CMT_AUTO_IMAGE "Automatic loading of inline image"
#define CMT_EXT_IMAGE_VIEWER "Use external image viewer"
#define CMT_IMAGE_SCALE "Scale of image (%)"
#define CMT_IMGDISPLAY "External command to display image"
#define CMT_IMGSIZE "External command to get size of image"
#endif
#define CMT_MULTICOL "Multi-column output of file names"
#define CMT_ALT_ENTITY "Use alternate expression with ASCII for entity"
#define CMT_FOLD_TEXTAREA "Fold lines of TEXTAREA"
@@ -413,6 +432,10 @@ struct param_ptr params1[] = {
{"tabstop", P_NZINT, PI_TEXT, (void *)&Tabstop, CMT_TABSTOP, NULL},
{"pixel_per_char", P_PIXELS, PI_TEXT, (void *)&pixel_per_char,
CMT_PIXEL_PER_CHAR, NULL},
#ifdef USE_IMAGE
{"pixel_per_line", P_PIXELS, PI_TEXT, (void *)&pixel_per_line,
CMT_PIXEL_PER_LINE, NULL},
#endif
#ifdef JP_CHARSET
{"kanjicode", P_CODE, PI_SEL_C, (void *)&DisplayCode, CMT_KANJICODE,
kcodestr},
@@ -438,6 +461,18 @@ struct param_ptr params1[] = {
CMT_IGNORE_NULL_IMG_ALT, NULL},
{"view_unseenobject", P_INT, PI_ONOFF, (void *)&view_unseenobject,
CMT_VIEW_UNSEENOBJECTS, NULL},
#ifdef USE_IMAGE
{"display_image", P_INT, PI_ONOFF, (void *)&displayImage, CMT_DISP_IMAGE,
NULL},
{"auto_image", P_INT, PI_ONOFF, (void *)&autoImage, CMT_AUTO_IMAGE, NULL},
{"ext_image_viewer", P_INT, PI_ONOFF, (void *)&useExtImageViewer,
CMT_EXT_IMAGE_VIEWER, NULL},
{"image_scale", P_SCALE, PI_TEXT, (void *)&image_scale, CMT_IMAGE_SCALE,
NULL},
{"imgdisplay", P_STRING, PI_TEXT, (void *)&Imgdisplay, CMT_IMGDISPLAY,
NULL},
{"imgsize", P_STRING, PI_TEXT, (void *)&Imgsize, CMT_IMGSIZE, NULL},
#endif
{"show_lnum", P_INT, PI_ONOFF, (void *)&showLineNum, CMT_SHOW_NUM, NULL},
{"show_srch_str", P_INT, PI_ONOFF, (void *)&show_srch_str,
CMT_SHOW_SRCH_STR, NULL},
@@ -818,6 +853,9 @@ show_params(FILE * fp)
case P_PIXELS:
t = "number";
break;
case P_SCALE:
t = "percent";
break;
}
#ifdef JP_CHARSET
if (InnerCode != DisplayCode)
@@ -1019,7 +1057,12 @@ set_param(char *name, char *value)
#endif
case P_PIXELS:
ppc = atof(value);
if (ppc >= MINIMUM_PIXEL_PER_CHAR && ppc <= MAXIMUM_PIXEL_PER_CHAR)
if (ppc >= MINIMUM_PIXEL_PER_CHAR && ppc <= MAXIMUM_PIXEL_PER_CHAR * 2)
*(double *)p->varptr = ppc;
break;
case P_SCALE:
ppc = atof(value);
if (ppc >= 10 && ppc <= 1000)
*(double *)p->varptr = ppc;
break;
}
@@ -1159,6 +1202,10 @@ sync_with_option(void)
#ifdef USE_MIGEMO
init_migemo();
#endif
#ifdef USE_IMAGE
if (fmInitialized && displayImage)
initImage();
#endif
if (AcceptLang == NULL || *AcceptLang == '\0') {
#if LANG == JA
@@ -1261,6 +1308,7 @@ to_str(struct param_ptr *p)
#endif
return Strnew_charp(*(char **)p->varptr);
case P_PIXELS:
case P_SCALE:
return Sprintf("%g", *(double *)p->varptr);
}
/* not reached */
+15 -7
View File
@@ -155,11 +155,14 @@ while(! $end) {
}
$type = $header{"content-type"};
$dispos = $header{"content-disposition"};
if ((! $type || $type =~ /^text\/plain/i) &&
(! $dispos || $dispos =~ /^inline/i)) {
$plain = 1;
} else {
$plain = 0;
$plain = 0;
$image = 0;
if (! $dispos || $dispos =~ /^inline/i) {
if (! $type || $type =~ /^text\/plain/i) {
$plain = 1;
} elsif ($type =~ /^image\//i) {
$image = 1;
}
}
$body = '';
while(<F>) {
@@ -193,8 +196,13 @@ while(! $end) {
print "<input type=hidden name=file value=\"$qfile\">\n";
print "<input type=hidden name=boundary value=\"$qboundary\">\n";
print "<input type=hidden name=count value=\"$count\">\n";
print "<input type=submit name=submit value=\"",
&html_quote($name), "\">\n";
if ($image) {
print "<input type=image name=submit src=\"$CGI?file=$qfile&amp;boundary=$qboundary&amp;count=$count\" alt=\"",
&html_quote($name), "\">\n";
} else {
print "<input type=submit name=submit value=\"",
&html_quote($name), "\">\n";
}
print "</form>\n"
}
if ($plain) {
+2 -2
View File
@@ -1,5 +1,5 @@
#!@PERL@
# $Id: w3mhelp.cgi.in,v 1.10 2002/01/10 03:45:13 ukai Exp $
# $Id: w3mhelp.cgi.in,v 1.11 2002/01/31 17:54:58 ukai Exp $
if ( $^O =~ /^(ms)?(dos|win(32|nt)?)/i ) {
$CYGPATH = 1;
@@ -132,7 +132,7 @@ for $otherlang (@docdirs) {
&show_keymap("Buffer operation",
split(" ", "backBf selMn selBuf vwSrc svSrc svBuf
editBf editScr reload rdrwSc"));
editBf editScr reload rdrwSc dispI stopI"));
&show_keymap("Bookmark operation",
split(" ", "ldBmark adBmark"));
+17 -2
View File
@@ -1,4 +1,4 @@
/* $Id: table.c,v 1.18 2002/01/28 14:42:30 ukai Exp $ */
/* $Id: table.c,v 1.19 2002/01/31 17:54:56 ukai Exp $ */
/*
* HTML table
*/
@@ -2786,7 +2786,22 @@ feed_table_tag(struct table *tbl, char *line, struct table_mode *mode,
mode->pre_mode &= ~TBLM_PRE_INT;
break;
case HTML_IMG:
tok = process_img(tag);
w = tbl->fixed_width[tbl->col];
if (w < 0) {
if (tbl->total_width > 0)
w = -tbl->total_width * w / 100;
else if (width > 0)
w = -width * w / 100;
else
w = 0;
}
else if (w == 0) {
if (tbl->total_width > 0)
w = tbl->total_width;
else if (width > 0)
w = width;
}
tok = process_img(tag, w);
feed_table1(tbl, tok, mode, width);
break;
case HTML_FORM:
+1
View File
@@ -45,6 +45,7 @@ pre HTML_PRE
blockquote HTML_BLQ
/blockquote HTML_N_BLQ
img HTML_IMG
image HTML_IMG
code HTML_NOP
/code HTML_NOP
dfn HTML_NOP
+26 -2
View File
@@ -1,4 +1,4 @@
/* $Id: terms.c,v 1.27 2001/12/25 16:54:45 ukai Exp $ */
/* $Id: terms.c,v 1.28 2002/01/31 17:54:56 ukai Exp $ */
/*
* An original curses library for EUC-kanji by Akinori ITO, December 1989
* revised by Akinori ITO, January 1995
@@ -1865,7 +1865,14 @@ wgetch(void)
{
char c;
read(tty, &c, 1);
/* read(tty, &c, 1); */
while (read(tty, &c, 1) < (ssize_t) 1) {
if (errno == EINTR || errno == EAGAIN)
continue;
/* error happend on read(2) */
quitfm();
break; /* unreachable */
}
return c;
}
@@ -2159,3 +2166,20 @@ flush_tty()
{
fflush(ttyf);
}
#ifdef USE_IMAGE
void
touch_cursor()
{
touch_line();
touch_column(CurColumn);
#ifdef JP_CHARSET
if (CurColumn > 0 &&
CHMODE(ScreenImage[CurLine]->lineprop[CurColumn]) == C_WCHAR2)
touch_column(CurColumn - 1);
else if (CurColumn < COLS - 1 &&
CHMODE(ScreenImage[CurLine]->lineprop[CurColumn]) == C_WCHAR1)
touch_column(CurColumn + 1);
#endif
}
#endif
+369
View File
@@ -0,0 +1,369 @@
/* $Id: w3mimgdisplay.c,v 1.1 2002/01/31 17:54:57 ukai Exp $ */
#include <stdio.h>
#include <stdlib.h>
#include <Imlib.h>
static Display *display;
static Window window, parent;
static unsigned long background_pixel;
static char *background = NULL;
static int offset_x = 2, offset_y = 2;
static int defined_bg = 0, defined_x = 0, defined_y = 0, defined_test = 0;
static int defined_debug = 0;
#define MAX_IMAGE 1000
typedef struct {
Pixmap pixmap;
int width;
int height;
} Image;
static Image *imageBuf = NULL;
static int maxImage = 0;
static GC imageGC = NULL;
static void GetOption(int argc, char **argv);
static void DrawImage(char *buf, int redraw);
static void ClearImage(void);
/* *INDENT-OFF* */
/*
xterm/kterm/hanterm/cxterm
top window (WINDOWID)
+- text window
+- scrollbar
rxvt/aterm/Eterm/wterm
top window (WINDOWID)
+- text window
+- scrollbar
+- menubar (etc.)
gnome-terminal
top window
+- text window (WINDOWID)
+- scrollbar
+- menubar
mlterm (-s)
top window
+- text window (WINDOWID)
+- scrollbar
mlterm
top window = text window (WINDOWID)
powershell
top window
+- window
| +- text window
| +- scrollbar
+- menubar (etc.)
dtterm
top window
+- window
+- window
| +- window
| +- text window
| +- scrollbar
+- menubar
hpterm
top window
+- window
+- text window
+- scrollbar
+- (etc.)
*/
/* *INDENT-ON* */
int
main(int argc, char **argv)
{
Window root, *children;
XWindowAttributes attr;
XColor screen_def, exact_def;
int revert, nchildren, len, width, height, i;
char buf[1024 + 128];
char *id;
GetOption(argc, argv);
if (!defined_debug)
fclose(stderr);
display = XOpenDisplay(NULL);
if (!display)
exit(1);
if ((id = getenv("WINDOWID")) != NULL)
window = (Window) atoi(id);
else
XGetInputFocus(display, &window, &revert);
if (!window)
exit(1);
XGetWindowAttributes(display, window, &attr);
width = attr.width;
height = attr.height;
while (1) {
Window p_window;
XQueryTree(display, window, &root, &parent, &children, &nchildren);
if (defined_debug)
fprintf(stderr,
"window=%x root=%x parent=%x nchildren=%d width=%d height=%d\n",
window, root, parent, nchildren, width, height);
p_window = window;
for (i = 0; i < nchildren; i++) {
XGetWindowAttributes(display, children[i], &attr);
if (defined_debug)
fprintf(stderr,
"children[%d]=%x x=%d y=%d width=%d height=%d\n", i,
children[i], attr.x, attr.y, attr.width, attr.height);
if (attr.width > width * 0.7 && attr.height > height * 0.7) {
/* maybe text window */
width = attr.width;
height = attr.height;
window = children[i];
}
}
if (p_window == window)
break;
}
if (!defined_x) {
for (i = 0; i < nchildren; i++) {
XGetWindowAttributes(display, children[i], &attr);
if (attr.x <= 0 && attr.width < 30 && attr.height > height * 0.7) {
if (defined_debug)
fprintf(stderr,
"children[%d]=%x x=%d y=%d width=%d height=%d\n",
i, children[i], attr.x, attr.y, attr.width,
attr.height);
/* scrollbar of xterm/kterm ? */
offset_x += attr.x + attr.width + attr.border_width * 2;
break;
}
}
}
if (defined_test) {
printf("%d %d\n", width - offset_x, height - offset_y);
exit(0);
}
if (defined_bg && XAllocNamedColor(display, DefaultColormap(display, 0),
background, &screen_def, &exact_def))
background_pixel = screen_def.pixel;
else {
Pixmap p;
GC gc;
XImage *i;
p = XCreatePixmap(display, window, 1, 1, DefaultDepth(display, 0));
gc = XCreateGC(display, window, 0, NULL);
if (!p || !gc)
exit(1);
XCopyArea(display, window, p, gc, (offset_x >= 1) ? (offset_x - 1) : 0,
(offset_y >= 1) ? (offset_y - 1) : 0, 1, 1, 0, 0);
i = XGetImage(display, p, 0, 0, 1, 1, -1, ZPixmap);
if (!i)
exit(1);
background_pixel = XGetPixel(i, 0, 0);
XDestroyImage(i);
XFreeGC(display, gc);
XFreePixmap(display, p);
/*
background_pixel = WhitePixel(display, 0);
*/
}
while (fgets(buf, sizeof(buf), stdin) != NULL) {
if (!(isdigit(buf[0]) && buf[1] == ';')) {
fputc('\n', stdout);
fflush(stdout);
continue;
}
len = strlen(buf);
if (buf[len - 1] == '\n') {
buf[--len] = '\0';
if (buf[len - 1] == '\r')
buf[--len] = '\0';
}
switch (buf[0]) {
case '0':
DrawImage(&buf[2], 0);
break;
case '1':
DrawImage(&buf[2], 1);
break;
case '2':
ClearImage();
break;
case '3':
XSync(display, False);
break;
case '4':
fputs("\n", stdout);
fflush(stdout);
break;
}
}
ClearImage();
/*
* XCloseDisplay(display);
*/
exit(0);
}
static void
GetOption(int argc, char **argv)
{
int i;
for (i = 1; i < argc; i++) {
if (!strcmp("-bg", argv[i])) {
if (++i >= argc)
exit(1);
background = argv[i];
defined_bg = 1;
}
else if (!strcmp("-x", argv[i])) {
if (++i >= argc)
exit(1);
offset_x = atoi(argv[i]);
defined_x = 1;
}
else if (!strcmp("-y", argv[i])) {
if (++i >= argc)
exit(1);
offset_y = atoi(argv[i]);
defined_y = 1;
}
else if (!strcmp("-test", argv[i])) {
defined_test = 1;
}
else if (!strcmp("-debug", argv[i])) {
defined_debug = 1;
}
else {
exit(1);
}
}
}
void
DrawImage(char *buf, int redraw)
{
static ImlibData *id = NULL;
ImlibImage *im;
char *p = buf;
int n = 0, x = 0, y = 0, w = 0, h = 0, sx = 0, sy = 0, sw = 0, sh = 0;
if (!p)
return;
for (; isdigit(*p); p++)
n = 10 * n + (*p - '0');
if (*(p++) != ';')
return;
for (; isdigit(*p); p++)
x = 10 * x + (*p - '0');
if (*(p++) != ';')
return;
for (; isdigit(*p); p++)
y = 10 * y + (*p - '0');
if (*(p++) != ';')
return;
for (; isdigit(*p); p++)
w = 10 * w + (*p - '0');
if (*(p++) != ';')
return;
for (; isdigit(*p); p++)
h = 10 * h + (*p - '0');
if (*(p++) != ';')
return;
for (; isdigit(*p); p++)
sx = 10 * sx + (*p - '0');
if (*(p++) != ';')
return;
for (; isdigit(*p); p++)
sy = 10 * sy + (*p - '0');
if (*(p++) != ';')
return;
for (; isdigit(*p); p++)
sw = 10 * sw + (*p - '0');
if (*(p++) != ';')
return;
for (; isdigit(*p); p++)
sh = 10 * sh + (*p - '0');
if (*(p++) != ';')
return;
n--;
if (n < 0 || n >= MAX_IMAGE)
return;
if (redraw) {
if (!imageGC || n >= maxImage || !imageBuf[n].pixmap)
return;
goto draw_image;
}
if (!id) {
id = Imlib_init(display);
if (!id)
return;
}
if (!imageGC) {
imageGC = XCreateGC(display, parent, 0, NULL);
if (!imageGC)
return;
}
if (n >= maxImage) {
int i = maxImage;
maxImage = i ? (i * 2) : 2;
if (maxImage > MAX_IMAGE)
maxImage = MAX_IMAGE;
else if (n >= maxImage)
maxImage = n + 1;
imageBuf = (Image *) realloc((void *)imageBuf,
sizeof(Image) * maxImage);
for (; i < maxImage; i++)
imageBuf[i].pixmap = NULL;
}
if (imageBuf[n].pixmap) {
XFreePixmap(display, imageBuf[n].pixmap);
imageBuf[n].pixmap = NULL;
}
im = Imlib_load_image(id, p);
if (!im)
return;
if (!w)
w = im->rgb_width;
if (!h)
h = im->rgb_height;
imageBuf[n].pixmap = XCreatePixmap(display, parent, w, h,
DefaultDepth(display, 0));
if (!imageBuf[n].pixmap)
return;
XSetForeground(display, imageGC, background_pixel);
XFillRectangle(display, imageBuf[n].pixmap, imageGC, 0, 0, w, h);
Imlib_paste_image(id, im, imageBuf[n].pixmap, 0, 0, w, h);
Imlib_kill_image(id, im);
imageBuf[n].width = w;
imageBuf[n].height = h;
draw_image:
XCopyArea(display, imageBuf[n].pixmap, window, imageGC,
sx, sy, (sw ? sw : imageBuf[n].width),
(sh ? sh : imageBuf[n].height), x + offset_x, y + offset_y);
}
void
ClearImage(void)
{
if (imageGC) {
XFreeGC(display, imageGC);
imageGC = NULL;
}
if (imageBuf) {
int i;
for (i = 0; i < maxImage; i++) {
if (imageBuf[i].pixmap)
XFreePixmap(display, imageBuf[i].pixmap);
}
free(imageBuf);
imageBuf = NULL;
}
maxImage = 0;
}
+31
View File
@@ -0,0 +1,31 @@
/* $Id: w3mimgsize.c,v 1.1 2002/01/31 17:54:57 ukai Exp $ */
#include <stdio.h>
#include <stdlib.h>
#include <Imlib.h>
int
main(int argc, char **argv)
{
Display *display;
ImlibData *id;
ImlibImage *im;
fclose(stderr);
if (argc < 2)
exit(1);
display = XOpenDisplay(NULL);
if (!display)
exit(1);
id = Imlib_init(display);
if (!id)
exit(1);
im = Imlib_load_image(id, argv[1]);
if (!im)
exit(1);
printf("%d %d\n", im->rgb_width, im->rgb_height);
/*
* Imlib_kill_image(id, im);
* XCloseDisplay(display);
*/
exit(0);
}