2 Unix SMB/CIFS implementation.
5 Copyright (C) Jelmer Vernooij 2004
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include "dynconfig.h"
25 #include "lib/cmdline/popt_common.h"
26 #include "gtk/common/select.h"
27 #include "gtk/common/gtk-smb.h"
29 GtkWidget
*openfilewin
;
30 GtkWidget
*savefilewin
;
31 GtkTreeStore
*store_keys
;
32 GtkListStore
*store_vals
;
36 GtkWidget
*mnu_add_key
, *mnu_set_value
, *mnu_del_key
, *mnu_del_value
, *mnu_find
;
37 TALLOC_CTX
*mem_ctx
; /* FIXME: Split up */
41 static GtkWidget
* create_openfilewin (void);
42 static GtkWidget
* create_savefilewin (void);
43 struct registry_context
*registry
= NULL
;
44 struct registry_key
*current_key
= NULL
;
46 static GtkWidget
* create_FindDialog (void)
48 GtkWidget
*FindDialog
;
49 GtkWidget
*dialog_vbox2
;
53 GtkWidget
*entry_pattern
;
55 GtkWidget
*alignment3
;
57 GtkWidget
*checkbutton1
;
58 GtkWidget
*checkbutton2
;
59 GtkWidget
*checkbutton3
;
61 GtkWidget
*dialog_action_area2
;
62 GtkWidget
*cancelbutton2
;
65 FindDialog
= gtk_dialog_new ();
66 gtk_window_set_title (GTK_WINDOW (FindDialog
), "Find Key or Value");
67 gtk_window_set_resizable (GTK_WINDOW (FindDialog
), FALSE
);
68 gtk_window_set_type_hint (GTK_WINDOW (FindDialog
), GDK_WINDOW_TYPE_HINT_DIALOG
);
70 dialog_vbox2
= GTK_DIALOG (FindDialog
)->vbox
;
72 vbox1
= gtk_vbox_new (FALSE
, 0);
73 gtk_box_pack_start (GTK_BOX (dialog_vbox2
), vbox1
, TRUE
, TRUE
, 0);
75 hbox1
= gtk_hbox_new (FALSE
, 0);
76 gtk_box_pack_start (GTK_BOX (vbox1
), hbox1
, TRUE
, TRUE
, 0);
78 label6
= gtk_label_new ("Find String");
79 gtk_box_pack_start (GTK_BOX (hbox1
), label6
, FALSE
, FALSE
, 0);
81 entry_pattern
= gtk_entry_new ();
82 gtk_box_pack_start (GTK_BOX (hbox1
), entry_pattern
, TRUE
, TRUE
, 0);
84 frame3
= gtk_frame_new (NULL
);
85 gtk_box_pack_start (GTK_BOX (vbox1
), frame3
, TRUE
, TRUE
, 0);
86 gtk_frame_set_shadow_type (GTK_FRAME (frame3
), GTK_SHADOW_NONE
);
88 alignment3
= gtk_alignment_new (0.5, 0.5, 1, 1);
89 gtk_container_add (GTK_CONTAINER (frame3
), alignment3
);
90 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment3
), 0, 0, 12, 0);
92 vbox2
= gtk_vbox_new (FALSE
, 0);
93 gtk_container_add (GTK_CONTAINER (alignment3
), vbox2
);
95 checkbutton1
= gtk_check_button_new_with_mnemonic ("_Key Names");
96 gtk_box_pack_start (GTK_BOX (vbox2
), checkbutton1
, FALSE
, FALSE
, 0);
98 checkbutton2
= gtk_check_button_new_with_mnemonic ("_Value Names");
99 gtk_box_pack_start (GTK_BOX (vbox2
), checkbutton2
, FALSE
, FALSE
, 0);
101 checkbutton3
= gtk_check_button_new_with_mnemonic ("Value _Data");
102 gtk_box_pack_start (GTK_BOX (vbox2
), checkbutton3
, FALSE
, FALSE
, 0);
104 label7
= gtk_label_new ("<b>Search in</b>");
105 gtk_frame_set_label_widget (GTK_FRAME (frame3
), label7
);
106 gtk_label_set_use_markup (GTK_LABEL (label7
), TRUE
);
108 dialog_action_area2
= GTK_DIALOG (FindDialog
)->action_area
;
109 gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area2
), GTK_BUTTONBOX_END
);
111 cancelbutton2
= gtk_button_new_from_stock ("gtk-cancel");
112 gtk_dialog_add_action_widget (GTK_DIALOG (FindDialog
), cancelbutton2
, GTK_RESPONSE_CANCEL
);
113 GTK_WIDGET_SET_FLAGS (cancelbutton2
, GTK_CAN_DEFAULT
);
115 okbutton2
= gtk_button_new_from_stock ("gtk-ok");
116 gtk_dialog_add_action_widget (GTK_DIALOG (FindDialog
), okbutton2
, GTK_RESPONSE_OK
);
117 GTK_WIDGET_SET_FLAGS (okbutton2
, GTK_CAN_DEFAULT
);
119 gtk_widget_show_all (dialog_vbox2
);
124 static GtkWidget
* create_SetValueDialog (GtkWidget
**entry_name
, GtkWidget
**entry_type
, GtkWidget
**entry_data
)
126 GtkWidget
*SetValueDialog
;
127 GtkWidget
*dialog_vbox1
;
132 GtkWidget
*entry_value_name
;
133 GtkWidget
*value_data
;
134 GtkWidget
*combo_data_type
;
135 GtkWidget
*dialog_action_area1
;
136 GtkWidget
*cancelbutton1
;
137 GtkWidget
*okbutton1
;
139 SetValueDialog
= gtk_dialog_new ();
140 gtk_window_set_title (GTK_WINDOW (SetValueDialog
), "Set Registry Value");
141 gtk_window_set_position (GTK_WINDOW (SetValueDialog
), GTK_WIN_POS_CENTER
);
142 gtk_window_set_resizable (GTK_WINDOW (SetValueDialog
), FALSE
);
143 gtk_window_set_type_hint (GTK_WINDOW (SetValueDialog
), GDK_WINDOW_TYPE_HINT_DIALOG
);
145 dialog_vbox1
= GTK_DIALOG (SetValueDialog
)->vbox
;
147 table1
= gtk_table_new (3, 2, FALSE
);
148 gtk_box_pack_start (GTK_BOX (dialog_vbox1
), table1
, TRUE
, TRUE
, 0);
150 label3
= gtk_label_new ("Value name:");
151 gtk_table_attach (GTK_TABLE (table1
), label3
, 0, 1, 0, 1,
152 (GtkAttachOptions
) (GTK_FILL
),
153 (GtkAttachOptions
) (0), 0, 0);
154 gtk_misc_set_alignment (GTK_MISC (label3
), 0, 0.5);
156 label4
= gtk_label_new ("Data Type:");
157 gtk_table_attach (GTK_TABLE (table1
), label4
, 0, 1, 1, 2,
158 (GtkAttachOptions
) (GTK_FILL
),
159 (GtkAttachOptions
) (0), 0, 0);
160 gtk_misc_set_alignment (GTK_MISC (label4
), 0, 0.5);
162 label5
= gtk_label_new ("Data:");
163 gtk_table_attach (GTK_TABLE (table1
), label5
, 0, 1, 2, 3,
164 (GtkAttachOptions
) (GTK_FILL
),
165 (GtkAttachOptions
) (0), 0, 0);
166 gtk_misc_set_alignment (GTK_MISC (label5
), 0, 0.5);
168 *entry_name
= entry_value_name
= gtk_entry_new ();
169 gtk_table_attach (GTK_TABLE (table1
), entry_value_name
, 1, 2, 0, 1,
170 (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
),
171 (GtkAttachOptions
) (0), 0, 0);
173 *entry_data
= value_data
= gtk_entry_new ();
174 gtk_table_attach (GTK_TABLE (table1
), value_data
, 1, 2, 2, 3,
175 (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
),
176 (GtkAttachOptions
) (0), 0, 0);
178 *entry_type
= combo_data_type
= gtk_combo_box_new_text ();
180 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type
), "REG_NONE");
181 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type
), "REG_SZ");
182 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type
), "REG_EXPAND_SZ");
183 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type
), "REG_BINARY");
184 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type
), "REG_DWORD_LE");
185 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type
), "REG_DWORD_BE");
187 gtk_table_attach (GTK_TABLE (table1
), combo_data_type
, 1, 2, 1, 2,
188 (GtkAttachOptions
) (GTK_FILL
),
189 (GtkAttachOptions
) (GTK_FILL
), 0, 0);
191 dialog_action_area1
= GTK_DIALOG (SetValueDialog
)->action_area
;
192 gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1
), GTK_BUTTONBOX_END
);
194 cancelbutton1
= gtk_button_new_from_stock ("gtk-cancel");
195 gtk_dialog_add_action_widget (GTK_DIALOG (SetValueDialog
), cancelbutton1
, GTK_RESPONSE_CANCEL
);
196 GTK_WIDGET_SET_FLAGS (cancelbutton1
, GTK_CAN_DEFAULT
);
198 okbutton1
= gtk_button_new_from_stock ("gtk-ok");
199 gtk_dialog_add_action_widget (GTK_DIALOG (SetValueDialog
), okbutton1
, GTK_RESPONSE_OK
);
200 GTK_WIDGET_SET_FLAGS (okbutton1
, GTK_CAN_DEFAULT
);
202 gtk_widget_show_all (dialog_vbox1
);
204 return SetValueDialog
;
207 static GtkWidget
* create_NewKeyDialog (GtkWidget
**name_entry
)
209 GtkWidget
*NewKeyDialog
;
210 GtkWidget
*dialog_vbox2
;
213 GtkWidget
*entry_key_name
;
214 GtkWidget
*dialog_action_area2
;
215 GtkWidget
*cancelbutton2
;
216 GtkWidget
*okbutton2
;
218 NewKeyDialog
= gtk_dialog_new ();
219 gtk_window_set_title (GTK_WINDOW (NewKeyDialog
), "New Registry Key");
220 gtk_window_set_position (GTK_WINDOW (NewKeyDialog
), GTK_WIN_POS_CENTER
);
221 gtk_window_set_resizable (GTK_WINDOW (NewKeyDialog
), FALSE
);
222 gtk_window_set_type_hint (GTK_WINDOW (NewKeyDialog
), GDK_WINDOW_TYPE_HINT_DIALOG
);
224 dialog_vbox2
= GTK_DIALOG (NewKeyDialog
)->vbox
;
226 hbox1
= gtk_hbox_new (FALSE
, 0);
227 gtk_box_pack_start (GTK_BOX (dialog_vbox2
), hbox1
, TRUE
, TRUE
, 0);
229 label6
= gtk_label_new ("Name:");
230 gtk_box_pack_start (GTK_BOX (hbox1
), label6
, FALSE
, FALSE
, 0);
232 entry_key_name
= gtk_entry_new ();
233 gtk_box_pack_start (GTK_BOX (hbox1
), entry_key_name
, TRUE
, TRUE
, 0);
235 dialog_action_area2
= GTK_DIALOG (NewKeyDialog
)->action_area
;
236 gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area2
), GTK_BUTTONBOX_END
);
238 *name_entry
= entry_key_name
;
240 cancelbutton2
= gtk_button_new_from_stock ("gtk-cancel");
241 gtk_dialog_add_action_widget (GTK_DIALOG (NewKeyDialog
), cancelbutton2
, GTK_RESPONSE_CANCEL
);
242 GTK_WIDGET_SET_FLAGS (cancelbutton2
, GTK_CAN_DEFAULT
);
244 okbutton2
= gtk_button_new_from_stock ("gtk-ok");
245 gtk_dialog_add_action_widget (GTK_DIALOG (NewKeyDialog
), okbutton2
, GTK_RESPONSE_OK
);
246 GTK_WIDGET_SET_FLAGS (okbutton2
, GTK_CAN_DEFAULT
);
248 gtk_widget_show_all (dialog_vbox2
);
254 static void expand_key(GtkTreeView
*treeview
, GtkTreeIter
*parent
, GtkTreePath
*arg2
)
256 GtkTreeIter firstiter
, iter
, tmpiter
;
257 struct registry_key
*k
, *sub
;
262 gtk_tree_model_iter_children(GTK_TREE_MODEL(store_keys
), &firstiter
, parent
);
264 /* See if this row has ever had a name gtk_tree_store_set()'ed to it.
265 If not, read the directory contents */
266 gtk_tree_model_get(GTK_TREE_MODEL(store_keys
), &firstiter
, 0, &name
, -1);
270 gtk_tree_model_get(GTK_TREE_MODEL(store_keys
), parent
, 1, &k
, -1);
274 for(i
= 0; W_ERROR_IS_OK(error
= reg_key_get_subkey_by_index(mem_ctx
, k
, i
, &sub
)); i
++) {
276 /* Replace the blank child with the first directory entry
277 You may be tempted to remove the blank child node and then
278 append a new one. Don't. If you remove the blank child
279 node GTK gets confused and won't expand the parent row. */
284 gtk_tree_store_append(store_keys
, &iter
, parent
);
286 gtk_tree_store_set (store_keys
,
294 if(W_ERROR_IS_OK(reg_key_num_subkeys(sub
, &count
)) && count
> 0)
295 gtk_tree_store_append(store_keys
, &tmpiter
, &iter
);
298 if(!W_ERROR_EQUAL(error
, WERR_NO_MORE_ITEMS
)) gtk_show_werror(mainwin
, error
);
301 static void registry_load_hive(struct registry_key
*root
)
303 GtkTreeIter iter
, tmpiter
;
304 gtk_list_store_clear(store_vals
);
306 gtk_tree_store_append(store_keys
, &iter
, NULL
);
307 gtk_tree_store_set (store_keys
,
310 root
->name
?root
->name
:"",
315 gtk_tree_store_append(store_keys
, &tmpiter
, &iter
);
317 gtk_widget_set_sensitive( save
, True
);
318 gtk_widget_set_sensitive( save_as
, True
);
321 static void registry_load_root(void)
323 struct registry_key
*root
;
325 if(!registry
) return;
327 gtk_list_store_clear(store_vals
);
328 gtk_tree_store_clear(store_keys
);
330 for(i
= HKEY_CLASSES_ROOT
; i
<= HKEY_PERFORMANCE_NLSTEXT
; i
++)
332 if (!W_ERROR_IS_OK(reg_get_predefined_key(registry
, i
, &root
))) { continue; }
334 registry_load_hive(root
);
338 static void on_open_file_activate (GtkMenuItem
*menuitem
, gpointer user_data
)
340 gint result
= gtk_dialog_run(GTK_DIALOG(create_openfilewin()));
341 char *filename
, *tmp
;
342 struct registry_key
*root
;
345 case GTK_RESPONSE_OK
:
346 filename
= strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(openfilewin
)));
347 error
= reg_open_hive(NULL
, user_data
, filename
, NULL
, &root
);
348 if(!W_ERROR_IS_OK(error
)) {
349 gtk_show_werror(mainwin
, error
);
353 tmp
= g_strdup_printf("Registry Editor - %s", filename
);
354 gtk_window_set_title (GTK_WINDOW (mainwin
), tmp
);
356 gtk_tree_store_clear(store_keys
);
357 registry_load_hive(root
);
363 gtk_widget_destroy(openfilewin
);
366 static void on_open_gconf_activate (GtkMenuItem
*menuitem
,
369 struct registry_key
*root
;
370 WERROR error
= reg_open_hive(NULL
, "gconf", NULL
, NULL
, &root
);
371 if(!W_ERROR_IS_OK(error
)) {
372 gtk_show_werror(mainwin
, error
);
376 gtk_window_set_title (GTK_WINDOW (mainwin
), "Registry Editor - GConf");
378 gtk_tree_store_clear(store_keys
);
379 registry_load_hive(root
);
382 static void on_open_local_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
384 WERROR error
= reg_open_local(®istry
);
385 if(!W_ERROR_IS_OK(error
)) {
386 gtk_show_werror(mainwin
, error
);
389 registry_load_root();
392 static void on_open_remote_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
395 GtkWidget
*rpcwin
= GTK_WIDGET(gtk_rpc_binding_dialog_new(FALSE
, NULL
));
396 gint result
= gtk_dialog_run(GTK_DIALOG(rpcwin
));
399 if(result
!= GTK_RESPONSE_ACCEPT
)
401 gtk_widget_destroy(rpcwin
);
405 error
= reg_open_remote(®istry
,
406 gtk_rpc_binding_dialog_get_username(GTK_RPC_BINDING_DIALOG(rpcwin
)),
407 gtk_rpc_binding_dialog_get_password(GTK_RPC_BINDING_DIALOG(rpcwin
)),
408 gtk_rpc_binding_dialog_get_binding_string(GTK_RPC_BINDING_DIALOG(rpcwin
), mem_ctx
));
410 if(!W_ERROR_IS_OK(error
)) {
411 gtk_show_werror(mainwin
, error
);
412 gtk_widget_destroy(rpcwin
);
416 tmp
= g_strdup_printf("Registry Editor - Remote Registry at %s", gtk_rpc_binding_dialog_get_host(GTK_RPC_BINDING_DIALOG(rpcwin
)));
417 gtk_window_set_title (GTK_WINDOW (mainwin
), tmp
);
420 registry_load_root();
423 gtk_widget_destroy(rpcwin
);
427 static void on_save_activate (GtkMenuItem
*menuitem
,
430 WERROR error
= reg_save(registry
, NULL
);
431 if(!W_ERROR_IS_OK(error
)) {
432 gtk_show_werror(mainwin
, error
);
437 static void on_save_as_activate (GtkMenuItem
*menuitem
,
442 create_savefilewin();
443 result
= gtk_dialog_run(GTK_DIALOG(savefilewin
));
445 case GTK_RESPONSE_OK
:
446 error
= reg_save(registry
, gtk_file_selection_get_filename(GTK_FILE_SELECTION(savefilewin
)));
447 if(!W_ERROR_IS_OK(error
)) {
448 gtk_show_werror(mainwin
, error
);
456 gtk_widget_destroy(savefilewin
);
460 static void on_quit_activate (GtkMenuItem
*menuitem
,
467 static void on_delete_value_activate (GtkMenuItem
*menuitem
,
474 if (!gtk_tree_selection_get_selected (gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_vals
)), NULL
, &iter
)) {
478 gtk_tree_model_get(GTK_TREE_MODEL(store_vals
), &iter
, 0, &value
, -1);
480 error
= reg_del_value(current_key
, value
);
482 if (!W_ERROR_IS_OK(error
)) {
483 gtk_show_werror(NULL
, error
);
488 static void on_delete_key_activate (GtkMenuItem
*menuitem
,
492 GtkTreeIter iter
, parentiter
;
493 struct registry_key
*parent_key
;
495 if (!gtk_tree_selection_get_selected (gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_keys
)), NULL
, &iter
)) {
499 if (!gtk_tree_model_iter_parent(GTK_TREE_MODEL(store_keys
), &parentiter
, &iter
)) {
503 gtk_tree_model_get(GTK_TREE_MODEL(store_keys
), &parentiter
, 1, &parent_key
, -1);
505 error
= reg_key_del(parent_key
, current_key
->name
);
507 if (!W_ERROR_IS_OK(error
)) {
508 gtk_show_werror(NULL
, error
);
513 static void on_add_key_activate (GtkMenuItem
*menuitem
,
517 GtkDialog
*addwin
= GTK_DIALOG(create_NewKeyDialog(&entry
));
518 gint result
= gtk_dialog_run(addwin
);
520 if (result
== GTK_RESPONSE_OK
)
522 struct registry_key
*newkey
;
523 WERROR error
= reg_key_add_name(mem_ctx
, current_key
, gtk_entry_get_text(GTK_ENTRY(entry
)), 0, NULL
, &newkey
);
525 if (!W_ERROR_IS_OK(error
)) {
526 gtk_show_werror(NULL
, error
);
530 gtk_widget_destroy(GTK_WIDGET(addwin
));
533 static void on_value_activate(GtkTreeView
*treeview
, GtkTreePath
*arg1
,
534 GtkTreeViewColumn
*arg2
, gpointer user_data
)
536 GtkWidget
*entry_name
, *entry_type
, *entry_value
;
537 GtkDialog
*addwin
= GTK_DIALOG(create_SetValueDialog(&entry_name
, &entry_type
, &entry_value
));
539 struct registry_value
*value
;
542 gtk_tree_model_get_iter(GTK_TREE_MODEL(store_vals
), &iter
, arg1
);
544 gtk_tree_model_get(GTK_TREE_MODEL(store_vals
), &iter
, 3, &value
, -1);
546 gtk_widget_set_sensitive(entry_name
, FALSE
);
547 gtk_entry_set_text(GTK_ENTRY(entry_name
), value
->name
);
548 gtk_entry_set_text(GTK_ENTRY(entry_value
), reg_val_data_string(mem_ctx
, value
));
549 gtk_combo_box_set_active(GTK_COMBO_BOX(entry_type
), value
->data_type
);
551 result
= gtk_dialog_run(addwin
);
552 if (result
== GTK_RESPONSE_OK
)
555 struct registry_value
*val
;
557 reg_string_to_val(mem_ctx
,str_regtype(gtk_combo_box_get_active(GTK_COMBO_BOX(entry_type
))), gtk_entry_get_text(GTK_ENTRY(entry_value
)), &val
);
559 error
= reg_val_set(current_key
, gtk_entry_get_text(GTK_ENTRY(entry_name
)), val
->data_type
, val
->data_blk
, val
->data_len
);
561 if (!W_ERROR_IS_OK(error
)) {
562 gtk_show_werror(NULL
, error
);
565 gtk_widget_destroy(GTK_WIDGET(addwin
));
569 static void on_set_value_activate (GtkMenuItem
*menuitem
,
572 GtkWidget
*entry_name
, *entry_type
, *entry_value
;
573 GtkDialog
*addwin
= GTK_DIALOG(create_SetValueDialog(&entry_name
, &entry_type
, &entry_value
));
574 gint result
= gtk_dialog_run(addwin
);
575 if (result
== GTK_RESPONSE_OK
)
578 struct registry_value
*val
;
580 reg_string_to_val(mem_ctx
,str_regtype(gtk_combo_box_get_active(GTK_COMBO_BOX(entry_type
))), gtk_entry_get_text(GTK_ENTRY(entry_value
)), &val
);
582 error
= reg_val_set(current_key
, gtk_entry_get_text(GTK_ENTRY(entry_name
)), val
->data_type
, val
->data_blk
, val
->data_len
);
584 if (!W_ERROR_IS_OK(error
)) {
585 gtk_show_werror(NULL
, error
);
588 gtk_widget_destroy(GTK_WIDGET(addwin
));
591 static void on_find_activate (GtkMenuItem
*menuitem
,
594 GtkDialog
*findwin
= GTK_DIALOG(create_FindDialog());
595 /*gint result = gtk_dialog_run(findwin);
597 gtk_widget_destroy(GTK_WIDGET(findwin
));
600 static void on_about_activate (GtkMenuItem
*menuitem
,
603 GtkDialog
*aboutwin
= GTK_DIALOG(create_gtk_samba_about_dialog("gregedit"));
604 gtk_dialog_run(aboutwin
);
605 gtk_widget_destroy(GTK_WIDGET(aboutwin
));
608 gboolean
on_key_activate(GtkTreeSelection
*selection
,
611 gboolean path_currently_selected
,
615 struct registry_key
*k
;
616 struct registry_value
*val
;
620 gtk_widget_set_sensitive(mnu_add_key
, !path_currently_selected
);
621 gtk_widget_set_sensitive(mnu_set_value
, !path_currently_selected
);
622 gtk_widget_set_sensitive(mnu_del_key
, !path_currently_selected
);
623 gtk_widget_set_sensitive(mnu_del_value
, !path_currently_selected
);
624 gtk_widget_set_sensitive(mnu_find
, !path_currently_selected
);
626 if(path_currently_selected
) {
631 gtk_tree_model_get_iter(GTK_TREE_MODEL(store_keys
), &parent
, path
);
632 gtk_tree_model_get(GTK_TREE_MODEL(store_keys
), &parent
, 1, &k
, -1);
636 if (!k
) return FALSE
;
638 gtk_list_store_clear(store_vals
);
640 for(i
= 0; W_ERROR_IS_OK(error
= reg_key_get_value_by_index(mem_ctx
, k
, i
, &val
)); i
++) {
642 gtk_list_store_append(store_vals
, &iter
);
643 gtk_list_store_set (store_vals
,
648 str_regtype(val
->data_type
),
650 reg_val_data_string(mem_ctx
, val
),
656 if(!W_ERROR_EQUAL(error
, WERR_NO_MORE_ITEMS
)) {
657 gtk_show_werror(mainwin
, error
);
663 static GtkWidget
* create_mainwin (void)
667 GtkWidget
*menu_file
;
668 GtkWidget
*menu_file_menu
;
672 GtkWidget
*open_gconf
;
673 GtkWidget
*open_remote
;
674 GtkWidget
*open_local
;
675 GtkWidget
*separatormenuitem1
;
678 GtkWidget
*men_key_menu
;
679 GtkCellRenderer
*renderer
;
680 GtkTreeViewColumn
*curcol
;
682 GtkWidget
*help_menu
;
685 GtkWidget
*scrolledwindow1
;
686 GtkWidget
*scrolledwindow2
;
687 GtkWidget
*statusbar
;
688 GtkAccelGroup
*accel_group
;
690 accel_group
= gtk_accel_group_new ();
692 mainwin
= gtk_window_new (GTK_WINDOW_TOPLEVEL
);
693 gtk_window_set_title (GTK_WINDOW (mainwin
), "Registry editor");
694 gtk_window_set_default_size (GTK_WINDOW (mainwin
), 642, 562);
696 vbox1
= gtk_vbox_new (FALSE
, 0);
697 gtk_container_add (GTK_CONTAINER (mainwin
), vbox1
);
699 menubar
= gtk_menu_bar_new ();
700 gtk_box_pack_start (GTK_BOX (vbox1
), menubar
, FALSE
, FALSE
, 0);
702 menu_file
= gtk_menu_item_new_with_mnemonic ("_File");
703 gtk_container_add (GTK_CONTAINER (menubar
), menu_file
);
705 menu_file_menu
= gtk_menu_new ();
706 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_file
), menu_file_menu
);
708 open_local
= gtk_menu_item_new_with_mnemonic ("Open _Local");
709 gtk_container_add (GTK_CONTAINER (menu_file_menu
), open_local
);
710 g_signal_connect ((gpointer
) open_local
, "activate",
711 G_CALLBACK (on_open_local_activate
), NULL
);
713 if(reg_has_backend("rpc")) {
714 open_remote
= gtk_menu_item_new_with_mnemonic ("Open _Remote");
715 gtk_container_add (GTK_CONTAINER (menu_file_menu
), open_remote
);
717 g_signal_connect ((gpointer
) open_remote
, "activate",
718 G_CALLBACK (on_open_remote_activate
),
722 separatormenuitem1
= gtk_menu_item_new ();
723 gtk_container_add (GTK_CONTAINER (menu_file_menu
), separatormenuitem1
);
724 gtk_widget_set_sensitive (separatormenuitem1
, FALSE
);
727 if(reg_has_backend("nt4")) {
728 open_nt4
= gtk_image_menu_item_new_with_mnemonic("Open _NT4 file");
729 gtk_container_add (GTK_CONTAINER (menu_file_menu
), open_nt4
);
731 g_signal_connect(open_nt4
, "activate",
732 G_CALLBACK (on_open_file_activate
),
733 discard_const_p(char, "nt4"));
736 if(reg_has_backend("w95")) {
737 open_w95
= gtk_image_menu_item_new_with_mnemonic("Open Win_9x file");
738 gtk_container_add (GTK_CONTAINER (menu_file_menu
), open_w95
);
740 g_signal_connect (open_w95
, "activate",
741 G_CALLBACK (on_open_file_activate
),
742 discard_const_p(char, "w95"));
745 if(reg_has_backend("gconf")) {
746 open_gconf
= gtk_image_menu_item_new_with_mnemonic ("Open _GConf");
747 gtk_container_add (GTK_CONTAINER (menu_file_menu
), open_gconf
);
749 g_signal_connect ((gpointer
) open_gconf
, "activate",
750 G_CALLBACK (on_open_gconf_activate
),
754 if(reg_has_backend("ldb")) {
755 open_ldb
= gtk_image_menu_item_new_with_mnemonic("Open _LDB file");
756 gtk_container_add (GTK_CONTAINER (menu_file_menu
), open_ldb
);
758 g_signal_connect(open_ldb
, "activate",
759 G_CALLBACK (on_open_file_activate
),
760 discard_const_p(char, "ldb"));
763 save
= gtk_image_menu_item_new_from_stock ("gtk-save", accel_group
);
764 gtk_widget_set_sensitive( save
, False
);
765 gtk_container_add (GTK_CONTAINER (menu_file_menu
), save
);
767 save_as
= gtk_image_menu_item_new_from_stock ("gtk-save-as", accel_group
);
768 gtk_widget_set_sensitive( save_as
, False
);
769 gtk_container_add (GTK_CONTAINER (menu_file_menu
), save_as
);
771 separatormenuitem1
= gtk_menu_item_new ();
772 gtk_container_add (GTK_CONTAINER (menu_file_menu
), separatormenuitem1
);
773 gtk_widget_set_sensitive (separatormenuitem1
, FALSE
);
775 quit
= gtk_image_menu_item_new_from_stock ("gtk-quit", accel_group
);
776 gtk_container_add (GTK_CONTAINER (menu_file_menu
), quit
);
778 men_key
= gtk_menu_item_new_with_mnemonic ("_Key");
779 gtk_container_add (GTK_CONTAINER (menubar
), men_key
);
781 men_key_menu
= gtk_menu_new ();
782 gtk_menu_item_set_submenu (GTK_MENU_ITEM (men_key
), men_key_menu
);
784 mnu_add_key
= gtk_image_menu_item_new_with_mnemonic("Add _Subkey");
785 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_add_key
), gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU
));
787 gtk_widget_set_sensitive(mnu_add_key
, False
);
788 gtk_container_add (GTK_CONTAINER (men_key_menu
), mnu_add_key
);
790 mnu_set_value
= gtk_image_menu_item_new_with_mnemonic("Set _Value");
791 gtk_widget_set_sensitive(mnu_set_value
, False
);
792 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_set_value
), gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU
));
793 gtk_container_add (GTK_CONTAINER (men_key_menu
), mnu_set_value
);
795 mnu_find
= gtk_image_menu_item_new_from_stock ("gtk-find", accel_group
);
796 gtk_widget_set_sensitive(mnu_find
, False
);
797 gtk_container_add (GTK_CONTAINER (men_key_menu
), mnu_find
);
799 mnu_del_key
= gtk_image_menu_item_new_with_mnemonic ("Delete Key");
800 gtk_widget_set_sensitive(mnu_del_key
, False
);
801 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_del_value
), gtk_image_new_from_stock ("gtk-delete", GTK_ICON_SIZE_MENU
));
802 gtk_container_add (GTK_CONTAINER (men_key_menu
), mnu_del_key
);
804 mnu_del_value
= gtk_image_menu_item_new_with_mnemonic ("Delete Value");
805 gtk_widget_set_sensitive(mnu_del_value
, False
);
806 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_del_value
), gtk_image_new_from_stock ("gtk-delete", GTK_ICON_SIZE_MENU
));
807 gtk_container_add (GTK_CONTAINER (men_key_menu
), mnu_del_value
);
810 help
= gtk_menu_item_new_with_mnemonic ("_Help");
811 gtk_container_add (GTK_CONTAINER (menubar
), help
);
813 help_menu
= gtk_menu_new ();
814 gtk_menu_item_set_submenu (GTK_MENU_ITEM (help
), help_menu
);
816 about
= gtk_menu_item_new_with_mnemonic ("_About");
817 gtk_container_add (GTK_CONTAINER (help_menu
), about
);
819 hbox1
= gtk_hbox_new (FALSE
, 0);
820 gtk_box_pack_start (GTK_BOX (vbox1
), hbox1
, TRUE
, TRUE
, 0);
822 scrolledwindow1
= gtk_scrolled_window_new (NULL
, NULL
);
823 gtk_box_pack_start (GTK_BOX (hbox1
), scrolledwindow1
, TRUE
, TRUE
, 0);
825 tree_keys
= gtk_tree_view_new ();
828 curcol
= gtk_tree_view_column_new ();
829 gtk_tree_view_column_set_title(curcol
, "Name");
830 renderer
= gtk_cell_renderer_text_new();
831 gtk_tree_view_column_pack_start(curcol
, renderer
, True
);
833 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_keys
), curcol
);
835 gtk_tree_view_column_add_attribute(curcol
, renderer
, "text", 0);
836 gtk_container_add (GTK_CONTAINER (scrolledwindow1
), tree_keys
);
837 store_keys
= gtk_tree_store_new(2, G_TYPE_STRING
, G_TYPE_POINTER
);
838 gtk_tree_view_set_model(GTK_TREE_VIEW(tree_keys
), GTK_TREE_MODEL(store_keys
));
839 g_object_unref(store_keys
);
841 gtk_tree_selection_set_select_function (gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_keys
)), on_key_activate
, NULL
, NULL
);
843 g_signal_connect ((gpointer
) tree_keys
, "row-expanded",
844 G_CALLBACK (expand_key
),
848 scrolledwindow2
= gtk_scrolled_window_new (NULL
, NULL
);
849 gtk_box_pack_start (GTK_BOX (hbox1
), scrolledwindow2
, TRUE
, TRUE
, 0);
851 tree_vals
= gtk_tree_view_new ();
854 curcol
= gtk_tree_view_column_new ();
855 gtk_tree_view_column_set_title(curcol
, "Name");
856 renderer
= gtk_cell_renderer_text_new();
857 gtk_tree_view_column_pack_start(curcol
, renderer
, True
);
858 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_vals
), curcol
);
859 gtk_tree_view_column_add_attribute(curcol
, renderer
, "text", 0);
861 curcol
= gtk_tree_view_column_new ();
862 gtk_tree_view_column_set_title(curcol
, "Type");
863 renderer
= gtk_cell_renderer_text_new();
864 gtk_tree_view_column_pack_start(curcol
, renderer
, True
);
865 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_vals
), curcol
);
866 gtk_tree_view_column_add_attribute(curcol
, renderer
, "text", 1);
868 curcol
= gtk_tree_view_column_new ();
869 gtk_tree_view_column_set_title(curcol
, "Value");
870 renderer
= gtk_cell_renderer_text_new();
871 gtk_tree_view_column_pack_start(curcol
, renderer
, True
);
872 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_vals
), curcol
);
873 gtk_tree_view_column_add_attribute(curcol
, renderer
, "text", 2);
876 gtk_container_add (GTK_CONTAINER (scrolledwindow2
), tree_vals
);
878 store_vals
= gtk_list_store_new(4, G_TYPE_STRING
, G_TYPE_STRING
, G_TYPE_STRING
, G_TYPE_POINTER
);
879 gtk_tree_view_set_model(GTK_TREE_VIEW(tree_vals
), GTK_TREE_MODEL(store_vals
));
880 g_object_unref(store_vals
);
882 statusbar
= gtk_statusbar_new ();
883 gtk_box_pack_start (GTK_BOX (vbox1
), statusbar
, FALSE
, FALSE
, 0);
884 gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (statusbar
), FALSE
);
886 g_signal_connect ((gpointer
) save
, "activate",
887 G_CALLBACK (on_save_activate
),
889 g_signal_connect ((gpointer
) save_as
, "activate",
890 G_CALLBACK (on_save_as_activate
),
892 g_signal_connect ((gpointer
) quit
, "activate",
893 G_CALLBACK (on_quit_activate
),
895 g_signal_connect ((gpointer
) mnu_add_key
, "activate",
896 G_CALLBACK (on_add_key_activate
),
898 g_signal_connect ((gpointer
) mnu_set_value
, "activate",
899 G_CALLBACK (on_set_value_activate
),
901 g_signal_connect ((gpointer
) mnu_find
, "activate",
902 G_CALLBACK (on_find_activate
),
904 g_signal_connect ((gpointer
) mnu_del_key
, "activate",
905 G_CALLBACK (on_delete_key_activate
),
907 g_signal_connect ((gpointer
) mnu_del_value
, "activate",
908 G_CALLBACK (on_delete_value_activate
),
910 g_signal_connect ((gpointer
) about
, "activate",
911 G_CALLBACK (on_about_activate
),
914 g_signal_connect ((gpointer
) tree_vals
, "row-activated",
915 G_CALLBACK (on_value_activate
),
919 gtk_window_add_accel_group (GTK_WINDOW (mainwin
), accel_group
);
924 static GtkWidget
* create_openfilewin (void)
926 GtkWidget
*ok_button
;
927 GtkWidget
*cancel_button
;
929 openfilewin
= gtk_file_selection_new ("Select File");
930 gtk_container_set_border_width (GTK_CONTAINER (openfilewin
), 10);
932 ok_button
= GTK_FILE_SELECTION (openfilewin
)->ok_button
;
933 GTK_WIDGET_SET_FLAGS (ok_button
, GTK_CAN_DEFAULT
);
935 cancel_button
= GTK_FILE_SELECTION (openfilewin
)->cancel_button
;
936 GTK_WIDGET_SET_FLAGS (cancel_button
, GTK_CAN_DEFAULT
);
941 static GtkWidget
* create_savefilewin (void)
943 GtkWidget
*ok_button
;
944 GtkWidget
*cancel_button
;
946 savefilewin
= gtk_file_selection_new ("Select File");
947 gtk_container_set_border_width (GTK_CONTAINER (savefilewin
), 10);
949 ok_button
= GTK_FILE_SELECTION (savefilewin
)->ok_button
;
950 GTK_WIDGET_SET_FLAGS (ok_button
, GTK_CAN_DEFAULT
);
952 cancel_button
= GTK_FILE_SELECTION (savefilewin
)->cancel_button
;
953 GTK_WIDGET_SET_FLAGS (cancel_button
, GTK_CAN_DEFAULT
);
958 int main(int argc
, char *argv
[])
963 struct poptOption long_options
[] = {
968 gregedit_init_subsystems
;
970 lp_load(dyn_CONFIGFILE
,True
,False
,False
);
973 gtk_init (&argc
, &argv
);
974 mem_ctx
= talloc_init("gregedit");
976 pc
= poptGetContext(argv
[0], argc
, (const char **) argv
, long_options
,0);
978 while((opt
= poptGetNextOpt(pc
)) != -1) {
981 error
= reg_open_local(®istry
);
982 if(!W_ERROR_IS_OK(error
)) {
983 gtk_show_werror(mainwin
, error
);
986 mainwin
= create_mainwin ();
987 registry_load_root();
989 gtk_widget_show_all (mainwin
);
993 talloc_destroy(mem_ctx
);