Scantool part 5(5) (shar)
Was a Sunny day
gunnar at falcon.ericsson.se
Tue Jun 18 22:50:48 AEST 1991
#!/bin/sh
# this is scan.05 (part 5 of a multipart archive)
# do not concatenate these parts, unpack them in order with /bin/sh
# file sunview.c continued
#
if test ! -r _shar_seq_.tmp; then
echo 'Please unpack part 1 first!'
exit 1
fi
(read Scheck
if test "$Scheck" != 5; then
echo Please unpack part "$Scheck" next!
exit 1
else
exit 0
fi
) < _shar_seq_.tmp || exit 1
if test ! -f _shar_wnt_.tmp; then
echo 'x - still skipping sunview.c'
else
echo 'x - continuing file sunview.c'
sed 's/^X//' << 'SHAR_EOF' >> 'sunview.c' &&
Frame frame ;
Event *event ;
Notify_arg arg ;
Notify_event_type type ;
{
X Notify_value value ;
X Rect *r ;
X
X value = notify_next_event_func(frame, (Notify_event) event, arg, type) ;
X if (event_id(event) == WIN_RESIZE)
X if (firsttime)
X {
X init_width = (int) window_get(base_frame, WIN_WIDTH) ;
X init_height = (int) window_get(base_frame, WIN_HEIGHT) ;
X firsttime = 0 ;
X }
X else
X {
X r = (Rect *) LINT_CAST(window_get(frame, WIN_RECT)) ;
X r->r_width = init_width ;
X r->r_height = init_height ;
X WINDOW_SET(frame, FRAME_OPEN_RECT, r, 0) ;
X do_repaint() ;
X }
X return(value) ;
}
X
init_fonts()
{
X font[(int) NFONT] = open_font(NORMAL_FONT) ;
X font_width = font[(int) NFONT]->pf_defaultsize.x ;
X font[(int) BFONT] = open_font(BOLD_FONT) ;
}
X
init_ws_type()
{
X ops[(int) GSET] = PIX_SET ;
X ops[(int) GCLR] = PIX_CLR ;
X ops[(int) GXOR] = PIX_SRC ^ PIX_DST ;
X ops[(int) GSRC] = PIX_SRC ;
X ops[(int) GOR] = PIX_SRC | PIX_DST ;
X ops[(int) GNOT] = PIX_NOT(PIX_DST) ;
X
X firsttime = 1 ;
}
X
make_frames(argc, argv)
int argc ;
char *argv[] ;
{
X scantool_icon = icon_create(ICON_IMAGE, &icon_pr, 0) ;
X base_frame = window_create((Window) 0, FRAME,
X FRAME_ICON, scantool_icon,
X FRAME_LABEL, " MICROTEK MSF-300A Image Scanner",
X FRAME_EMBOLDEN_LABEL, TRUE,
X FRAME_ARGS, argc,argv,
X 0) ;
X
X show_frame = window_create(base_frame, FRAME,
X FRAME_SHOW_LABEL, TRUE,
X WIN_WIDTH, 650,
X WIN_HEIGHT, 900,
X WIN_X, 0,
X WIN_Y, 0,
X WIN_SHOW, FALSE,
X 0) ;
X NOTIFY_INTERPOSE_EVENT_FUNC(base_frame, handle_resize, NOTIFY_SAFE) ;
}
X
make_subframes()
{
X cursor[(int) FRAME_CUR] = cursor_create(CURSOR_IMAGE, &frame_cursor_pr,
X CURSOR_XHOT, 7,
X CURSOR_YHOT, 7,
X 0) ;
X cursor[(int) HELP_CUR] = cursor_create(CURSOR_IMAGE, &help_cursor_pr, 0) ;
X cursor[(int) HOUR_CUR] = cursor_create(CURSOR_IMAGE, &hour_cursor_pr, 0) ;
X cursor[(int) MAIN_CUR] = cursor_create(CURSOR_IMAGE, &main_cursor_pr, 0) ;
X
X canvas = window_create(base_frame, CANVAS,
X WIN_EVENT_PROC, canvas_proc,
X WIN_CURSOR, cursor[(int) MAIN_CUR],
X WIN_WIDTH, SCAN_WIDTH,
X WIN_HEIGHT, SCAN_HEIGHT,
X CANVAS_RETAINED, FALSE,
X CANVAS_FIXED_IMAGE, FALSE,
X 0) ;
X WINDOW_SET(canvas, WIN_CONSUME_KBD_EVENTS, WIN_ASCII_EVENTS,
X WIN_UP_EVENTS, 0, 0) ;
X WINDOW_SET(canvas, WIN_CONSUME_PICK_EVENTS, LOC_DRAG, LOC_MOVE, 0, 0) ;
X wpw = canvas_pixwin(canvas) ;
X
X show_canvas = window_create(show_frame, CANVAS,
X CANVAS_REPAINT_PROC, repaint_show_canvas,
X 0) ;
X spw = canvas_pixwin(show_canvas) ;
X spr = NULL ;
X
X images[(int) B_NORMAL] = &button_normal_pr ;
X images[(int) B_INVERT] = &button_invert_pr ;
X images[(int) S_NORMAL] = &switch_normal_pr ;
X images[(int) S_INVERT] = &switch_invert_pr ;
X images[(int) EXCLAIM_IMAGE] = &exclaim_pr ;
}
X
Pixfont *
open_font(fontname)
char *fontname ;
{
X Pixfont *f ;
X
X if ((f = pf_open(fontname)) == NULL)
X if ((f = pf_default()) == NULL)
X {
X perror("couldn't get the default font.") ;
X exit(1) ;
X }
X return(f) ;
}
X
/*ARGSUSED*/
void
repaint_show_canvas(canvas, pw, repaint_area) /* Show current picture. */
Canvas canvas ;
Pixwin *pw ;
Rectlist *repaint_area ;
{
X PW_ROP(pw, 0, 0, hdr.ras_width, hdr.ras_height, PIX_SRC, spr, 0, 0) ;
}
X
set_cursor(ctype)
enum cur_type ctype ;
{
X WINDOW_SET(canvas, WIN_CURSOR, cursor[(int) ctype], 0) ;
}
X
show() /* Display scanned image. */
{
X Rect *temprect ;
X char errmes[MAXLINE] ;
X int fd ;
X
X showing = 1 ;
X make_button(SCAN_WIDTH-150, 4*SWITCH_HEIGHT+100, "Show", B_INVERT) ;
X if (spr) PR_DESTROY(spr) ;
X if ((fd = open(picname, O_RDONLY | O_NDELAY, 0644)) == -1)
X {
X SPRINTF(errmes, "Cannot open %s.", picname) ;
X make_display(errmes) ;
X }
X else
X {
X READ(fd, (char *) &hdr, sizeof(struct rasterfile)) ;
X if (hdr.ras_maplength)
X {
X make_display("Color rasterfiles currently not supported.") ;
X return ;
X }
X spr = mem_create(hdr.ras_width, hdr.ras_height, hdr.ras_depth) ;
X READ(fd, (char *) (mpr_d(spr)->md_image),
X hdr.ras_width * hdr.ras_height) ;
X CLOSE(fd) ;
X temprect = (Rect *) LINT_CAST(window_get(show_frame, FRAME_OPEN_RECT)) ;
X temprect->r_left = temprect->r_top = 0 ;
X temprect->r_height = hdr.ras_height ;
X temprect->r_width = hdr.ras_width ;
X WINDOW_SET(show_frame, FRAME_OPEN_RECT, temprect, 0) ;
X WINDOW_SET(show_frame, FRAME_LABEL, picname, 0) ;
X WINDOW_SET(show_frame, WIN_SHOW, TRUE, 0) ;
X }
X make_button(SCAN_WIDTH-150, 4*SWITCH_HEIGHT+100, "Show", B_NORMAL) ;
X showing = 0 ;
}
X
start_tool()
{
X window_fit(base_frame) ;
X NOTIFY_INTERPOSE_DESTROY_FUNC(base_frame, destroy) ;
X window_main_loop(base_frame) ;
}
X
/*ARGSUSED*/
Notify_value
wait_child(frame, pid, status, rusage)
Window frame ;
int pid ;
union wait *status ;
struct rusage *rusage ;
{
X char output[MAXLINE] ;
X int high, low ;
X
X if (WIFSTOPPED(*status)) return (NOTIFY_IGNORED) ;
X
X high = (status->w_status & 0xFF00) >> 8 ;
X low = status->w_status & 0xFF ;
X if (low) SPRINTF(output, "Scan: terminated with signal %1d", (low & 0x3F)) ;
X else
X {
X switch (high)
X {
X case 0 : SPRINTF(output, "Scan: successful. %s saved",
X picname) ;
X break ;
X case 1 : SPRINTF(output, "Scan: cannot open tty port %c",
X switches[SERIAL_PORT] + 'A') ;
X break ;
X case 2 : SPRINTF(output, "Scan: cannot open temporary image file") ;
X break ;
X case 3 : SPRINTF(output, "Scan: cannot open raster header file") ;
X break ;
X case 4 : SPRINTF(output, "Scan: scanner not responding; aborting") ;
X break ;
X case 5 : SPRINTF(output, "Scan: invalid command line argument") ;
X break ;
X default : if (high >= 100 && high < 200)
X SPRINTF(output, "Scan: scanner error %1d; aborting",
X high - 100) ;
X else
X SPRINTF(output, "Scan: terminated with signal %1d",
X high - 200) ;
X }
X }
X make_display(output) ;
X make_button(SCAN_WIDTH-150, 4*SWITCH_HEIGHT+20, "Scan", B_NORMAL) ;
X make_button(SCAN_WIDTH-150, 4*SWITCH_HEIGHT+60, "Cancel", B_NORMAL) ;
X scanning = 0 ;
X return (NOTIFY_DONE) ;
}
X
wait_on_child(pid) /* Wait on child scan process. */
int pid ;
{
X NOTIFY_SET_WAIT3_FUNC(base_frame, wait_child, pid) ;
}
SHAR_EOF
echo 'File sunview.c is complete' &&
chmod 0644 sunview.c ||
echo 'restore of sunview.c failed'
Wc_c="`wc -c < 'sunview.c'`"
test 13894 -eq "$Wc_c" ||
echo 'sunview.c: original size 13894, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= switch.invert.cursor ==============
if test -f 'switch.invert.cursor' -a X"$1" != X"-c"; then
echo 'x - skipping switch.invert.cursor (File already exists)'
rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting switch.invert.cursor (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'switch.invert.cursor' &&
/* Format_version=1, Width=16, Height=16, Depth=1, Valid_bits_per_item=16
X */
X 0x0000,0x0000,0x0000,0x0002,0x0007,0x000E,0xFFFC,0x8038,
X 0x8070,0x80E0,0xB1E0,0xBBA0,0x9F20,0x8E20,0x8420,0xFFE0
SHAR_EOF
chmod 0644 switch.invert.cursor ||
echo 'restore of switch.invert.cursor failed'
Wc_c="`wc -c < 'switch.invert.cursor'`"
test 193 -eq "$Wc_c" ||
echo 'switch.invert.cursor: original size 193, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= switch.normal.cursor ==============
if test -f 'switch.normal.cursor' -a X"$1" != X"-c"; then
echo 'x - skipping switch.normal.cursor (File already exists)'
rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting switch.normal.cursor (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'switch.normal.cursor' &&
/* Format_version=1, Width=16, Height=16, Depth=1, Valid_bits_per_item=16
X */
X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFE0,0x8020,
X 0x8020,0x8020,0x8020,0x8020,0x8020,0x8020,0x8020,0xFFE0
SHAR_EOF
chmod 0644 switch.normal.cursor ||
echo 'restore of switch.normal.cursor failed'
Wc_c="`wc -c < 'switch.normal.cursor'`"
test 193 -eq "$Wc_c" ||
echo 'switch.normal.cursor: original size 193, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= white.codes ==============
if test -f 'white.codes' -a X"$1" != X"-c"; then
echo 'x - skipping white.codes (File already exists)'
rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting white.codes (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'white.codes' &&
X 0 00110101
X 1 000111
X 2 0111
X 3 1000
X 4 1011
X 5 1100
X 6 1110
X 7 1111
X 8 10011
X 9 10100
X 10 00111
X 11 01000
X 12 001000
X 13 000011
X 14 110100
X 15 110101
X 16 101010
X 17 101011
X 18 0100111
X 19 0001100
X 20 0001000
X 21 0010111
X 22 0000011
X 23 0000100
X 24 0101000
X 25 0101011
X 26 0010011
X 27 0100100
X 28 0011000
X 29 00000010
X 30 00000011
X 31 00011010
X 32 00011011
X 33 00010010
X 34 00010011
X 35 00010100
X 36 00010101
X 37 00010110
X 38 00010111
X 39 00101000
X 40 00101001
X 41 00101010
X 42 00101011
X 43 00101100
X 44 00101101
X 45 00000100
X 46 00000101
X 47 00001010
X 48 00001011
X 49 01010010
X 50 01010011
X 51 01010100
X 52 01010101
X 53 00100100
X 54 00100101
X 55 01011000
X 56 01011001
X 57 01011010
X 58 01011011
X 59 01001010
X 60 01001011
X 61 00110010
X 62 00110011
X 63 00110100
X 64 11011
X 128 10010
X 192 010111
X 256 0110111
X 320 00110110
X 384 00110111
X 448 01100100
X 512 01100101
X 576 01101000
X 640 01100111
X 704 011001100
X 768 011001101
X 832 011010010
X 896 011010011
X 960 011010100
X 1024 011010101
X 1088 011010110
X 1152 011010111
X 1216 011011000
X 1280 011011001
X 1344 011011010
X 1408 011011011
X 1472 010011000
X 1536 010011001
X 1600 010011010
X 1664 011000
X 1728 010011011
X 1792 00000001000
X 1856 00000001100
X 1920 00000001101
X 1984 000000010010
X 2048 000000010011
X 2112 000000010100
X 2176 000000010101
X 2240 000000010110
X 2304 000000010111
X 2368 000000011100
X 2432 000000011101
X 2496 000000011110
X -1 000000000001
SHAR_EOF
chmod 0644 white.codes ||
echo 'restore of white.codes failed'
Wc_c="`wc -c < 'white.codes'`"
test 2080 -eq "$Wc_c" ||
echo 'white.codes: original size 2080, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= xview.c ==============
if test -f 'xview.c' -a X"$1" != X"-c"; then
echo 'x - skipping xview.c (File already exists)'
rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting xview.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'xview.c' &&
X
/* @(#)xview.c 1.5 90/04/10
X *
X * XView dependent graphics routines used by scantool.
X *
X * Copyright (c) Rich Burridge.
X * Sun Microsystems, Australia - All rights reserved.
X *
X * Permission is given to distribute these sources, as long as the
X * copyright messages are not removed, and no monies are exchanged.
X *
X * No responsibility is taken for any errors or inaccuracies inherent
X * either to the comments or the code of this program, but if
X * reported to me, then an attempt will be made to fix them.
X */
X
#include <stdio.h>
#include <sys/fcntl.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/resource.h>
#include "scantool.h"
#include "scantool_extern.h"
#include "images.h"
#include <rasterfile.h>
#include <xview/xview.h>
#include <xview/canvas.h>
#include <xview/font.h>"
#include <xview/fullscreen.h>
#include <xview/cursor.h>
#include <xview/svrimage.h>
#include <X11/Xlib.h>
#define NOTIFY_INTERPOSE_DESTROY_FUNC (void) notify_interpose_destroy_func
#define NOTIFY_SET_SIGNAL_FUNC (void) notify_set_signal_func
#define NOTIFY_SET_WAIT3_FUNC (void) notify_set_wait3_func
#define PR_DESTROY (void) pr_destroy
#define PW_WRITE (void) pw_write
#define XV_INPUT_READEVENT (void) xv_input_readevent
#define XV_SET (void) xv_set
X
#define BOLDFONT "lucidasanstypewriter-bold-12"
#define DEFFONT "fixed"
#define NORMALFONT "lucidasanstypewriter-12"
#define NULL 0
int menu_proc() ;
void repaint_show_canvas() ;
X
Canvas canvas, show_canvas ;
Canvas_paint_window spw, wpw ;
Event *cur_event ;
Frame base_frame, show_frame ;
Fullscreen fs ;
Icon scantool_icon ;
Menu menus[MAXMENUS] ;
Notify_value destroy() ;
Pixrect *spr ;
Server_image frame_cursor_pr, help_cursor_pr, hour_cursor_pr, main_cursor_pr ;
Server_image make_server_image() ;
X
XXv_cursor cursor[MAXCURSORS] ;
X
Display *dpy ; /* Display id of scantool frame. */
Drawable xid ; /* Xid for scantool canvas. */
Drawable grey_pr ;
Drawable images[MAXIMAGES] ; /* Xids for various graphical images. */
GC backgc ; /* Graphics context for pw_writebackground. */
GC gc ; /* Graphics context for text and lines. */
GC ropgc ; /* Graphics context for rops. */
Window root ;
XXFontStruct *font[MAXFONTS] ; /* Xlib handles to the fonts. */
XXGCValues gc_val ; /* Used to setup graphics context values. */
int gc_flags ; /* Used to set up graphics context flags. */
int screen ; /* Default graphics display screen. */
unsigned long backgnd ; /* Default background color. */
unsigned long foregnd ; /* Default foreground color. */
unsigned long gc_mask ; /* Mask for setting graphic context values. */
X
enum menu_type cur_menu ; /* Current menu type being processed. */
X
int init_height ; /* Initial height of the scantool window. */
int init_width ; /* Initial width of the scantool window. */
int started ; /* Kludge to correct handle repaints. */
X
struct rasterfile hdr ;
X
mpr_static(icon_pr, 64, 64, 1, icon_image) ;
X
/*ARGSUSED*/
void
canvas_proc(canvas, event)
Canvas canvas ;
Event *event ;
{
X if (!started) return ;
X cur_event = event ;
X handle_event() ; /* Determine what kind of event it is. */
X process_event() ; /* And process it. */
}
X
create_menu(mtype, title, values) /* Create popup menus for cycle items. */
enum menu_type mtype ;
char *title, *values[] ;
{
X int i = 0 ;
X int more = 1 ; /* Cleared when current menu is complete.*/
X
X menus[(int) mtype] = xv_create(XV_NULL, MENU_COMMAND_MENU,
X MENU_NOTIFY_PROC, menu_proc,
X MENU_TITLE_ITEM, title,
X 0) ;
X do
X {
X if (values[i] != NULL)
X XV_SET(menus[(int) mtype], MENU_STRING_ITEM, values[i], i+1, 0) ;
X else more = 0 ;
X i++ ;
X }
X while (more) ;
}
X
Notify_value
destroy(client, status)
Notify_client client ;
Destroy_status status ;
{
X stop_scan() ; /* Stop the current scan (if there is one). */
X exit(0) ;
}
X
display_menu(menuno)
enum menu_type menuno ;
{
X cur_menu = menuno ;
X menu_show(menus[(int) menuno], canvas, cur_event, 0) ;
X return(0) ;
}
X
draw_area(x, y, width, height, op)
int x, y, width, height ;
enum op_type op ;
{
X if (op == GNOT)
X {
X XSetFunction(dpy, gc, GXcopyInverted) ;
X XCopyArea(dpy, xid, xid, gc, x, y, width, height, x, y) ;
X }
X else
X {
X XSetFunction(dpy, backgc, ops[(int) op]) ;
X XFillRectangle(dpy, xid, backgc, x, y, width, height) ;
X }
}
X
draw_image(x, y, width, height, image)
int x, y, width, height ;
enum image_type image ;
{
X gc_mask = GCStipple | GCTileStipXOrigin | GCTileStipYOrigin ;
X gc_val.stipple = images[(int) image] ;
X gc_val.ts_x_origin = x ;
X gc_val.ts_y_origin = y ;
X XChangeGC(dpy, ropgc, gc_mask, &gc_val) ;
X XFillRectangle(dpy, xid, ropgc, x, y, width, height) ;
}
X
draw_line(x1, y1, x2, y2, op)
int x1, y1, x2, y2 ;
enum op_type op ;
{
X gc_val.foreground = foregnd ;
X gc_val.function = ops[(int) op] ;
X XChangeGC(dpy, gc, GCForeground | GCFunction, &gc_val) ;
X XDrawLine(dpy, xid, gc, x1, y1, x2, y2) ;
}
X
/*ARGSUSED*/
draw_text(x, y, stencil, ftype, str)
int x, y ;
enum sten_type stencil ;
enum font_type ftype ;
char *str ;
{
X gc_val.foreground = foregnd ;
X gc_val.font = font[(int) ftype]->fid ;
X if (stencil == STEN_INV) gc_val.function = GXcopyInverted ;
X else gc_val.function = GXcopy ;
X XChangeGC(dpy, gc, GCFont | GCForeground | GCFunction, &gc_val) ;
X XDrawString(dpy, xid, gc, x, y, str, strlen(str)) ;
}
X
get_event() /* Get the next XView event. */
{
X XV_INPUT_READEVENT(wpw, cur_event, 1, 0, NULL) ;
X if (event_is_button(cur_event))
X if (event_is_down(cur_event))
X fs = xv_create(wpw, FULLSCREEN,
X WIN_CONSUME_EVENTS,
X WIN_MOUSE_BUTTONS, LOC_DRAG, 0,
X 0) ;
X else if (event_is_up(cur_event)) xv_destroy(fs) ;
}
X
XXFontStruct *
get_font(name)
char *name ;
{
X XFontStruct *f ;
X
X if (!(f = XLoadQueryFont(dpy, name)))
X if (!(f = XLoadQueryFont(dpy, DEFFONT)))
X {
X FPRINTF(stderr, "%s: couldn't get the default font.", progname) ;
X exit(1) ;
X }
X return(f) ;
}
X
get_strwidth(ftype, str) /* Get width in pixels of string value. */
enum font_type ftype ;
char *str ;
{
X return(XTextWidth(font[(int) ftype], str, strlen(str))) ;
}
X
grey_area(x, y, width, height)
{
X gc_mask = GCStipple | GCTileStipXOrigin | GCTileStipYOrigin ;
X gc_val.stipple = grey_pr ;
X gc_val.ts_x_origin = x % 16 ;
X gc_val.ts_y_origin = y % 16 ;
X XChangeGC(dpy, ropgc, gc_mask, &gc_val) ;
X XFillRectangle(dpy, xid, ropgc, x, y, width, height) ;
}
X
handle_event() /* Work out what kind of event this is. */
{
X curx = event_x(cur_event) ;
X cury = event_y(cur_event) ;
X cur_ch = event_id(cur_event) ;
X
X if (cur_ch == LOC_WINENTER) win_set_kbd_focus(canvas, xid) ;
X else if (cur_ch == WIN_REPAINT) type = REPAINT ;
X else if (cur_ch == LOC_MOVE) type = MOUSE_MOVE ;
X else if (cur_ch == LOC_DRAG) type = MOUSE_DRAG ;
X else if (event_is_button(cur_event) && event_is_down(cur_event))
X {
X if (cur_ch == MS_LEFT) type = LEFT_DOWN ;
X else if (cur_ch == MS_MIDDLE) type = MIDDLE_DOWN ;
X else if (cur_ch == MS_RIGHT) type = RIGHT_DOWN ;
X }
X else if (event_is_button(cur_event) && event_is_up(cur_event))
X {
X if (cur_ch == MS_LEFT) type = LEFT_UP ;
X else if (cur_ch == MS_MIDDLE) type = MIDDLE_UP ;
X else if (cur_ch == MS_RIGHT) type = RIGHT_UP ;
X }
X else if (event_is_ascii(cur_event) &&
X event_is_down(cur_event)) type = KEYBOARD ;
X else type = IGNORE ;
}
X
init_fonts()
{
X font[(int) NFONT] = get_font(NORMALFONT) ;
X font_width = font[(int) NFONT]->max_bounds.rbearing -
X font[(int) NFONT]->min_bounds.lbearing ;
X font[(int) BFONT] = get_font(BOLDFONT) ;
}
X
init_ws_type()
{
X ops[(int) GSET] = GXset ;
X ops[(int) GCLR] = GXclear ;
X ops[(int) GXOR] = GXxor ;
X ops[(int) GSRC] = GXcopy ;
X ops[(int) GOR] = GXor ;
X ops[(int) GNOT] = GXcopyInverted ;
X
X started = 0 ; /* Kludge to correctly handle repaints. */
}
X
make_frames(argc, argv)
int argc ;
char *argv[] ;
{
X xv_init(XV_INIT_ARGS, argc, argv, 0) ;
X scantool_icon = xv_create(XV_NULL, ICON,
X ICON_IMAGE, &icon_pr,
X 0) ;
X base_frame = xv_create(XV_NULL, FRAME,
X FRAME_ICON, scantool_icon,
X FRAME_LABEL, progname,
X FRAME_SHOW_RESIZE_CORNER, FALSE,
X 0) ;
X
X show_frame = xv_create(base_frame, FRAME,
X FRAME_SHOW_LABEL, TRUE,
X XV_WIDTH, 650,
X XV_HEIGHT, 900,
X XV_X, 0,
X XV_Y, 0,
X XV_SHOW, FALSE,
X 0) ;
}
X
make_subframes()
{
X canvas = xv_create(base_frame, CANVAS,
X CANVAS_RETAINED, FALSE,
X OPENWIN_AUTO_CLEAR, FALSE,
X XV_WIDTH, SCAN_WIDTH,
X XV_HEIGHT, SCAN_HEIGHT,
X CANVAS_PAINTWINDOW_ATTRS,
X WIN_CONSUME_EVENTS,
X MS_LEFT, MS_MIDDLE, MS_RIGHT,
X WIN_ASCII_EVENTS, KBD_USE, KBD_DONE,
X LOC_WINENTER, LOC_WINEXIT, LOC_DRAG, LOC_MOVE,
X WIN_LEFT_KEYS, WIN_TOP_KEYS, WIN_RIGHT_KEYS,
X WIN_REPAINT,
X 0,
X WIN_EVENT_PROC, canvas_proc,
X 0,
X 0) ;
X wpw = canvas_paint_window(canvas) ;
X
X dpy = (Display *) xv_get(base_frame, XV_DISPLAY) ;
X xid = (Drawable) xv_get(wpw, XV_XID) ;
X
X screen = DefaultScreen(dpy) ;
X root = RootWindow(dpy, screen) ;
X foregnd = BlackPixel(dpy, screen) ;
X backgnd = WhitePixel(dpy, screen) ;
X
X gc_mask = GCForeground | GCBackground | GCGraphicsExposures ;
X gc_val.foreground = foregnd ;
X gc_val.background = backgnd ;
X gc_val.graphics_exposures = False ;
X gc = XCreateGC(dpy, root, gc_mask, &gc_val) ;
X
X backgc = XCreateGC(dpy, root, gc_mask, &gc_val) ;
X XSetForeground(dpy, backgc, gc_val.background) ;
X
X ropgc = XCreateGC(dpy, root, gc_mask, &gc_val) ;
X gc_val.function = GXcopy ;
X gc_val.fill_style = FillOpaqueStippled ;
X XChangeGC(dpy, ropgc, GCFunction | GCFillStyle, &gc_val) ;
X
X grey_pr = (Drawable) xv_get(make_server_image(grey_image, 16, 16), XV_XID) ;
X frame_cursor_pr = make_server_image(frame_cursor_array, 16, 16) ;
X help_cursor_pr = make_server_image(help_cursor_array, 16, 16) ;
X hour_cursor_pr = make_server_image(hour_cursor_array, 16, 16) ;
X main_cursor_pr = make_server_image(main_cursor_array, 16, 16) ;
X images[(int) B_NORMAL] = (Drawable)
X xv_get(make_server_image(button_normal_image, 64, 64), XV_XID) ;
X images[(int) B_INVERT] = (Drawable)
X xv_get(make_server_image(button_invert_image, 64, 64), XV_XID) ;
X images[(int) S_NORMAL] = (Drawable)
X xv_get(make_server_image(switch_normal_image, 16, 16), XV_XID) ;
X images[(int) S_INVERT] = (Drawable)
X xv_get(make_server_image(switch_invert_image, 16, 16), XV_XID) ;
X images[(int) EXCLAIM_IMAGE] = (Drawable)
X xv_get(make_server_image(exclaim_image, 64, 64), XV_XID) ;
X
X cursor[(int) FRAME_CUR] = xv_create(XV_NULL, CURSOR,
X CURSOR_IMAGE, frame_cursor_pr,
X CURSOR_XHOT, 7,
X CURSOR_YHOT, 7,
X 0) ;
X cursor[(int) HELP_CUR] = xv_create(XV_NULL, CURSOR,
X CURSOR_IMAGE, help_cursor_pr,
X 0) ;
X cursor[(int) HOUR_CUR] = xv_create(XV_NULL, CURSOR,
X CURSOR_IMAGE, hour_cursor_pr,
X 0) ;
X cursor[(int) MAIN_CUR] = xv_create(XV_NULL, CURSOR,
X CURSOR_IMAGE, main_cursor_pr,
X 0) ;
X
X show_canvas = xv_create(show_frame, CANVAS,
X CANVAS_REPAINT_PROC, repaint_show_canvas,
X 0) ;
X spw = canvas_paint_window(show_canvas) ;
X spr = NULL ;
X
X XV_SET(canvas, WIN_CURSOR, cursor[(int) MAIN_CUR]) ;
}
X
menu_proc(menu, menu_item)
Menu menu ;
Menu_item menu_item ;
{
X int choice ;
X
X choice = (int) menu_get(menu_item, MENU_VALUE) ;
X if (choice) process_menu(cur_menu, choice) ;
}
X
Server_image
make_server_image(image, width, height)
unsigned short image[] ;
int width, height ;
{
X return(xv_create(XV_NULL, SERVER_IMAGE,
X XV_WIDTH, width,
X XV_HEIGHT, height,
X SERVER_IMAGE_BITS, image,
X 0)) ;
}
X
/*ARGSUSED*/
void
repaint_show_canvas(canvas, pw, repaint_area) /* Show current picture. */
Canvas canvas ;
Pixwin *pw ;
Rectlist *repaint_area ;
{
X PW_WRITE(pw, 0, 0, hdr.ras_width, hdr.ras_height, PIX_SRC, spr, 0, 0) ;
}
X
set_cursor(ctype)
enum cur_type ctype ;
{
X XV_SET(wpw, WIN_CURSOR, cursor[(int) ctype], 0) ;
}
X
show() /* Display scanned image. */
{
X Rect *temprect ;
X char errmes[MAXLINE] ;
X int fd ;
X
X showing = 1 ;
X make_button(SCAN_WIDTH-150, 4*SWITCH_HEIGHT+100, "Show", B_INVERT) ;
X if (spr) PR_DESTROY(spr) ;
X if ((fd = open(picname, O_RDONLY | O_NDELAY, 0644)) == -1)
X {
X SPRINTF(errmes, "Cannot open %s.", picname) ;
X make_display(errmes) ;
X }
X else
X {
X READ(fd, (char *) &hdr, sizeof(struct rasterfile)) ;
X if (hdr.ras_maplength)
X {
X make_display("Color rasterfiles currently not supported.") ;
X return ;
X }
X spr = mem_create(hdr.ras_width, hdr.ras_height, hdr.ras_depth) ;
X READ(fd, (char *) (mpr_d(spr)->md_image),
X hdr.ras_width * hdr.ras_height) ;
X CLOSE(fd) ;
X temprect = (Rect *) xv_get(show_frame, FRAME_OPEN_RECT) ;
X temprect->r_left = temprect->r_top = 0 ;
X temprect->r_height = hdr.ras_height ;
X temprect->r_width = hdr.ras_width ;
X XV_SET(show_frame, FRAME_OPEN_RECT, temprect, 0) ;
X XV_SET(show_frame, FRAME_LABEL, picname, 0) ;
X XV_SET(show_frame, XV_SHOW, TRUE, 0) ;
X }
X make_button(SCAN_WIDTH-150, 4*SWITCH_HEIGHT+100, "Show", B_NORMAL) ;
X showing = 0 ;
}
X
start_tool()
{
X window_fit(base_frame) ;
X NOTIFY_INTERPOSE_DESTROY_FUNC(base_frame, destroy) ;
X started = 1 ;
X window_main_loop(base_frame) ;
}
X
/*ARGSUSED*/
Notify_value
wait_child(frame, pid, status, rusage)
Window frame ;
int pid ;
union wait *status ;
struct rusage *rusage ;
{
X char output[MAXLINE] ;
X int high, low ;
X
X if (WIFSTOPPED(*status)) return (NOTIFY_IGNORED) ;
X
X high = (status->w_status & 0xFF00) >> 8 ;
X low = status->w_status & 0xFF ;
X if (low) SPRINTF(output, "Scan: terminated with signal %1d", (low & 0x3F)) ;
X else
X {
X switch (high)
X {
X case 0 : SPRINTF(output, "Scan: successful. %s saved",
X picname) ;
X break ;
X case 1 : SPRINTF(output, "Scan: cannot open tty port %c",
X switches[SERIAL_PORT] + 'A') ;
X break ;
X case 2 : SPRINTF(output, "Scan: cannot open temporary image file") ;
X break ;
X case 3 : SPRINTF(output, "Scan: cannot open raster header file") ;
X break ;
X case 4 : SPRINTF(output, "Scan: scanner not responding; aborting") ;
X break ;
X case 5 : SPRINTF(output, "Scan: invalid command line argument") ;
X break ;
X default : if (high >= 100 && high < 200)
X SPRINTF(output, "Scan: scanner error %1d; aborting",
X high - 100) ;
X else
X SPRINTF(output, "Scan: terminated with signal %1d",
X high - 200) ;
X }
X }
X make_display(output) ;
X make_button(SCAN_WIDTH-150, 4*SWITCH_HEIGHT+20, "Scan", B_NORMAL) ;
X make_button(SCAN_WIDTH-150, 4*SWITCH_HEIGHT+60, "Cancel", B_NORMAL) ;
X scanning = 0 ;
X return (NOTIFY_DONE) ;
}
X
wait_on_child(pid) /* Wait on child scan process. */
int pid ;
{
X NOTIFY_SET_WAIT3_FUNC(base_frame, wait_child, pid) ;
}
SHAR_EOF
chmod 0644 xview.c ||
echo 'restore of xview.c failed'
Wc_c="`wc -c < 'xview.c'`"
test 16935 -eq "$Wc_c" ||
echo 'xview.c: original size 16935, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
rm -f _shar_seq_.tmp
echo You have unpacked the last part
exit 0
More information about the Alt.sources
mailing list