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 	copy_string(&win->monitor, (char *)&(body->add_config_data.monitor_name));
185 	win->desknum = body->add_config_data.desk;
186 	win->x = body->add_config_data.frame_x;
187 	win->y = body->add_config_data.frame_y;
188 	win->width = body->add_config_data.frame_width;
189 	win->height = body->add_config_data.frame_height;
190 	win->iconified =  IS_ICONIFIED(&(body->add_config_data));
191 	if (win == fvwm_focus_win)
192 	{
193 		win->state = FOCUS_CONTEXT;
194 	}
195 	else if (win->iconified)
196 	{
197 		win->state = ICON_CONTEXT;
198 	}
199 	else
200 	{
201 		win->state = PLAIN_CONTEXT;
202 	}
203 	win->geometry_set = 1;
204 	memcpy(&(win->flags), &(body->add_config_data.flags),
205 		sizeof(win->flags));
206 	{
207 		int wb_x = body->add_config_data.border_width;
208 		int wb_y = body->add_config_data.border_width;
209 		int t_w = 2*wb_x;
210 		int t_h = 2*wb_y;
211 
212 		if (HAS_TITLE_DIR(win, DIR_N))
213 		{
214 			wb_y += body->add_config_data.title_height;
215 			t_h += body->add_config_data.title_height;
216 		}
217 		else if (HAS_TITLE_DIR(win, DIR_W))
218 		{
219 			wb_x += body->add_config_data.title_height;
220 			t_w += body->add_config_data.title_height;
221 		}
222 		if (HAS_TITLE_DIR(win, DIR_S))
223 		{
224 			t_h += body->add_config_data.title_height;
225 		}
226 		if (HAS_TITLE_DIR(win, DIR_E))
227 		{
228 			t_w += body->add_config_data.title_height;
229 		}
230 		win->real_g.x = win->x + wb_x;
231 		win->real_g.y = win->y + wb_y;
232 		win->real_g.width = win->width - t_w;
233 		win->real_g.height = win->height - t_h;
234 	}
235 }
236 
handle_config_info(unsigned long * body)237 static void handle_config_info(unsigned long *body)
238 {
239 	char *tline, *token, *rest;
240 	int color;
241 	extern void process_dynamic_config_line(char *line);
242 
243 	tline = (char*)&(body[3]);
244 	token = PeekToken(tline, &rest);
245 	if (StrEquals(token, "Colorset"))
246 	{
247 		color = LoadColorset(rest);
248 		change_colorset(color);
249 	}
250 	else if (StrEquals(token, "IgnoreModifiers"))
251 	{
252 		sscanf(rest, "%d", &mods_unused);
253 	}
254 	else if (strncasecmp(tline, Module, ModuleLen) == 0)
255 	{
256 		process_dynamic_config_line(tline);
257 	}
258 }
259 
configure_window(FvwmPacketBody * body)260 static void configure_window(FvwmPacketBody *body)
261 {
262 	Ulong app_id = body->add_config_data.w;
263 	WinData *win;
264 	ConsoleDebug(FVWM, "configure_window: %ld\n", app_id);
265 
266 	win = id_to_win(app_id);
267 
268 	set_win_configuration(win, body);
269 
270 	check_win_complete(win);
271 	check_in_window(win);
272 	got_configure(win->manager);
273 }
274 
focus_change(FvwmPacketBody * body)275 static void focus_change(FvwmPacketBody *body)
276 {
277 	Ulong app_id = body->minimal_data.app_id;
278 	WinData *win = id_to_win(app_id);
279 
280 	ConsoleDebug(FVWM, "Focus Change\n");
281 	ConsoleDebug(FVWM, "\tID: %ld\n", app_id);
282 
283 	if (fvwm_focus_win &&
284 	    fvwm_focus_win->button &&
285 	    fvwm_focus_win->manager->showonlyfocused)
286 	  delete_windows_button(fvwm_focus_win);
287 
288 	if (fvwm_focus_win && win != fvwm_focus_win)
289 	{
290 		del_win_state(fvwm_focus_win, FOCUS_CONTEXT);
291 		if (fvwm_focus_win->manager &&
292 			fvwm_focus_win->manager->focus_button)
293 		{
294 			fvwm_focus_win->manager->focus_button = NULL;
295 		}
296 		fvwm_focus_win = NULL;
297 	}
298 
299 	if (win->complete &&
300 		win->button &&
301 		win->manager &&
302 		win->manager->window_up &&
303 		win->manager->followFocus)
304 	{
305 		win->manager->focus_button = win->button;
306 	}
307 	add_win_state(win, FOCUS_CONTEXT);
308 
309 	check_in_window(win);
310 
311 	globals.focus_win = win;
312 	fvwm_focus_win = win;
313 	ConsoleDebug(FVWM, "leaving focus_change\n");
314 }
315 
res_name(FvwmPacketBody * body)316 static void res_name(FvwmPacketBody *body)
317 {
318 	Ulong app_id = body->name_data.app_id;
319 	Uchar *name = body->name_data.name.name;
320 	WinData *win;
321 
322 	ConsoleDebug(FVWM, "In res_name\n");
323 
324 	win = id_to_win(app_id);
325 
326 	copy_string(&win->resname, (char *)name);
327 	change_windows_manager(win);
328 
329 	ConsoleDebug(FVWM, "Exiting res_name\n");
330 }
331 
class_name(FvwmPacketBody * body)332 static void class_name(FvwmPacketBody *body)
333 {
334 	Ulong app_id = body->name_data.app_id;
335 	Uchar *name = body->name_data.name.name;
336 	WinData *win;
337 
338 	ConsoleDebug(FVWM, "In class_name\n");
339 
340 	win = id_to_win(app_id);
341 
342 	copy_string(&win->classname, (char *)name);
343 	change_windows_manager(win);
344 
345 	ConsoleDebug(FVWM, "Exiting class_name\n");
346 }
347 
icon_name(FvwmPacketBody * body)348 static void icon_name(FvwmPacketBody *body)
349 {
350 	WinData *win;
351 	Ulong app_id;
352 	Uchar *name = body->name_data.name.name;
353 
354 	ConsoleDebug(FVWM, "In icon_name\n");
355 
356 	app_id = body->name_data.app_id;
357 
358 	win = id_to_win(app_id);
359 
360 	if (win->iconname && !strcmp(win->iconname, (char *)name))
361 	{
362 		ConsoleDebug(
363 			FVWM, "No icon change: %s %s\n", win->iconname, name);
364 		return;
365 	}
366 
367 	copy_string(&win->iconname, (char *)name);
368 	ConsoleDebug(FVWM, "new icon name: %s\n", win->iconname);
369 
370 	ConsoleDebug(FVWM, "Exiting icon_name\n");
371 }
372 
visible_icon_name(FvwmPacketBody * body)373 static void visible_icon_name(FvwmPacketBody *body)
374 {
375 	WinData *win;
376 	Ulong app_id;
377 	Uchar *name = body->name_data.name.name;
378 
379 	ConsoleDebug(FVWM, "In visible_icon_name\n");
380 
381 	app_id = body->name_data.app_id;
382 
383 	win = id_to_win(app_id);
384 
385 	if (win->visible_icon_name &&
386 		!strcmp(win->visible_icon_name, (char *)name))
387 	{
388 		ConsoleDebug(
389 			FVWM, "No icon change: %s %s\n", win->iconname, name);
390 		return;
391 	}
392 
393 	copy_string(&win->visible_icon_name, (char *)name);
394 	ConsoleDebug(
395 		FVWM, "new visible icon name: %s\n", win->visible_icon_name);
396 	if (change_windows_manager(win) == 0 && win->button &&
397 		(win->manager->format_depend & ICON_NAME))
398 	{
399 		if (win->manager->sort)
400 		{
401 			resort_windows_button(win);
402 		}
403 	}
404 
405 	ConsoleDebug(FVWM, "Exiting icon_name\n");
406 }
407 
window_name(FvwmPacketBody * body)408 static void window_name(FvwmPacketBody *body)
409 {
410 	WinData *win;
411 	Ulong app_id;
412 	Uchar *name = body->name_data.name.name;
413 
414 	ConsoleDebug(FVWM, "In window_name\n");
415 
416 	app_id = body->name_data.app_id;
417 
418 	win = id_to_win(app_id);
419 
420 	/* This is necessary because bash seems to update the window title on
421 	   every keystroke regardless of whether anything changes */
422 	if (win->titlename && !strcmp(win->titlename, (char *)name))
423 	{
424 		ConsoleDebug(
425 			FVWM, "No name change: %s %s\n", win->titlename, name);
426 		return;
427 	}
428 
429 	copy_string(&win->titlename, (char *)name);
430 
431 	ConsoleDebug(FVWM, "Exiting window_name\n");
432 }
433 
visible_name(FvwmPacketBody * body)434 static void visible_name(FvwmPacketBody *body)
435 {
436 	WinData *win;
437 	Ulong app_id;
438 	Uchar *name = body->name_data.name.name;
439 
440 	ConsoleDebug(FVWM, "In visible_name\n");
441 
442 	app_id = body->name_data.app_id;
443 
444 	win = id_to_win(app_id);
445 
446 	/* This is necessary because bash seems to update the window title on
447 	   every keystroke regardless of whether anything changes */
448 	if (win->visible_name && !strcmp(win->visible_name, (char *)name))
449 	{
450 		ConsoleDebug(
451 			FVWM, "No visible name change: %s %s\n",
452 			win->visible_name, name);
453 		return;
454 	}
455 
456 	copy_string(&win->visible_name, (char *)name);
457 	if (change_windows_manager(win) == 0 && win->button &&
458 		(win->manager->format_depend & TITLE_NAME))
459 	{
460 		if (win->manager->sort)
461 		{
462 			resort_windows_button(win);
463 		}
464 	}
465 	ConsoleDebug(FVWM, "Exiting visible_name\n");
466 }
467 
468 
new_window(FvwmPacketBody * body)469 static void new_window(FvwmPacketBody *body)
470 {
471 	WinData *win;
472 
473 	win = id_to_win(body->add_config_data.w);
474 	memcpy(&(win->flags), &(body->add_config_data.flags), sizeof(win->flags));
475 	set_win_configuration(win, body);
476 	got_configure(win->manager);
477 	check_win_complete(win);
478 	check_in_window(win);
479 	/* FIXME: not perfect, the manager is not know yet */
480 	tips_cancel(win->manager);
481 }
482 
destroy_window(FvwmPacketBody * body)483 static void destroy_window(FvwmPacketBody *body)
484 {
485 	WinData *win;
486 	Ulong app_id;
487 
488 	app_id = body->minimal_data.app_id;
489 	win = id_to_win(app_id);
490 	if (win->manager)
491 	{
492 		tips_cancel(win->manager);
493 	}
494 	if (win == globals.focus_win)
495 	{
496 		globals.focus_win = NULL;
497 	}
498 	delete_win_hashtab(win);
499 	if (win->button)
500 	{
501 		ConsoleDebug(FVWM, "destroy_window: deleting windows_button\n");
502 		delete_windows_button(win);
503 	}
504 	if (win == fvwm_focus_win)
505 	{
506 		fvwm_focus_win = NULL;
507 	}
508 	free_windata(win);
509 }
510 
mini_icon(FvwmPacketBody * body)511 static void mini_icon(FvwmPacketBody *body)
512 {
513 	Ulong app_id = body->mini_icon_data.app_id;
514 	WinData *win;
515 
516 	if (!FMiniIconsSupported)
517 	{
518 		return;
519 	}
520 	win = id_to_win(app_id);
521 	set_win_picture(
522 		win, body->mini_icon_data.picture, body->mini_icon_data.mask,
523 		body->mini_icon_data.alpha, body->mini_icon_data.depth,
524 		body->mini_icon_data.width, body->mini_icon_data.height);
525 
526 
527 	ConsoleDebug(
528 		FVWM, "mini_icon: 0x%lx 0x%lx %dx%dx%d\n",
529 		(unsigned long) win->pic.picture, (unsigned long) win->pic.mask,
530 		win->pic.width, win->pic.height, win->pic.depth);
531 }
532 
icon_location(FvwmPacketBody * body)533 static void icon_location(FvwmPacketBody *body)
534 {
535 	Ulong app_id = body->minimal_data.app_id;
536 	WinData *win;
537 
538 	win = id_to_win(app_id);
539 	if (win == NULL)
540 	{
541 		return;
542 	}
543 	win->icon_g.x = body->icon_data.xpos;
544 	win->icon_g.y = body->icon_data.ypos;
545 	win->icon_g.width = body->icon_data.icon_width;
546 	if (win->icon_g.width <= 0)
547 	{
548 		win->icon_g.width = 1;
549 	}
550 	win->icon_g.height = body->icon_data.icon_height;
551 	if (win->icon_g.height <= 0)
552 	{
553 		win->icon_g.height = 1;
554 	}
555 	check_in_window(win);
556 }
557 
iconify(FvwmPacketBody * body,int dir)558 static void iconify(FvwmPacketBody *body, int dir)
559 {
560 	Ulong app_id = body->minimal_data.app_id;
561 	WinData *win;
562 
563 	win = id_to_win(app_id);
564 	set_win_iconified(win, dir);
565 	icon_location(body);
566 	check_win_complete(win);
567 	check_in_window(win);
568 }
569 
window_shade(FvwmPacketBody * body,int do_shade)570 static void window_shade(FvwmPacketBody *body, int do_shade)
571 {
572 	Window w;
573 	WinManager *man;
574 
575 	w = (Window)(body->minimal_data.app_id);
576 	man = find_windows_manager(w);
577 	if (man == NULL)
578 	{
579 		return;
580 	}
581 	if (do_shade)
582 	{
583 		man->flags.needs_resize_after_unshade = 0;
584 		man->flags.is_shaded = 1;
585 	}
586 	else
587 	{
588 		man->flags.is_shaded = 0;
589 		if (man->flags.needs_resize_after_unshade)
590 		{
591 			draw_manager(man);
592 			man->flags.needs_resize_after_unshade = 0;
593 		}
594 	}
595 
596 	return;
597 }
598 
599 /* only used by remanage_winlist */
600 
update_win_in_hashtab(void * arg)601 static void update_win_in_hashtab(void *arg)
602 {
603 	WinData *p = (WinData *)arg;
604 	check_in_window(p);
605 }
606 
remanage_winlist(void)607 void remanage_winlist(void)
608 {
609 	walk_hashtab(update_win_in_hashtab);
610 	draw_managers();
611 }
612 
new_desk(FvwmPacketBody * body)613 static void new_desk(FvwmPacketBody *body)
614 {
615 	globals.desknum = body->new_desk_data.desknum;
616 	remanage_winlist();
617 }
618 
sendtomodule(FvwmPacketBody * body)619 static void sendtomodule(FvwmPacketBody *body)
620 {
621 	extern void execute_function(char *);
622 	Uchar *string = body->name_data.name.name;
623 
624 	ConsoleDebug(FVWM, "Got string: %s\n", string);
625 
626 	execute_function((char *)string);
627 }
628 
property_change(FvwmPacketBody * body)629 static void property_change(FvwmPacketBody *body)
630 {
631 	WinManager *man = NULL;
632 	int j;
633 
634 	if (body->property_data.id != 0)
635 	{
636 		if (!(man = find_windows_manager(body->property_data.id)))
637 			return;
638 	}
639 
640 	if (body->property_data.arg == MX_PROPERTY_CHANGE_BACKGROUND)
641 	{
642 		if (man != NULL &&
643 		    CSET_IS_TRANSPARENT_PR(man->colorsets[DEFAULT]))
644 		{
645 			recreate_background(man, DEFAULT);
646 			force_manager_redraw(man);
647 		}
648 		if (man != NULL)
649 		{
650 			return;
651 		}
652 		for (j = 0; j < globals.num_managers; j++)
653 		{
654 			man = &globals.managers[j];
655 			if (CSET_IS_TRANSPARENT_PR(man->colorsets[DEFAULT]))
656 			{
657 				recreate_background(man, DEFAULT);
658 				force_manager_redraw(man);
659 			}
660 		}
661 	}
662 	else if (body->property_data.arg == MX_PROPERTY_CHANGE_SWALLOW &&
663 		man != NULL)
664 	{
665 		man->swallowed = body->property_data.toggle;
666 		if (man->swallowed)
667 		{
668 			unsigned long u;
669 
670 			if (sscanf((char *)body->property_data.str, "%lu",
671 				   &u) == 1)
672 			{
673 				man->swallower_win = (Window)u;
674 			}
675 			else
676 			{
677 				man->swallower_win = 0;
678 			}
679 		}
680 	}
681 }
682 
ProcessMessage(Ulong type,FvwmPacketBody * body)683 static void ProcessMessage(Ulong type, FvwmPacketBody *body)
684 {
685 	int i;
686 
687 	ConsoleDebug(FVWM, "fvwm message type: %ld\n", type);
688 
689 	switch(type)
690 	{
691 	case M_CONFIG_INFO:
692 		ConsoleDebug(FVWM, "DEBUG::M_CONFIG_INFO\n");
693 		handle_config_info((unsigned long*)body);
694 		break;
695 
696 	case M_CONFIGURE_WINDOW:
697 		ConsoleDebug(FVWM, "DEBUG::M_CONFIGURE_WINDOW\n");
698 		configure_window(body);
699 		break;
700 
701 	case M_FOCUS_CHANGE:
702 		ConsoleDebug(FVWM, "DEBUG::M_FOCUS_CHANGE\n");
703 		focus_change(body);
704 		break;
705 
706 	case M_RES_NAME:
707 		ConsoleDebug(FVWM, "DEBUG::M_RES_NAME\n");
708 		res_name(body);
709 		break;
710 
711 	case M_RES_CLASS:
712 		ConsoleDebug(FVWM, "DEBUG::M_RES_CLASS\n");
713 		class_name(body);
714 		break;
715 
716 	case M_MAP:
717 		ConsoleDebug(FVWM, "DEBUG::M_MAP\n");
718 		break;
719 
720 	case M_ADD_WINDOW:
721 		ConsoleDebug(FVWM, "DEBUG::M_ADD_WINDOW\n");
722 		new_window(body);
723 		break;
724 
725 	case M_DESTROY_WINDOW:
726 		ConsoleDebug(FVWM, "DEBUG::M_DESTROY_WINDOW\n");
727 		destroy_window(body);
728 		break;
729 
730 	case M_MINI_ICON:
731 		ConsoleDebug(FVWM, "DEBUG::M_MINI_ICON\n");
732 		mini_icon(body);
733 		break;
734 
735 	case M_WINDOW_NAME:
736 		ConsoleDebug(FVWM, "DEBUG::M_WINDOW_NAME\n");
737 		window_name(body);
738 		break;
739 
740 	case M_VISIBLE_NAME:
741 		ConsoleDebug(FVWM, "DEBUG::M_VISIBLE_NAME\n");
742 		visible_name(body);
743 		break;
744 
745 	case M_ICON_NAME:
746 		ConsoleDebug(FVWM, "DEBUG::M_ICON_NAME\n");
747 		icon_name(body);
748 		break;
749 
750 	case MX_VISIBLE_ICON_NAME:
751 		ConsoleDebug(FVWM, "DEBUG::MX_VISIBLE_ICON_NAME\n");
752 		visible_icon_name(body);
753 		break;
754 
755 	case M_DEICONIFY:
756 		ConsoleDebug(FVWM, "DEBUG::M_DEICONIFY\n");
757 		iconify(body, 0);
758 		SendUnlockNotification(fvwm_fd);
759 		break;
760 
761 	case M_ICONIFY:
762 		ConsoleDebug(FVWM, "DEBUG::M_ICONIFY\n");
763 		iconify(body, 1);
764 		SendUnlockNotification(fvwm_fd);
765 		break;
766 
767 	case M_ICON_LOCATION:
768 		icon_location(body);
769 		break;
770 
771 	case M_END_WINDOWLIST:
772 		ConsoleDebug(FVWM, "DEBUG::M_END_WINDOWLIST\n");
773 		ConsoleDebug(
774 			FVWM, "+++++ End window list +++++\n");
775 		if (globals.focus_win && globals.focus_win->button)
776 		{
777 			globals.focus_win->manager->focus_button =
778 				globals.focus_win->button;
779 		}
780 		globals.got_window_list = 1;
781 		for (i = 0; i < globals.num_managers; i++)
782 		{
783 			create_manager_window(i);
784 		}
785 	  break;
786 
787 	case M_NEW_DESK:
788 		ConsoleDebug(FVWM, "DEBUG::M_NEW_DESK\n");
789 		new_desk(body);
790 		break;
791 
792 	case M_NEW_PAGE:
793 		ConsoleDebug(FVWM, "DEBUG::M_NEW_PAGE\n");
794 		if (globals.x == body->new_page_data.x &&
795 			globals.y == body->new_page_data.y &&
796 			globals.desknum == body->new_page_data.desknum)
797 		{
798 			ConsoleDebug(FVWM, "Useless NEW_PAGE received\n");
799 			break;
800 		}
801 		globals.x = body->new_page_data.x;
802 		globals.y = body->new_page_data.y;
803 		globals.desknum = body->new_page_data.desknum;
804 		if (fvwm_focus_win && fvwm_focus_win->manager &&
805 			fvwm_focus_win->manager->followFocus)
806 		{
807 			/* need to set the focus on a page change */
808 			add_win_state(fvwm_focus_win, FOCUS_CONTEXT);
809 		}
810 		for (i = 0; i < globals.num_managers; i++)
811 		{
812 			set_draw_mode(&globals.managers[i], 0);
813 		}
814 		break;
815 
816 	case M_STRING:
817 		ConsoleDebug(FVWM, "DEBUG::M_STRING\n");
818 		sendtomodule(body);
819 		break;
820 
821 	case MX_PROPERTY_CHANGE:
822 		ConsoleDebug(FVWM, "DEBUG::MX_PROPERTY_CHANGE\n");
823 		property_change(body);
824 		break;
825 
826 	case M_WINDOWSHADE:
827 		window_shade(body, 1);
828 		break;
829 
830 	case M_DEWINDOWSHADE:
831 		window_shade(body, 0);
832 		break;
833 
834 	default:
835 		break;
836 	}
837 
838 	check_managers_consistency();
839 
840 	for (i = 0; i < globals.num_managers; i++)
841 	{
842 		if (drawing(&globals.managers[i]))
843 		{
844 			draw_manager(&globals.managers[i]);
845 		}
846 	}
847 
848 	check_managers_consistency();
849 }
850 
ReadFvwmPipe(void)851 void ReadFvwmPipe(void)
852 {
853 	FvwmPacket* packet;
854 
855 	PrintMemuse();
856 	ConsoleDebug(FVWM, "DEBUG: entering ReadFvwmPipe\n");
857 
858 	if ((packet = ReadFvwmPacket(fvwm_fd[1])) == NULL)
859 	{
860 		exit(0);
861 	}
862 	else
863 	{
864 		ProcessMessage(packet->type, (FvwmPacketBody *)packet->body);
865 	}
866 
867 	ConsoleDebug(FVWM, "DEBUG: leaving ReadFvwmPipe\n");
868 }
869