1 /****************************************************************************\
2  *  sview.h - definitions used for sview data functions
3  *****************************************************************************
4  *  Copyright (C) 2004 The Regents of the University of California.
5  *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
6  *  Written by Danny Auble <da@llnl.gov>
7  *  CODE-OCEC-09-009. All rights reserved.
8  *
9  *  This file is part of Slurm, a resource management program.
10  *  For details, see <https://slurm.schedmd.com/>.
11  *  Please also read the included file: DISCLAIMER.
12  *
13  *  Slurm is free software; you can redistribute it and/or modify it under
14  *  the terms of the GNU General Public License as published by the Free
15  *  Software Foundation; either version 2 of the License, or (at your option)
16  *  any later version.
17  *
18  *  Slurm is distributed in the hope that it will be useful, but WITHOUT ANY
19  *  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
20  *  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
21  *  details.
22  *
23  *  You should have received a copy of the GNU General Public License along
24  *  with Slurm; if not, write to the Free Software Foundation, Inc.,
25  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA.
26 \****************************************************************************/
27 
28 #ifndef _SVIEW_H
29 #define _SVIEW_H
30 
31 #include "config.h"
32 
33 #define _GNU_SOURCE
34 
35 #include <ctype.h>
36 #include <inttypes.h>
37 #include <getopt.h>
38 #include <pwd.h>
39 #include <stdio.h>
40 #include <stdlib.h>
41 #include <string.h>
42 #include <sys/stat.h>
43 #include <sys/types.h>
44 #include <unistd.h>
45 
46 #include "slurm/slurmdb.h"
47 
48 #include "src/common/assoc_mgr.h"
49 #include "src/common/bitstring.h"
50 #include "src/common/hostlist.h"
51 #include "src/common/list.h"
52 #include "src/common/macros.h"
53 #include "src/common/node_select.h"
54 #include "src/common/parse_time.h"
55 #include "src/common/slurmdb_defs.h"
56 #include "src/common/slurm_protocol_api.h"
57 #include "src/common/slurm_protocol_defs.h"
58 #include "src/common/strlcpy.h"
59 #include "src/common/uid.h"
60 #include "src/common/xstring.h"
61 
62 #include "gthread_helper.h"
63 
64 /* getopt_long options, integers but not characters */
65 #define OPT_LONG_HELP	0x100
66 #define OPT_LONG_USAGE	0x101
67 #define OPT_LONG_HIDE	0x102
68 
69 #define POS_LOC 0
70 #define DEFAULT_ENTRY_LENGTH 500
71 
72 #define MAKE_TOPO_1 -6
73 #define MAKE_TOPO_2 -5
74 #define MAKE_INIT -4
75 #define MAKE_DOWN -3
76 #define MAKE_BLACK -2
77 #define MAKE_WHITE -1
78 
79 #define EXTRA_BASE  0x0000ffff
80 #define EXTRA_FLAGS 0xffff0000
81 #define EXTRA_NODES 0x00010000
82 
83 enum { JOB_PAGE,
84        PART_PAGE,
85        RESV_PAGE,
86        BB_PAGE,
87        NODE_PAGE,
88        FRONT_END_PAGE,
89        SUBMIT_PAGE,
90        ADMIN_PAGE,
91        INFO_PAGE,
92        TAB_PAGE,
93        PAGE_CNT
94 };
95 enum { TAB_CLICKED,
96        ROW_LEFT_CLICKED,
97        ROW_CLICKED,
98        FULL_CLICKED,
99        POPUP_CLICKED
100 };
101 
102 enum { ERROR_VIEW,
103        INFO_VIEW
104 };
105 
106 enum { STATUS_ADMIN_MODE,
107        STATUS_REFRESH,
108        STATUS_ADMIN_EDIT
109 };
110 
111 enum { DISPLAY_NAME,
112        DISPLAY_VALUE,
113        DISPLAY_FONT
114 };
115 
116 enum { EDIT_NONE,
117        EDIT_ARRAY,
118        EDIT_MODEL,
119        EDIT_TEXTBOX,
120        EDIT_COLOR
121 };
122 
123 //typedef struct pages_options page_opts_t;
124 typedef struct display_data display_data_t;
125 typedef struct specific_info specific_info_t;
126 typedef struct popup_info popup_info_t;
127 typedef struct popup_positioner popup_positioner_t;
128 
129 typedef enum {
130 	       CREATE_BATCH_JOB = 1,
131 	       CREATE_PARTITION,
132 	       CREATE_RESERVATION,
133 	       SEARCH_JOB_ID = 10,
134 	       SEARCH_JOB_USER,
135 	       SEARCH_JOB_STATE,
136 	       SEARCH_PARTITION_NAME,
137 	       SEARCH_PARTITION_STATE,
138 	       SEARCH_NODE_NAME,
139 	       SEARCH_NODE_STATE,
140 	       SEARCH_RESERVATION_NAME,
141 } sview_search_type_t;
142 
143 typedef struct {
144 	uint32_t x;
145 	uint32_t y;
146 	int cntr;
147 	int slider;
148 } popup_pos_t;
149 
150 typedef struct  {
151 	char *nodes;
152 	bitstr_t *node_bitmap;
153 } switch_record_bitmaps_t;
154 
155 typedef struct {
156 	List col_list;
157 	bool def_col_list;
158 	display_data_t *display_data;
159 	char *page_name;
160 } page_opts_t;
161 
162 /* Input parameters */
163 typedef struct {
164 	GtkToggleAction *action_admin;
165 	GtkToggleAction *action_grid;
166 	GtkToggleAction *action_hidden;
167 	GtkToggleAction *action_page_opts;
168 	GtkToggleAction *action_gridtopo;
169 	GtkToggleAction *action_ruled;
170 	GtkRadioAction *action_tab;
171 	uint16_t button_size;
172 	uint16_t gap_size;
173 	bool admin_mode;
174 	uint16_t default_page;
175 	uint32_t fi_popup_width;
176 	uint32_t fi_popup_height;
177 	uint32_t grid_hori;
178 	bool grid_topological;
179 	uint32_t grid_vert;
180 	uint32_t grid_x_width;
181 	uint32_t main_width;
182 	uint32_t main_height;
183 	GtkWidget *page_check_widget[PAGE_CNT];
184 	page_opts_t page_opts[PAGE_CNT];
185 	bool page_visible[PAGE_CNT];
186 	uint16_t refresh_delay;
187 	bool ruled_treeview;
188 	bool show_grid;
189 	bool show_hidden;
190 	bool save_page_opts;
191 	uint16_t tab_pos;
192 	uint32_t convert_flags;
193 } sview_config_t;
194 
195 struct display_data {
196 	GType type;
197 	int id;
198 	char *name;
199 	bool show;
200 	uint32_t extra;
201 	void (*refresh)     (GtkAction *action, gpointer user_data);
202 	GtkListStore *(*create_model)(int type);
203 	void (*admin_edit)  (GtkCellRendererText *cell,
204 			     const char *path_string,
205 			     const char *new_text,
206 			     gpointer data);
207 	void (*get_info)    (GtkTable *table, display_data_t *display_data);
208 	void (*specific)    (popup_info_t *popup_win);
209 	void (*set_menu)    (void *arg, void *arg2,
210 			     GtkTreePath *path, int type);
211 	gpointer user_data;
212 	gpointer button_list;
213 };
214 
215 struct popup_positioner {
216 	int id;
217 	char *name;
218 	uint32_t width;
219 	uint32_t height;
220 };
221 
222 typedef struct {
223 	sview_search_type_t search_type;
224 	gchar *cluster_name;
225 	gchar *gchar_data;
226 	int  int_data;
227 	int  int_data2;
228 } sview_search_info_t;
229 
230 struct specific_info {
231 	int type; /* calling window type */
232 	int view;
233 	sview_search_info_t *search_info;
234 	char *title;
235 	GtkWidget *display_widget;
236 };
237 
238 struct popup_info {
239 	display_data_t *display_data;
240 	GtkWidget *event_box;
241 	int force_refresh;
242 	int full_grid;
243 	List grid_button_list;
244 	List multi_button_list;
245 	GtkTable *grid_table;
246 	GtkTreeIter iter;
247 	GtkTreeModel *model;
248 	int *node_inx;
249 	int node_inx_id;
250 	bool not_found;
251 	GtkWidget *popup;
252 	int *running;
253 	int show_grid;
254 	specific_info_t *spec_info;
255 	GtkTable *table;
256 	int toggled;
257 	int type; /* window type */
258 };
259 
260 typedef struct {
261 	GtkWidget *button;
262 	List button_list; /*list this grid_button exists in does not
263 			   * need to be freed, should only be a
264 			   * pointer to an existing list */
265 	char *color;
266 	int color_inx;
267 	int inx;
268 	GtkStateType last_state;
269 	char *node_name;
270 	uint32_t state;
271 	GtkTable *table;
272 	int table_x;
273 	int table_y;
274 #ifndef GTK2_USE_TOOLTIP
275 	GtkTooltips *tip;
276 #endif
277 	bool used;
278 } grid_button_t;
279 
280 typedef struct {
281 	char *boot_time;
282 	char *color;
283 	GtkTreeIter iter_ptr;
284 	bool iter_set;
285 	char *node_name;
286 	node_info_t *node_ptr;
287 	int pos;
288 	char *reason;
289 	char *rack_mp;
290 	char *slurmd_start_time;
291 } sview_node_info_t;
292 
293 typedef struct {
294 	display_data_t *display_data;
295 	List *button_list;
296 } signal_params_t;
297 
298 extern sview_config_t default_sview_config;
299 extern sview_config_t working_sview_config;
300 
301 extern int fini;
302 extern bool toggled;
303 extern bool force_refresh;
304 extern bool apply_hidden_change;
305 extern bool apply_partition_check;
306 extern List popup_list;
307 extern List grid_button_list;
308 extern List multi_button_list;
309 extern List signal_params_list;
310 extern bool global_entry_changed;
311 extern bool global_send_update_msg;
312 extern bool global_edit_error;
313 extern bool global_multi_error;
314 extern int global_error_code;
315 extern gchar *global_edit_error_msg;
316 extern GtkWidget *main_notebook;
317 extern GtkWidget *main_statusbar;
318 extern GtkWidget *main_window;
319 extern GtkTable *main_grid_table;
320 extern GMutex *sview_mutex;
321 extern int global_row_count;
322 extern gint last_event_x;
323 extern gint last_event_y;
324 extern GdkCursor* in_process_cursor;
325 extern char *sview_colors[];
326 extern int sview_colors_cnt;
327 extern int cluster_dims;
328 extern uint32_t cluster_flags;
329 extern List cluster_list;
330 extern char *orig_cluster_name;
331 extern front_end_info_msg_t *g_front_end_info_ptr;
332 extern job_info_msg_t *g_job_info_ptr;
333 extern node_info_msg_t *g_node_info_ptr;
334 extern partition_info_msg_t *g_part_info_ptr;
335 extern reserve_info_msg_t *g_resv_info_ptr;
336 extern burst_buffer_info_msg_t *g_bb_info_ptr;
337 extern slurm_ctl_conf_info_msg_t *g_ctl_info_ptr;
338 extern job_step_info_response_msg_t *g_step_info_ptr;
339 extern topo_info_response_msg_t *g_topo_info_msg_ptr;
340 extern switch_record_bitmaps_t *g_switch_nodes_maps;
341 extern popup_positioner_t main_popup_positioner[];
342 extern popup_pos_t popup_pos;
343 extern char *federation_name;
344 
345 extern void init_grid(node_info_msg_t *node_info_ptr);
346 extern int set_grid(int start, int end, int count);
347 extern int set_grid_bg(int *start, int *end, int count, int set);
348 extern void print_grid(int dir);
349 
350 //sview.c
351 extern void refresh_main(GtkAction *action, gpointer user_data);
352 extern void toggle_tab_visiblity(GtkToggleButton *toggle_button,
353 				 display_data_t *display_data);
354 extern gboolean tab_pressed(GtkWidget *widget, GdkEventButton *event,
355 			    display_data_t *display_data);
356 extern void close_tab(GtkWidget *widget, GdkEventButton *event,
357 		      display_data_t *display_data);
358 
359 //popups.c
360 extern void create_config_popup(GtkAction *action, gpointer user_data);
361 extern void create_create_popup(GtkAction *action, gpointer user_data);
362 extern void create_dbconfig_popup(GtkAction *action, gpointer user_data);
363 extern void create_daemon_popup(GtkAction *action, gpointer user_data);
364 extern void create_search_popup(GtkAction *action, gpointer user_data);
365 extern void change_refresh_popup(GtkAction *action, gpointer user_data);
366 extern void change_grid_popup(GtkAction *action, gpointer user_data);
367 extern void about_popup(GtkAction *action, gpointer user_data);
368 extern void usage_popup(GtkAction *action, gpointer user_data);
369 extern void display_fed_disabled_popup(const char *title);
370 
371 //grid.c
372 extern void destroy_grid_button(void *arg);
373 extern grid_button_t *create_grid_button_from_another(
374 	grid_button_t *grid_button, char *name, int color_inx);
375 /* do not free the char * from this function it is static */
376 extern void change_grid_color(List button_list, int start, int end,
377 			      int color_inx, bool change_unused,
378 			      enum node_states state_override);
379 extern void change_grid_color_array(List button_list, int array_len,
380 				    int *color_inx, bool *color_set_flag,
381 				    bool only_change_unused,
382 				    enum node_states state_override);
383 extern void highlight_grid(GtkTreeView *tree_view,
384 			   int node_inx_id, int color_inx_id, List button_list);
385 extern void highlight_grid_range(int start, int end, List button_list);
386 extern void set_grid_used(List button_list, int start, int end,
387 			  bool used, bool reset_highlight);
388 extern void get_button_list_from_main(List *button_list, int start, int end,
389 				      int color_inx);
390 extern List copy_main_button_list(int initial_color);
391 extern void put_buttons_in_table(GtkTable *table, List button_list);
392 extern int get_system_stats(GtkTable *table);
393 extern int setup_grid_table(GtkTable *table, List button_list, List node_list);
394 extern void sview_init_grid(bool reset_highlight);
395 extern void sview_clear_unused_grid(List button_list, int color_inx);
396 extern void setup_popup_grid_list(popup_info_t *popup_win);
397 extern void post_setup_popup_grid_list(popup_info_t *popup_win);
398 
399 // part_info.c
400 extern GtkWidget *create_part_entry(update_part_msg_t *part_msg,
401 				    GtkTreeModel *model, GtkTreeIter *iter);
402 extern bool check_part_includes_node(int node_dx);
403 extern void refresh_part(GtkAction *action, gpointer user_data);
404 extern GtkListStore *create_model_part(int type);
405 extern void admin_edit_part(GtkCellRendererText *cell,
406 			    const char *path_string,
407 			    const char *new_text,
408 			    gpointer data);
409 extern int get_new_info_part(partition_info_msg_t **part_ptr, int force);
410 extern void get_info_part(GtkTable *table, display_data_t *display_data);
411 extern void specific_info_part(popup_info_t *popup_win);
412 extern void set_menus_part(void *arg, void *arg2, GtkTreePath *path, int type);
413 extern void popup_all_part(GtkTreeModel *model, GtkTreeIter *iter, int id);
414 extern void select_admin_partitions(GtkTreeModel *model, GtkTreeIter *iter,
415 				    display_data_t *display_data,
416 				    GtkTreeView *treeview);
417 extern void admin_part(GtkTreeModel *model, GtkTreeIter *iter, char *type);
418 extern void cluster_change_part(void);
419 
420 // accnt_info.c
421 extern void refresh_accnt(GtkAction *action, gpointer user_data);
422 extern GtkListStore *create_model_accnt(int type);
423 extern void admin_edit_accnt(GtkCellRendererText *cell,
424 			     const char *path_string,
425 			     const char *new_text,
426 			     gpointer data);
427 extern void specific_info_accnt(popup_info_t *popup_win);
428 
429 // front_end_info.c
430 extern void admin_edit_front_end(GtkCellRendererText *cell,
431 				 const char *path_string,
432 				 const char *new_text, gpointer data);
433 extern void cluster_change_front_end(void);
434 extern GtkListStore *create_model_front_end(int type);
435 extern void get_info_front_end(GtkTable *table, display_data_t *display_data);
436 extern int  get_new_info_front_end(front_end_info_msg_t **info_ptr, int force);
437 extern void popup_all_front_end(GtkTreeModel *model, GtkTreeIter *iter, int id);
438 extern void refresh_front_end(GtkAction *action, gpointer user_data);
439 extern void select_admin_front_end(GtkTreeModel *model, GtkTreeIter *iter,
440 				  display_data_t *display_data,
441 				  GtkTreeView *treeview);
442 extern void set_menus_front_end(void *arg, void *arg2, GtkTreePath *path,
443 				int type);
444 extern void specific_info_front_end(popup_info_t *popup_win);
445 
446 // job_info.c
447 extern GtkWidget *create_job_entry(job_desc_msg_t *job_msg,
448 				   GtkTreeModel *model, GtkTreeIter *iter);
449 extern void refresh_job(GtkAction *action, gpointer user_data);
450 extern GtkListStore *create_model_job(int type);
451 extern void admin_edit_job(GtkCellRendererText *cell,
452 			   const char *path_string,
453 			   const char *new_text,
454 			   gpointer data);
455 extern int get_new_info_job(job_info_msg_t **info_ptr, int force);
456 extern int get_new_info_job_step(job_step_info_response_msg_t **info_ptr,
457 				 int force);
458 extern void get_info_job(GtkTable *table, display_data_t *display_data);
459 extern void specific_info_job(popup_info_t *popup_win);
460 extern void set_menus_job(void *arg, void *arg2, GtkTreePath *path, int type);
461 extern void popup_all_job(GtkTreeModel *model, GtkTreeIter *iter, int id);
462 extern void admin_job(GtkTreeModel *model, GtkTreeIter *iter, char *type,
463 		      GtkTreeView *treeview);
464 extern void cluster_change_job(void);
465 
466 // node_info.c
467 extern void refresh_node(GtkAction *action, gpointer user_data);
468 /* don't destroy the list from this function */
469 extern List create_node_info_list(node_info_msg_t *node_info_ptr,
470 				  bool by_partition);
471 extern int update_active_features_node(GtkDialog *dialog, const char *nodelist,
472 				      const char *old_features);
473 extern int update_avail_features_node(GtkDialog *dialog, const char *nodelist,
474 				      const char *old_features);
475 extern int update_state_node(GtkDialog *dialog,
476 			     const char *nodelist, const char *type);
477 extern GtkListStore *create_model_node(int type);
478 extern void select_admin_nodes(GtkTreeModel *model, GtkTreeIter *iter,
479 			       display_data_t *display_data, uint32_t node_col,
480 			       GtkTreeView *treeview);
481 extern void admin_edit_node(GtkCellRendererText *cell,
482 			    const char *path_string,
483 			    const char *new_text,
484 			    gpointer data);
485 extern int get_new_info_node(node_info_msg_t **info_ptr, int force);
486 extern void get_info_node(GtkTable *table, display_data_t *display_data);
487 extern void specific_info_node(popup_info_t *popup_win);
488 extern void set_menus_node(void *arg, void *arg2, GtkTreePath *path, int type);
489 extern void popup_all_node(GtkTreeModel *model, GtkTreeIter *iter, int id);
490 extern void popup_all_node_name(char *name, int id, char *cluster_name);
491 extern void admin_menu_node_name(char *name, GdkEventButton *event);
492 extern void admin_node(GtkTreeModel *model, GtkTreeIter *iter, char *type);
493 extern void admin_node_name(char *name, char *old_value, char *type);
494 extern void cluster_change_node(void);
495 
496 // resv_info.c
497 extern GtkWidget *create_resv_entry(resv_desc_msg_t *resv_msg,
498 				    GtkTreeModel *model, GtkTreeIter *iter);
499 extern void refresh_resv(GtkAction *action, gpointer user_data);
500 extern GtkListStore *create_model_resv(int type);
501 extern void admin_edit_resv(GtkCellRendererText *cell,
502 			    const char *path_string,
503 			    const char *new_text,
504 			    gpointer data);
505 extern int get_new_info_resv(reserve_info_msg_t **info_ptr, int force);
506 extern void get_info_resv(GtkTable *table, display_data_t *display_data);
507 extern void specific_info_resv(popup_info_t *popup_win);
508 extern void set_menus_resv(void *arg, void *arg2, GtkTreePath *path, int type);
509 extern void popup_all_resv(GtkTreeModel *model, GtkTreeIter *iter, int id);
510 extern void select_admin_resv(GtkTreeModel *model, GtkTreeIter *iter,
511 			      display_data_t *display_data,
512 			      GtkTreeView *treeview);
513 extern void cluster_change_resv(void);
514 
515 
516 // submit_info.c
517 extern void get_info_submit(GtkTable *table, display_data_t *display_data);
518 extern void set_menus_submit(void *arg, void *arg2,
519 			     GtkTreePath *path, int type);
520 
521 // config_info.c
522 extern int get_new_info_config(slurm_ctl_conf_info_msg_t **info_ptr);
523 
524 // common.c
525 extern char * replspace (char *str);
526 extern char * replus (char *str);
527 extern void set_page_opts(int tab, display_data_t *display_data,
528 			  int count, char* initial_opts);
529 extern void free_switch_nodes_maps(switch_record_bitmaps_t
530 				   *g_switch_nodes_maps);
531 extern int get_topo_conf(void);
532 extern int get_row_number(GtkTreeView *tree_view, GtkTreePath *path);
533 extern int find_col(display_data_t *display_data, int type);
534 extern const char *find_col_name(display_data_t *display_data, int type);
535 extern void load_header(GtkTreeView *tree_view, display_data_t *display_data);
536 extern void make_fields_menu(popup_info_t *popup_win, GtkMenu *menu,
537 			     display_data_t *display_data, int count);
538 extern void make_options_menu(GtkTreeView *tree_view, GtkTreePath *path,
539 			      GtkMenu *menu, display_data_t *display_data);
540 extern GtkScrolledWindow *create_scrolled_window(void);
541 extern GtkWidget *create_entry(void);
542 extern void create_page(GtkNotebook *notebook, display_data_t *display_data);
543 extern GtkTreeView *create_treeview(display_data_t *local, List *button_list);
544 extern GtkTreeView *create_treeview_2cols_attach_to_table(GtkTable *table);
545 extern GtkTreeStore *create_treestore(GtkTreeView *tree_view,
546 				      display_data_t *display_data,
547 				      int count, int sort_column,
548 				      int color_column);
549 
550 extern gboolean right_button_pressed(GtkTreeView *tree_view, GtkTreePath *path,
551 				     GdkEventButton *event,
552 				     const signal_params_t *signal_params,
553 				     int type);
554 extern gboolean left_button_pressed(GtkTreeView *tree_view,
555 				    GtkTreePath *path,
556 				    const signal_params_t *signal_params,
557 				    GdkEventButton *event);
558 extern gboolean row_activated(GtkTreeView *tree_view, GtkTreePath *path,
559 			      GtkTreeViewColumn *column,
560 			      const signal_params_t *signal_params);
561 extern gboolean row_expander(GtkTreeView *tree_view,
562 			     gboolean arg1, gboolean arg2,
563 			     const signal_params_t *signal_params);
564 extern gboolean row_expand(GtkTreeView *tree_view,  GtkTreeIter *iter,
565 			   GtkTreePath *path,
566 			   const signal_params_t *signal_params);
567 extern gboolean row_clicked(GtkTreeView *tree_view, GdkEventButton *event,
568 			    const signal_params_t *signal_params);
569 extern gboolean key_pressed(GtkTreeView *tree_view, GdkEventKey *event,
570 			    const signal_params_t *signal_params);
571 extern gboolean focus_in(GtkTreeView *tree_view, GdkEventButton *event,
572 			 const signal_params_t *signal_params);
573 extern gboolean key_released(GtkTreeView *tree_view, GdkEventKey *event,
574 			     const signal_params_t *signal_params);
575 extern popup_info_t *create_popup_info(int type, int dest_type, char *title);
576 extern void setup_popup_info(popup_info_t *popup_win,
577 			     display_data_t *display_data,
578 			     int cnt);
579 extern void redo_popup(GtkWidget *widget, GdkEventButton *event,
580 		       popup_info_t *popup_win);
581 
582 extern void destroy_search_info(void *arg);
583 extern void destroy_specific_info(void *arg);
584 extern void destroy_popup_info(void *arg);
585 extern void destroy_signal_params(void *arg);
586 
587 extern gboolean delete_popup(GtkWidget *widget, GtkWidget *event, char *title);
588 extern gboolean delete_popups(void);
589 extern void *popup_thr(popup_info_t *popup_win);
590 extern void set_for_update(GtkTreeModel *model, int updated);
591 extern void remove_old(GtkTreeModel *model, int updated);
592 extern GtkWidget *create_pulldown_combo(display_data_t *display_data);
593 extern char *str_tolower(char *upper_str);
594 extern char *get_reason(void);
595 extern void display_admin_edit(GtkTable *table, void *type_msg, int *row,
596 			       GtkTreeModel *model, GtkTreeIter *iter,
597 			       display_data_t *display_data,
598 			       GCallback changed_callback,
599 			       GCallback focus_callback,
600 			       void (*set_active)(
601 				       GtkComboBox *combo,
602 				       GtkTreeModel *model, GtkTreeIter *iter,
603 				       int type));
604 extern void display_edit_note(char *edit_note);
605 extern void add_display_treestore_line(int update,
606 				       GtkTreeStore *treestore,
607 				       GtkTreeIter *iter,
608 				       const char *name,
609 				       const char *value);
610 extern void add_display_treestore_line_with_font(
611 	int update,
612 	GtkTreeStore *treestore,
613 	GtkTreeIter *iter,
614 	const char *name, char *value,
615 	char *font);
616 extern void sview_widget_modify_bg(GtkWidget *widget, GtkStateType state,
617 				   const GdkColor color);
618 extern void sview_radio_action_set_current_value(GtkRadioAction *action,
619 						 gint current_value);
620 extern char *page_to_str(int page);
621 extern char *tab_pos_to_str(int tab_pos);
622 extern char *visible_to_str(sview_config_t *sview_config);
623 extern gboolean entry_changed(GtkWidget *widget, void *msg);
624 extern void select_admin_common(GtkTreeModel *model, GtkTreeIter *iter,
625 				display_data_t *display_data,
626 				GtkTreeView *treeview,
627 				uint32_t node_col,
628 				void (*process_each)(GtkTreeModel *model,
629 						     GtkTreePath *path,
630 						     GtkTreeIter *iter,
631 						     gpointer userdata));
632 
633 // defaults.c
634 extern int load_defaults(void);
635 extern int save_defaults(bool final_save);
636 extern GtkListStore *create_model_defaults(int type);
637 extern int configure_defaults(void);
638 
639 //bb_info.c
640 extern void refresh_bb(GtkAction *action, gpointer user_data);
641 extern GtkListStore *create_model_bb(int type);
642 extern void admin_edit_bb(GtkCellRendererText *cell,
643 			  const char *path_string,
644 			  const char *new_text,
645 			  gpointer data);
646 extern void get_info_bb(GtkTable *table, display_data_t *display_data);
647 extern void specific_info_bb(popup_info_t *popup_win);
648 extern void set_menus_bb(void *arg, void *arg2, GtkTreePath *path, int type);
649 extern void cluster_change_bb(void);
650 extern void popup_all_bb(GtkTreeModel *model, GtkTreeIter *iter, int id);
651 extern void select_admin_bb(GtkTreeModel *model, GtkTreeIter *iter,
652 			    display_data_t *display_data,
653 			    GtkTreeView *treeview);
654 
655 #endif
656