summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar taiyu <taiyu.len@gmail.com>2015-08-18 11:22:52 -0700
committerLibravatar taiyu <taiyu.len@gmail.com>2015-08-18 11:22:52 -0700
commit03e83c7ef94e90a78390209af8d9c2a0c0adb237 (patch)
treeea13031298833fff8e57ec2b1f2d652d608b7db5
parentFixed mouse clicks from triggering a segfault (diff)
downloadsway-03e83c7ef94e90a78390209af8d9c2a0c0adb237.tar.gz
sway-03e83c7ef94e90a78390209af8d9c2a0c0adb237.tar.zst
sway-03e83c7ef94e90a78390209af8d9c2a0c0adb237.zip
restored fullscreen/focus behavior
-rw-r--r--sway/commands.c2
-rw-r--r--sway/container.c31
-rw-r--r--sway/focus.c77
-rw-r--r--sway/handlers.c19
-rw-r--r--sway/layout.c62
-rw-r--r--sway/workspace.c58
6 files changed, 166 insertions, 83 deletions
diff --git a/sway/commands.c b/sway/commands.c
index ae0bdbe4..6c3efb3b 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -408,7 +408,7 @@ static bool cmd_fullscreen(struct sway_config *config, int argc, char **argv) {
408 return false; 408 return false;
409 } 409 }
410 410
411 swayc_t *container = get_focused_container(&root_container); 411 swayc_t *container = get_focused_view(&root_container);
412 bool current = (wlc_view_get_state(container->handle) & WLC_BIT_FULLSCREEN) > 0; 412 bool current = (wlc_view_get_state(container->handle) & WLC_BIT_FULLSCREEN) > 0;
413 wlc_view_set_state(container->handle, WLC_BIT_FULLSCREEN, !current); 413 wlc_view_set_state(container->handle, WLC_BIT_FULLSCREEN, !current);
414 //Resize workspace if going from fullscreen -> notfullscreen 414 //Resize workspace if going from fullscreen -> notfullscreen
diff --git a/sway/container.c b/sway/container.c
index c83cd720..62c5bda0 100644
--- a/sway/container.c
+++ b/sway/container.c
@@ -4,6 +4,7 @@
4#include "config.h" 4#include "config.h"
5#include "container.h" 5#include "container.h"
6#include "workspace.h" 6#include "workspace.h"
7#include "focus.h"
7#include "layout.h" 8#include "layout.h"
8#include "log.h" 9#include "log.h"
9 10
@@ -21,11 +22,26 @@ static swayc_t *new_swayc(enum swayc_types type) {
21} 22}
22 23
23static void free_swayc(swayc_t *c) { 24static void free_swayc(swayc_t *c) {
24 //TODO does not properly handle containers with children, 25 // TODO does not properly handle containers with children,
25 //TODO but functions that call this usually check for that 26 // TODO but functions that call this usually check for that
26 if (c->children) { 27 if (c->children) {
28 if (c->children->length) {
29 int i;
30 for (i = 0; i < c->children->length; ++i) {
31 free_swayc(c->children->items[i]);
32 }
33 }
27 list_free(c->children); 34 list_free(c->children);
28 } 35 }
36 if (c->floating) {
37 if (c->floating->length) {
38 int i;
39 for (i = 0; i < c->floating->length; ++i) {
40 free_swayc(c->floating->items[i]);
41 }
42 }
43 list_free(c->floating);
44 }
29 if (c->parent) { 45 if (c->parent) {
30 remove_child(c); 46 remove_child(c);
31 } 47 }
@@ -194,7 +210,7 @@ swayc_t *new_floating_view(wlc_handle handle) {
194 list_add(active_workspace->floating, view); 210 list_add(active_workspace->floating, view);
195 view->parent = active_workspace; 211 view->parent = active_workspace;
196 if (active_workspace->focused == NULL) { 212 if (active_workspace->focused == NULL) {
197 active_workspace->focused = view; 213 set_focused_container_for(active_workspace, view);
198 } 214 }
199 return view; 215 return view;
200} 216}
@@ -291,7 +307,7 @@ swayc_t *find_container(swayc_t *container, bool (*test)(swayc_t *view, void *da
291} 307}
292 308
293void container_map(swayc_t *container, void (*f)(swayc_t *view, void *data), void *data) { 309void container_map(swayc_t *container, void (*f)(swayc_t *view, void *data), void *data) {
294 if (!container->children || !container->children->length) { 310 if (!container || !container->children || !container->children->length) {
295 return; 311 return;
296 } 312 }
297 int i; 313 int i;
@@ -300,6 +316,13 @@ void container_map(swayc_t *container, void (*f)(swayc_t *view, void *data), voi
300 f(child, data); 316 f(child, data);
301 container_map(child, f, data); 317 container_map(child, f, data);
302 } 318 }
319 if (container->type == C_WORKSPACE) {
320 for (i = 0; i < container->floating->length; ++i) {
321 swayc_t *child = container->floating->items[i];
322 f(child, data);
323 container_map(child, f, data);
324 }
325 }
303} 326}
304 327
305void set_view_visibility(swayc_t *view, void *data) { 328void set_view_visibility(swayc_t *view, void *data) {
diff --git a/sway/focus.c b/sway/focus.c
index 7e3af56c..628316dd 100644
--- a/sway/focus.c
+++ b/sway/focus.c
@@ -14,11 +14,15 @@ static void update_focus(swayc_t *c) {
14 swayc_t *parent = c->parent; 14 swayc_t *parent = c->parent;
15 if (parent->focused != c) { 15 if (parent->focused != c) {
16 switch (c->type) { 16 switch (c->type) {
17 // Shouldnt happen
17 case C_ROOT: return; 18 case C_ROOT: return;
19
20 // Case where output changes
18 case C_OUTPUT: 21 case C_OUTPUT:
19 wlc_output_focus(c->handle); 22 wlc_output_focus(c->handle);
20 break; 23 break;
21 // switching workspaces 24
25 // Case where workspace changes
22 case C_WORKSPACE: 26 case C_WORKSPACE:
23 if (parent->focused) { 27 if (parent->focused) {
24 swayc_t *ws = parent->focused; 28 swayc_t *ws = parent->focused;
@@ -29,10 +33,12 @@ static void update_focus(swayc_t *c) {
29 mask = 2; 33 mask = 2;
30 container_map(c, set_view_visibility, &mask); 34 container_map(c, set_view_visibility, &mask);
31 wlc_output_set_mask(parent->handle, 2); 35 wlc_output_set_mask(parent->handle, 2);
36 c->parent->focused = c;
32 destroy_workspace(ws); 37 destroy_workspace(ws);
33 } 38 }
34 active_workspace = c; 39 active_workspace = c;
35 break; 40 break;
41
36 default: 42 default:
37 case C_VIEW: 43 case C_VIEW:
38 case C_CONTAINER: 44 case C_CONTAINER:
@@ -49,6 +55,10 @@ bool move_focus(enum movement_direction direction) {
49 return false; 55 return false;
50 } 56 }
51 swayc_t *current = get_focused_container(&root_container); 57 swayc_t *current = get_focused_container(&root_container);
58 if (current->type == C_VIEW
59 && wlc_view_get_state(current->handle) & WLC_BIT_FULLSCREEN) {
60 return false;
61 }
52 swayc_t *parent = current->parent; 62 swayc_t *parent = current->parent;
53 63
54 if (direction == MOVE_PARENT) { 64 if (direction == MOVE_PARENT) {
@@ -128,23 +138,39 @@ void set_focused_container(swayc_t *c) {
128 return; 138 return;
129 } 139 }
130 sway_log(L_DEBUG, "Setting focus to %p:%ld", c, c->handle); 140 sway_log(L_DEBUG, "Setting focus to %p:%ld", c, c->handle);
131 if (c->type != C_ROOT && c->type != C_OUTPUT) { 141
132 c->is_focused = true; 142 // Find previous focused view, and the new focused view, if they are the same return
143 swayc_t *focused = get_focused_view(&root_container);
144 swayc_t *workspace = active_workspace;
145 if (focused == get_focused_view(c)) {
146 return;
133 } 147 }
134 swayc_t *prev_view = get_focused_view(&root_container); 148
149 // update container focus from here to root, making necessary changes along
150 // the way
135 swayc_t *p = c; 151 swayc_t *p = c;
136 while (p != &root_container) { 152 while (p != &root_container) {
137 update_focus(p); 153 update_focus(p);
138 p = p->parent; 154 p = p->parent;
139 p->is_focused = false; 155 p->is_focused = false;
140 } 156 }
141 if (!locked_view_focus) { 157
142 p = get_focused_view(c); 158 // if the workspace is the same, and previous focus is fullscreen, dont
143 // Set focus to p 159 // change focus
144 if (p && !(wlc_view_get_type(p->handle) & WLC_BIT_POPUP)) { 160 if (workspace == active_workspace
145 if (prev_view) { 161 && wlc_view_get_state(focused->handle) & WLC_BIT_FULLSCREEN) {
146 wlc_view_set_state(prev_view->handle, WLC_BIT_ACTIVATED, false); 162 return;
147 } 163 }
164
165 // get new focused view and set focus to it.
166 p = get_focused_view(c);
167 if (p->type == C_VIEW && !(wlc_view_get_type(p->handle) & WLC_BIT_POPUP)) {
168 // unactivate previous focus
169 if (focused->type == C_VIEW) {
170 wlc_view_set_state(focused->handle, WLC_BIT_ACTIVATED, false);
171 }
172 // activate current focus
173 if (p->type == C_VIEW) {
148 wlc_view_focus(p->handle); 174 wlc_view_focus(p->handle);
149 wlc_view_set_state(p->handle, WLC_BIT_ACTIVATED, true); 175 wlc_view_set_state(p->handle, WLC_BIT_ACTIVATED, true);
150 } 176 }
@@ -156,12 +182,25 @@ void set_focused_container_for(swayc_t *a, swayc_t *c) {
156 return; 182 return;
157 } 183 }
158 swayc_t *find = c; 184 swayc_t *find = c;
159 //Ensure that a is an ancestor of c 185 // Ensure that a is an ancestor of c
160 while (find != a && (find = find->parent)) { 186 while (find != a && (find = find->parent)) {
161 if (find == &root_container) { 187 if (find == &root_container) {
162 return; 188 return;
163 } 189 }
164 } 190 }
191 // Check if we changing a parent container that will see chnage
192 bool effective = true;
193 while (find != &root_container) {
194 if (find->parent->focused != find) {
195 effective = false;
196 }
197 find = find->parent;
198 }
199 if (effective) {
200 // Go to set_focused_container
201 set_focused_container(c);
202 return;
203 }
165 204
166 sway_log(L_DEBUG, "Setting focus for %p:%ld to %p:%ld", 205 sway_log(L_DEBUG, "Setting focus for %p:%ld to %p:%ld",
167 a, a->handle, c, c->handle); 206 a, a->handle, c, c->handle);
@@ -173,19 +212,17 @@ void set_focused_container_for(swayc_t *a, swayc_t *c) {
173 p = p->parent; 212 p = p->parent;
174 p->is_focused = false; 213 p->is_focused = false;
175 } 214 }
176 if (!locked_view_focus) {
177 p = get_focused_view(c);
178 // Set focus to p
179 if (p) {
180 wlc_view_focus(p->handle);
181 wlc_view_set_state(p->handle, WLC_BIT_ACTIVATED, true);
182 }
183 }
184} 215}
185 216
186swayc_t *get_focused_view(swayc_t *parent) { 217swayc_t *get_focused_view(swayc_t *parent) {
187 while (parent && parent->type != C_VIEW) { 218 while (parent && parent->type != C_VIEW) {
219 if (parent->type == C_WORKSPACE && parent->focused == NULL) {
220 return parent;
221 }
188 parent = parent->focused; 222 parent = parent->focused;
189 } 223 }
224 if (parent == NULL) {
225 return active_workspace;
226 }
190 return parent; 227 return parent;
191} 228}
diff --git a/sway/handlers.c b/sway/handlers.c
index 4980f65c..ec2b123e 100644
--- a/sway/handlers.c
+++ b/sway/handlers.c
@@ -106,6 +106,12 @@ static void handle_output_destroyed(wlc_handle output) {
106 if (i < list->length) { 106 if (i < list->length) {
107 destroy_output(list->items[i]); 107 destroy_output(list->items[i]);
108 } 108 }
109 if (list->length == 0) {
110 active_workspace = NULL;
111 } else {
112 //switch to other outputs active workspace
113 workspace_switch(((swayc_t *)root_container.children->items[0])->focused);
114 }
109} 115}
110 116
111static void handle_output_resolution_change(wlc_handle output, const struct wlc_size *from, const struct wlc_size *to) { 117static void handle_output_resolution_change(wlc_handle output, const struct wlc_size *from, const struct wlc_size *to) {
@@ -320,6 +326,9 @@ static bool handle_pointer_motion(wlc_handle handle, uint32_t time, const struct
320 mouse_origin = *origin; 326 mouse_origin = *origin;
321 bool changed_floating = false; 327 bool changed_floating = false;
322 int i = 0; 328 int i = 0;
329 if (!active_workspace) {
330 return false;
331 }
323 // Do checks to determine if proper keys are being held 332 // Do checks to determine if proper keys are being held
324 swayc_t *view = active_workspace->focused; 333 swayc_t *view = active_workspace->focused;
325 if (m1_held && view) { 334 if (m1_held && view) {
@@ -400,7 +409,11 @@ static bool handle_pointer_motion(wlc_handle handle, uint32_t time, const struct
400 } 409 }
401 } 410 }
402 if (config->focus_follows_mouse && prev_handle != handle) { 411 if (config->focus_follows_mouse && prev_handle != handle) {
403 set_focused_container(container_under_pointer()); 412 //Dont change focus if fullscreen
413 swayc_t *focused = get_focused_view(view);
414 if (!(focused->type == C_VIEW && wlc_view_get_state(focused->handle) & WLC_BIT_FULLSCREEN)) {
415 set_focused_container(container_under_pointer());
416 }
404 } 417 }
405 prev_handle = handle; 418 prev_handle = handle;
406 prev_pos = mouse_origin; 419 prev_pos = mouse_origin;
@@ -414,6 +427,10 @@ static bool handle_pointer_motion(wlc_handle handle, uint32_t time, const struct
414static bool handle_pointer_button(wlc_handle view, uint32_t time, const struct wlc_modifiers *modifiers, 427static bool handle_pointer_button(wlc_handle view, uint32_t time, const struct wlc_modifiers *modifiers,
415 uint32_t button, enum wlc_button_state state) { 428 uint32_t button, enum wlc_button_state state) {
416 swayc_t *focused = get_focused_container(&root_container); 429 swayc_t *focused = get_focused_container(&root_container);
430 //dont change focus if fullscreen
431 if (focused->type == C_VIEW && wlc_view_get_state(focused->handle) & WLC_BIT_FULLSCREEN) {
432 return false;
433 }
417 if (state == WLC_BUTTON_STATE_PRESSED) { 434 if (state == WLC_BUTTON_STATE_PRESSED) {
418 sway_log(L_DEBUG, "Mouse button %u pressed", button); 435 sway_log(L_DEBUG, "Mouse button %u pressed", button);
419 if (button == 272) { 436 if (button == 272) {
diff --git a/sway/layout.c b/sway/layout.c
index e2ea46a7..105359d2 100644
--- a/sway/layout.c
+++ b/sway/layout.c
@@ -1,11 +1,12 @@
1#include <stdlib.h> 1#include <stdlib.h>
2#include <stdbool.h> 2#include <stdbool.h>
3#include <wlc/wlc.h> 3#include <wlc/wlc.h>
4#include "list.h"
5#include "log.h"
6#include "layout.h" 4#include "layout.h"
5#include "log.h"
6#include "list.h"
7#include "container.h" 7#include "container.h"
8#include "workspace.h" 8#include "workspace.h"
9#include "focus.h"
9 10
10swayc_t root_container; 11swayc_t root_container;
11 12
@@ -79,9 +80,10 @@ swayc_t *remove_child(swayc_t *child) {
79 } 80 }
80 } 81 }
81 } 82 }
83 //Set focused to new container
82 if (parent->focused == child) { 84 if (parent->focused == child) {
83 if (parent->children->length > 0) { 85 if (parent->children->length > 0) {
84 parent->focused = parent->children->items[i?i-1:0]; 86 set_focused_container_for(parent, parent->children->items[i?i-1:0]);
85 } else { 87 } else {
86 parent->focused = NULL; 88 parent->focused = NULL;
87 } 89 }
@@ -209,26 +211,42 @@ void arrange_windows(swayc_t *container, int width, int height) {
209 if (container->type == C_WORKSPACE) { 211 if (container->type == C_WORKSPACE) {
210 for (i = 0; i < container->floating->length; ++i) { 212 for (i = 0; i < container->floating->length; ++i) {
211 swayc_t *view = container->floating->items[i]; 213 swayc_t *view = container->floating->items[i];
212 // Set the geometry 214 if (view->type == C_VIEW) {
213 struct wlc_geometry geometry = { 215 // Set the geometry
214 .origin = { 216 struct wlc_geometry geometry = {
215 .x = view->x, 217 .origin = {
216 .y = view->y 218 .x = view->x,
217 }, 219 .y = view->y
218 .size = { 220 },
219 .w = view->width, 221 .size = {
220 .h = view->height 222 .w = view->width,
223 .h = view->height
224 }
225 };
226 if (wlc_view_get_state(view->handle) & WLC_BIT_FULLSCREEN) {
227 swayc_t *parent = view;
228 while (parent->type != C_OUTPUT) {
229 parent = parent->parent;
230 }
231 geometry.origin.x = 0;
232 geometry.origin.y = 0;
233 geometry.size.w = parent->width;
234 geometry.size.h = parent->height;
235 wlc_view_set_geometry(view->handle, &geometry);
236 wlc_view_bring_to_front(view->handle);
237 } else {
238 wlc_view_set_geometry(view->handle, &geometry);
239 view->width = width;
240 view->height = height;
241 // Bring the views to the front in order of the list, the list
242 // will be kept up to date so that more recently focused views
243 // have higher indexes
244 // This is conditional on there not being a fullscreen view in the workspace
245 if (!container->focused
246 || !(wlc_view_get_state(container->focused->handle) & WLC_BIT_FULLSCREEN)) {
247 wlc_view_bring_to_front(view->handle);
248 }
221 } 249 }
222 };
223 wlc_view_set_geometry(view->handle, &geometry);
224
225 // Bring the views to the front in order of the list, the list
226 // will be kept up to date so that more recently focused views
227 // have higher indexes
228 // This is conditional on there not being a fullscreen view in the workspace
229 if (!container->focused
230 || !(wlc_view_get_state(container->focused->handle) & WLC_BIT_FULLSCREEN)) {
231 wlc_view_bring_to_front(view->handle);
232 } 250 }
233 } 251 }
234 } 252 }
diff --git a/sway/workspace.c b/sway/workspace.c
index ed545804..05a669fe 100644
--- a/sway/workspace.c
+++ b/sway/workspace.c
@@ -178,43 +178,37 @@ void workspace_switch(swayc_t *workspace) {
178 return; 178 return;
179 } 179 }
180 sway_log(L_DEBUG, "Switching to workspace %p:%s", workspace, workspace->name); 180 sway_log(L_DEBUG, "Switching to workspace %p:%s", workspace, workspace->name);
181 181 set_focused_container(get_focused_view(workspace));
182 // Remove focus from current view 182 arrange_windows(workspace, -1, -1);
183 swayc_t *current = get_focused_view(&root_container);
184 if (current && current->type == C_VIEW) {
185 wlc_view_set_state(current->handle, WLC_BIT_ACTIVATED, false);
186 }
187
188 set_focused_container(workspace);
189 active_workspace = workspace; 183 active_workspace = workspace;
190} 184}
191 185
192/* XXX:DEBUG:XXX */ 186/* XXX:DEBUG:XXX */
193static void container_log(const swayc_t *c) { 187static void container_log(const swayc_t *c) {
194 fprintf(stderr, "focus:%c|", 188 fprintf(stderr, "focus:%c|",
195 c->is_focused ? 'F' : //Focused 189 c->is_focused ? 'F' : //Focused
196 c == active_workspace ? 'W' : //active workspace 190 c == active_workspace ? 'W' : //active workspace
197 c == &root_container ? 'R' : //root 191 c == &root_container ? 'R' : //root
198 'X');//not any others 192 'X');//not any others
199 fprintf(stderr,"(%p)",c); 193 fprintf(stderr,"(%p)",c);
200 fprintf(stderr,"(p:%p)",c->parent); 194 fprintf(stderr,"(p:%p)",c->parent);
201 fprintf(stderr,"(f:%p)",c->focused); 195 fprintf(stderr,"(f:%p)",c->focused);
202 fprintf(stderr,"(h:%ld)",c->handle); 196 fprintf(stderr,"(h:%ld)",c->handle);
203 fprintf(stderr,"Type:"); 197 fprintf(stderr,"Type:");
204 fprintf(stderr, 198 fprintf(stderr,
205 c->type == C_ROOT ? "Root|" : 199 c->type == C_ROOT ? "Root|" :
206 c->type == C_OUTPUT ? "Output|" : 200 c->type == C_OUTPUT ? "Output|" :
207 c->type == C_WORKSPACE ? "Workspace|" : 201 c->type == C_WORKSPACE ? "Workspace|" :
208 c->type == C_CONTAINER ? "Container|" : 202 c->type == C_CONTAINER ? "Container|" :
209 c->type == C_VIEW ? "View|" : "Unknown|"); 203 c->type == C_VIEW ? "View|" : "Unknown|");
210 fprintf(stderr,"layout:"); 204 fprintf(stderr,"layout:");
211 fprintf(stderr, 205 fprintf(stderr,
212 c->layout == L_NONE ? "NONE|" : 206 c->layout == L_NONE ? "NONE|" :
213 c->layout == L_HORIZ ? "Horiz|": 207 c->layout == L_HORIZ ? "Horiz|":
214 c->layout == L_VERT ? "Vert|": 208 c->layout == L_VERT ? "Vert|":
215 c->layout == L_STACKED ? "Stacked|": 209 c->layout == L_STACKED ? "Stacked|":
216 c->layout == L_FLOATING ? "Floating|": 210 c->layout == L_FLOATING ? "Floating|":
217 "Unknown|"); 211 "Unknown|");
218 fprintf(stderr, "w:%d|h:%d|", c->width, c->height); 212 fprintf(stderr, "w:%d|h:%d|", c->width, c->height);
219 fprintf(stderr, "x:%d|y:%d|", c->x, c->y); 213 fprintf(stderr, "x:%d|y:%d|", c->x, c->y);
220 fprintf(stderr, "vis:%c|", c->visible?'t':'f'); 214 fprintf(stderr, "vis:%c|", c->visible?'t':'f');
@@ -223,30 +217,24 @@ static void container_log(const swayc_t *c) {
223 fprintf(stderr, "children:%d\n",c->children?c->children->length:0); 217 fprintf(stderr, "children:%d\n",c->children?c->children->length:0);
224} 218}
225void layout_log(const swayc_t *c, int depth) { 219void layout_log(const swayc_t *c, int depth) {
226 int i; 220 int i, d;
227 int e = c->children?c->children->length:0; 221 int e = c->children ? c->children->length : 0;
228 for (i = 0; i < depth; ++i) fputc(' ', stderr);
229 container_log(c); 222 container_log(c);
230 if (e) { 223 if (e) {
231 for (i = 0; i < depth; ++i) fputc(' ', stderr);
232 fprintf(stderr,"(\n");
233 for (i = 0; i < e; ++i) { 224 for (i = 0; i < e; ++i) {
225 fputc('|',stderr);
226 for (d = 0; d < depth; ++d) fputc('-', stderr);
234 layout_log(c->children->items[i], depth + 1); 227 layout_log(c->children->items[i], depth + 1);
235 } 228 }
236 for (i = 0; i < depth; ++i) fputc(' ', stderr);
237 fprintf(stderr,")\n");
238 } 229 }
239 if (c->type == C_WORKSPACE) { 230 if (c->type == C_WORKSPACE) {
240 e = c->floating?c->floating->length:0; 231 e = c->floating?c->floating->length:0;
241 for (i = 0; i < depth; ++i) fputc(' ', stderr);
242 if (e) { 232 if (e) {
243 for (i = 0; i < depth; ++i) fputc(' ', stderr);
244 fprintf(stderr,"(\n");
245 for (i = 0; i < e; ++i) { 233 for (i = 0; i < e; ++i) {
234 fputc('|',stderr);
235 for (d = 0; d < depth; ++d) fputc('-', stderr);
246 layout_log(c->floating->items[i], depth + 1); 236 layout_log(c->floating->items[i], depth + 1);
247 } 237 }
248 for (i = 0; i < depth; ++i) fputc(' ', stderr);
249 fprintf(stderr,")\n");
250 } 238 }
251 } 239 }
252} 240}