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