Jabber WindowGram Client (JWGC)

Introduction Screenshots Installation Downloads
Documentation Browse Source Resources Project Site

Stable Version
-none-

Latest Version
beta5



Main Page | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

xshow.c File Reference

#include "mit-copyright.h"
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xresource.h>
#include "pointer_dictionary.h"
#include "formatter.h"
#include "variables.h"
#include "main.h"
#include "X_fonts.h"
#include "X_gram.h"
#include "xmode_stack.h"

Go to the source code of this file.

Data Structures

struct  res_dict_type

Defines

#define max(a, b)   ((a)>(b)?(a):(b))
#define xres_get_geometry(style)   xres_get_resource(&geometry_resources,style)
#define xres_get_bgcolor(style)   xres_get_resource(&bgcolor_resources,style)
#define MODE_TO_FONT(dpy, style, mode)
#define envmatch(string, length)   ((desc->len==(length)) && (strncasecmp(desc->str,(string),(length))==0))

Functions

unsigned long x_string_to_color ()
void xshowinit ()
char * mode_to_colorname (Display *dpy, char *style, xmode *mode)
void fixup_and_draw (Display *dpy, char *style, xauxblock *auxblocks, xblock *blocks, int num, xlinedesc *lines, int numlines, int beepcount)
char * no_dots_downcase_var (char *str)
void xshow (Display *dpy, desctype *desc, int numstr, int numnl)
void x_get_input (Display *dpy)

Variables

XContext desc_context
int internal_border_width
unsigned long default_bgcolor
unsigned long default_fgcolor


Define Documentation

#define envmatch string,
length   )     ((desc->len==(length)) && (strncasecmp(desc->str,(string),(length))==0))
 

Referenced by xshow().

#define max a,
 )     ((a)>(b)?(a):(b))
 

Definition at line 24 of file xshow.c.

#define MODE_TO_FONT dpy,
style,
mode   ) 
 

Value:

get_font((dpy),(style),(mode)->font?(mode)->font:(mode)->substyle, \
           (mode)->size, (mode)->bold+(mode)->italic*2)

Definition at line 354 of file xshow.c.

Referenced by xshow().

#define xres_get_bgcolor style   )     xres_get_resource(&bgcolor_resources,style)
 

Definition at line 86 of file xshow.c.

Referenced by fixup_and_draw().

#define xres_get_geometry style   )     xres_get_resource(&geometry_resources,style)
 

Definition at line 85 of file xshow.c.

Referenced by fixup_and_draw().


Function Documentation

void fixup_and_draw Display *  dpy,
char *  style,
xauxblock auxblocks,
xblock blocks,
int  num,
xlinedesc lines,
int  numlines,
int  beepcount
 

Definition at line 110 of file xshow.c.

References _xauxblock::align, _xlinedesc::ascent, _x_gram::bgcolor, _x_gram::blocks, CENTERALIGN, _xlinedesc::csize, default_bgcolor, _xlinedesc::descent, dpy, _xblock::fid, _xauxblock::font, internal_border_width, LEFTALIGN, _xauxblock::len, _xlinedesc::lsize, max, _xlinedesc::numblock, _x_gram::numblocks, RIGHTALIGN, _xlinedesc::rsize, _xauxblock::str, _xblock::strindex, _xblock::strlen, _x_gram::text, var_get_variable(), _xauxblock::width, _xblock::x, _xblock::x1, _xblock::x2, x_gram, x_gram_create(), x_string_to_color(), xauxblock, xblock, xlinedesc, xres_get_bgcolor, xres_get_geometry, _xblock::y, _xblock::y1, and _xblock::y2.

Referenced by xshow().

00120 {
00121         int gram_xalign = 1;
00122         int gram_yalign = 1;
00123         int gram_xpos, gram_ypos, gram_xsize, gram_ysize;
00124 
00125         x_gram *gram;
00126         int strindex = 0;
00127 
00128         int line, block = 0;
00129         int maxwidth = 0, chars = 0, maxascent, maxdescent;
00130         int ssize, lsize, csize, rsize, width = 0;
00131         int i, ascent, descent;
00132 
00133         int yofs = internal_border_width;
00134         int lofs, cofs, rofs;
00135         int ystart, yend;
00136 
00137         char *bgstr, *geometry, xpos[10], ypos[10], xfrom, yfrom;
00138 
00139         gram = (x_gram *) malloc(sizeof(x_gram));
00140 
00141         /*
00142          * Find total lengths of left, center, and right parts.  Also find
00143          * the length of the longest line and the total number of characters.
00144          */
00145 
00146         for (line = 0; line < numlines; line++) {
00147                 lsize = csize = rsize = 0;
00148                 maxascent = maxdescent = 0;
00149 
00150                 /* add up sizes for each block, get max ascent and descent */
00151 
00152                 for (i = 0; i < lines[line].numblock; i++, block++) {
00153                         chars += auxblocks[block].len;
00154                         ssize = XTextWidth(auxblocks[block].font, auxblocks[block].str,
00155                                            auxblocks[block].len);
00156                         auxblocks[block].width = ssize;
00157                         ascent = auxblocks[block].font->ascent;
00158                         descent = auxblocks[block].font->descent;
00159                         if (ascent > maxascent)
00160                                 maxascent = ascent;
00161                         if (descent > maxdescent)
00162                                 maxdescent = descent;
00163                         switch (auxblocks[block].align) {
00164                                 case LEFTALIGN:
00165                                         lsize += ssize;
00166                                         break;
00167 
00168                                 case CENTERALIGN:
00169                                         csize += ssize;
00170                                         break;
00171 
00172                                 case RIGHTALIGN:
00173                                         rsize += ssize;
00174                                         break;
00175                         }
00176                 }
00177 
00178                 /* save what we need to do size fixups */
00179 
00180                 if (maxascent > lines[line].ascent)
00181                         lines[line].ascent = maxascent;
00182                 if (maxdescent > lines[line].descent)
00183                         lines[line].descent = maxdescent;
00184                 lines[line].lsize = lsize;
00185                 lines[line].csize = csize;
00186                 lines[line].rsize = rsize;
00187 
00188                 /*
00189                  * get width of line and see if it is bigger than the max
00190                  * width
00191                  */
00192 
00193                 switch ((lsize ? 1 : 0) + (csize ? 2 : 0) + (rsize ? 4 : 0)) {
00194                         case 0:
00195                                 width = 0;
00196                                 break;
00197 
00198                         case 1:
00199                                 width = lsize;
00200                                 break;
00201 
00202                         case 2:
00203                                 width = csize;
00204                                 break;
00205 
00206                         case 3:
00207                                 /*
00208                                  * in all these cases, we just want to add
00209                                  * the width of *any* space, so the first
00210                                  * font will do just fine.
00211                                  */
00212                                 /*
00213                                  * XXX implicit assumption that a line must
00214                                  * have at least one block, so that there is
00215                                  * indeed a reasonable font in
00216                                  * auxblocks[0].font
00217                                  */
00218                                 width = lsize * 2 + csize + XTextWidth(auxblocks[0].font, " ", 1);
00219                                 break;
00220 
00221                         case 4:
00222                                 width = rsize;
00223                                 break;
00224 
00225                         case 5:
00226                                 width = lsize + rsize + XTextWidth(auxblocks[0].font, " ", 1);
00227                                 break;
00228 
00229                         case 6:
00230                                 width = csize + rsize * 2 + XTextWidth(auxblocks[0].font, " ", 1);
00231                                 break;
00232 
00233                         case 7:
00234                                 width = max(lsize, rsize) * 2 + csize +
00235                                         XTextWidth(auxblocks[0].font, " ", 1) * 2;
00236                                 break;
00237                 }
00238                 if (width > maxwidth)
00239                         maxwidth = width;
00240         }
00241 
00242         /* fixup x,y for each block, create big string and indices into it */
00243         /* set x1,y1,x2,y2 of each block also. */
00244 
00245         gram->text = (char *) malloc(chars);
00246         block = 0;
00247 
00248         for (line = 0; line < numlines; line++) {
00249                 lofs = internal_border_width;
00250                 cofs = ((maxwidth - lines[line].csize) >> 1) + internal_border_width;
00251                 rofs = maxwidth - lines[line].rsize + internal_border_width;
00252                 ystart = yofs;
00253                 yofs += lines[line].ascent;
00254                 yend = yofs + lines[line].descent + 1;  /* +1 because lines look
00255                                                          * scrunched without it. */
00256 
00257                 for (i = 0; i < lines[line].numblock; i++, block++) {
00258                         blocks[block].fid = auxblocks[block].font->fid;
00259                         switch (auxblocks[block].align) {
00260                                 case LEFTALIGN:
00261                                         blocks[block].x = lofs;
00262                                         blocks[block].x1 = lofs;
00263                                         lofs += auxblocks[block].width;
00264                                         blocks[block].x2 = lofs;
00265                                         break;
00266 
00267                                 case CENTERALIGN:
00268                                         blocks[block].x = cofs;
00269                                         blocks[block].x1 = cofs;
00270                                         cofs += auxblocks[block].width;
00271                                         blocks[block].x2 = cofs;
00272                                         break;
00273 
00274                                 case RIGHTALIGN:
00275                                         blocks[block].x = rofs;
00276                                         blocks[block].x1 = rofs;
00277                                         rofs += auxblocks[block].width;
00278                                         blocks[block].x2 = rofs;
00279                                         break;
00280                         }
00281                         blocks[block].y = yofs;
00282                         blocks[block].y1 = ystart;
00283                         blocks[block].y2 = yend;
00284                         blocks[block].strindex = strindex;
00285                         blocks[block].strlen = auxblocks[block].len;
00286                         strncpy(gram->text + strindex, auxblocks[block].str,
00287                                 auxblocks[block].len);
00288                         strindex += blocks[block].strlen;
00289                 }
00290 
00291                 yofs = yend;
00292 
00293         }
00294 
00295         if ((geometry = var_get_variable("X_geometry")), (geometry[0] == '\0'))
00296                 if ((geometry = xres_get_geometry(style)) == NULL)
00297                         if ((geometry = var_get_variable("default_X_geometry")),
00298                             (geometry[0] == '\0'))
00299                                 geometry = "+0+0";
00300         sscanf(geometry, "%c%[0123456789c]%c%[0123456789c]", &xfrom, xpos,
00301                &yfrom, ypos);
00302 
00303         if (xpos[0] == 'c') {
00304                 gram_xalign = 0;
00305                 gram_xpos = 0;
00306         }
00307         else
00308                 gram_xpos = atoi(xpos);
00309         if (xfrom == '-')
00310                 gram_xalign *= -1;
00311 
00312         if (ypos[0] == 'c') {
00313                 gram_yalign = 0;
00314                 gram_ypos = 0;
00315         }
00316         else
00317                 gram_ypos = atoi(ypos);
00318         if (yfrom == '-')
00319                 gram_yalign *= -1;
00320 
00321         if ((bgstr = var_get_variable("X_background")), (bgstr[0] == '\0'))
00322                 if ((bgstr = xres_get_bgcolor(style)) == NULL)
00323                         if ((bgstr = var_get_variable("default_X_background")),
00324                             (bgstr[0] == '\0'))
00325                                 gram->bgcolor = default_bgcolor;
00326         if (bgstr && bgstr[0])
00327                 gram->bgcolor = x_string_to_color(bgstr, default_bgcolor);
00328 
00329 
00330         gram_xsize = maxwidth + (internal_border_width << 1);
00331         gram_ysize = yofs + internal_border_width;
00332         gram->numblocks = num;
00333         gram->blocks = blocks;
00334 
00335         x_gram_create(dpy, gram, gram_xalign, gram_yalign, gram_xpos,
00336                       gram_ypos, gram_xsize, gram_ysize, beepcount);
00337 }

char* mode_to_colorname Display *  dpy,
char *  style,
xmode mode
 

Definition at line 95 of file xshow.c.

References string_Concat, string_Concat2, _xmode::substyle, and xmode.

Referenced by xshow().

00099 {
00100         char *desc, *result;
00101 
00102         desc = string_Concat(style, ".substyle.");
00103         desc = string_Concat2(desc, mode->substyle);
00104         result = xres_get_resource(&fgcolor_resources, desc);
00105         free(desc);
00106         return result;
00107 }

char* no_dots_downcase_var char *  str  ) 
 

Definition at line 341 of file xshow.c.

References string_Downcase(), and var_get_variable().

Referenced by xshow().

00343 {
00344         register char *var, *var2;
00345 
00346         var = string_Downcase(var_get_variable(str));
00347         var2 = var;
00348         while (*var++)
00349                 if (*var == '.')
00350                         *var = '_';
00351         return (var2);
00352 }

void x_get_input Display *  dpy  ) 
 

Definition at line 586 of file xshow.c.

References dOutput, dprintf(), and dpy.

00588 {
00589         XEvent event;
00590 
00591         dprintf(dOutput, "Entering x_get_input(%x).\n", (unsigned int) dpy);
00592 
00593         /*
00594          * Kludge to get around lossage in XPending:
00595          *
00596          * (the problem: XPending on a partial packet returns 0 without
00597          *  reading in the packet.  This causes a problem when the X server
00598          *  dies in the middle of sending a packet.)
00599          */
00600         if (XPending(dpy) == 0)
00601                 XNoOp(dpy);     /* Ensure server is still with us... */
00602 
00603         while (XPending(dpy)) {
00604                 XNextEvent(dpy, &event);
00605                 xhandleevent(dpy, event.xany.window, &event);
00606         }
00607 }

unsigned long x_string_to_color  ) 
 

void xshow Display *  dpy,
desctype desc,
int  numstr,
int  numnl
 

Definition at line 358 of file xshow.c.

References _xauxblock::align, _xmode::align, _xlinedesc::ascent, _xmode::bold, _desctype::code, _xmode::color, default_fgcolor, _xlinedesc::descent, desctype, dpy, DT_END, DT_ENV, DT_NL, DT_STR, envmatch, _xmode::expcolor, _xblock::fgcolor, fixup_and_draw(), _xauxblock::font, _xmode::font, _xmode::italic, _xauxblock::len, _desctype::len, mode_to_colorname(), MODE_TO_FONT, _desctype::next, no_dots_downcase_var(), _xlinedesc::numblock, _xmode::size, _xlinedesc::startblock, _xauxblock::str, _desctype::str, string_Concat, string_Concat2, string_Copy, string_CreateFromData, string_Downcase(), _xmode::substyle, var_get_variable(), x_string_to_color(), xauxblock, xblock, xlinedesc, xmode, xmode_stack, xmode_stack_create, xmode_stack_pop, xmode_stack_push, and xmode_stack_top.

00363 {
00364         XFontStruct *font;
00365         xmode_stack modes = xmode_stack_create();
00366         xmode curmode;
00367         xlinedesc *lines;
00368         xblock *blocks;
00369         xauxblock *auxblocks;
00370         int nextblock = 0;
00371         int line = 0, linestart = 0;
00372         char *style;
00373         int free_style = 0;
00374         int beepcount = 0;
00375 
00376         lines = (xlinedesc *) malloc(sizeof(xlinedesc) * (numnl + 1));
00377 
00378         blocks = (xblock *) malloc(sizeof(xblock) * numstr);
00379         auxblocks = (xauxblock *) malloc(sizeof(xauxblock) * numstr);
00380 
00381         curmode.bold = 0;
00382         curmode.italic = 0;
00383         curmode.size = MEDIUM_SIZE;
00384         curmode.align = LEFTALIGN;
00385         curmode.expcolor = 0;
00386         curmode.substyle = string_Copy("default");
00387         curmode.font = NULL;
00388 
00389         style = var_get_variable("style");
00390         if (style[0] == '\0') {
00391                 style = string_Concat(no_dots_downcase_var("type"), ".");
00392                 style = string_Concat2(style, no_dots_downcase_var("subtype"));
00393                 style = string_Concat2(style, ".");
00394                 style = string_Concat2(style, no_dots_downcase_var("msgtype"));
00395                 style = string_Concat2(style, ".");
00396                 style = string_Concat2(style, no_dots_downcase_var("from"));
00397                 string_Downcase(style);
00398                 free_style = 1;
00399         }
00400 
00401         for (; desc->code != DT_EOF; desc = desc->next) {
00402                 switch (desc->code) {
00403                         case DT_ENV:
00404                                 xmode_stack_push(modes, curmode);
00405                                 curmode.substyle = string_Copy(curmode.substyle);
00406                                 if (curmode.font)
00407                                         curmode.font = string_Copy(curmode.font);
00408 
00409 #define envmatch(string,length) ((desc->len==(length)) && (strncasecmp(desc->str,(string),(length))==0))
00410 
00411                                 if (envmatch("roman", 5)) {
00412                                         curmode.bold = 0;
00413                                         curmode.italic = 0;
00414                                 }
00415                                 else if (envmatch("bold", 4) || envmatch("b", 1))
00416                                         curmode.bold = 1;
00417                                 else if (envmatch("italic", 6) || envmatch("i", 1))
00418                                         curmode.italic = 1;
00419                                 else if (envmatch("large", 5))
00420                                         curmode.size = LARGE_SIZE;
00421                                 else if (envmatch("medium", 6))
00422                                         curmode.size = MEDIUM_SIZE;
00423                                 else if (envmatch("small", 5))
00424                                         curmode.size = SMALL_SIZE;
00425                                 else if (envmatch("left", 4) || envmatch("l", 1))
00426                                         curmode.align = LEFTALIGN;
00427                                 else if (envmatch("center", 6) || envmatch("c", 1))
00428                                         curmode.align = CENTERALIGN;
00429                                 else if (envmatch("right", 5) || envmatch("r", 1))
00430                                         curmode.align = RIGHTALIGN;
00431                                 else if (envmatch("beep", 4))
00432                                         beepcount++;
00433                                 else if (envmatch("font", 4)) {
00434                                         /*
00435                                          * lookahead needed.  desc->next->str
00436                                          * should be the font name, and
00437                                          * desc->next->next->code should be a
00438                                          * DT_END
00439                                          */
00440                                         if ((desc->next) &&
00441                                             (desc->next->next) &&
00442                                             (desc->next->code == DT_STR) &&
00443                                         (desc->next->next->code == DT_END)) {
00444 
00445                                                 /*
00446                                                  * Since @font mutates the
00447                                                  * current environment, we
00448                                                  * have to pop the
00449                                                  * environment that this case
00450                                                  * usually pushes
00451                                                  */
00452                                                 free(curmode.substyle);
00453                                                 curmode = xmode_stack_top(modes);
00454                                                 xmode_stack_pop(modes);
00455 
00456                                                 /* mutating... */
00457                                                 curmode.size = SPECIAL_SIZE;    /* This is an @font() */
00458                                                 curmode.font = string_CreateFromData(desc->next->str,
00459                                                            desc->next->len);
00460                                                 /*
00461                                                  * skip over the rest of the
00462                                                  * @font
00463                                                  */
00464                                                 desc = desc->next->next;
00465                                         }
00466                                 }
00467                                 else if (envmatch("color", 5)) {
00468                                         /*
00469                                          * lookahead needed.  desc->next->str
00470                                          * should be the font name, and
00471                                          * desc->next->next->code should be a
00472                                          * DT_END
00473                                          */
00474                                         if ((desc->next) &&
00475                                             (desc->next->next) &&
00476                                             (desc->next->code == DT_STR) &&
00477                                         (desc->next->next->code == DT_END)) {
00478                                                 char *colorname;
00479 
00480                                                 /*
00481                                                  * Since @font mutates the
00482                                                  * current environment, we
00483                                                  * have to pop the
00484                                                  * environment that this case
00485                                                  * usually pushes
00486                                                  */
00487                                                 free(curmode.substyle);
00488                                                 curmode = xmode_stack_top(modes);
00489                                                 xmode_stack_pop(modes);
00490 
00491                                                 /* mutating... */
00492                                                 colorname = string_CreateFromData(desc->next->str,
00493                                                            desc->next->len);
00494                                                 curmode.color = x_string_to_color(colorname, default_fgcolor);
00495                                                 free(colorname);
00496                                                 curmode.expcolor = 1;
00497                                                 /*
00498                                                  * skip over the rest of the
00499                                                  * @font
00500                                                  */
00501                                                 desc = desc->next->next;
00502                                         }
00503                                 }
00504                                 else if (desc->len > 0) {       /* avoid @{...} */
00505                                         free(curmode.substyle);
00506                                         if (curmode.font) {
00507                                                 free(curmode.font);
00508                                                 curmode.font = NULL;
00509                                         }
00510                                         curmode.substyle = string_CreateFromData(desc->str, desc->len);
00511                                 }
00512                                 break;
00513 
00514                         case DT_STR:
00515                                 auxblocks[nextblock].align = curmode.align;
00516                                 auxblocks[nextblock].font = MODE_TO_FONT(dpy, style, &curmode);
00517                                 auxblocks[nextblock].str = desc->str;
00518                                 auxblocks[nextblock].len = desc->len;
00519                                 if (curmode.expcolor)
00520                                         blocks[nextblock].fgcolor = curmode.color;
00521                                 else
00522                                         blocks[nextblock].fgcolor =
00523                                                 x_string_to_color(mode_to_colorname(dpy, style, &curmode),
00524                                                            default_fgcolor);
00525                                 nextblock++;
00526                                 break;
00527 
00528                         case DT_END:
00529                                 free(curmode.substyle);
00530                                 curmode = xmode_stack_top(modes);
00531                                 xmode_stack_pop(modes);
00532                                 break;
00533 
00534                         case DT_NL:
00535                                 lines[line].startblock = linestart;
00536                                 lines[line].numblock = nextblock - linestart;
00537                                 font = MODE_TO_FONT(dpy, style, &curmode);
00538                                 lines[line].ascent = font->ascent;
00539                                 lines[line].descent = font->descent;
00540                                 line++;
00541                                 linestart = nextblock;
00542                                 break;
00543                 }
00544         }
00545 
00546         /* case DT_EOF:    will drop through to here. */
00547 
00548         if (linestart != nextblock) {
00549                 lines[line].startblock = linestart;
00550                 lines[line].numblock = nextblock - linestart;
00551                 font = MODE_TO_FONT(dpy, style, &curmode);
00552                 lines[line].ascent = 0;
00553                 lines[line].descent = 0;
00554                 line++;
00555         }
00556 
00557         free(curmode.substyle);
00558         fixup_and_draw(dpy, style, auxblocks, blocks, nextblock, lines, line,
00559                        beepcount);
00560         free(lines);
00561         free(auxblocks);
00562         if (free_style)
00563                 free(style);
00564 }

void xshowinit  ) 
 

Definition at line 34 of file xshow.c.

References desc_context.

00035 {
00036         desc_context = XUniqueContext();
00037 }


Variable Documentation

unsigned long default_bgcolor
 

Definition at line 38 of file X_gram.c.

Referenced by fixup_and_draw(), and x_gram_init().

unsigned long default_fgcolor
 

Definition at line 37 of file X_gram.c.

Referenced by x_gram_init(), and xshow().

XContext desc_context
 

Definition at line 26 of file xshow.c.

Referenced by x_gram_create(), xcut(), xdestroygram(), xshowinit(), and xunmark().

int internal_border_width
 

Definition at line 35 of file X_gram.c.

Referenced by fixup_and_draw(), and x_gram_init().



Last updated at Tue Dec 18 21:07:42 PST 2007. This site and project hosted by...SourceForge.net Logo

Source Perspective by Fisheye