Annotation of 43BSD/contrib/X/uwm/NewIconify.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *rcsid_NewIconify_c = "$Header: NewIconify.c,v 10.4 86/04/07 17:04:38 jg Exp $";
                      3: #endif lint
                      4: 
                      5: /************************************************************************
                      6:  *                                                                     *
                      7:  *                     Copyright (c) 1986 by                           *
                      8:  *             Digital Equipment Corporation, Maynard, MA              *
                      9:  *                      All Rights Reserved.                           *
                     10:  *                                                                     *
                     11:  *     Permission to use, copy, modify, and distribute this software   *
                     12:  *     and its documentation is hereby granted only to licensees of    *
                     13:  *     The Regents of the University of California pursuant to their   *
                     14:  *     license agreement for the Berkeley Software Distribution        *
                     15:  *     provided that the following appears on all copies.              *
                     16:  *                                                                     *
                     17:  *            "LICENSED FROM DIGITAL EQUIPMENT CORPORATION             *
                     18:  *                      COPYRIGHT (C) 1986                             *       
                     19:  *                 DIGITAL EQUIPMENT CORPORATION                       *
                     20:  *                         MAYNARD, MA                                 *
                     21:  *                     ALL RIGHTS RESERVED.                            *
                     22:  *                                                                     *
                     23:  *      THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT  * 
                     24:  *     NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL   *
                     25:  *     EQUIPMENT CORPORATION.  DIGITAL MAKES NO REPRESENTATIONS        *
                     26:  *     ABOUT SUITABILITY OF THIS SOFTWARE FOR ANY PURPOSE. IT IS       *
                     27:  *     SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.           *
                     28:  *                                                                     *       
                     29:  *     IF THE UNIVERSITY OF CALIFORNIA OR ITS LICENSEES MODIFY         *       
                     30:  *     THE SOFTWARE IN A MANNER CREATING DERIVATIVE COPYRIGHT          *       
                     31:  *     RIGHTS APPROPRIATE COPYRIGHT LEGENDS MAY BE PLACED ON THE       *
                     32:  *     DERIVATIVE WORK IN ADDITION TO THAT SET FORTH ABOVE."           *       
                     33:  *                                                                     *
                     34:  ************************************************************************/
                     35:  
                     36: 
                     37: /*
                     38:  * MODIFICATION HISTORY
                     39:  *
                     40:  * 000 -- M. Gancarz, DEC Ultrix Engineering Group
                     41:  */
                     42: 
                     43: #ifndef lint
                     44: static char *sccsid = "@(#)NewIconify.c        3.8     1/24/86";
                     45: #endif
                     46: 
                     47: #include "uwm.h"
                     48: 
                     49: Bool NewIconify(window, mask, button, x, y)
                     50: Window window;                          /* Event window. */
                     51: int mask;                               /* Button/key mask. */
                     52: short button;                           /* Button event detail. */
                     53: int x, y;                               /* Event mouse position. */
                     54: {
                     55:     register WindowInfo window_info;   /* Event window info. */
                     56:     register WindowInfo icon_info;     /* Icon window info. */
                     57:     char *name;                                /* Event window name. */
                     58:     int mse_x, mse_y;                  /* Mouse X and Y coordinates. */
                     59:     int icon_x, icon_y;                        /* Icon U. L. X and Y coordinates. */
                     60:     int icon_w, icon_h;                        /* Icon width and height. */
                     61:     int icon_bdr;                      /* Icon border width. */
                     62:     int prev_x;                                /* Previous event window X location. */
                     63:     int prev_y;                                /* Previous event window Y location. */
                     64:     int cur_x;                         /* Current event window X location. */
                     65:     int cur_y;                         /* Current event window Y location. */
                     66:     int ulx, uly;                      /* Event window upper left X and Y. */
                     67:     int lrx, lry;                      /* Event window lower right X and Y. */
                     68:     int init_ulx, init_uly;            /* Init window upper left X and Y. */
                     69:     int init_lrx, init_lry;            /* Init window lower right X and Y. */
                     70:     int num_vectors;                   /* Number of vectors in box. */
                     71:     int status;                                /* Routine call return status. */
                     72:     Window icon;                       /* Icon window. */
                     73:     Window sub_win;                    /* Mouse position sub-window. */
                     74:     XButtonEvent button_event;         /* Button event packet. */
                     75:     Vertex box[MAX_BOX_VECTORS];       /* Box vertex buffer. */
                     76:     Vertex zap[MAX_ZAP_VECTORS];       /* Zap effect vertex buffer. */
                     77:     Bool iconifying;                   /* Are we iconifying? */
                     78: 
                     79:     /*
                     80:      * Do not lower or iconify the root window.
                     81:      */
                     82:     if (window == RootWindow)
                     83:         return(FALSE);
                     84: 
                     85:     /*
                     86:      * Change the cursor to the icon cursor.
                     87:      */
                     88:     status = XGrabButton(RootWindow, ArrowCrossCursor, mask, EVENTMASK);
                     89:     if (status == FAILURE)
                     90:         Error("NewIconify -> Unable to grab button and change cursor.");
                     91: 
                     92:     /*
                     93:      * Clear the vector buffers.
                     94:      */
                     95:     bzero(box, sizeof(box));
                     96:     if (Zap) bzero(zap, sizeof(zap));
                     97:     
                     98:     /*
                     99:      * Get info on the event window.
                    100:      */
                    101:     status = XQueryWindow(window, &window_info);
                    102:     if (status == FAILURE) return(FALSE);
                    103: 
                    104:     /*
                    105:      * Are we iconifying or de-iconifying?
                    106:      */
                    107:     if (window_info.type != IsIcon) {
                    108: 
                    109:         /*
                    110:          * Window => Icon (Iconifying).
                    111:          */
                    112:         /*
                    113:          * If an icon window doesn't exist for the event window, then
                    114:          * make one.
                    115:          */
                    116:         if (window_info.assoc_wind == 0) {
                    117: 
                    118:            /*
                    119:              * Set the icon border width.
                    120:              */ 
                    121:             icon_bdr = IBorderWidth;
                    122: 
                    123:             /*
                    124:              * Determine the size of the icon window.
                    125:              */
                    126:             status = XFetchName(window, &name);
                    127:             if (status == FAILURE) return(FALSE);
                    128:             icon_h = IFontInfo.height + (VIconPad << 1);
                    129:             icon_w = XQueryWidth(name, IFont);
                    130:             if (icon_w == 0) icon_w = icon_h;
                    131:             else icon_w += (HIconPad << 1);
                    132: 
                    133: 
                    134:             /*
                    135:              * Create the icon window.
                    136:              */
                    137:             icon = XCreateWindow(RootWindow, x + (icon_w >> 1),
                    138:                                  y + (icon_h >> 1), icon_w, icon_h,
                    139:                                  icon_bdr, IBorder, IBackground);
                    140:             if (icon == FAILURE) return(FALSE);
                    141: 
                    142:             /*
                    143:              * Use the text cursor whenever the mouse is in the icon window.
                    144:              */
                    145:             XDefineCursor(icon, TextCursor);
                    146: 
                    147:             /*
                    148:              * Select "key pressed", "window exposure" and "unmap window"
                    149:              * events for the icon window.
                    150:              */
                    151:             XSelectInput(icon, (KeyPressed | ExposeWindow | UnmapWindow));
                    152: 
                    153:             /*
                    154:              * Set the event window's icon window to be the new icon window.
                    155:              */
                    156:             XSetIconWindow(window, icon);
                    157:         }
                    158:         else {
                    159:             /*
                    160:              * If we already have an icon window all we have to do is
                    161:              * retrieve the info on it and move it into place.
                    162:              */
                    163:             icon = window_info.assoc_wind;
                    164: 
                    165:             /*
                    166:              * Get info on the icon window.
                    167:              */
                    168:             status = XQueryWindow(icon, &icon_info);
                    169:             if (status == FAILURE) return(FALSE);
                    170: 
                    171:             /*
                    172:              * Determine the height, width, and borderwidth of the icon.
                    173:              */
                    174:             icon_h = icon_info.height;
                    175:             icon_w = icon_info.width;
                    176:             icon_bdr = icon_info.bdrwidth;
                    177:         }
                    178: 
                    179:         iconifying = TRUE;
                    180:     }
                    181:     else {
                    182: 
                    183:         /*
                    184:          * Icon => Window (DeIconifying).
                    185:          */
                    186:         /*
                    187:          * If the window is gone, destroy the icon and return.
                    188:          */
                    189:         if (window_info.assoc_wind == 0) {
                    190:             XDestroyWindow(window);
                    191:             Grab(mask);
                    192:             return(FALSE);
                    193:         }
                    194: 
                    195:         /*
                    196:          * We call the normal window the "icon" window only to simplify
                    197:          * the code later on in the function.
                    198:          */
                    199:         icon = window_info.assoc_wind;
                    200: 
                    201:         /*
                    202:          * Get info on the icon window.
                    203:          */
                    204:         status = XQueryWindow(icon, &icon_info);
                    205:         if (status == FAILURE) return(FALSE);
                    206: 
                    207:         /*
                    208:          * Determine the height, width, and borderwidth of the icon.
                    209:          */
                    210:         icon_h = icon_info.height;
                    211:         icon_w = icon_info.width;
                    212:         icon_bdr = icon_info.bdrwidth;
                    213: 
                    214:         iconifying = FALSE;
                    215:     }
                    216: 
                    217:     /*
                    218:      * Initialize the movement variables.
                    219:      */
                    220:     init_ulx = ulx = x - (icon_w >> 1) - icon_bdr;
                    221:     init_uly = uly = y - (icon_h >> 1) - icon_bdr;
                    222:     init_lrx = lrx = x + (icon_w >> 1) + icon_bdr - 1;
                    223:     init_lry = lry = y + (icon_h >> 1) + icon_bdr - 1;
                    224:     prev_x = x;
                    225:     prev_y = y;
                    226: 
                    227: 
                    228:     /*
                    229:      * Store the box.
                    230:      */
                    231:     if (Grid)
                    232:         num_vectors = StoreGridBox(box, ulx, uly, lrx, lry);
                    233:     else num_vectors = StoreBox(box, ulx, uly, lrx, lry);
                    234: 
                    235:     /*
                    236:      * Freeze the server, if requested by the user.
                    237:      * This results in a solid box instead of a flickering one.
                    238:      */
                    239:     if (Freeze)
                    240:         XGrabServer();
                    241: 
                    242:     /*
                    243:      * Process any outstanding events before drawing the box.
                    244:      */
                    245:     while (QLength() > 0) {
                    246:         XPeekEvent(&button_event);
                    247:         if (button_event.window == RootWindow)
                    248:             break;
                    249:         GetButton(&button_event);
                    250:     }
                    251: 
                    252:     /*
                    253:      * Draw the box.
                    254:      */
                    255:     DrawBox();
                    256:     if (Freeze)
                    257:         Frozen = window;
                    258: 
                    259:     /*
                    260:      * We spin our wheels here looking for mouse movement or a change
                    261:      * in the status of the buttons.
                    262:      */
                    263:     while (TRUE) {
                    264: 
                    265:        /*
                    266:         * Check to see if we have a change in mouse button status.
                    267:         * This is how we get out of this "while" loop.
                    268:         */
                    269:        if (XPending() && GetButton(&button_event)) {
                    270:             /*
                    271:              * Process the pending events, this sequence is the only
                    272:              * way out of the loop and the routine.
                    273:              */
                    274: 
                    275:             /*
                    276:              * If we froze the server, then erase the last lines drawn.
                    277:              */
                    278:             if (Freeze) {
                    279:                 DrawBox();
                    280:                 Frozen = (Window)0;
                    281:                 XUngrabServer();
                    282:             }
                    283: 
                    284:             /*
                    285:              * Save the mouse cursor location.
                    286:              */
                    287:            mse_x = button_event.x;
                    288:            mse_y = button_event.y;
                    289:            break;
                    290:        }
                    291:        else {
                    292:            /*
                    293:             * Continue to track the mouse until we get a change
                    294:              * in button status.
                    295:             */
                    296:             XUpdateMouse(RootWindow, &cur_x, &cur_y, &sub_win);
                    297: 
                    298:             /*
                    299:              * If the mouse has moved, then make sure the box follows it.
                    300:              */
                    301:             if ((cur_x != prev_x) || (cur_y != prev_y)) {
                    302: 
                    303:                 /*
                    304:                  * If we've frozen the server, then erase the old box first!
                    305:                  */
                    306:                 if (Freeze)
                    307:                     DrawBox();
                    308:     
                    309:                 /*
                    310:                  * Set the new box position.
                    311:                  */
                    312:                 ulx += cur_x - prev_x;
                    313:                 uly += cur_y - prev_y;
                    314:                 lrx += cur_x - prev_x;
                    315:                 lry += cur_y - prev_y;
                    316:     
                    317:                 /*
                    318:                  * Calculate the vectors for the new box.
                    319:                  */
                    320:                 if (Grid)
                    321:                     num_vectors = StoreGridBox(box, ulx, uly, lrx, lry);
                    322:                 else num_vectors = StoreBox(box, ulx, uly, lrx, lry);
                    323:     
                    324:                 /*
                    325:                  * Draw the new box.
                    326:                  */
                    327:                 if (Freeze)
                    328:                     DrawBox();
                    329:             }
                    330: 
                    331:             /*
                    332:              * Save the old box position.
                    333:              */
                    334:             prev_x = cur_x;
                    335:             prev_y = cur_y;
                    336: 
                    337:             /*
                    338:              * If server is not frozen, then draw the "flicker" box.
                    339:              */
                    340:             if (!Freeze) {
                    341:                 DrawBox();
                    342:                 DrawBox();
                    343:             }
                    344:        }
                    345:     }
                    346: 
                    347:     /*
                    348:      * Restore the main cursor.
                    349:      */
                    350:     Grab(mask);
                    351: 
                    352:     /*
                    353:      * If the button is not a button release of the same button pressed,
                    354:      * then abort the operation.
                    355:      */
                    356:     if ((button_event.type != ButtonReleased) ||
                    357:         ((button_event.detail & ValueMask) != button)) {
                    358:            return(TRUE);
                    359:     }
                    360: 
                    361:     /*
                    362:      * If we are here we have committed to iconifying/deiconifying.
                    363:      */
                    364: 
                    365:     /*
                    366:      * Determine the coordinates of the icon or window;
                    367:      * normalize the window or icon coordinates if the user so desires.
                    368:      */
                    369:     icon_x = mse_x - (icon_w >> 1) - icon_bdr;
                    370:     icon_y = mse_y - (icon_h >> 1) - icon_bdr;
                    371:     if ((NIcon && iconifying) || (NWindow && !iconifying)) {
                    372:         if (icon_x < 0) icon_x = 0;
                    373:         if (icon_y < 0) icon_y = 0;
                    374:         if ((icon_x - 1 + icon_w + (icon_bdr << 1)) > ScreenWidth) {
                    375:             icon_x = ScreenWidth - icon_w - (icon_bdr << 1) + 1;
                    376:         }
                    377:         if ((icon_y - 1 + icon_h + (icon_bdr << 1)) > ScreenHeight) {
                    378:             icon_y = ScreenHeight - icon_h - (icon_bdr << 1) + 1;
                    379:         }
                    380:     }
                    381: 
                    382:     /*
                    383:      * Move the window into place.
                    384:      */
                    385:     XMoveWindow(icon, icon_x, icon_y);
                    386: 
                    387:     /*
                    388:      * Map the icon window.
                    389:      */
                    390:     XMapWindow(icon);
                    391: 
                    392:     if (Zap) {
                    393:         num_vectors = StoreZap(zap, window_info.x, window_info.y,
                    394:                                window_info.x + window_info.width +
                    395:                                (window_info.bdrwidth << 1),
                    396:                                window_info.y + window_info.height +
                    397:                                (window_info.bdrwidth << 1),
                    398:                                ulx, uly, lrx, lry);
                    399:         DrawZap();
                    400:         DrawZap();
                    401:     }
                    402: 
                    403:     /*
                    404:      * Unmap the event window.
                    405:      */
                    406:     XUnmapWindow(window);
                    407:     return(TRUE);
                    408: }

unix.superglobalmegacorp.com

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