1 /* -*-c-*- */
2 /* This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 2 of the License, or
5  * (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, see: <http://www.gnu.org/licenses/>
14  */
15 
16 #include "config.h"
17 
18 #include "FvwmIconMan.h"
19 #include "x.h"
20 #include "xmanager.h"
21 
22 #include "libs/fvwmlib.h"
23 #include "libs/FScreen.h"
24 #include "libs/Module.h"
25 #include "libs/Parse.h"
26 #include "libs/Strings.h"
27 
28 static WinData *fvwm_focus_win = NULL;
29 
30 typedef struct {
31 	Ulong desknum;
32 } m_new_desk_data;
33 
34 typedef struct {
35 	Ulong x, y, desknum;
36 } m_new_page_data;
37 
38 typedef struct {
39 	Ulong app_id, frame_id, dbase_entry;
40 } m_minimal_data;
41 
42 typedef struct {
43 	Ulong app_id, frame_id, dbase_entry;
44 	Ulong xpos, ypos, icon_width, icon_height;
45 } m_icon_data;
46 
47 typedef struct {
48 	Ulong app_id, frame_id, dbase_entry;
49 	union {
50 		Ulong name_long[1];
51 		Uchar name[4];
52 	} name;
53 } m_name_data;
54 
55 typedef struct {
56 	Ulong arg, toggle, id;
57 	Uchar str[4];
58 } m_property_data;
59 
60 typedef struct {
61 	Ulong app_id, frame_id, dbase_entry;
62 	Ulong width, height, depth, picture, mask, alpha;
63 	union {
64 		Ulong name_long[1];
65 		Uchar name[4];
66 	} name;
67 } m_mini_icon_data;
68 
69 typedef union {
70 	m_new_desk_data      new_desk_data;
71 	ConfigWinPacket      add_config_data;
72 	m_new_page_data      new_page_data;
73 	m_minimal_data       minimal_data;
74 	m_icon_data          icon_data;
75 	m_name_data          name_data;
76 	m_mini_icon_data     mini_icon_data;
77 	m_property_data      property_data;
78 } FvwmPacketBody;
79 
80 /* only used by count_nonsticky_in_hashtab */
81 static WinManager *the_manager;
82 
count_nonsticky_in_hashtab(void * arg)83 static int count_nonsticky_in_hashtab(void *arg)
84 {
85 	WinData *win = (WinData *)arg;
86 	WinManager *man = the_manager;
87 
88 	if (!(IS_STICKY_ACROSS_DESKS(win) || IS_STICKY_ACROSS_PAGES(win)) &&
89 	    !(WINDATA_ICONIFIED(win) && (IS_ICON_STICKY_ACROSS_PAGES(win) ||
90 				 IS_ICON_STICKY_ACROSS_DESKS(win))) &&
91 	    win->complete && win->manager == man)
92 	{
93 		return 1;
94 	}
95 
96 	return 0;
97 }
98 
set_draw_mode(WinManager * man,int flag)99 static void set_draw_mode(WinManager *man, int flag)
100 {
101 	int num;
102 
103 	if (!man)
104 	{
105 		return;
106 	}
107 
108 	if (man->we_are_drawing == 0 && flag)
109 	{
110 		draw_manager(man);
111 	}
112 	else if (man->we_are_drawing && !flag)
113 	{
114 		the_manager = man;
115 		num = accumulate_walk_hashtab(count_nonsticky_in_hashtab);
116 		ConsoleDebug(
117 			FVWM, "SetDrawMode on 0x%lx, num = %d\n",
118 			(unsigned long)man, num);
119 
120 		if (num == 0)
121 		{
122 			return;
123 		}
124 		man->configures_expected = num;
125 	}
126 	man->we_are_drawing = flag;
127 }
128 
drawing(WinManager * man)129 static int drawing(WinManager *man)
130 {
131 	if (!man)
132 	{
133 		return 1;
134 	}
135 
136 	return man->we_are_drawing;
137 }
138 
got_configure(WinManager * man)139 static void got_configure(WinManager *man)
140 {
141 	if (man && !man->we_are_drawing)
142 	{
143 		man->configures_expected--;
144 		ConsoleDebug(
145 			FVWM, "got_configure on 0x%lx, num_expected now = %d\n",
146 			(unsigned long) man, man->configures_expected);
147 		if (man->configures_expected <= 0)
148 		{
149 			set_draw_mode(man, 1);
150 		}
151 	}
152 }
153 
154 /* MMH <mikehan@best.com> 6/99
155  * Following a gruesome hack this function has been hijacked.
156  * The function is no longer about whether or not the window is in the
157  * viewport, but whether or not the manager wants to display the window,
158  * based on its current location.
159  */
win_in_viewport(WinData * win)160 int win_in_viewport(WinData *win)
161 {
162 	return check_resolution(win->manager, win);
163 }
164 
165 
id_to_win(Ulong id)166 WinData *id_to_win(Ulong id)
167 {
168 	WinData *win;
169 
170 	win = find_win_hashtab(id);
171 	if (win == NULL)
172 	{
173 		win = new_windata();
174 		win->app_id = id;
175 		win->app_id_set = 1;
176 		insert_win_hashtab(win);
177 	}
178 
179 	return win;
180 }
181 
set_win_configuration(WinData * win,FvwmPacketBody * body)182 static void set_win_configuration(WinData *win, FvwmPacketBody *body)
183 {
184 	win->desknum = body->add_config_data.desk;
185 	win->x = body->add_config_data.frame_x;
186 	win->y = body->add_config_data.frame_y;
187 	win->width = body->add_config_data.frame_width;
188 	win->height = body->add_config_data.frame_height;
189 	win->iconified =  IS_ICONIFIED(&(body->add_config_data));
190 	if (win == fvwm_focus_win)
191 	{
192 		win->state = FOCUS_CONTEXT;
193 	}
194 	else if (win->iconified)
195 	{
196 		win->state = ICON_CONTEXT;
197 	}
198 	else
199 	{
200 		win->state = PLAIN_CONTEXT;
201 	}
202 	win->geometry_set = 1;
203 	memcpy(&(win->flags), &(body->add_config_data.flags),
204 		sizeof(win->flags));
205 	{
206 		int wb_x = body->add_config_data.border_width;
207 		int wb_y = body->add_config_data.border_width;
208 		int t_w = 2*wb_x;
209 		int t_h = 2*wb_y;
210 
211 		if (HAS_TITLE_DIR(win, DIR_N))
212 		{
213 			wb_y += body->add_config_data.title_height;
214 			t_h += body->add_config_data.title_height;
215 		}
216 		else if (HAS_TITLE_DIR(win, DIR_W))
217 		{
218 			wb_x += body->add_config_data.title_height;
219 			t_w += body->add_config_data.title_height;
220 		}
221 		if (HAS_TITLE_DIR(win, DIR_S))
222 		{
223 			t_h += body->add_config_data.title_height;
224 		}
225 		if (HAS_TITLE_DIR(win, DIR_E))
226 		{
227 			t_w += body->add_config_data.title_height;
228 		}
229 		win->real_g.x = win->x + wb_x;
230 		win->real_g.y = win->y + wb_y;
231 		win->real_g.width = win->width - t_w;
232 		win->real_g.height = win->height - t_h;
233 	}
234 }
235 
handle_config_info(unsigned long * body)236 static void handle_config_info(unsigned long *body)
237 {
238 	char *tline, *token, *rest;
239 	int color;
240 	extern void process_dynamic_config_line(char *line);
241 
242 	tline = (char*)&(body[3]);
243 	token = PeekToken(tline, &rest);
244 	if (StrEquals(token, "Colorset"))
245 	{
246 		color = LoadColorset(rest);
247 		change_colorset(color);
248 	}
249 	else if (StrEquals(token, XINERAMA_CONFIG_STRING))
250 	{
251 		FScreenConfigureModule(rest);
252 	}
253 	else if (StrEquals(token, "IgnoreModifiers"))
254 	{
255 		sscanf(rest, "%d", &mods_unused);
256 	}
257 	else if (strncasecmp(tline, Module, ModuleLen) == 0)
258 	{
259 		process_dynamic_config_line(tline);
260 	}
261 }
262 
configure_window(FvwmPacketBody * body)263 static void configure_window(FvwmPacketBody *body)
264 {
265 	Ulong app_id = body->add_config_data.w;
266 	WinData *win;
267 	ConsoleDebug(FVWM, "configure_window: %ld\n", app_id);
268 
269 	win = id_to_win(app_id);
270 
271 	set_win_configuration(win, body);
272 
273 	check_win_complete(win);
274 	check_in_window(win);
275 	got_configure(win->manager);
276 }
277 
focus_change(FvwmPacketBody * body)278 static void focus_change(FvwmPacketBody *body)
279 {
280 	Ulong app_id = body->minimal_data.app_id;
281 	WinData *win = id_to_win(app_id);
282 
283 	ConsoleDebug(FVWM, "Focus Change\n");
284 	ConsoleDebug(FVWM, "\tID: %ld\n", app_id);
285 
286 	if (fvwm_focus_win &&
287 	    fvwm_focus_win->button &&
288 	    fvwm_focus_win->manager->showonlyfocused)
289 	  delete_windows_button(fvwm_focus_win);
290 
291 	if (fvwm_focus_win && win != fvwm_focus_win)
292 	{
293 		del_win_state(fvwm_focus_win, FOCUS_CONTEXT);
294 		if (fvwm_focus_win->manager &&
295 			fvwm_focus_win->manager->focus_button)
296 		{
297 			fvwm_focus_win->manager->focus_button = NULL;
298 		}
299 		fvwm_focus_win = NULL;
300 	}
301 
302 	if (win->complete &&
303 		win->button &&
304 		win->manager &&
305 		win->manager->window_up &&
306 		win->manager->followFocus)
307 	{
308 		win->manager->focus_button = win->button;
309 	}
310 	add_win_state(win, FOCUS_CONTEXT);
311 
312 	check_in_window(win);
313 
314 	globals.focus_win = win;
315 	fvwm_focus_win = win;
316 	ConsoleDebug(FVWM, "leaving focus_change\n");
317 }
318 
res_name(FvwmPacketBody * body)319 static void res_name(FvwmPacketBody *body)
320 {
321 	Ulong app_id = body->name_data.app_id;
322 	Uchar *name = body->name_data.name.name;
323 	WinData *win;
324 
325 	ConsoleDebug(FVWM, "In res_name\n");
326 
327 	win = id_to_win(app_id);
328 
329 	copy_string(&win->resname, (char *)name);
330 	change_windows_manager(win);
331 
332 	ConsoleDebug(FVWM, "Exiting res_name\n");
333 }
334 
class_name(FvwmPacketBody * body)335 static void class_name(FvwmPacketBody *body)
336 {
337 	Ulong app_id = body->name_data.app_id;
338 	Uchar *name = body->name_data.name.name;
339 	WinData *win;
340 
341 	ConsoleDebug(FVWM, "In class_name\n");
342 
343 	win = id_to_win(app_id);
344 
345 	copy_string(&win->classname, (char *)name);
346 	change_windows_manager(win);
347 
348 	ConsoleDebug(FVWM, "Exiting class_name\n");
349 }
350 
icon_name(FvwmPacketBody * body)351 static void icon_name(FvwmPacketBody *body)
352 {
353 	WinData *win;
354 	Ulong app_id;
355 	Uchar *name = body->name_data.name.name;
356 
357 	ConsoleDebug(FVWM, "In icon_name\n");
358 
359 	app_id = body->name_data.app_id;
360 
361 	win = id_to_win(app_id);
362 
363 	if (win->iconname && !strcmp(win->iconname, (char *)name))
364 	{
365 		ConsoleDebug(
366 			FVWM, "No icon change: %s %s\n", win->iconname, name);
367 		return;
368 	}
369 
370 	copy_string(&win->iconname, (char *)name);
371 	ConsoleDebug(FVWM, "new icon name: %s\n", win->iconname);
372 
373 	ConsoleDebug(FVWM, "Exiting icon_name\n");
374 }
375 
visible_icon_name(FvwmPacketBody * body)376 static void visible_icon_name(FvwmPacketBody *body)
377 {
378 	WinData *win;
379 	Ulong app_id;
380 	Uchar *name = body->name_data.name.name;
381 
382 	ConsoleDebug(FVWM, "In visible_icon_name\n");
383 
384 	app_id = body->name_data.app_id;
385 
386 	win = id_to_win(app_id);
387 
388 	if (win->visible_icon_name &&
389 		!strcmp(win->visible_icon_name, (char *)name))
390 	{
391 		ConsoleDebug(
392 			FVWM, "No icon change: %s %s\n", win->iconname, name);
393 		return;
394 	}
395 
396 	copy_string(&win->visible_icon_name, (char *)name);
397 	ConsoleDebug(
398 		FVWM, "new visible icon name: %s\n", win->visible_icon_name);
399 	if (change_windows_manager(win) == 0 && win->button &&
400 		(win->manager->format_depend & ICON_NAME))
401 	{
402 		if (win->manager->sort)
403 		{
404 			resort_windows_button(win);
405 		}
406 	}
407 
408 	ConsoleDebug(FVWM, "Exiting icon_name\n");
409 }
410 
window_name(FvwmPacketBody * body)411 static void window_name(FvwmPacketBody *body)
412 {
413 	WinData *win;
414 	Ulong app_id;
415 	Uchar *name = body->name_data.name.name;
416 
417 	ConsoleDebug(FVWM, "In window_name\n");
418 
419 	app_id = body->name_data.app_id;
420 
421 	win = id_to_win(app_id);
422 
423 	/* This is necessary because bash seems to update the window title on
424 	   every keystroke regardless of whether anything changes */
425 	if (win->titlename && !strcmp(win->titlename, (char *)name))
426 	{
427 		ConsoleDebug(
428 			FVWM, "No name change: %s %s\n", win->titlename, name);
429 		return;
430 	}
431 
432 	copy_string(&win->titlename, (char *)name);
433 
434 	ConsoleDebug(FVWM, "Exiting window_name\n");
435 }
436 
visible_name(FvwmPacketBody * body)437 static void visible_name(FvwmPacketBody *body)
438 {
439 	WinData *win;
440 	Ulong app_id;
441 	Uchar *name = body->name_data.name.name;
442 
443 	ConsoleDebug(FVWM, "In visible_name\n");
444 
445 	app_id = body->name_data.app_id;
446 
447 	win = id_to_win(app_id);
448 
449 	/* This is necessary because bash seems to update the window title on
450 	   every keystroke regardless of whether anything changes */
451 	if (win->visible_name && !strcmp(win->visible_name, (char *)name))
452 	{
453 		ConsoleDebug(
454 			FVWM, "No visible name change: %s %s\n",
455 			win->visible_name, name);
456 		return;
457 	}
458 
459 	copy_string(&win->visible_name, (char *)name);
460 	if (change_windows_manager(win) == 0 && win->button &&
461 		(win->manager->format_depend & TITLE_NAME))
462 	{
463 		if (win->manager->sort)
464 		{
465 			resort_windows_button(win);
466 		}
467 	}
468 	ConsoleDebug(FVWM, "Exiting visible_name\n");
469 }
470 
471 
new_window(FvwmPacketBody * body)472 static void new_window(FvwmPacketBody *body)
473 {
474 	WinData *win;
475 
476 	win = id_to_win(body->add_config_data.w);
477 	memcpy(&(win->flags), &(body->add_config_data.flags), sizeof(win->flags));
478 	set_win_configuration(win, body);
479 	got_configure(win->manager);
480 	check_win_complete(win);
481 	check_in_window(win);
482 	/* FIXME: not perfect, the manager is not know yet */
483 	tips_cancel(win->manager);
484 }
485 
destroy_window(FvwmPacketBody * body)486 static void destroy_window(FvwmPacketBody *body)
487 {
488 	WinData *win;
489 	Ulong app_id;
490 
491 	app_id = body->minimal_data.app_id;
492 	win = id_to_win(app_id);
493 	if (win->manager)
494 	{
495 		tips_cancel(win->manager);
496 	}
497 	if (win == globals.focus_win)
498 	{
499 		globals.focus_win = NULL;
500 	}
501 	delete_win_hashtab(win);
502 	if (win->button)
503 	{
504 		ConsoleDebug(FVWM, "destroy_window: deleting windows_button\n");
505 		delete_windows_button(win);
506 	}
507 	if (win == fvwm_focus_win)
508 	{
509 		fvwm_focus_win = NULL;
510 	}
511 	free_windata(win);
512 }
513 
mini_icon(FvwmPacketBody * body)514 static void mini_icon(FvwmPacketBody *body)
515 {
516 	Ulong app_id = body->mini_icon_data.app_id;
517 	WinData *win;
518 
519 	if (!FMiniIconsSupported)
520 	{
521 		return;
522 	}
523 	win = id_to_win(app_id);
524 	set_win_picture(
525 		win, body->mini_icon_data.picture, body->mini_icon_data.mask,
526 		body->mini_icon_data.alpha, body->mini_icon_data.depth,
527 		body->mini_icon_data.width, body->mini_icon_data.height);
528 
529 
530 	ConsoleDebug(
531 		FVWM, "mini_icon: 0x%lx 0x%lx %dx%dx%d\n",
532 		(unsigned long) win->pic.picture, (unsigned long) win->pic.mask,
533 		win->pic.width, win->pic.height, win->pic.depth);
534 }
535 
icon_location(FvwmPacketBody * body)536 static void icon_location(FvwmPacketBody *body)
537 {
538 	Ulong app_id = body->minimal_data.app_id;
539 	WinData *win;
540 
541 	win = id_to_win(app_id);
542 	if (win == NULL)
543 	{
544 		return;
545 	}
546 	win->icon_g.x = body->icon_data.xpos;
547 	win->icon_g.y = body->icon_data.ypos;
548 	win->icon_g.width = body->icon_data.icon_width;
549 	if (win->icon_g.width <= 0)
550 	{
551 		win->icon_g.width = 1;
552 	}
553 	win->icon_g.height = body->icon_data.icon_height;
554 	if (win->icon_g.height <= 0)
555 	{
556 		win->icon_g.height = 1;
557 	}
558 	check_in_window(win);
559 }
560 
iconify(FvwmPacketBody * body,int dir)561 static void iconify(FvwmPacketBody *body, int dir)
562 {
563 	Ulong app_id = body->minimal_data.app_id;
564 	WinData *win;
565 
566 	win = id_to_win(app_id);
567 	set_win_iconified(win, dir);
568 	icon_location(body);
569 	check_win_complete(win);
570 	check_in_window(win);
571 }
572 
window_shade(FvwmPacketBody * body,int do_shade)573 static void window_shade(FvwmPacketBody *body, int do_shade)
574 {
575 	Window w;
576 	WinManager *man;
577 
578 	w = (Window)(body->minimal_data.app_id);
579 	man = find_windows_manager(w);
580 	if (man == NULL)
581 	{
582 		return;
583 	}
584 	if (do_shade)
585 	{
586 		man->flags.needs_resize_after_unshade = 0;
587 		man->flags.is_shaded = 1;
588 	}
589 	else
590 	{
591 		man->flags.is_shaded = 0;
592 		if (man->flags.needs_resize_after_unshade)
593 		{
594 			draw_manager(man);
595 			man->flags.needs_resize_after_unshade = 0;
596 		}
597 	}
598 
599 	return;
600 }
601 
602 /* only used by remanage_winlist */
603 
update_win_in_hashtab(void * arg)604 static void update_win_in_hashtab(void *arg)
605 {
606 	WinData *p = (WinData *)arg;
607 	check_in_window(p);
608 }
609 
remanage_winlist(void)610 void remanage_winlist(void)
611 {
612 	walk_hashtab(update_win_in_hashtab);
613 	draw_managers();
614 }
615 
new_desk(FvwmPacketBody * body)616 static void new_desk(FvwmPacketBody *body)
617 {
618 	globals.desknum = body->new_desk_data.desknum;
619 	remanage_winlist();
620 }
621 
sendtomodule(FvwmPacketBody * body)622 static void sendtomodule(FvwmPacketBody *body)
623 {
624 	extern void execute_function(char *);
625 	Uchar *string = body->name_data.name.name;
626 
627 	ConsoleDebug(FVWM, "Got string: %s\n", string);
628 
629 	execute_function((char *)string);
630 }
631 
property_change(FvwmPacketBody * body)632 static void property_change(FvwmPacketBody *body)
633 {
634 	WinManager *man = NULL;
635 	int j;
636 
637 	if (body->property_data.id != 0)
638 	{
639 		if (!(man = find_windows_manager(body->property_data.id)))
640 			return;
641 	}
642 
643 	if (body->property_data.arg == MX_PROPERTY_CHANGE_BACKGROUND)
644 	{
645 		if (man != NULL &&
646 		    CSET_IS_TRANSPARENT_PR(man->colorsets[DEFAULT]))
647 		{
648 			recreate_background(man, DEFAULT);
649 			force_manager_redraw(man);
650 		}
651 		if (man != NULL)
652 		{
653 			return;
654 		}
655 		for (j = 0; j < globals.num_managers; j++)
656 		{
657 			man = &globals.managers[j];
658 			if (CSET_IS_TRANSPARENT_PR(man->colorsets[DEFAULT]))
659 			{
660 				recreate_background(man, DEFAULT);
661 				force_manager_redraw(man);
662 			}
663 		}
664 	}
665 	else if (body->property_data.arg == MX_PROPERTY_CHANGE_SWALLOW &&
666 		man != NULL)
667 	{
668 		man->swallowed = body->property_data.toggle;
669 		if (man->swallowed)
670 		{
671 			unsigned long u;
672 
673 			if (sscanf((char *)body->property_data.str, "%lu",
674 				   &u) == 1)
675 			{
676 				man->swallower_win = (Window)u;
677 			}
678 			else
679 			{
680 				man->swallower_win = 0;
681 			}
682 		}
683 	}
684 }
685 
ProcessMessage(Ulong type,FvwmPacketBody * body)686 static void ProcessMessage(Ulong type, FvwmPacketBody *body)
687 {
688 	int i;
689 
690 	ConsoleDebug(FVWM, "fvwm message type: %ld\n", type);
691 
692 	switch(type)
693 	{
694 	case M_CONFIG_INFO:
695 		ConsoleDebug(FVWM, "DEBUG::M_CONFIG_INFO\n");
696 		handle_config_info((unsigned long*)body);
697 		break;
698 
699 	case M_CONFIGURE_WINDOW:
700 		ConsoleDebug(FVWM, "DEBUG::M_CONFIGURE_WINDOW\n");
701 		configure_window(body);
702 		break;
703 
704 	case M_FOCUS_CHANGE:
705 		ConsoleDebug(FVWM, "DEBUG::M_FOCUS_CHANGE\n");
706 		focus_change(body);
707 		break;
708 
709 	case M_RES_NAME:
710 		ConsoleDebug(FVWM, "DEBUG::M_RES_NAME\n");
711 		res_name(body);
712 		break;
713 
714 	case M_RES_CLASS:
715 		ConsoleDebug(FVWM, "DEBUG::M_RES_CLASS\n");
716 		class_name(body);
717 		break;
718 
719 	case M_MAP:
720 		ConsoleDebug(FVWM, "DEBUG::M_MAP\n");
721 		break;
722 
723 	case M_ADD_WINDOW:
724 		ConsoleDebug(FVWM, "DEBUG::M_ADD_WINDOW\n");
725 		new_window(body);
726 		break;
727 
728 	case M_DESTROY_WINDOW:
729 		ConsoleDebug(FVWM, "DEBUG::M_DESTROY_WINDOW\n");
730 		destroy_window(body);
731 		break;
732 
733 	case M_MINI_ICON:
734 		ConsoleDebug(FVWM, "DEBUG::M_MINI_ICON\n");
735 		mini_icon(body);
736 		break;
737 
738 	case M_WINDOW_NAME:
739 		ConsoleDebug(FVWM, "DEBUG::M_WINDOW_NAME\n");
740 		window_name(body);
741 		break;
742 
743 	case M_VISIBLE_NAME:
744 		ConsoleDebug(FVWM, "DEBUG::M_VISIBLE_NAME\n");
745 		visible_name(body);
746 		break;
747 
748 	case M_ICON_NAME:
749 		ConsoleDebug(FVWM, "DEBUG::M_ICON_NAME\n");
750 		icon_name(body);
751 		break;
752 
753 	case MX_VISIBLE_ICON_NAME:
754 		ConsoleDebug(FVWM, "DEBUG::MX_VISIBLE_ICON_NAME\n");
755 		visible_icon_name(body);
756 		break;
757 
758 	case M_DEICONIFY:
759 		ConsoleDebug(FVWM, "DEBUG::M_DEICONIFY\n");
760 		iconify(body, 0);
761 		SendUnlockNotification(fvwm_fd);
762 		break;
763 
764 	case M_ICONIFY:
765 		ConsoleDebug(FVWM, "DEBUG::M_ICONIFY\n");
766 		iconify(body, 1);
767 		SendUnlockNotification(fvwm_fd);
768 		break;
769 
770 	case M_ICON_LOCATION:
771 		icon_location(body);
772 		break;
773 
774 	case M_END_WINDOWLIST:
775 		ConsoleDebug(FVWM, "DEBUG::M_END_WINDOWLIST\n");
776 		ConsoleDebug(
777 			FVWM, "+++++ End window list +++++\n");
778 		if (globals.focus_win && globals.focus_win->button)
779 		{
780 			globals.focus_win->manager->focus_button =
781 				globals.focus_win->button;
782 		}
783 		globals.got_window_list = 1;
784 		for (i = 0; i < globals.num_managers; i++)
785 		{
786 			create_manager_window(i);
787 		}
788 	  break;
789 
790 	case M_NEW_DESK:
791 		ConsoleDebug(FVWM, "DEBUG::M_NEW_DESK\n");
792 		new_desk(body);
793 		break;
794 
795 	case M_NEW_PAGE:
796 		ConsoleDebug(FVWM, "DEBUG::M_NEW_PAGE\n");
797 		if (globals.x == body->new_page_data.x &&
798 			globals.y == body->new_page_data.y &&
799 			globals.desknum == body->new_page_data.desknum)
800 		{
801 			ConsoleDebug(FVWM, "Useless NEW_PAGE received\n");
802 			break;
803 		}
804 		globals.x = body->new_page_data.x;
805 		globals.y = body->new_page_data.y;
806 		globals.desknum = body->new_page_data.desknum;
807 		if (fvwm_focus_win && fvwm_focus_win->manager &&
808 			fvwm_focus_win->manager->followFocus)
809 		{
810 			/* need to set the focus on a page change */
811 			add_win_state(fvwm_focus_win, FOCUS_CONTEXT);
812 		}
813 		for (i = 0; i < globals.num_managers; i++)
814 		{
815 			set_draw_mode(&globals.managers[i], 0);
816 		}
817 		break;
818 
819 	case M_STRING:
820 		ConsoleDebug(FVWM, "DEBUG::M_STRING\n");
821 		sendtomodule(body);
822 		break;
823 
824 	case MX_PROPERTY_CHANGE:
825 		ConsoleDebug(FVWM, "DEBUG::MX_PROPERTY_CHANGE\n");
826 		property_change(body);
827 		break;
828 
829 	case M_WINDOWSHADE:
830 		window_shade(body, 1);
831 		break;
832 
833 	case M_DEWINDOWSHADE:
834 		window_shade(body, 0);
835 		break;
836 
837 	default:
838 		break;
839 	}
840 
841 	check_managers_consistency();
842 
843 	for (i = 0; i < globals.num_managers; i++)
844 	{
845 		if (drawing(&globals.managers[i]))
846 		{
847 			draw_manager(&globals.managers[i]);
848 		}
849 	}
850 
851 	check_managers_consistency();
852 }
853 
ReadFvwmPipe(void)854 void ReadFvwmPipe(void)
855 {
856 	FvwmPacket* packet;
857 
858 	PrintMemuse();
859 	ConsoleDebug(FVWM, "DEBUG: entering ReadFvwmPipe\n");
860 
861 	if ((packet = ReadFvwmPacket(fvwm_fd[1])) == NULL)
862 	{
863 		exit(0);
864 	}
865 	else
866 	{
867 		ProcessMessage(packet->type, (FvwmPacketBody *)packet->body);
868 	}
869 
870 	ConsoleDebug(FVWM, "DEBUG: leaving ReadFvwmPipe\n");
871 }
872