|
|
1.1 ! root 1: #ifndef lint ! 2: static char *rcsid_GetButton_c = "$Header: GetButton.c,v 10.5 86/11/19 16:23:39 jg Rel $"; ! 3: #endif lint ! 4: ! 5: /* ! 6: * COPYRIGHT 1985, 1986 ! 7: * DIGITAL EQUIPMENT CORPORATION ! 8: * MAYNARD, MASSACHUSETTS ! 9: * ALL RIGHTS RESERVED. ! 10: * ! 11: * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND ! 12: * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ! 13: * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITIBILITY OF THIS SOFTWARE FOR ! 14: * ANY PURPOSE. IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY. ! 15: * ! 16: * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT RIGHTS, ! 17: * APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN ADDITION TO THAT ! 18: * SET FORTH ABOVE. ! 19: * ! 20: * ! 21: * Permission to use, copy, modify, and distribute this software and its ! 22: * documentation for any purpose and without fee is hereby granted, provided ! 23: * that the above copyright notice appear in all copies and that both that ! 24: * copyright notice and this permission notice appear in supporting documentation, ! 25: * and that the name of Digital Equipment Corporation not be used in advertising ! 26: * or publicity pertaining to distribution of the software without specific, ! 27: * written prior permission. ! 28: * ! 29: */ ! 30: ! 31: ! 32: /* ! 33: * MODIFICATION HISTORY ! 34: * ! 35: * 000 -- M. Gancarz, DEC Ultrix Engineering Group ! 36: */ ! 37: ! 38: #ifndef lint ! 39: static char *sccsid = "@(#)GetButton.c 3.8 1/24/86"; ! 40: #endif ! 41: /* ! 42: * GetButton - This subroutine is used by the Ultrix Window Manager (uwm) ! 43: * to acquire button events. It waits for a button event to occur ! 44: * and handles all event traffic in the interim. ! 45: * ! 46: * File: GetButton.c ! 47: */ ! 48: ! 49: #include "uwm.h" ! 50: ! 51: Bool GetButton(button_event) ! 52: XButtonEvent *button_event; /* Button event packet. */ ! 53: { ! 54: XKeyPressedEvent *kp_event; /* Key pressed event. */ ! 55: char *icon_str; /* Icon's name string. */ ! 56: register int icon_str_len; /* Icon name string lenght. */ ! 57: register int key_char; /* Key press character code. */ ! 58: register int icon_x; /* Icon window X coordinate. */ ! 59: register int icon_y; /* Icon window Y coordinate. */ ! 60: register int icon_w; /* Icon window width. */ ! 61: register int icon_h; /* Icon window height. */ ! 62: int status; /* Routine call return status. */ ! 63: Window icon; /* Icon window. */ ! 64: WindowInfo icon_info; /* Icon window info structure. */ ! 65: char *kbd_str; /* Keyboard string. */ ! 66: int nbytes; /* Keyboard string length. */ ! 67: int i; /* Iteration counter. */ ! 68: ! 69: ! 70: /* ! 71: * Get next event from input queue and store it in the event packet ! 72: * passed to GetButton. ! 73: */ ! 74: XNextEvent(button_event); ! 75: ! 76: /* ! 77: * The event occured on the root window, it must be a mouse ! 78: * button event. ! 79: */ ! 80: if (button_event->window == RootWindow) { ! 81: return(TRUE); ! 82: } ! 83: ! 84: /* ! 85: * Ok, if the event is not on the root window it must be an event on ! 86: * one of the icons owned by uwm. ! 87: */ ! 88: icon = button_event->window; ! 89: ! 90: /* ! 91: * Find out current information about the icon window. ! 92: */ ! 93: status = XQueryWindow(icon, &icon_info); ! 94: if (status == FAILURE) return(FALSE); ! 95: ! 96: /* ! 97: * If the icon's normal window is gone, then ! 98: * destroy the icon window and return FALSE. ! 99: */ ! 100: if (icon_info.assoc_wind == 0) { ! 101: XDestroyWindow(icon); ! 102: return(FALSE); ! 103: } ! 104: ! 105: /* ! 106: * If the event is an UnmapWindow event, ! 107: * then return FALSE. ! 108: */ ! 109: if (button_event->type == UnmapWindow) ! 110: return(FALSE); ! 111: ! 112: /* ! 113: * Initialize the icon position variables. ! 114: */ ! 115: icon_x = icon_info.x; ! 116: icon_y = icon_info.y; ! 117: ! 118: /* ! 119: * Get the name of the window associated with the icon and ! 120: * determine its length. ! 121: */ ! 122: status = XFetchName(icon_info.assoc_wind, &icon_str); ! 123: if (status == FAILURE) return(FALSE); ! 124: icon_str_len = icon_str ? strlen(icon_str) : 0; ! 125: ! 126: /* ! 127: * If the event is a window exposure event and the icon's name string ! 128: * is not of zero length, simply repaint the text in the icon window ! 129: * and return FALSE. ! 130: */ ! 131: if (button_event->type == ExposeWindow && Frozen == 0) { ! 132: XClear(icon); ! 133: if (icon_str_len != 0) { ! 134: XTextPad(icon, ! 135: HIconPad, VIconPad, ! 136: icon_str, icon_str_len, ! 137: IFont, 0, 0, ! 138: ITextForground, ITextBackground, ! 139: GXcopy, AllPlanes); ! 140: /* ! 141: * Remember to free the icon name string. ! 142: */ ! 143: free(icon_str); ! 144: } ! 145: return(FALSE); ! 146: } ! 147: ! 148: /* ! 149: * If we have gotten this far event can only be a key pressed event. ! 150: */ ! 151: kp_event = (XKeyPressedEvent *) button_event; ! 152: ! 153: /* ! 154: * We convert the key pressed event to ascii. ! 155: */ ! 156: kbd_str = XLookupMapping(kp_event, &nbytes); ! 157: ! 158: /* ! 159: * If kbd_str is a "non-string", then don't do anything. ! 160: */ ! 161: if (nbytes == 0) { ! 162: if (icon_str) free(icon_str); ! 163: return(FALSE); ! 164: } ! 165: for (i = 0; i < nbytes; i++) { ! 166: key_char = kbd_str[i]; ! 167: /* ! 168: * If the key was <DELETE>, then delete a character from the end of ! 169: * the name, return FALSE. ! 170: * ! 171: * If the key was <CTRL-U>, then wipe out the entire window name ! 172: * and return FALSE. ! 173: * ! 174: * All other ctrl keys are squashed and we return FALSE. ! 175: * ! 176: * All printable characters are appended to the window's name, which ! 177: * may have to be grown to allow for the extra length. ! 178: */ ! 179: if (key_char == '\177') { ! 180: /* ! 181: * <DELETE> ! 182: */ ! 183: if (icon_str_len > 0) { ! 184: icon_str_len--; ! 185: icon_str[icon_str_len] = '\0'; ! 186: } ! 187: } ! 188: else if (key_char == '\025') { ! 189: /* ! 190: * <CTRL-U> ! 191: */ ! 192: if (icon_str_len > 0) { ! 193: icon_str_len = 0; ! 194: icon_str = '\0'; ! 195: } ! 196: } ! 197: else if (key_char < IFontInfo.firstchar || ! 198: key_char > IFontInfo.lastchar) { ! 199: /* ! 200: * Any other random (non-printable) key; ignore it. ! 201: */ ! 202: /* do nothing */ ; ! 203: } ! 204: else { ! 205: /* ! 206: * ASCII Alphanumerics. ! 207: */ ! 208: if (icon_str == NULL) ! 209: icon_str = (char *) malloc (icon_str_len + 2); ! 210: else ! 211: icon_str = (char *)realloc(icon_str, (icon_str_len + 2)); ! 212: if (icon_str == NULL) { ! 213: errno = ENOMEM; ! 214: Error("GetButton -> Realloc of window name string memory failed."); ! 215: } ! 216: icon_str[icon_str_len] = key_char; ! 217: icon_str[icon_str_len + 1] = '\0'; ! 218: icon_str_len += 1; ! 219: } ! 220: } ! 221: ! 222: /* ! 223: * Now that we have changed the size of the icon we have to reconfigure ! 224: * it so that everything looks good. Oh yes, don't forget to move the ! 225: * mouse so that it stays in the window! ! 226: */ ! 227: ! 228: /* ! 229: * Set the window name to the new string. ! 230: */ ! 231: XStoreName(icon_info.assoc_wind, icon_str); ! 232: ! 233: /* ! 234: * Determine the new icon window configuration. ! 235: */ ! 236: icon_h = IFontInfo.height + (VIconPad << 1); ! 237: icon_w = XQueryWidth(icon_str, IFont); ! 238: if (icon_w == 0) { ! 239: icon_w = icon_h; ! 240: } ! 241: else { ! 242: icon_w += (HIconPad << 1); ! 243: } ! 244: ! 245: if (icon_x < 0) icon_x = 0; ! 246: if (icon_y < 0) icon_y = 0; ! 247: if (icon_x - 1 + icon_w + (IBorderWidth << 1) > ScreenWidth) { ! 248: icon_x = ScreenWidth - icon_w - (IBorderWidth << 1) + 1; ! 249: } ! 250: if (icon_y - 1 + icon_h + (IBorderWidth << 1) > ScreenHeight) { ! 251: icon_y = ScreenHeight - icon_h - (IBorderWidth << 1) + 1; ! 252: } ! 253: ! 254: XConfigureWindow(icon, icon_x, icon_y, icon_w, icon_h); ! 255: XWarpMouse(icon, (icon_w >> 1), (icon_h >> 1)); ! 256: ! 257: /* ! 258: * Free the local storage and return FALSE. ! 259: */ ! 260: if (icon_str) free(icon_str); ! 261: return(FALSE); ! 262: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.