comparison lwlib/lwlib.c @ 27997:7ff6dc4c3775

(lw_modify_all_widgets): Return non-zero if widget tree was changed. (merge_widget_value): Add parameter CHANGE_P. Set *CHANGE_P to 1 if a change occurs.
author Gerd Moellmann <gerd@gnu.org>
date Sun, 05 Mar 2000 14:31:04 +0000
parents d0d4542bbdac
children 2d728b3d9f5f
comparison
equal deleted inserted replaced
27996:3e54f8125fcd 27997:7ff6dc4c3775
72 #ifdef USE_MOTIF 72 #ifdef USE_MOTIF
73 char *lwlib_toolkit_type = "motif"; 73 char *lwlib_toolkit_type = "motif";
74 #else 74 #else
75 char *lwlib_toolkit_type = "lucid"; 75 char *lwlib_toolkit_type = "lucid";
76 #endif 76 #endif
77 /* Forward declarations */ 77
78 static void 78 #if defined __STDC__
79 instantiate_widget_instance (/* widget_instance* instance */); 79 #define P_(x) x
80 80 #else
81 #define P_(x) ()
82 #endif
83
84 static widget_value *merge_widget_value P_ ((widget_value *,
85 widget_value *,
86 int, int *));
87 static void instantiate_widget_instance P_ ((widget_instance *));
88 static int my_strcasecmp P_ ((char *, char *));
89 static void safe_free_str P_ ((char *));
90 static void free_widget_value_tree P_ ((widget_value *));
91 static widget_value *copy_widget_value_tree P_ ((widget_value *,
92 change_type));
93 static widget_info *allocate_widget_info P_ ((char *, char *, LWLIB_ID,
94 widget_value *,
95 lw_callback, lw_callback,
96 lw_callback, lw_callback));
97 static void free_widget_info P_ ((widget_info *));
98 static void mark_widget_destroyed P_ ((Widget, XtPointer, XtPointer));
99 static widget_instance *allocate_widget_instance P_ ((widget_info *,
100 Widget, Boolean));
101 static void free_widget_instance P_ ((widget_instance *));
102 static widget_info *get_widget_info P_ ((LWLIB_ID, Boolean));
103 static widget_instance *get_widget_instance P_ ((Widget, Boolean));
104 static widget_instance *find_instance P_ ((LWLIB_ID, Widget, Boolean));
105 static Boolean safe_strcmp P_ ((char *, char *));
106 static Widget name_to_widget P_ ((widget_instance *, char *));
107 static void set_one_value P_ ((widget_instance *, widget_value *, Boolean));
108 static void update_one_widget_instance P_ ((widget_instance *, Boolean));
109 static void update_all_widget_values P_ ((widget_info *, Boolean));
110 static void initialize_widget_instance P_ ((widget_instance *));
111 static widget_creation_function find_in_table P_ ((char *, widget_creation_entry *));
112 static Boolean dialog_spec_p P_ ((char *));
113 static void instantiate_widget_instance P_ ((widget_instance *));
114 static void destroy_one_instance P_ ((widget_instance *));
115 static void lw_pop_all_widgets P_ ((LWLIB_ID, Boolean));
116 static Boolean get_one_value P_ ((widget_instance *, widget_value *));
117 static void show_one_widget_busy P_ ((Widget, Boolean));
118
81 void 119 void
82 lwlib_memset (address, value, length) 120 lwlib_memset (address, value, length)
83 char *address; 121 char *address;
84 int value; 122 int value;
85 int length; 123 int length;
453 # define EXPLAIN(name, oc, nc, desc, a1, a2) 491 # define EXPLAIN(name, oc, nc, desc, a1, a2)
454 #endif 492 #endif
455 493
456 494
457 static widget_value * 495 static widget_value *
458 merge_widget_value (val1, val2, level) 496 merge_widget_value (val1, val2, level, change_p)
459 widget_value* val1; 497 widget_value* val1;
460 widget_value* val2; 498 widget_value* val2;
461 int level; 499 int level;
500 int *change_p;
462 { 501 {
463 change_type change, this_one_change; 502 change_type change, this_one_change;
464 widget_value* merged_next; 503 widget_value* merged_next;
465 widget_value* merged_contents; 504 widget_value* merged_contents;
466 505
467 if (!val1) 506 if (!val1)
468 { 507 {
469 if (val2) 508 if (val2)
470 return copy_widget_value_tree (val2, STRUCTURAL_CHANGE); 509 {
510 *change_p = 1;
511 return copy_widget_value_tree (val2, STRUCTURAL_CHANGE);
512 }
471 else 513 else
472 return NULL; 514 return NULL;
473 } 515 }
474 if (!val2) 516 if (!val2)
475 { 517 {
518 *change_p = 1;
476 free_widget_value_tree (val1); 519 free_widget_value_tree (val1);
477 return NULL; 520 return NULL;
478 } 521 }
479 522
480 change = NO_CHANGE; 523 change = NO_CHANGE;
541 } 584 }
542 585
543 if (level > 0) 586 if (level > 0)
544 { 587 {
545 merged_contents = 588 merged_contents =
546 merge_widget_value (val1->contents, val2->contents, level - 1); 589 merge_widget_value (val1->contents, val2->contents, level - 1,
590 change_p);
547 591
548 if (val1->contents && !merged_contents) 592 if (val1->contents && !merged_contents)
549 { 593 {
550 /* This used to say INVISIBLE_CHANGE, 594 /* This used to say INVISIBLE_CHANGE,
551 but it is visible and vitally important when 595 but it is visible and vitally important when
571 val1->contents = merged_contents; 615 val1->contents = merged_contents;
572 } 616 }
573 617
574 this_one_change = change; 618 this_one_change = change;
575 619
576 merged_next = merge_widget_value (val1->next, val2->next, level); 620 merged_next = merge_widget_value (val1->next, val2->next, level, change_p);
577 621
578 if (val1->next && !merged_next) 622 if (val1->next && !merged_next)
579 { 623 {
580 EXPLAIN (val1->name, change, STRUCTURAL_CHANGE, "(following gone)", 624 EXPLAIN (val1->name, change, STRUCTURAL_CHANGE, "(following gone)",
581 0, 0); 625 0, 0);
594 val1->this_one_change = this_one_change; 638 val1->this_one_change = this_one_change;
595 val1->change = change; 639 val1->change = change;
596 640
597 if (change > NO_CHANGE && val1->toolkit_data) 641 if (change > NO_CHANGE && val1->toolkit_data)
598 { 642 {
643 *change_p = 1;
599 if (val1->free_toolkit_data) 644 if (val1->free_toolkit_data)
600 XtFree (val1->toolkit_data); 645 XtFree (val1->toolkit_data);
601 val1->toolkit_data = NULL; 646 val1->toolkit_data = NULL;
602 } 647 }
603 648
690 735
691 for (val = info->val; val; val = val->next) 736 for (val = info->val; val; val = val->next)
692 val->change = NO_CHANGE; 737 val->change = NO_CHANGE;
693 } 738 }
694 739
695 void 740 int
696 lw_modify_all_widgets (id, val, deep_p) 741 lw_modify_all_widgets (id, val, deep_p)
697 LWLIB_ID id; 742 LWLIB_ID id;
698 widget_value* val; 743 widget_value* val;
699 Boolean deep_p; 744 Boolean deep_p;
700 { 745 {
703 widget_value* next_new_val; 748 widget_value* next_new_val;
704 widget_value* cur; 749 widget_value* cur;
705 widget_value* prev; 750 widget_value* prev;
706 widget_value* next; 751 widget_value* next;
707 int found; 752 int found;
753 int change_p = 0;
708 754
709 if (!info) 755 if (!info)
710 return; 756 return;
711 757
712 for (new_val = val; new_val; new_val = new_val->next) 758 for (new_val = val; new_val; new_val = new_val->next)
718 if (!strcmp (cur->name, new_val->name)) 764 if (!strcmp (cur->name, new_val->name))
719 { 765 {
720 found = True; 766 found = True;
721 next = cur->next; 767 next = cur->next;
722 cur->next = NULL; 768 cur->next = NULL;
723 cur = merge_widget_value (cur, new_val, deep_p ? 1000 : 1); 769 cur = merge_widget_value (cur, new_val, deep_p ? 1000 : 1,
770 &change_p);
724 if (prev) 771 if (prev)
725 prev->next = cur ? cur : next; 772 prev->next = cur ? cur : next;
726 else 773 else
727 info->val = cur ? cur : next; 774 info->val = cur ? cur : next;
728 if (cur) 775 if (cur)
734 /* Could not find it, add it */ 781 /* Could not find it, add it */
735 if (prev) 782 if (prev)
736 prev->next = copy_widget_value_tree (new_val, STRUCTURAL_CHANGE); 783 prev->next = copy_widget_value_tree (new_val, STRUCTURAL_CHANGE);
737 else 784 else
738 info->val = copy_widget_value_tree (new_val, STRUCTURAL_CHANGE); 785 info->val = copy_widget_value_tree (new_val, STRUCTURAL_CHANGE);
786 change_p = 1;
739 } 787 }
740 new_val->next = next_new_val; 788 new_val->next = next_new_val;
741 } 789 }
742 790
743 update_all_widget_values (info, deep_p); 791 update_all_widget_values (info, deep_p);
792 return change_p;
744 } 793 }
745 794
746 795
747 /* creating the widgets */ 796 /* creating the widgets */
748 797