|
|
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.