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

1.1       root        1: #include <X11/copyright.h>
                      2: 
                      3: /*
                      4:  * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
                      5:  *
                      6:  *                         All Rights Reserved
                      7:  *
                      8:  * Permission to use, copy, modify, and distribute this software and its
                      9:  * documentation for any purpose and without fee is hereby granted,
                     10:  * provided that the above copyright notice appear in all copies and that
                     11:  * both that copyright notice and this permission notice appear in
                     12:  * supporting documentation, and that the name of Digital Equipment
                     13:  * Corporation not be used in advertising or publicity pertaining to
                     14:  * distribution of the software without specific, written prior permission.
                     15:  *
                     16:  *
                     17:  * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     18:  * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     19:  * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     20:  * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     21:  * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     22:  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     23:  * SOFTWARE.
                     24:  */
                     25: 
                     26: /*
                     27:  * MODIFICATION HISTORY
                     28:  *
                     29:  * 000 -- M. Gancarz, DEC Ultrix Engineering Group
                     30:  * 001 -- Loretta Guarino Reid, DEC Ultrix Engineering Group,
                     31:  *  Western Software Lab. Port to X11.
                     32:  */
                     33: 
                     34: #ifndef lint
                     35: static char *sccsid = "%W%     %G%";
                     36: #endif
                     37: 
                     38: #include "uwm.h"
                     39: 
                     40: Bool NewIconify(window, mask, button, x, y)
                     41: Window window;                          /* Event window. */
                     42: int mask;                               /* Button/key mask. */
                     43: int button;                             /* Button event detail. */
                     44: int x, y;                               /* Event mouse position. */
                     45: {
                     46:     XWindowAttributes window_info;     /* Event window info. */
                     47:     XWindowAttributes icon_info;       /* Icon window info. */
                     48:     char *name;                                /* Event window name. */
                     49:     int mse_x, mse_y;                  /* Mouse X and Y coordinates. */
                     50:     int icon_x, icon_y;                        /* Icon U. L. X and Y coordinates. */
                     51:     int icon_w, icon_h;                        /* Icon width and height. */
                     52:     int icon_bdr;                      /* Icon border width. */
                     53:     int prev_x;                                /* Previous event window X location. */
                     54:     int prev_y;                                /* Previous event window Y location. */
                     55:     int cur_x;                         /* Current event window X location. */
                     56:     int cur_y;                         /* Current event window Y location. */
                     57:     int root_x;                                /* Root window X location. */
                     58:     int root_y;                                /* Root window Y location. */
                     59:     int ulx, uly;                      /* Event window upper left X and Y. */
                     60:     int lrx, lry;                      /* Event window lower right X and Y. */
                     61:     int init_ulx, init_uly;            /* Init window upper left X and Y. */
                     62:     int init_lrx, init_lry;            /* Init window lower right X and Y. */
                     63:     int num_vectors;                   /* Number of vectors in box. */
                     64:     int status;                                /* Routine call return status. */
                     65:     int ptrmask;                       /* pointer query state. */
                     66:     Window root;                       /* Mouse root window. */
                     67:     Window icon;                       /* Icon window. */
                     68:     Window sub_win;                    /* Mouse position sub-window. */
                     69:     XEvent button_event;               /* Button event packet. */
                     70:     XSegment box[MAX_BOX_VECTORS];     /* Box vertex buffer. */
                     71:     XSegment zap[MAX_ZAP_VECTORS];     /* Zap effect vertex buffer. */
                     72:     Bool iconifying;                   /* Are we iconifying? */
                     73: 
                     74:     /*
                     75:      * Do not lower or iconify the root window.
                     76:      */
                     77:     if (window == RootWindow(dpy, scr))
                     78:         return(FALSE);
                     79: 
                     80:     /*
                     81:      * Change the cursor to the icon cursor.
                     82:      */
                     83:     XChangeActivePointerGrab(dpy, EVENTMASK, ArrowCrossCursor, CurrentTime);
                     84: 
                     85:     /*
                     86:      * Clear the vector buffers.
                     87:      */
                     88:     bzero(box, sizeof(box));
                     89:     if (Zap) bzero(zap, sizeof(zap));
                     90:     
                     91:     /*
                     92:      * Get info on the event window.
                     93:      */
                     94:     status = XGetWindowAttributes(dpy, window, &window_info);
                     95:     if (status == FAILURE) return(FALSE);
                     96: 
                     97:     /*
                     98:      * Are we iconifying or de-iconifying?
                     99:      */
                    100:     if (!IsIcon(window, x, y, FALSE, &icon)) {
                    101: 
                    102:         /*
                    103:          * Window => Icon (Iconifying).
                    104:          */
                    105:         /*
                    106:          * If an icon window doesn't exist for the event window, then
                    107:          * make one.
                    108:          */
                    109:         iconifying = TRUE;
                    110:     }
                    111:     else {
                    112: 
                    113:         /*
                    114:          * Icon => Window (DeIconifying).
                    115:          */
                    116: 
                    117:         /*
                    118:          * We call the normal window the "icon" window only to simplify
                    119:          * the code later on in the function.
                    120:          */
                    121:         iconifying = FALSE;
                    122:     }
                    123:     /*
                    124:      * Get info on the icon window.
                    125:      */
                    126:     status = XGetWindowAttributes(dpy, icon, &icon_info);
                    127:     if (status == FAILURE) return(FALSE);
                    128: 
                    129:     /*
                    130:      * Determine the height, width, and borderwidth of the icon.
                    131:      */
                    132:     icon_h = icon_info.height;
                    133:     icon_w = icon_info.width;
                    134:     icon_bdr = icon_info.border_width;
                    135: 
                    136: 
                    137:     /*
                    138:      * Initialize the movement variables.
                    139:      */
                    140:     init_ulx = ulx = x - (icon_w >> 1) - icon_bdr;
                    141:     init_uly = uly = y - (icon_h >> 1) - icon_bdr;
                    142:     init_lrx = lrx = x + (icon_w >> 1) + icon_bdr - 1;
                    143:     init_lry = lry = y + (icon_h >> 1) + icon_bdr - 1;
                    144:     prev_x = x;
                    145:     prev_y = y;
                    146: 
                    147: 
                    148:     /*
                    149:      * Store the box.
                    150:      */
                    151:     if (Grid)
                    152:         num_vectors = StoreGridBox(box, ulx, uly, lrx, lry);
                    153:     else num_vectors = StoreBox(box, ulx, uly, lrx, lry);
                    154: 
                    155:     /*
                    156:      * Freeze the server, if requested by the user.
                    157:      * This results in a solid box instead of a flickering one.
                    158:      */
                    159:     if (Freeze)
                    160:         XGrabServer(dpy);
                    161: 
                    162:     /*
                    163:      * Process any outstanding events before drawing the box.
                    164:      */
                    165:     while (QLength(dpy) > 0) {
                    166:         XPeekEvent(dpy, &button_event);
                    167:         if (((XAnyEvent *)&button_event)->window == RootWindow(dpy, scr))
                    168:             break;
                    169:         GetButton(&button_event);
                    170:     }
                    171: 
                    172:     /*
                    173:      * Draw the box.
                    174:      */
                    175:     DrawBox();
                    176:     if (Freeze)
                    177:         Frozen = window;
                    178: 
                    179:     /*
                    180:      * We spin our wheels here looking for mouse movement or a change
                    181:      * in the status of the buttons.
                    182:      */
                    183:     while (TRUE) {
                    184: 
                    185:        /*
                    186:         * Check to see if we have a change in mouse button status.
                    187:         * This is how we get out of this "while" loop.
                    188:         */
                    189:        if (XPending(dpy) && GetButton(&button_event)) {
                    190:             /*
                    191:              * Process the pending events, this sequence is the only
                    192:              * way out of the loop and the routine.
                    193:              */
                    194: 
                    195:             if ((button_event.type != ButtonPress) && 
                    196:                (button_event.type != ButtonRelease)) {
                    197:                 continue; /* spurious menu event... */
                    198:             }
                    199: 
                    200:             /*
                    201:              * If we froze the server, then erase the last lines drawn.
                    202:              */
                    203:             if (Freeze) {
                    204:                 DrawBox();
                    205:                 Frozen = (Window)0;
                    206:                 XUngrabServer(dpy);
                    207:             }
                    208: 
                    209:             /*
                    210:              * Save the mouse cursor location.
                    211:              */
                    212:            if (button_event.type == ButtonPress ||
                    213:                button_event.type == ButtonRelease) {
                    214:                mse_x = ((XButtonEvent *)&button_event)->x;
                    215:                mse_y = ((XButtonEvent *)&button_event)->y;
                    216:                break;
                    217:            }
                    218:        }
                    219:        else {
                    220:            /*
                    221:             * Continue to track the mouse until we get a change
                    222:              * in button status.
                    223:             */
                    224:             XQueryPointer(dpy, RootWindow(dpy, scr), 
                    225:                &root, &sub_win, &root_x, &root_y, &cur_x, &cur_y, 
                    226:                &ptrmask);
                    227: 
                    228:             /*
                    229:              * If the mouse has moved, then make sure the box follows it.
                    230:              */
                    231:             if ((cur_x != prev_x) || (cur_y != prev_y)) {
                    232: 
                    233:                 /*
                    234:                  * If we've frozen the server, then erase the old box first!
                    235:                  */
                    236:                 if (Freeze)
                    237:                     DrawBox();
                    238:     
                    239:                 /*
                    240:                  * Set the new box position.
                    241:                  */
                    242:                 ulx += cur_x - prev_x;
                    243:                 uly += cur_y - prev_y;
                    244:                 lrx += cur_x - prev_x;
                    245:                 lry += cur_y - prev_y;
                    246:     
                    247:                 /*
                    248:                  * Calculate the vectors for the new box.
                    249:                  */
                    250:                 if (Grid)
                    251:                     num_vectors = StoreGridBox(box, ulx, uly, lrx, lry);
                    252:                 else num_vectors = StoreBox(box, ulx, uly, lrx, lry);
                    253:     
                    254:                 /*
                    255:                  * Draw the new box.
                    256:                  */
                    257:                 if (Freeze)
                    258:                     DrawBox();
                    259:             }
                    260: 
                    261:             /*
                    262:              * Save the old box position.
                    263:              */
                    264:             prev_x = cur_x;
                    265:             prev_y = cur_y;
                    266: 
                    267:             /*
                    268:              * If server is not frozen, then draw the "flicker" box.
                    269:              */
                    270:             if (!Freeze) {
                    271:                 DrawBox();
                    272:                 DrawBox();
                    273:             }
                    274:        }
                    275:     }
                    276: 
                    277:     /*
                    278:      * If the button is not a button release of the same button pressed,
                    279:      * then abort the operation.
                    280:      */
                    281:     if ((button_event.type != ButtonRelease) ||
                    282:         (((XButtonReleasedEvent *)&button_event)->button != button)) {
                    283:            ResetCursor(button);
                    284:            return(TRUE);
                    285:     }
                    286: 
                    287:     /*
                    288:      * If we are here we have committed to iconifying/deiconifying.
                    289:      */
                    290: 
                    291:     /*
                    292:      * Determine the coordinates of the icon or window;
                    293:      * normalize the window or icon coordinates if the user so desires.
                    294:      */
                    295:     icon_x = mse_x - (icon_w >> 1) - icon_bdr;
                    296:     icon_y = mse_y - (icon_h >> 1) - icon_bdr;
                    297:     if ((NIcon && iconifying) || (NWindow && !iconifying)) {
                    298:         if (icon_x < 0) icon_x = 0;
                    299:         if (icon_y < 0) icon_y = 0;
                    300:         if ((icon_x - 1 + icon_w + (icon_bdr << 1)) > ScreenWidth) {
                    301:             icon_x = ScreenWidth - icon_w - (icon_bdr << 1) + 1;
                    302:         }
                    303:         if ((icon_y - 1 + icon_h + (icon_bdr << 1)) > ScreenHeight) {
                    304:             icon_y = ScreenHeight - icon_h - (icon_bdr << 1) + 1;
                    305:         }
                    306:     }
                    307: 
                    308:     /*
                    309:      * Move the window into place.
                    310:      */
                    311:     XMoveWindow(dpy, icon, icon_x, icon_y);
                    312: 
                    313:     /*
                    314:      * Map the icon window.
                    315:      */
                    316:     XMapRaised(dpy, icon);
                    317:     if (!iconifying) XRemoveFromSaveSet(dpy, icon);
                    318: 
                    319:     if (Zap) {
                    320:         num_vectors = StoreZap(zap, window_info.x, window_info.y,
                    321:                                window_info.x + window_info.width +
                    322:                                (window_info.border_width << 1),
                    323:                                window_info.y + window_info.height +
                    324:                                (window_info.border_width << 1),
                    325:                                ulx, uly, lrx, lry);
                    326:         DrawZap();
                    327:         DrawZap();
                    328:     }
                    329: 
                    330:     /*
                    331:      * Unmap the event window.
                    332:      */
                    333:     if (iconifying) XAddToSaveSet(dpy, window);
                    334:     XUnmapWindow(dpy, window);
                    335:     return(TRUE);
                    336: }

unix.superglobalmegacorp.com

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