aboutsummaryrefslogtreecommitdiffstats
path: root/w3mimgdisplay.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--w3mimgdisplay.c233
1 files changed, 42 insertions, 191 deletions
diff --git a/w3mimgdisplay.c b/w3mimgdisplay.c
index 1ff442e..e450871 100644
--- a/w3mimgdisplay.c
+++ b/w3mimgdisplay.c
@@ -1,175 +1,49 @@
-/* $Id: w3mimgdisplay.c,v 1.2 2002/01/31 18:28:24 ukai Exp $ */
+/* $Id: w3mimgdisplay.c,v 1.3 2002/07/17 20:58:48 ukai Exp $ */
#include <stdio.h>
#include <stdlib.h>
-#include <Imlib.h>
+#include <ctype.h>
+#include "config.h"
+#include "w3mimg/w3mimg.h"
-static Display *display;
-static Window window, parent;
-static unsigned long background_pixel;
+w3mimg_op *w_op;
static char *background = NULL;
-static int offset_x = 2, offset_y = 2;
+static int offset_x = 0, offset_y = 0;
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 W3MImage *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;
+ int len;
char buf[1024 + 128];
- char *id;
GetOption(argc, argv);
if (!defined_debug)
fclose(stderr);
- display = XOpenDisplay(NULL);
- if (!display)
+ w_op = w3mimg_open();
+ if (w_op == NULL)
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=%lx root=%lx parent=%lx nchildren=%d width=%d height=%d\n",
- (unsigned long)window, (unsigned long)root,
- (unsigned long)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]=%lx 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]=%lx 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_x)
+ w_op->offset_x = offset_x;
+ if (defined_y)
+ w_op->offset_y = offset_y;
if (defined_test) {
- printf("%d %d\n", width - offset_x, height - offset_y);
+ printf("%d %d\n", w_op->width - w_op->offset_x,
+ w_op->height - w_op->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);
- */
- }
+ w_op->set_background(w_op, background);
while (fgets(buf, sizeof(buf), stdin) != NULL) {
if (!(isdigit(buf[0]) && buf[1] == ';')) {
@@ -194,18 +68,26 @@ main(int argc, char **argv)
ClearImage();
break;
case '3':
- XSync(display, False);
+ w_op->sync(w_op);
break;
case '4':
fputs("\n", stdout);
fflush(stdout);
break;
+#if 0 /* def USE_W3MIMG_FB */
+ case '5':
+ if (w3mimg_mode == W3MIMG_FB_MODE) {
+ IMAGE *im = fb_load_image(&buf[2], 0, 0);
+ fprintf(stdout, "%d %d\n", im->width, im->height);
+ fflush(stdout);
+ fb_free_image(im);
+ }
+ break;
+#endif
}
}
ClearImage();
- /*
- * XCloseDisplay(display);
- */
+ w_op->close(w_op);
exit(0);
}
@@ -248,8 +130,6 @@ GetOption(int argc, char **argv)
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;
@@ -296,20 +176,12 @@ DrawImage(char *buf, int redraw)
if (n < 0 || n >= MAX_IMAGE)
return;
if (redraw) {
- if (!imageGC || n >= maxImage || !imageBuf[n].pixmap)
+ if (! w_op->active(w_op) || 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;
- }
+ w_op->init(w_op);
+
if (n >= maxImage) {
int i = maxImage;
maxImage = i ? (i * 2) : 2;
@@ -317,51 +189,30 @@ DrawImage(char *buf, int redraw)
maxImage = MAX_IMAGE;
else if (n >= maxImage)
maxImage = n + 1;
- imageBuf = (Image *) realloc((void *)imageBuf,
- sizeof(Image) * maxImage);
+ imageBuf = (W3MImage *) realloc((void *)imageBuf,
+ sizeof(W3MImage) * maxImage);
for (; i < maxImage; i++)
- imageBuf[i].pixmap = (Pixmap) NULL;
+ imageBuf[i].pixmap = NULL;
}
if (imageBuf[n].pixmap) {
- XFreePixmap(display, imageBuf[n].pixmap);
- imageBuf[n].pixmap = (Pixmap) NULL;
+ w_op->free_image(w_op, &imageBuf[n]);
+ 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;
+ w_op->load_image(w_op, &imageBuf[n], p, w, 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);
+ w_op->show_image(w_op, &imageBuf[n], sx, sy, sw, sh, x, y);
}
void
ClearImage(void)
{
- if (imageGC) {
- XFreeGC(display, imageGC);
- imageGC = NULL;
- }
+ w_op->finish(w_op);
if (imageBuf) {
int i;
for (i = 0; i < maxImage; i++) {
- if (imageBuf[i].pixmap)
- XFreePixmap(display, imageBuf[i].pixmap);
+ w_op->free_image(w_op, &imageBuf[i]);
}
free(imageBuf);
imageBuf = NULL;