Annotation of researchv9/X11/src/X.V11R1/clients/uwm/Icons.c, revision 1.1.1.1

1.1       root        1: /* $Header: Icons.c,v 1.4 87/09/09 12:00:29 swick Exp $ */
                      2: #include <X11/copyright.h>
                      3: 
                      4: /*
                      5:  * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
                      6:  *
                      7:  *                         All Rights Reserved
                      8:  *
                      9:  * Permission to use, copy, modify, and distribute this software and its
                     10:  * documentation for any purpose and without fee is hereby granted,
                     11:  * provided that the above copyright notice appear in all copies and that
                     12:  * both that copyright notice and this permission notice appear in
                     13:  * supporting documentation, and that the name of Digital Equipment
                     14:  * Corporation not be used in advertising or publicity pertaining to
                     15:  * distribution of the software without specific, written prior permission.
                     16:  *
                     17:  *
                     18:  * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     19:  * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     20:  * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     21:  * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     22:  * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     23:  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     24:  * SOFTWARE.
                     25:  */
                     26: 
                     27: 
                     28:  
                     29: /*
                     30:  * MODIFICATION HISTORY
                     31:  *
                     32:  * 000 -- L. Guarino Reid, DEC Ultrix Engineering Group
                     33:  */
                     34:  
                     35: #ifndef lint
                     36: static char *sccsid = "%W%     %G%";
                     37: #endif
                     38:  
                     39: #include "uwm.h"
                     40: #include <X11/Xutil.h>
                     41: #include <X11/Xatom.h>
                     42: 
                     43: typedef struct _windowList {
                     44:   struct _windowList *next;
                     45:   Window window;
                     46:   Window icon;
                     47:   Bool own;
                     48:   Pixmap pixmap;
                     49: } WindowListRec, *WindowList;
                     50:   
                     51: WindowList Icons = NULL;
                     52: 
                     53: 
                     54: /* the client should pass us a bitmap (single-plane pixmap with background=0
                     55:  * and foreground = 1).  It is our responsibility to convert it to a pixmap
                     56:  * of the appropriate depth for a window tile and also color it with the
                     57:  * appropriate background and foreground pixels.
                     58:  *
                     59:  * we'll use the (global) IconGC for the fore/background pixels.
                     60:  */
                     61: 
                     62: static Pixmap MakePixmapFromBitmap( bitmap, width_return, height_return )
                     63: Pixmap bitmap;
                     64: unsigned int *width_return, *height_return;
                     65: {
                     66:     Pixmap tile;
                     67:     Window junkW;
                     68:     int junk, width, height;
                     69: 
                     70:     if (!XGetGeometry( dpy, bitmap, &junkW, &junk, &junk,
                     71:                      &width, &height, &junk, &junk )) {
                     72:         Warning( "client passed invalid pixmap for icon." );
                     73:        return( NULL );
                     74:     }
                     75: 
                     76:     tile = XCreatePixmap( dpy, RootWindow(dpy, scr), width, height,
                     77:                          DefaultDepth(dpy, scr) );
                     78: 
                     79:     /* use the IconGC's foreground & background, so we don't have to
                     80:      * create another (and add yet another user configuration option.
                     81:      * someday this may need to be split out.
                     82:      */
                     83:     XCopyPlane( dpy, bitmap, tile, IconGC, 0, 0, width, height, 0, 0, 1 );
                     84: 
                     85:     if (*width_return)  *width_return = width;
                     86:     if (*height_return) *height_return = height;
                     87: 
                     88:     return( tile );
                     89: }
                     90: 
                     91: 
                     92: char *
                     93: GetIconName(window)
                     94: Window window;
                     95: {
                     96:     char *name;
                     97: 
                     98:     if (XGetIconName( dpy, window, &name )) return( name );
                     99: 
                    100:     if (XFetchName( dpy, window, &name )) return( name );
                    101: 
                    102:     return( NULL );
                    103: }
                    104: 
                    105: Bool IsIcon(icon, x, y, mousePositioned, assoc)
                    106: Window icon;
                    107: Window *assoc;
                    108: {
                    109:   WindowList ptr;
                    110:   Window MakeIcon();
                    111: 
                    112:   for (ptr = Icons; ptr; ptr = ptr->next) {
                    113:     if (ptr->icon == icon) {
                    114:       if (assoc) *assoc = ptr->window; 
                    115:       return(TRUE);
                    116:     }
                    117:     if (ptr->window == icon) {
                    118:       if (assoc) *assoc = ptr->icon; 
                    119:       return(FALSE);
                    120:     }
                    121:   }
                    122:   if (assoc) *assoc = MakeIcon(icon, x, y, mousePositioned);
                    123:   return(FALSE);
                    124: }
                    125: 
                    126: 
                    127: RemoveIcon(window)
                    128: Window window;
                    129: {
                    130:   WindowList ptr, ptr1;
                    131: 
                    132:   for (ptr = Icons; ptr; ptr = ptr->next) 
                    133:     if (ptr->window == window) {
                    134:       if (ptr->own) {
                    135:          XDestroyWindow(dpy, ptr->icon);
                    136:          if (ptr->pixmap != IBackground) XFreePixmap(dpy, ptr->pixmap);
                    137:       }
                    138:       break;
                    139:     }
                    140:   if (ptr) {
                    141:     if (ptr==Icons) Icons = Icons->next;
                    142:     else 
                    143:       for (ptr1 = Icons; ptr1->next; ptr1 = ptr1->next) 
                    144:         if (ptr1->next == ptr) {
                    145:           ptr1->next = ptr->next;
                    146:          break;
                    147:         };
                    148:     free(ptr);
                    149:     }
                    150: }
                    151: 
                    152: GetDefaultSize(window, icon_w, icon_h)
                    153: Window window;
                    154: int *icon_w, *icon_h;
                    155: {
                    156:     char *name;                                /* Event window name. */
                    157: 
                    158:           /*
                    159:            * Determine the size of the icon window.
                    160:            */ 
                    161:           name = GetIconName(window);
                    162:           *icon_h = IFontInfo->ascent + IFontInfo->descent;
                    163:           if (name) {
                    164:            *icon_w = XTextWidth(IFontInfo, name, strlen(name));
                    165:             if (*icon_w == 0)
                    166:               *icon_w = *icon_h;
                    167:          } else 
                    168:            *icon_w = *icon_h;
                    169:      }
                    170: 
                    171: Window MakeIcon(window, x, y, mousePositioned)
                    172: Window window;                          /* associated window. */
                    173: int x, y;                               /* Event mouse position. */
                    174: Bool mousePositioned;
                    175: {
                    176:     Window icon;                       /* icon window. */
                    177:     int icon_x, icon_y;                        /* Icon U. L. X and Y coordinates. */
                    178:     int icon_w, icon_h;                        /* Icon width and height. */
                    179:     int icon_bdr;                      /* Icon border width. */
                    180:     int mask;                          /* Icon event mask */
                    181:     int depth;                         /* for XGetGeometry */
                    182:     XSetWindowAttributes iconValues;   /* for icon window creation */
                    183:     XWMHints *wmhints;                 /* see if icon position provided */
                    184:     XWMHints *XGetWMHints();
                    185:     Window AddIcon();
                    186:  
                    187:    iconValues.background_pixmap = IBackground;
                    188:    mask = (KeyPressMask|ExposureMask|StructureNotifyMask);
                    189:    /*
                    190:     * Process window manager hints.
                    191:     */ 
                    192:     if (wmhints = XGetWMHints(dpy, window)) {
                    193:       if (wmhints->flags&IconWindowHint)
                    194:         return(
                    195:         AddIcon(window, wmhints->icon_window, FALSE, 
                    196:                 (StructureNotifyMask), (Pixmap)NULL));
                    197:       else if (wmhints->flags&IconPixmapHint) { 
                    198:           iconValues.background_pixmap =
                    199:              MakePixmapFromBitmap( wmhints->icon_pixmap, &icon_w, &icon_h );
                    200:          if (iconValues.background_pixmap)
                    201:              mask = (StructureNotifyMask);
                    202:          else {
                    203:              iconValues.background_pixmap = IBackground;
                    204:              wmhints->flags &= ~IconPixmapHint;
                    205:              GetDefaultSize(window, &icon_w, &icon_h);
                    206:          }
                    207:       }
                    208:       else GetDefaultSize(window, &icon_w, &icon_h);
                    209:     }
                    210:     else GetDefaultSize(window, &icon_w, &icon_h);
                    211: 
                    212:      /*
                    213:       * Fix up sizes by padding.
                    214:       */ 
                    215:     if (!wmhints || !(wmhints->flags&(IconPixmapHint|IconWindowHint))) {
                    216:       icon_w += (HIconPad << 1);
                    217:       icon_h += (VIconPad << 1);
                    218:     }
                    219: 
                    220:      /*
                    221:       * Set the icon border attributes.
                    222:       */ 
                    223:     if (!wmhints || !(wmhints->flags&IconWindowHint)) {
                    224:       icon_bdr = IBorderWidth;
                    225:       iconValues.border_pixel = IBorder;
                    226:     }
                    227:  
                    228:     if (wmhints && (wmhints->flags&IconPositionHint)) {
                    229:          icon_x = wmhints->icon_x;
                    230:         icon_y = wmhints->icon_y;
                    231:     } else {
                    232:       if (mousePositioned) {
                    233:         /*
                    234:          * Determine the coordinates of the icon window;
                    235:          * normalize so that we don't lose the icon off the
                    236:          * edge of the screen.
                    237:          */
                    238:         icon_x = x - (icon_w >> 1) + 1;
                    239:         if (icon_x < 0) icon_x = 0;
                    240:         icon_y = y - (icon_h >> 1) + 1;
                    241:         if (icon_y < 0) icon_y = 0;
                    242:         if ((icon_x - 1 + icon_w + (icon_bdr << 1)) > ScreenWidth) {
                    243:            icon_x = ScreenWidth - icon_w - (icon_bdr << 1) + 1;
                    244:         }
                    245:         if ((icon_y - 1 + icon_h + (icon_bdr << 1)) > ScreenHeight) {
                    246:            icon_y = ScreenHeight - icon_h - (icon_bdr << 1) + 1;
                    247:         }
                    248:       }
                    249:       else {
                    250:         icon_x = x + (icon_w >> 1);
                    251:         icon_y = y + (icon_y >> 1);
                    252:       }
                    253:         
                    254:     }
                    255: 
                    256:    /*
                    257:     * Create the icon window.
                    258:     */
                    259:    return(AddIcon(window,
                    260:              XCreateWindow(
                    261:                 dpy, RootWindow(dpy, scr),
                    262:                 icon_x, icon_y,
                    263:                 icon_w, icon_h,
                    264:                 icon_bdr, 0, CopyFromParent, CopyFromParent,
                    265:                CWBorderPixel+CWBackPixmap, &iconValues),
                    266:             TRUE, mask, iconValues.background_pixmap));
                    267:  
                    268: }
                    269: 
                    270: Window AddIcon(window, icon, own, mask, background)
                    271: Window window, icon;
                    272: Bool own;
                    273: int mask;
                    274: Pixmap background;
                    275: {
                    276:   WindowList ptr;
                    277: 
                    278:    if (icon == NULL) return(NULL);
                    279:    /*
                    280:     * Use the text cursor whenever the mouse is in the icon window.
                    281:     */
                    282:    XDefineCursor(dpy, icon, TextCursor);
                    283:     
                    284:    /*
                    285:     * Select "key pressed", "window exposure" and "unmap window"
                    286:     * events for the icon window.
                    287:     */
                    288:    XSelectInput(dpy, icon, mask);
                    289:     
                    290:     /*
                    291:      * Set the event window's icon window to be the new icon window.
                    292:      */
                    293:     ptr = (WindowList) malloc(sizeof(WindowListRec));
                    294:     ptr->window = window;
                    295:     ptr->icon = icon;
                    296:     ptr->own = own;
                    297:     ptr->pixmap = background;
                    298:     ptr->next = Icons;
                    299:     Icons = ptr;
                    300: 
                    301:     return(icon);
                    302: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.