--- xcb/xcb.c 2002/10/10 10:07:02 1.1 +++ xcb/xcb.c 2002/10/10 12:22:32 1.2 @@ -35,16 +35,14 @@ #include #include -#include /* for strcmp() */ -#ifdef __STDC__ -#include /* for exit()... */ -#endif -#ifndef VMS -#include /* for read(), write() */ -#endif -#include /* for pre-defined atom names */ -#include /* for XtNforeground et.al. */ +#include /* for strcmp() */ +#include +#include /* for exit()... */ +#include /* for read(), write() */ +#include /* for pre-defined atom names */ +#include /* for XtNforeground et.al. */ #include +#include #ifdef ATHENA #ifndef VMS @@ -62,17 +60,17 @@ #include "cb.h" #include "patchlevel.h" -#define eq(a,b) (strcmp((a),(b)) == 0) -#define max(a,b) ((a) > (b)? (a): (b)) +#define eq(a,b) (strcmp((a),(b)) == 0) +#define max(a,b) ((a) > (b)? (a): (b)) -#define XtNbufferCount "bufferCount" /* Application resources */ -#define XtCBufferCount "BufferCount" -#define XtNlayout "layout" -#define XtCLayout "Layout" - -#define PGM_NAME "xcb" -#define PGM_CLASS "Xcb" -#define BUFINC 2048 +#define XtNbufferCount "bufferCount" /* Application resources */ +#define XtCBufferCount "BufferCount" +#define XtNlayout "layout" +#define XtCLayout "Layout" + +#define PGM_NAME "xcb" +#define PGM_CLASS "Xcb" +#define BUFINC 2048 static Display *dpy; static Window root; @@ -85,18 +83,218 @@ static Window seln; static int use_utf8 = 0; -static Atom convert_to; /* convert selection to this cut buffer */ - -#ifdef XVIEW -static Atom caret, clipboard, yield; -static Atom length, lengthc; -#endif +static Atom convert_to; /* convert selection to this cut buffer */ #ifndef X_HAVE_UTF8_STRING #define Xutf8TextPropertyToTextList XmbTextPropertyToTextList #define Xutf8TextListToTextProperty XmbTextListToTextProperty #endif +#define FONT_ELEMENT_SIZE 50 + +static const char * +i_strstr (const char *str, const char *ptn) +{ + const char *s2, *p2; + for (; *str; str++) + { + for (s2 = str, p2 = ptn;; s2++, p2++) + { + if (!*p2) + return str; + if (toupper (*s2) != toupper (*p2)) + break; + } + } + return NULL; +} + +static const char * +Font_GetElement (const char *pattern, char *buf, int bufsiz, ...) +{ + const char *p, *v; + char *p2; + va_list va; + + va_start (va, bufsiz); + buf[bufsiz - 1] = 0; + buf[bufsiz - 2] = '*'; + while ((v = va_arg (va, char *)) != NULL) + { + p = i_strstr (pattern, v); + if (p) + { + strncpy (buf, p + 1, bufsiz - 2); + p2 = strchr (buf, '-'); + if (p2) + *p2 = 0; + va_end (va); + return p; + } + } + va_end (va); + strncpy (buf, "*", bufsiz); + return NULL; +} + +static const char * +Font_GetSize (const char *pattern, int *size) +{ + const char *p; + const char *p2 = NULL; + int n = 0; + + for (p = pattern; 1; p++) + { + if (!*p) + { + if (p2 != NULL && n > 1 && n < 72) + { + *size = n; + return p2 + 1; + } + else + { + *size = 16; + return NULL; + } + } + else if (*p == '-') + { + if (n > 1 && n < 72 && p2 != NULL) + { + *size = n; + return p2 + 1; + } + p2 = p; + n = 0; + } + else if (*p >= '0' && *p <= '9' && p2 != NULL) + { + n *= 10; + n += *p - '0'; + } + else + { + p2 = NULL; + n = 0; + } + } +} + +/* from http://www.debian.org/doc/manuals/intro-i18n/ */ +static XFontSet +XCreateFontSetWithGuess (Display * d, const char *pattern, char ***miss, int *n_miss, char **def) +{ + XFontSet fs; + char *pattern2; + int pixel_size, bufsiz; + char weight[FONT_ELEMENT_SIZE], slant[FONT_ELEMENT_SIZE]; + + /* No problem? or 'fs' for pattern analysis */ + fs = XCreateFontSet (d, pattern, miss, n_miss, def); + if (fs && !*n_miss) + return fs; /* no need for font guessing */ + + /* for non-iso8859-1 language and iso8859-1 specification */ + /* This 'fs' is only for pattern analysis. */ + if (!fs) + { + if (*n_miss) + XFreeStringList (*miss); + + setlocale (LC_CTYPE, "C"); + fs = XCreateFontSet (d, pattern, miss, n_miss, def); + setlocale (LC_CTYPE, ""); + } + + /* make XLFD font name for pattern analysis */ + if (fs) + { + XFontStruct **fontstructs; + char **fontnames; + XFontsOfFontSet (fs, &fontstructs, &fontnames); + pattern = fontnames[0]; + } + + /* read elements of font name */ + Font_GetElement (pattern, weight, FONT_ELEMENT_SIZE, + "-medium-", "-bold-", "-demibold-", "-regular-", NULL); + Font_GetElement (pattern, slant, FONT_ELEMENT_SIZE, + "-r-", "-i-", "-o-", "-ri-", "-ro-", NULL); + Font_GetSize (pattern, &pixel_size); + + /* modify elements of font name to fit usual font names */ + if (!strcmp (weight, "*")) + strncpy (weight, "medium", FONT_ELEMENT_SIZE); + if (!strcmp (slant, "*")) + strncpy (slant, "r", FONT_ELEMENT_SIZE); + if (pixel_size < 3) + pixel_size = 3; + else if (pixel_size > 97) + pixel_size = 97; + + /* build font pattern for better matching for various charsets */ + bufsiz = strlen (pattern) + FONT_ELEMENT_SIZE * 2 + 2 * 2 + 58; + pattern2 = (char *) malloc (bufsiz); + if (pattern2) + { + snprintf (pattern2, bufsiz - 1, "%s," + "-*-*-%s-%s-*-*-%d-*-*-*-*-*-*-*," + "-*-*-*-*-*-*-%d-*-*-*-*-*-*-*,*", + pattern, + weight, slant, pixel_size, + pixel_size); + pattern = pattern2; + } + if (*n_miss) + XFreeStringList (*miss); + if (fs) + XFreeFontSet (d, fs); + + /* create fontset */ + fs = XCreateFontSet (d, pattern, miss, n_miss, def); + if (pattern2) + free (pattern2); + + return fs; +} + +static +Boolean +CvtStringToFontSet (dpy, args, num_args, fromVal, toVal, closure_ret) + Display *dpy; + XrmValuePtr args; + Cardinal *num_args; + XrmValuePtr fromVal; + XrmValuePtr toVal; + XtPointer *closure_ret; +{ + XFontSet f; + char **missing_charset_list; + int missing_charset_count; + char *def_string; + + f = XCreateFontSetWithGuess (dpy, (char *) fromVal->addr, + &missing_charset_list, &missing_charset_count, &def_string); + /* Free any returned missing charset list */ + if (missing_charset_count) + { + fprintf (stderr, "Missing charsets in String to FontSet conversion (%s)\n", missing_charset_list[0]); + XFreeStringList (missing_charset_list); + } + + if (!f) + { + f = XCreateFontSetWithGuess (dpy, "-*-*-*-R-*-*-*-120-*-*-*-*", + &missing_charset_list, &missing_charset_count, &def_string); + } + + *(XFontSet *) (toVal->addr) = f; + + return f ? True : False; +} + /* * Fetch the contents of cut buffer n from the root window. */ @@ -114,15 +312,15 @@ *nb = 0; if (XGetWindowProperty (dpy, root, a, - 0L, 10000000L, False, AnyPropertyType, - &pt.encoding, &pt.format, &pt.nitems, - &after, &pt.value) != Success || !pt.nitems) + 0L, 10000000L, False, AnyPropertyType, + &pt.encoding, &pt.format, &pt.nitems, + &after, &pt.value) != Success || !pt.nitems) return strdup (""); if (pt.nitems) { (force_mb ? XmbTextPropertyToTextList : Xutf8TextPropertyToTextList) - (dpy, &pt, &list, &count); + (dpy, &pt, &list, &count); data = strdup (list[0]); *nb = strlen (data); @@ -152,7 +350,7 @@ (dpy, &p, 1, XStdICCTextStyle, &pt); XChangeProperty (dpy, root, atom, pt.encoding, - 8, PropModeReplace, pt.value, pt.nitems); + 8, PropModeReplace, pt.value, pt.nitems); XFree (pt.value); } @@ -170,7 +368,7 @@ { atom = (Atom *) XtRealloc ((char *) atom, (n + 1) * sizeof (Atom)); while (natoms < n + 1) - atom[natoms++] = 0; + atom[natoms++] = 0; } if (!atom[n]) @@ -221,15 +419,15 @@ / cb->font_width; */ /*len = min(len, cols); */ if (len > 0) - { - y -= cb->font_ascent; + { + y -= cb->font_ascent; #if X_HAVE_UTF8_STRING - Xutf8DrawImageString + Xutf8DrawImageString #else - XmbDrawImageString + XmbDrawImageString #endif - (dpy, cb->core.window, cb->fontset, gc, 0, y, str, len); - } + (dpy, cb->core.window, cb->fontset, gc, 0, y, str, len); + } } } @@ -241,7 +439,7 @@ */ static void -cb_initialize (req, wdg, args, nargs) /*ARGSUSED */ +cb_initialize (req, wdg, args, nargs) /*ARGSUSED */ Widget req, wdg; ArgList args; Cardinal *nargs; @@ -289,7 +487,7 @@ * Keep it simple. */ static void -cb_redisplay (wdg, event, region) /*ARGSUSED */ +cb_redisplay (wdg, event, region) /*ARGSUSED */ Widget wdg; XEvent *event; Region region; @@ -303,11 +501,11 @@ while (pp < base + nbytes) { if (*pp == '\n') - { - place_text (cb, p, pp - p, y); - p = pp + 1; - y += cb->font_height; - } + { + place_text (cb, p, pp - p, y); + p = pp + 1; + y += cb->font_height; + } pp++; } place_text (cb, p, pp - p, y); @@ -342,7 +540,7 @@ * This breaks all the rules for object oriented widgets. Disgusting, no? */ static void -cb_cut (wdg, event, parms, nparms) /*ARGSUSED */ +cb_cut (wdg, event, parms, nparms) /*ARGSUSED */ Widget wdg; XEvent *event; String *parms; @@ -370,15 +568,11 @@ seln = win; XClearArea (dpy, win, 0, 0, 0, 0, False); cb_redisplay (wdg, (XEvent *) 0, (Region) 0); -#ifdef XVIEW - XSetSelectionOwner (dpy, caret, win, event->xbutton.time); - XSetSelectionOwner (dpy, clipboard, win, event->xbutton.time); -#endif } } static void -cb_paste (wdg, event, parms, nparms) /*ARGSUSED */ +cb_paste (wdg, event, parms, nparms) /*ARGSUSED */ Widget wdg; XEvent *event; String *parms; @@ -392,17 +586,17 @@ w = XGetSelectionOwner (dpy, XA_PRIMARY); if (w == None) { - ptr = fetch_buffer (atom[0], &n, 0); /* copy from cb0 */ + ptr = fetch_buffer (atom[0], &n, 0); /* copy from cb0 */ store_buffer (ptr, n, cb->atom, 0); XFree (ptr); } else if (w != cb->core.window) XConvertSelection (dpy, XA_PRIMARY, xa_utf8_string, - convert_to = cb->atom, XtWindow(wdg), event->xbutton.time); + convert_to = cb->atom, XtWindow (wdg), event->xbutton.time); } static void -cb_clear (wdg, event, parms, nparms) /*ARGSUSED */ +cb_clear (wdg, event, parms, nparms) /*ARGSUSED */ Widget wdg; XEvent *event; String *parms; @@ -420,7 +614,7 @@ } static void -cb_rotate (wdg, event, parms, nparms) /*ARGSUSED */ +cb_rotate (wdg, event, parms, nparms) /*ARGSUSED */ Widget wdg; XEvent *event; String *parms; @@ -436,7 +630,7 @@ } static void -cb_quit (wdg, event, parms, nparms) /*ARGSUSED */ +cb_quit (wdg, event, parms, nparms) /*ARGSUSED */ Widget wdg; XEvent *event; String *parms; @@ -449,7 +643,7 @@ * Clear and redraw the widget's window. */ static void -cb_refresh (wdg, event, parms, nparms) /*ARGSUSED */ +cb_refresh (wdg, event, parms, nparms) /*ARGSUSED */ Widget wdg; XEvent *event; String *parms; @@ -467,7 +661,7 @@ * of the cut buffer to the target window+atom. */ static void -cb_selreq (wdg, event, parms, nparms) /*ARGSUSED */ +cb_selreq (wdg, event, parms, nparms) /*ARGSUSED */ Widget wdg; XEvent *event; String *parms; @@ -480,10 +674,6 @@ CbWidget cb = (CbWidget) wdg; Window win = cb->core.window; -#ifdef XVIEW - unsigned long data; -#endif - rq = (XSelectionRequestEvent *) event; notify.type = SelectionNotify; @@ -494,119 +684,51 @@ notify.property = None; notify.time = rq->time; -#ifdef XVIEW - if (rq->selection == XA_PRIMARY) + if (win == seln) { - if (rq->target == yield) - { - /* tell 'em we'll give it up */ - data = 1; - XChangeProperty (dpy, rq->requestor, rq->property, - rq->target, 32, PropModeReplace, - (unsigned char *) &data, 1); - notify.property = rq->property; - } - else - { -#endif + XICCEncodingStyle style; + Atom target = None; - if (win == seln) - { - XICCEncodingStyle style; - Atom target = None; - - if (rq->target == XA_STRING) - { - target = XA_STRING; - style = XStringStyle; - } - else if (rq->target == xa_text) - { - target = xa_compound_text; - style = XStdICCTextStyle; - } - else if (rq->target == xa_compound_text) - { - target = xa_compound_text; - style = XCompoundTextStyle; - } + if (rq->target == XA_STRING) + { + target = XA_STRING; + style = XStringStyle; + } + else if (rq->target == xa_text) + { + target = xa_compound_text; + style = XStdICCTextStyle; + } + else if (rq->target == xa_compound_text) + { + target = xa_compound_text; + style = XCompoundTextStyle; + } #ifdef X_HAVE_UTF8_STRING - else if (rq->target == xa_utf8_string) - { - target = xa_utf8_string; - style = XUTF8StringStyle; - } + else if (rq->target == xa_utf8_string) + { + target = xa_utf8_string; + style = XUTF8StringStyle; + } #endif - if (target != None) - { - XTextProperty pt; - char *fl; - - fl = fetch_buffer (cb->atom, &nbytes, 0); - Xutf8TextListToTextProperty (dpy, &fl, 1, style, &pt); - XFree (fl); - - XChangeProperty (dpy, rq->requestor, rq->property, - pt.encoding, 8, PropModeReplace, - pt.value, pt.nitems); - - notify.property = rq->property; - XFree (pt.value); - } - } + if (target != None) + { + XTextProperty pt; + char *fl; -#ifdef XVIEW - } - } - else if (rq->selection == caret) - { - if (rq->target == yield) - { - /* - * Give up the caret (which meant that we - * own the clipboard) - */ - XSetSelectionOwner (dpy, caret, None, - event->xselectionrequest.time); - data = 1; - XChangeProperty (dpy, rq->requestor, rq->property, - rq->target, 32, PropModeReplace, - (unsigned char *) &data, 1); - notify.property = rq->property; - } - } - else if (rq->selection == clipboard && win == seln) - { - ptr = fetch_buffer (cb->atom, &nbytes, 0); - if (rq->target == lengthc || rq->target == length) - { - /* - * Send the length of the selection. - */ - data = nbytes; - XChangeProperty (dpy, rq->requestor, rq->property, - rq->target, 32, PropModeReplace, - (unsigned char *) &data, 1); - notify.property = rq->property; - } - else if (rq->target == XA_STRING || - rq->target == xa_text || rq->target == xa_compound_text) - { - /* - * Send the selection itself. - * All of our selections will be XA_STRING, - * but if they ask for COMPOUND_TEXT, it's ok - * to say that that's what we've got... - */ - XChangeProperty (dpy, rq->requestor, rq->property, - (rq->target == xa_compound_text ? xa_compound_text : XA_STRING), 8, - PropModeReplace, ptr, nbytes); - notify.property = rq->property; - } - XFree (ptr); + fl = fetch_buffer (cb->atom, &nbytes, 0); + Xutf8TextListToTextProperty (dpy, &fl, 1, style, &pt); + XFree (fl); + + XChangeProperty (dpy, rq->requestor, rq->property, + pt.encoding, 8, PropModeReplace, + pt.value, pt.nitems); + + notify.property = rq->property; + XFree (pt.value); + } } -#endif XSendEvent (dpy, rq->requestor, False, 0, (XEvent *) & notify); } @@ -617,7 +739,7 @@ * be redrawn without highlighting. */ static void -cb_selclear (wdg, event, parms, nparms) /*ARGSUSED */ +cb_selclear (wdg, event, parms, nparms) /*ARGSUSED */ Widget wdg; XEvent *event; String *parms; @@ -625,42 +747,23 @@ { CbWidget cb = (CbWidget) wdg; -#ifdef XVIEW - Window w; - Time t; -#endif - if (event->xproperty.atom != XA_PRIMARY) return; seln = 0; XClearArea (dpy, cb->core.window, 0, 0, 0, 0, False); cb_redisplay (wdg, (XEvent *) 0, (Region) 0); -#ifdef XVIEW - /* - * Since we don't have ownership of PRIMARY anymore, - * we'd better get rid of CLIPBOARD and _SUN_SELN_CARET, - * if they're still ours. - */ - t = event->xselectionclear.time; - w = XGetSelectionOwner (dpy, caret); - if (w == cb->core.window) - XSetSelectionOwner (dpy, caret, None, t); - w = XGetSelectionOwner (dpy, clipboard); - if (w == cb->core.window) - XSetSelectionOwner (dpy, clipboard, None, t); -#endif } static XtResource resources[] = { -#define offset(field) XtOffset(CbWidget, field) - /* {name, class, type, size, offset, default_type, default_addr}, */ +#define offset(field) XtOffset(CbWidget, field) + /* {name, class, type, size, offset, default_type, default_addr}, */ {XtNforeground, XtCForeground, XtRPixel, sizeof (Pixel), offset (fgnd), XtRString, (XtPointer) "XtDefaultForeground"}, {XtNfontSet, XtCFontSet, XtRFontSet, sizeof (XFontSet), offset (fontset), XtRString, (XtPointer) "XtDefaultFontSet"}, - {XtNatom, XtCAtom, XtRAtom, sizeof (Atom), /* internal use */ + {XtNatom, XtCAtom, XtRAtom, sizeof (Atom), /* internal use */ offset (atom), XtRImmediate, (XtPointer) 0}, #undef offset }; @@ -678,55 +781,55 @@ }; static char cb_transl[] = "\ - : cut() \n\ - Shift : clear() \n\ - : paste() \n\ - Shift : rotate(-1) \n\ - : rotate(1) \n\ - Left: rotate(-1) \n\ - Right: rotate(1) \n\ - Up: rotate(-1) \n\ - Down: rotate(1) \n\ - q: quit() \n\ - : selreq() \n\ - : selclear() \n\ - "; + : cut() \n\ + Shift : clear() \n\ + : paste() \n\ + Shift : rotate(-1) \n\ + : rotate(1) \n\ + Left: rotate(-1) \n\ + Right: rotate(1) \n\ + Up: rotate(-1) \n\ + Down: rotate(1) \n\ + q: quit() \n\ + : selreq() \n\ + : selclear() \n\ + "; CbClassRec cbClassRec = { { - (WidgetClass) & widgetClassRec, /* superclass */ - "Buffer", /* class_name */ - sizeof (CbRec), /* widget_size */ - NULL, /* class_initialize */ - NULL, /* class_part_initialize */ - FALSE, /* class_inited */ - cb_initialize, /* initialize */ - NULL, /* initialize_hook */ - cb_realize, /* realize */ - actions, /* actions */ - XtNumber (actions), /* num_actions */ - resources, /* resources */ - XtNumber (resources), /* num_resources */ - NULLQUARK, /* xrm_class */ - TRUE, /* compress_motion */ - TRUE, /* compress_exposure */ - TRUE, /* compress_enterleave */ - FALSE, /* visible_interest */ - cb_destroy, /* destroy */ - NULL, /* resize */ - cb_redisplay, /* expose */ - NULL, /* set_values */ - NULL, /* set_values_hook */ - XtInheritSetValuesAlmost, /* set_values_almost */ - NULL, /* get_values_hook */ - NULL, /* accept_focus */ - XtVersion, /* version */ - NULL, /* callback_private */ - cb_transl, /* tm_table */ - XtInheritQueryGeometry, /* query_geometry */ - XtInheritDisplayAccelerator, /* display_accelerator */ - NULL /* extension */ + (WidgetClass) & widgetClassRec, /* superclass */ + "Buffer", /* class_name */ + sizeof (CbRec), /* widget_size */ + NULL, /* class_initialize */ + NULL, /* class_part_initialize */ + FALSE, /* class_inited */ + cb_initialize, /* initialize */ + NULL, /* initialize_hook */ + cb_realize, /* realize */ + actions, /* actions */ + XtNumber (actions), /* num_actions */ + resources, /* resources */ + XtNumber (resources), /* num_resources */ + NULLQUARK, /* xrm_class */ + TRUE, /* compress_motion */ + TRUE, /* compress_exposure */ + TRUE, /* compress_enterleave */ + FALSE, /* visible_interest */ + cb_destroy, /* destroy */ + NULL, /* resize */ + cb_redisplay, /* expose */ + NULL, /* set_values */ + NULL, /* set_values_hook */ + XtInheritSetValuesAlmost, /* set_values_almost */ + NULL, /* get_values_hook */ + NULL, /* accept_focus */ + XtVersion, /* version */ + NULL, /* callback_private */ + cb_transl, /* tm_table */ + XtInheritQueryGeometry, /* query_geometry */ + XtInheritDisplayAccelerator, /* display_accelerator */ + NULL /* extension */ }, }; @@ -743,8 +846,8 @@ usage () { fprintf (stderr, - "Usage: %s [Xt option] [-l layout] [-n count] [-p|-s|-S list] [-r count]\n", - PGM_NAME); + "Usage: %s [Xt option] [-l layout] [-n count] [-p|-s|-S list] [-r count]\n", + PGM_NAME); exit (1); } @@ -755,14 +858,14 @@ * or in the xdm-errors file when forcibly destroying the client program. */ static int -xioerror (d) /*ARGSUSED */ +xioerror (d) /*ARGSUSED */ Display *d; { - exit (1); /*NOTREACHED */ + exit (1); /*NOTREACHED */ } static void -wmdel (wdg, ptr, ep, cont) /*ARGSUSED */ +wmdel (wdg, ptr, ep, cont) /*ARGSUSED */ Widget wdg; XtPointer ptr; XEvent *ep; @@ -789,10 +892,10 @@ ptr = fetch_buffer (a, &nb, !use_utf8); if (write (1, ptr, nb) != nb) - { - fprintf (stderr, "Write error\n"); - exit (1); - } + { + fprintf (stderr, "Write error\n"); + exit (1); + } XFree (ptr); } @@ -842,11 +945,11 @@ if (XGetSelectionOwner (dpy, XA_PRIMARY) == None) { if (n != 0) - { - data = fetch_buffer (atom[0], &nbytes, 0); - store_buffer (data, nbytes, atm, 0); - XFree (data); - } + { + data = fetch_buffer (atom[0], &nbytes, 0); + store_buffer (data, nbytes, atm, 0); + XFree (data); + } return; } @@ -858,14 +961,14 @@ { XtAppNextEvent (app, &event); if (event.type == PropertyNotify - && event.xproperty.window == root - && event.xproperty.atom == atm - && event.xproperty.state == PropertyNewValue) - { - return; - } + && event.xproperty.window == root + && event.xproperty.atom == atm + && event.xproperty.state == PropertyNewValue) + { + return; + } - XtDispatchEvent (&event); /* This cannot happen. !!?? */ + XtDispatchEvent (&event); /* This cannot happen. !!?? */ } } @@ -889,32 +992,32 @@ while (*list) { if (!isdigit (*list)) - usage (); + usage (); for (m = 0; isdigit (*list); list++) - m = m * 10 + *list - '0'; + m = m * 10 + *list - '0'; (*fn) (m, data, nbytes); if (*list == '-') - { - list++; - if (!isdigit (*list)) - usage (); - for (n = 0; isdigit (*list); list++) - n = n * 10 + *list - '0'; + { + list++; + if (!isdigit (*list)) + usage (); + for (n = 0; isdigit (*list); list++) + n = n * 10 + *list - '0'; - x = (m > n) ? -1 : 1; - while (m != n) - { - m += x; - (*fn) (m, data, nbytes); - } - } + x = (m > n) ? -1 : 1; + while (m != n) + { + m += x; + (*fn) (m, data, nbytes); + } + } if (*list == ',') - list++; + list++; else if (*list) - usage (); + usage (); } } @@ -936,39 +1039,39 @@ switch (cmd) { - case 'p': /* print one or more buffers */ + case 'p': /* print one or more buffers */ dolist (arg, doprint, (char *) 0, 0); break; - case 'r': /* rotate the buffer contents */ + case 'r': /* rotate the buffer contents */ n = atoi (arg); if (n == 0) - break; + break; initialize_properties (); XRotateWindowProperties (dpy, root, atom, nbuffs, n); break; - case 's': /* store data in one or more buffers */ + case 's': /* store data in one or more buffers */ do - { - ptr = XtRealloc (ptr, nb + BUFINC); - i = BUFINC; - do - { - n = read (0, ptr + nb, i); - nb += n; - i -= n; - } - while (n > 0 && i > 0); - } + { + ptr = XtRealloc (ptr, nb + BUFINC); + i = BUFINC; + do + { + n = read (0, ptr + nb, i); + nb += n; + i -= n; + } + while (n > 0 && i > 0); + } while (n > 0); if (n == -1) - { - fprintf (stderr, "Read error\n"); - exit (1); - } + { + fprintf (stderr, "Read error\n"); + exit (1); + } dolist (arg, doset, ptr, nb); XtFree (ptr); @@ -990,7 +1093,7 @@ static XtResource res[] = { -#define offset(field) XtOffset(ares_ptr, field) +#define offset(field) XtOffset(ares_ptr, field) {XtNbufferCount, XtCBufferCount, XtRInt, sizeof (int), offset (nbuffs), XtRImmediate, (XtPointer) 8}, {XtNlayout, XtCLayout, XtRString, sizeof (char *), @@ -999,12 +1102,12 @@ }; static char *def[] = -{ /* default resource values */ - ".bufferCount: 8", - ".layout: horizontal", - "*fontSet: XtDefaultFontSet", - "*Buffer.width: 60", - "*Buffer.height: 60", +{ /* default resource values */ + ".bufferCount: 8", + ".layout: horizontal", + "*fontSet: XtDefaultFontSet", + "*Buffer.width: 60", + "*Buffer.height: 60", 0, }; @@ -1052,6 +1155,15 @@ dpy = XtDisplay (top); root = RootWindow (dpy, DefaultScreen (dpy)); + XtSetTypeConverter(XtRString, /* source type */ + XtRFontSet, /* target type */ + CvtStringToFontSet, /* converter routine */ + (XtConvertArgList) NULL, + /* args for converter routine */ + 0, /*# args for converter routine */ + XtCacheAll, /* caching instructions */ + NULL); /* destructor function */ + XtGetApplicationResources (top, &ares, res, XtNumber (res), 0, 0); nbuffs = max (ares.nbuffs, 1); @@ -1059,12 +1171,12 @@ for (p = argv + 1; p < argv + argc; p++) { if (eq (*p, "-u")) - use_utf8 = 1; + use_utf8 = 1; else if (eq (*p, "-V")) - { - printf ("xcb version %s\n", version); - exit (0); - } + { + printf ("xcb version %s\n", version); + exit (0); + } } /* @@ -1076,14 +1188,14 @@ for (p = argv + 1; p < argv + argc; p++) { if (eq (*p, "-p") || eq (*p, "-r") || eq (*p, "-s") || eq (*p, "-S")) - { - if (p == argv + argc - 1) - usage (); + { + if (p == argv + argc - 1) + usage (); - dotask (p[0][1], p[1]); - XCloseDisplay (dpy); - exit (0); - } + dotask (p[0][1], p[1]); + XCloseDisplay (dpy); + exit (0); + } } /* @@ -1106,21 +1218,21 @@ XtSetArg (args[0], XtNatom, get_atom (i, False)); n = 1; if (i > 0) - { - if (ares.layout[0] == 'h') - { - XtSetArg (args[1], XtNfromHoriz, wdg[i - 1]); - XtSetArg (args[2], XtNfromVert, 0); - n = 3; - } + { + if (ares.layout[0] == 'h') + { + XtSetArg (args[1], XtNfromHoriz, wdg[i - 1]); + XtSetArg (args[2], XtNfromVert, 0); + n = 3; + } - if (ares.layout[0] == 'v') - { - XtSetArg (args[1], XtNfromVert, wdg[i - 1]); - XtSetArg (args[2], XtNfromHoriz, 0); - n = 3; - } - } + if (ares.layout[0] == 'v') + { + XtSetArg (args[1], XtNfromVert, wdg[i - 1]); + XtSetArg (args[2], XtNfromHoriz, 0); + n = 3; + } + } sprintf (name, "buffer%d", i); wdg[i] = XtCreateWidget (name, cbWidgetClass, box, args, n); @@ -1179,14 +1291,6 @@ if (!xa_utf8_string) xa_utf8_string = xa_compound_text; -#ifdef XVIEW - clipboard = XInternAtom (dpy, "CLIPBOARD", False); - caret = XInternAtom (dpy, "_SUN_SELN_CARET", False); - yield = XInternAtom (dpy, "_SUN_SELN_YIELD", False); - length = XInternAtom (dpy, "LENGTH", False); - lengthc = XInternAtom (dpy, "LENGTH_CHARS", False); -#endif - initialize_properties (); } @@ -1242,9 +1346,7 @@ } } else - { - (void) XtDispatchEvent (&event); - } + (void) XtDispatchEvent (&event); } }