Annotation of 43BSD/contrib/X/xwm/LowerIconify.c, revision 1.1.1.1

1.1       root        1: #include <X/mit-copyright.h>
                      2: 
                      3: /* Copyright    Massachusetts Institute of Technology    1985  */
                      4: 
                      5: /*
                      6:  *     LowerIconify - This subroutine implements window lowering and
                      7:  *     iconifing for the X Window System window manager (xwm).
                      8:  *
                      9:  *     File:           LowerIconify.c
                     10:  *     Modified:       ADF     29-May-85       Converted to X version 8.0
                     11:  */
                     12: 
                     13: #include "xwm.h"
                     14: #ifndef lint
                     15: static char *rcsid_LowerIconify_c = "$Header: LowerIconify.c,v 10.4 86/02/01 16:09:38 tony Rel $";
                     16: #endif
                     17: 
                     18: LowerIconify(window, x, y)
                     19:     Window window;                     /* Event window. */
                     20:     int x, y;                          /* Event mouse position. */
                     21: {
                     22:     register WindowInfo window_info;   /* Event window info. */
                     23:     register WindowInfo icon_info;     /* Icon window info. */
                     24:     char *name;                                /* Event window name. */
                     25:     int mse_x, mse_y;                  /* Mouse X and Y coordinates. */
                     26:     int icon_x, icon_y;                        /* Icon U. L. X and Y coordinates. */
                     27:     int icon_w, icon_h;                        /* Icon width and height. */
                     28:     int icon_bdr;                      /* Icon border width. */
                     29:     int status;                                /* Routine call return status. */
                     30:     int num_vectors;                   /* Number of vectors in zap buffer. */
                     31:     Window icon;                       /* Icon window. */
                     32:     Window sub_win;                    /* Mouse position sub-window. */
                     33:     XButtonEvent button_event;         /* Button event packet. */
                     34:     Vertex zap[MAX_ZAP_VECTORS];       /* Zap effect vertex buffer. */
                     35:     Bool iconifying;                   /* Are we iconifying? */
                     36: 
                     37:     /*
                     38:      * Clear the vector buffer.
                     39:      */
                     40:     if (Zap) bzero(zap, sizeof(zap));
                     41:     
                     42:     /*
                     43:      * Get info on the event window.
                     44:      */
                     45:     status = XQueryWindow(window, &window_info);
                     46:     if (status == FAILURE) return;
                     47: 
                     48:     /*
                     49:      * If the mouse is in an icon window simply lower the window and return.
                     50:      */
                     51:     if (window_info.type == IsIcon) {
                     52: 
                     53:        /*
                     54:         * Wait for the button to come back up.
                     55:         */
                     56:        while (!GetButton(&button_event));
                     57: 
                     58:        if (
                     59:            (button_event.type == ButtonReleased) &&
                     60:            ((button_event.detail & ValueMask) == LeftButton)
                     61:        ){
                     62:            XLowerWindow(window);
                     63:        }
                     64: 
                     65:        return;
                     66:     }
                     67: 
                     68:     /*
                     69:      * If we are here then the event was not on an iconified window.
                     70:      * This flag denotes whether the window we're on is being
                     71:      * iconified or not.
                     72:      */
                     73:     iconifying = FALSE;
                     74: 
                     75:     /*
                     76:      * We spin our wheels here looking for mouse movement or a change
                     77:      * in the status of the buttons.
                     78:      */
                     79:     while (TRUE) {
                     80: 
                     81:        /*
                     82:         * Check to see if we have a change in mouse button status.
                     83:         * This is how we get out of this "while" loop.
                     84:         */
                     85:        if (XPending() && GetButton(&button_event)) {
                     86:            mse_x = button_event.x;
                     87:            mse_y = button_event.y;
                     88:            if (
                     89:                !iconifying &&
                     90:                ((abs(mse_x - x) > Delta) || (abs(mse_y - y) > Delta))
                     91:            ){
                     92:                /*
                     93:                 * The mouse has moved Delta pixels without the left button
                     94:                 * going up.  This means we are iconifying a window.
                     95:                 * We warn the user by changing the mouse cursor to the
                     96:                 * funny icon cursor.
                     97:                 */
                     98:                iconifying = TRUE;
                     99:                status = XGrabButton(
                    100:                    RootWindow,
                    101:                    IconCursor,
                    102:                    (LeftMask | ButtonMask),
                    103:                    (ButtonPressed | ButtonReleased)
                    104:                );
                    105:                if (status == FAILURE) {
                    106:                    Error("LowerIconify -> Unable to grab left button and change cursor.");
                    107:                }
                    108:            }
                    109:            break;
                    110:        }
                    111:        else if (!iconifying) {
                    112:            /*
                    113:             * Continue to track the mouse untill we exceed delta or
                    114:             * get a change in button status.
                    115:             */
                    116:            XQueryMouse(RootWindow, &mse_x, &mse_y, &sub_win);
                    117: 
                    118:            if ((abs(mse_x - x) > Delta) || (abs(mse_y - y) > Delta)) {
                    119:                /*
                    120:                 * The mouse has moved Delta pixels without the left button
                    121:                 * going up.  This means we are iconifying a window.
                    122:                 * We warn the user by changing the mouse cursor to the
                    123:                 * funny icon cursor.
                    124:                 */
                    125:                iconifying = TRUE;
                    126:                status = XGrabButton(
                    127:                    RootWindow,
                    128:                    IconCursor,
                    129:                    (LeftMask | ButtonMask),
                    130:                    (ButtonPressed | ButtonReleased)
                    131:                );
                    132:                if (status == FAILURE) {
                    133:                    Error("LowerIconify -> Unable to grab left button and change cursor.");
                    134:                }
                    135:            }
                    136:        }
                    137:     }
                    138: 
                    139:     if (iconifying) {
                    140:        /*
                    141:         * Restore the window manager mouse cursor.
                    142:         */
                    143:        status = XGrabButton(
                    144:            RootWindow,
                    145:            DotCursor,
                    146:            (LeftMask | ButtonMask),
                    147:            (ButtonPressed | ButtonReleased)
                    148:        );
                    149:        if (status == FAILURE) {
                    150:            Error("LowerIconify -> Unable to grab left button and change cursor.");
                    151:        }
                    152:     }
                    153: 
                    154:     /*
                    155:      * If the left button is released and we are not iconifying then
                    156:      * lower the window and return.  If any other button event occured
                    157:      * abort the operation.
                    158:      */
                    159:     if (
                    160:        (button_event.type == ButtonReleased) &&
                    161:        ((button_event.detail & ValueMask) == LeftButton)
                    162:     ){
                    163:        if (!iconifying) {
                    164:            XLowerWindow(window);
                    165:            return;
                    166:        }
                    167:     }
                    168:     else {
                    169:        /*
                    170:         * Abort!
                    171:         */
                    172:        return;
                    173:     }
                    174: 
                    175:     /*
                    176:      * If we are here we have committed to iconifying the window.
                    177:      */
                    178: 
                    179:     if (window_info.assoc_wind == 0) {
                    180:        /*
                    181:         * We need to make an icon window for the event window.
                    182:         */ 
                    183: 
                    184:        /*
                    185:         * Set the icon border width.
                    186:         */ 
                    187:        icon_bdr = IBorderWidth;
                    188: 
                    189:        /*
                    190:         * Determine the size of the icon window.
                    191:         */ 
                    192:        status = XFetchName(window, &name);
                    193:        if (status == FAILURE) return;
                    194:        icon_h = IFontInfo.height + (IPadding << 1);
                    195:        icon_w = XQueryWidth(name, IFont);
                    196:        if (icon_w == 0) {
                    197:            icon_w = icon_h;
                    198:        }
                    199:        else {
                    200:            icon_w += (IPadding << 1);
                    201:        }
                    202: 
                    203:        /*
                    204:         * Determine the coordinates of the icon window;
                    205:         * normalize so that we don't lose the icon off the
                    206:         * edge of the screen.
                    207:         */
                    208:        icon_x = mse_x - (icon_w >> 1) + 1;
                    209:        if (icon_x < 0) icon_x = 0;
                    210:        icon_y = mse_y - (icon_h >> 1) + 1;
                    211:        if (icon_y < 0) icon_y = 0;
                    212:        if ((icon_x - 1 + icon_w + (icon_bdr << 1)) > ScreenWidth) {
                    213:            icon_x = ScreenWidth - icon_w - (icon_bdr << 1) + 1;
                    214:        }
                    215:        if ((icon_y - 1 + icon_h + (icon_bdr << 1)) > ScreenHeight) {
                    216:            icon_y = ScreenHeight - icon_h - (icon_bdr << 1) + 1;
                    217:        }
                    218: 
                    219:        /*
                    220:         * Create the icon window.
                    221:         */
                    222:        icon = XCreateWindow(
                    223:            RootWindow,
                    224:            icon_x, icon_y,
                    225:            icon_w, icon_h,
                    226:            icon_bdr,
                    227:            IBorder, IBackground
                    228:        );
                    229:        if (icon == FAILURE) return;
                    230: 
                    231:        /*
                    232:         * Use the text cursor whenever the mouse is in the icon window.
                    233:         */
                    234:        XDefineCursor(icon, TextCursor);
                    235: 
                    236:        /*
                    237:         * Select "key pressed", "window exposure" and "unmap window"
                    238:         * events for the icon window.
                    239:         */
                    240:        XSelectInput(icon, (KeyPressed | ExposeWindow | UnmapWindow));
                    241: 
                    242:        /*
                    243:         * Set the event window's icon window to be the new icon window.
                    244:         */
                    245:        XSetIconWindow(window, icon);
                    246:     }
                    247:     else {
                    248:        /*
                    249:         * If we already have an icon window all we have to do is
                    250:         * retrieve the info on it and move it into place.
                    251:         */
                    252:        icon = window_info.assoc_wind;
                    253: 
                    254:        /*
                    255:         * Get info on the icon window.
                    256:         */
                    257:        status = XQueryWindow(icon, &icon_info);
                    258:        if (status == FAILURE) return;
                    259: 
                    260:        /*
                    261:         * Set the icon border width.
                    262:         */
                    263:        icon_bdr = icon_info.bdrwidth;
                    264: 
                    265:        /*
                    266:         * Determine the size of the icon window.
                    267:         */
                    268:        icon_h = icon_info.height;
                    269:        icon_w = icon_info.width;
                    270: 
                    271:        /*
                    272:         * Determine the coordinates of the icon window;
                    273:         * normalize so that we don't lose the icon off the
                    274:         * edge of the screen.
                    275:         */
                    276:        icon_x = mse_x - (icon_w >> 1) + 1;
                    277:        if (icon_x < 0) icon_x = 0;
                    278:        icon_y = mse_y - (icon_h >> 1) + 1;
                    279:        if (icon_y < 0) icon_y = 0;
                    280:        if ((icon_x - 1 + icon_w + (icon_bdr << 1)) > ScreenWidth) {
                    281:            icon_x = ScreenWidth - icon_w - (icon_bdr << 1) + 1;
                    282:        }
                    283:        if ((icon_y - 1 + icon_h + (icon_bdr << 1)) > ScreenHeight) {
                    284:            icon_y = ScreenHeight - icon_h - (icon_bdr << 1) + 1;
                    285:         }
                    286: 
                    287:        /*
                    288:         * Move the window into place.
                    289:         */
                    290:        XMoveWindow(icon, icon_x, icon_y);
                    291:     }
                    292: 
                    293:     if (Zap) {
                    294:        /*
                    295:         * Store the zap effect vectors.
                    296:         */
                    297:        num_vectors = StoreZap(
                    298:            zap,
                    299:            window_info.x - 1,
                    300:            window_info.y - 1,
                    301:            window_info.x + window_info.width + (window_info.bdrwidth << 1),
                    302:            window_info.y + window_info.height + (window_info.bdrwidth << 1),
                    303:            icon_x - 1,
                    304:            icon_y - 1,
                    305:            icon_x + icon_w + (icon_bdr << 1),
                    306:            icon_y + icon_h + (icon_bdr << 1)
                    307:        );
                    308:     }
                    309: 
                    310:     /*
                    311:      * Map the icon window.
                    312:      */
                    313:     XMapWindow(icon);
                    314: 
                    315:     if (Zap) {
                    316:        /*
                    317:         * Draw zap lines from the window to its icon.
                    318:         */
                    319:        XDraw(
                    320:            RootWindow,
                    321:            zap, num_vectors,
                    322:            DRAW_HEIGHT, DRAW_WIDTH,
                    323:            DRAW_VALUE, DRAW_FUNC, DRAW_PLANES
                    324:        );
                    325:        XDraw(
                    326:            RootWindow,
                    327:            zap, num_vectors,
                    328:            DRAW_HEIGHT, DRAW_WIDTH,
                    329:            DRAW_VALUE, DRAW_FUNC, DRAW_PLANES
                    330:        );
                    331:     }
                    332: 
                    333:     /*
                    334:      * Unmap the event window.
                    335:      */
                    336:     XUnmapWindow(window);
                    337: }

unix.superglobalmegacorp.com

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