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

xmark.c File Reference

#include "mit-copyright.h"
#include <X11/X.h>
#include <X11/Xlib.h>
#include "X_gram.h"
#include "X_fonts.h"
#include "xmark.h"
#include "new_string.h"

Go to the source code of this file.

Defines

#define xmarkValid()
#define swap(x, y)   temp=(x); (x)=(y); (y)=temp
#define expose   (event.xexpose)
#define ob1   ((unsigned int) oldblock[XMARK_START_BOUND])
#define ob2   ((unsigned int) oldblock[XMARK_END_BOUND])
#define nb1   ((unsigned int) markblock[XMARK_START_BOUND])
#define nb2   ((unsigned int) markblock[XMARK_END_BOUND])
#define op1   ((unsigned int) oldpixel[XMARK_START_BOUND])
#define op2   ((unsigned int) oldpixel[XMARK_END_BOUND])
#define np1   ((unsigned int) markpixel[XMARK_START_BOUND])
#define np2   ((unsigned int) markpixel[XMARK_END_BOUND])

Functions

void xmarkSetBound (x_gram *gram, int x, int y, int which)
void xmarkExpose (Display *dpy, Window w, x_gram *gram, unsigned int b1, unsigned int p1, unsigned int b2, unsigned int p2)
void xmarkRedraw (Display *dpy, Window w, x_gram *gram, int range)
int xmarkSecond ()
void xmarkClear ()
int xmarkExtendFromFirst (x_gram *gram, int x, int y)
int xmarkExtendFromNearest (x_gram *gram, int x, int y)
char * xmarkGetText ()

Variables

int markblock [3] = {-1, -1, -1}
int markchar [3] = {-1, -1, -1}
int markpixel [3] = {-1, -1, -1}
x_grammarkgram = NULL
int oldblock [2] = {-1, -1}
int oldpixel [2] = {-1, -1}
x_gramoldgram = NULL


Define Documentation

#define expose   (event.xexpose)
 

Referenced by xmarkExpose().

#define nb1   ((unsigned int) markblock[XMARK_START_BOUND])
 

Referenced by xmarkRedraw().

#define nb2   ((unsigned int) markblock[XMARK_END_BOUND])
 

Referenced by xmarkRedraw().

#define np1   ((unsigned int) markpixel[XMARK_START_BOUND])
 

Referenced by xmarkRedraw().

#define np2   ((unsigned int) markpixel[XMARK_END_BOUND])
 

Referenced by xmarkRedraw().

#define ob1   ((unsigned int) oldblock[XMARK_START_BOUND])
 

Referenced by xmarkRedraw().

#define ob2   ((unsigned int) oldblock[XMARK_END_BOUND])
 

Referenced by xmarkRedraw().

#define op1   ((unsigned int) oldpixel[XMARK_START_BOUND])
 

Referenced by xmarkRedraw().

#define op2   ((unsigned int) oldpixel[XMARK_END_BOUND])
 

Referenced by xmarkRedraw().

#define swap x,
 )     temp=(x); (x)=(y); (y)=temp
 

Referenced by xmarkExpose().

 
#define xmarkValid  ) 
 

Value:

((markgram) && \
   (STARTBLOCK != -1) && (ENDBLOCK != -1) && \
   (STARTCHAR != -1) && (ENDCHAR != -1) && \
   (STARTPIXEL != -1) && (ENDPIXEL != -1))

Definition at line 29 of file xmark.c.

Referenced by xmarkGetText().


Function Documentation

void xmarkClear  ) 
 

Definition at line 268 of file xmark.c.

References markblock, markchar, markgram, markpixel, oldblock, oldgram, and oldpixel.

Referenced by xdestroygram(), xmarkExtendFromFirst(), xmarkExtendFromNearest(), xmarkSetBound(), and xunmark().

00269 {
00270         oldblock[0] = markblock[0];
00271         oldblock[1] = markblock[1];
00272         oldpixel[0] = markpixel[0];
00273         oldpixel[1] = markpixel[1];
00274         oldgram = markgram;
00275 
00276         markblock[0] = -1;
00277         markblock[1] = -1;
00278         markchar[0] = -1;
00279         markchar[1] = -1;
00280         markpixel[0] = -1;
00281         markpixel[1] = -1;
00282         markgram = NULL;
00283 }

void xmarkExpose Display *  dpy,
Window  w,
x_gram gram,
unsigned int  b1,
unsigned int  p1,
unsigned int  b2,
unsigned int  p2
 

Definition at line 143 of file xmark.c.

References _x_gram::blocks, dpy, expose, swap, _xblock::x, _xblock::x1, _xblock::x2, x_gram, _xblock::y, _xblock::y1, and _xblock::y2.

Referenced by xmarkRedraw().

00148 {
00149 #define swap(x,y) temp=(x); (x)=(y); (y)=temp
00150         int i, temp;
00151         XEvent event;
00152 #define expose (event.xexpose)
00153 
00154         if ((b1 == -1) || (p1 == -1) || (b2 == -1) || (p2 == -1))
00155                 return;
00156 
00157         if ((b1 > b2) || ((b1 == b2) && (p1 > p2))) {
00158                 swap(b1, b2);
00159                 swap(p1, p2);
00160         }
00161 
00162 #if defined(_IBMR2) && !defined(__GNUC__) && defined(RS6000_OPT_BUG)
00163         /*
00164          * A version of the AIX 3.1 RS/6000 C compiler needs this to prevent
00165          * a core dump in the loop below.
00166          */
00167         &b1;
00168 #endif
00169 
00170         expose.type = Expose;
00171         expose.display = dpy;
00172         expose.window = w;
00173 
00174         for (i = b1; i <= b2; i++) {
00175                 if (b1 == b2) {
00176                         expose.x = gram->blocks[i].x1 + p1;
00177                         expose.y = gram->blocks[i].y1;
00178                         expose.width = p2 - p1;
00179                         expose.height = gram->blocks[i].y2 - gram->blocks[i].y1;
00180                         expose.count = 0;
00181                 }
00182                 else if (i == b1) {
00183                         expose.x = gram->blocks[i].x1 + p1;
00184                         expose.y = gram->blocks[i].y1;
00185                         expose.width = gram->blocks[i].x2 - p1;
00186                         expose.height = gram->blocks[i].y2 - gram->blocks[i].y1;
00187                         expose.count = b2 - i;
00188                 }
00189                 else if (i == b2) {
00190                         expose.x = gram->blocks[i].x1;
00191                         expose.y = gram->blocks[i].y1;
00192                         expose.width = p2;
00193                         expose.height = gram->blocks[i].y2 - gram->blocks[i].y1;
00194                         expose.count = b2 - i;
00195                 }
00196                 else {
00197                         expose.x = gram->blocks[i].x1;
00198                         expose.y = gram->blocks[i].y1;
00199                         expose.width = gram->blocks[i].x2 - gram->blocks[i].x1;
00200                         expose.height = gram->blocks[i].y2 - gram->blocks[i].y1;
00201                         expose.count = b2 - i;
00202                 }
00203 
00204                 if ((expose.width && expose.height) || (expose.count == 0))
00205                         XSendEvent(dpy, w, True, ExposureMask, &event);
00206         }
00207 }

int xmarkExtendFromFirst x_gram gram,
int  x,
int  y
 

Definition at line 286 of file xmark.c.

References ENDBLOCK, markgram, STARTBLOCK, x_gram, XMARK_END_BOUND, xmarkClear(), xmarkEnd, xmarkSetBound(), and xmarkStart.

00289 {
00290         if (markgram != gram) {
00291                 xmarkClear();
00292                 markgram = gram;
00293         }
00294 
00295         if (STARTBLOCK == -1) {
00296                 xmarkStart(gram, x, y);
00297                 xmarkEnd(gram, x, y);
00298                 return (XMARK_REDRAW_CURRENT);
00299         }
00300         else if (ENDBLOCK == -1) {
00301                 xmarkEnd(gram, x, y);
00302                 return (XMARK_REDRAW_CURRENT);
00303         }
00304         else {
00305                 xmarkSetBound(gram, x, y, XMARK_END_BOUND);
00306                 return (XMARK_REDRAW_END);
00307         }
00308 }

int xmarkExtendFromNearest x_gram gram,
int  x,
int  y
 

Definition at line 311 of file xmark.c.

References ENDBLOCK, markgram, STARTBLOCK, x_gram, XMARK_REDRAW_START, XMARK_START_BOUND, xmarkClear(), xmarkEnd, xmarkSetBound(), and xmarkStart.

00314 {
00315         int bound;
00316 
00317         if (markgram != gram) {
00318                 xmarkClear();
00319                 markgram = gram;
00320         }
00321 
00322         if (STARTBLOCK == -1) {
00323                 xmarkStart(gram, x, y);
00324                 xmarkEnd(gram, x, y);
00325                 return (XMARK_REDRAW_CURRENT);
00326         }
00327         else if (ENDBLOCK == -1) {
00328                 xmarkEnd(gram, x, y);
00329                 return (XMARK_REDRAW_CURRENT);
00330         }
00331         else {
00332                 xmarkSetBound(gram, x, y, bound = xmarkNearest(x, y));
00333                 return (bound == XMARK_START_BOUND ? XMARK_REDRAW_START : XMARK_REDRAW_END);
00334         }
00335 }

char* xmarkGetText  ) 
 

Definition at line 338 of file xmark.c.

References _x_gram::blocks, markgram, _xblock::strindex, string, string_Concat2, string_Copy, string_CreateFromData, _xblock::strlen, _x_gram::text, xmarkSecond(), xmarkValid, and _xblock::y.

Referenced by xcut().

00339 {
00340         int i, index, len;
00341         int last_y = -1;
00342         string temp;
00343         string text_so_far = string_Copy("");
00344         char *text = markgram->text;
00345         int startblock, endblock, startchar, endchar;
00346 
00347         if (xmarkValid()) {
00348                 if (xmarkSecond() == XMARK_END_BOUND) {
00349                         startblock = STARTBLOCK;
00350                         endblock = ENDBLOCK;
00351                         startchar = STARTCHAR;
00352                         endchar = ENDCHAR;
00353                 }
00354                 else {
00355                         startblock = ENDBLOCK;
00356                         endblock = STARTBLOCK;
00357                         startchar = ENDCHAR;
00358                         endchar = STARTCHAR;
00359                 }
00360 
00361                 for (i = startblock; i <= endblock; i++) {
00362                         if (last_y != -1 && last_y != markgram->blocks[i].y)
00363                                 text_so_far = string_Concat2(text_so_far, "\n");
00364                         index = markgram->blocks[i].strindex;
00365                         len = markgram->blocks[i].strlen;
00366                         if (startblock == endblock)
00367                                 temp = string_CreateFromData(text + index + startchar,
00368                                                        endchar - startchar);
00369                         else if (i == startblock)
00370                                 temp = string_CreateFromData(text + index + startchar, len - startchar);
00371                         else if (i == endblock)
00372                                 temp = string_CreateFromData(text + index, endchar);
00373                         else
00374                                 temp = string_CreateFromData(text + index, len);
00375                         text_so_far = string_Concat2(text_so_far, temp);
00376                         free(temp);
00377                         last_y = markgram->blocks[i].y;
00378                 }
00379         }
00380 
00381         return (text_so_far);
00382 }

void xmarkRedraw Display *  dpy,
Window  w,
x_gram gram,
int  range
 

Definition at line 212 of file xmark.c.

References dpy, nb1, nb2, np1, np2, ob1, ob2, op1, op2, x_gram, and xmarkExpose().

00217 {
00218 #define ob1 ((unsigned int) oldblock[XMARK_START_BOUND])
00219 #define ob2 ((unsigned int) oldblock[XMARK_END_BOUND])
00220 #define nb1 ((unsigned int) markblock[XMARK_START_BOUND])
00221 #define nb2 ((unsigned int) markblock[XMARK_END_BOUND])
00222 #define op1 ((unsigned int) oldpixel[XMARK_START_BOUND])
00223 #define op2 ((unsigned int) oldpixel[XMARK_END_BOUND])
00224 #define np1 ((unsigned int) markpixel[XMARK_START_BOUND])
00225 #define np2 ((unsigned int) markpixel[XMARK_END_BOUND])
00226 
00227         if (range == XMARK_REDRAW_CURRENT) {
00228                 if (!markgram)
00229                         return;
00230                 xmarkExpose(dpy, w, gram, nb1, np1, nb2, np2);
00231         }
00232         else if (range == XMARK_REDRAW_OLD) {
00233                 if (!oldgram)
00234                         return;
00235                 xmarkExpose(dpy, w, gram, ob1, op1, ob2, op2);
00236         }
00237         else if (range == XMARK_REDRAW_START) {
00238                 if (!markgram)
00239                         return;
00240                 xmarkExpose(dpy, w, gram, ob1, op1, nb1, np1);
00241         }
00242         else if (range == XMARK_REDRAW_END) {
00243                 if (!markgram)
00244                         return;
00245                 xmarkExpose(dpy, w, gram, ob2, op2, nb2, np2);
00246         }
00247 }

int xmarkSecond  ) 
 

Definition at line 251 of file xmark.c.

References STARTBLOCK, and STARTCHAR.

Referenced by x_gram_draw(), and xmarkGetText().

00252 {
00253         if (STARTBLOCK > ENDBLOCK)
00254                 return (XMARK_START_BOUND);
00255         else if (STARTBLOCK < ENDBLOCK)
00256                 return (XMARK_END_BOUND);
00257         else {
00258                 if (STARTCHAR > ENDCHAR)
00259                         return (XMARK_START_BOUND);
00260                 else if (STARTCHAR < ENDCHAR)
00261                         return (XMARK_END_BOUND);
00262                 else
00263                         return (XMARK_END_BOUND);
00264         }
00265 }

void xmarkSetBound x_gram gram,
int  x,
int  y,
int  which
 

Definition at line 36 of file xmark.c.

References _xblock::fid, get_fontst_from_fid(), markblock, markchar, markgram, markpixel, oldblock, oldpixel, _xblock::strindex, _xblock::strlen, _xblock::x1, _xblock::x2, x_gram, xblock, xmarkClear(), _xblock::y1, and _xblock::y2.

00040 {
00041         int i, xofs, yofs;
00042         XFontStruct *font;
00043         xblock *xb;
00044         unsigned char *s;
00045 
00046         if (markgram != gram) {
00047                 xmarkClear();
00048                 markgram = gram;
00049         }
00050         else if (which < XMARK_TEMP_BOUND) {
00051                 oldblock[which] = markblock[which];
00052                 oldpixel[which] = markpixel[which];
00053         }
00054 
00055         /* Start at the top, fastforward to first span not too high. */
00056         for (i = 0, xb = gram->blocks;
00057              (i < gram->numblocks) && (xb->y2 < y);
00058              i++, xb++);
00059 
00060         /* the point is after the end */
00061         if (i == gram->numblocks) {
00062                 markblock[which] = i;
00063                 markchar[which] = 0;
00064                 markpixel[which] = 0;
00065                 return;
00066         }
00067 
00068         /* is the point before the beginning of the line? */
00069         if (x <= xb->x1) {
00070                 markblock[which] = i;
00071                 markchar[which] = 0;
00072                 markpixel[which] = 0;
00073                 return;
00074         }
00075 
00076         /* is the point in the nether space between this line and the last? */
00077         if (y < xb->y1) {
00078                 markblock[which] = i;
00079                 markchar[which] = 0;
00080                 markpixel[which] = 0;
00081                 return;
00082         }
00083 
00084         for (yofs = xb->y1; (i < gram->numblocks) && (xb->y1 == yofs); i++, xb++) {
00085 
00086                 if (x <= xb->x2) {
00087                         markblock[which] = i;
00088 
00089                         xofs = xb->x1;
00090                         if ((x < xofs) || (y < xb->y1)) {
00091                                 markchar[which] = 0;
00092                                 return;
00093                         }
00094                         font = get_fontst_from_fid(xb->fid);
00095                         for (i = 0, s = (unsigned char *) ((gram->text) + (xb->strindex));
00096                              xofs < x && i < xb->strlen;
00097                              i++, s++) {
00098                                 /*
00099                                  * if font->per_char is NULL, then we should
00100                                  * use min_bounds
00101                                  */
00102                                 short usewidth = font->per_char ? font->per_char[*s - font->min_char_or_byte2].width : font->min_bounds.width;
00103                                 if (x <= (xofs += usewidth)) {
00104                                         markchar[which] = i;
00105                                         markpixel[which] = xofs - xb->x1 - usewidth;
00106                                         return;
00107                                 }
00108                         }
00109                 }
00110         }
00111 
00112         /* The endpoint is after the end of the block if the loop ends */
00113         markblock[which] = i;
00114         markchar[which] = 0;
00115         markpixel[which] = 0;
00116         return;
00117 }


Variable Documentation

int markblock[3] = {-1, -1, -1}
 

Definition at line 20 of file xmark.c.

Referenced by xmarkClear(), and xmarkSetBound().

int markchar[3] = {-1, -1, -1}
 

Definition at line 21 of file xmark.c.

Referenced by xmarkClear(), and xmarkSetBound().

x_gram* markgram = NULL
 

Definition at line 23 of file xmark.c.

Referenced by x_gram_draw(), xmarkClear(), xmarkExtendFromFirst(), xmarkExtendFromNearest(), xmarkGetText(), and xmarkSetBound().

int markpixel[3] = {-1, -1, -1}
 

Definition at line 22 of file xmark.c.

Referenced by xmarkClear(), and xmarkSetBound().

int oldblock[2] = {-1, -1}
 

Definition at line 25 of file xmark.c.

Referenced by xmarkClear(), and xmarkSetBound().

x_gram* oldgram = NULL
 

Definition at line 27 of file xmark.c.

Referenced by xmarkClear().

int oldpixel[2] = {-1, -1}
 

Definition at line 26 of file xmark.c.

Referenced by xmarkClear(), and xmarkSetBound().



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

Source Perspective by Fisheye