summaryrefslogtreecommitdiff
path: root/oldXMenu/Recomp.c
diff options
context:
space:
mode:
Diffstat (limited to 'oldXMenu/Recomp.c')
-rw-r--r--oldXMenu/Recomp.c104
1 files changed, 104 insertions, 0 deletions
diff --git a/oldXMenu/Recomp.c b/oldXMenu/Recomp.c
new file mode 100644
index 00000000000..69153656b1b
--- /dev/null
+++ b/oldXMenu/Recomp.c
@@ -0,0 +1,104 @@
+#include "copyright.h"
+
+/* $Header: Recomp.c,v 1.5 87/12/20 12:05:46 rws Exp $ */
+/* Copyright Massachusetts Institute of Technology 1985 */
+
+/*
+ * XMenu: MIT Project Athena, X Window system menu package
+ *
+ * XMenuRecompute - Recompute XMenu object dependencies.
+ *
+ * Author: Tony Della Fera, DEC
+ * September, 1985
+ *
+ */
+
+#include "XMenuInt.h"
+
+int
+XMenuRecompute(display, menu)
+ Display *display;
+ register XMenu *menu; /* Menu object to be recomputed. */
+{
+ register XMPane *p_ptr; /* Pane pointer. */
+ register XMSelect *s_ptr; /* Selection pointer. */
+
+ register int p_num; /* Pane serial number. */
+ register int s_num; /* Selection serial number. */
+
+ /*
+ * If there are no panes in the menu then return failure
+ * beacuse the menu is not initialized.
+ */
+ if (menu->p_count == 0) {
+ _XMErrorCode = XME_NOT_INIT;
+ return(XM_FAILURE);
+ }
+
+ /*
+ * Recompute menu wide global values: pane window size,
+ * selection size and maximum selection count.
+ */
+ _XMRecomputeGlobals(display, menu);
+
+ /*
+ * For each pane in the menu...
+ */
+
+ p_num = 0;
+ for (
+ p_ptr = menu->p_list->next;
+ p_ptr != menu->p_list;
+ p_ptr = p_ptr->next
+ ){
+ /*
+ * Recompute pane dependencies.
+ */
+ if (_XMRecomputePane(display, menu, p_ptr, p_num) == _FAILURE) {
+ return(XM_FAILURE);
+ }
+ p_num++;
+
+ /*
+ * For each selection in the pane...
+ */
+ s_num = 0;
+ for (
+ s_ptr = p_ptr->s_list->next;
+ s_ptr != p_ptr->s_list;
+ s_ptr = s_ptr->next
+ ) {
+ /*
+ * Recompute selection dependencies.
+ */
+ if (_XMRecomputeSelection(display, menu, s_ptr, s_num) == _FAILURE) {
+ return(XM_FAILURE);
+ }
+ s_num++;
+ }
+ }
+
+ /*
+ * Recompute menu size.
+ */
+ if (menu->menu_style == CENTER) {
+ menu->width = menu->p_width + (menu->p_bdr_width << 1);
+ }
+ else {
+ menu->width = menu->p_width + (menu->p_bdr_width << 1) +
+ ((menu->p_count - 1) * menu->p_x_off);
+ }
+ menu->height = menu->p_height + (menu->p_bdr_width << 1) +
+ ((menu->p_count - 1) * menu->p_y_off);
+
+ /*
+ * Reset the recompute flag.
+ */
+ menu->recompute = 0;
+
+ /*
+ * Return successfully.
+ */
+ _XMErrorCode = XME_NO_ERROR;
+ return(XM_SUCCESS);
+}