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