2 Unix SMB/CIFS implementation.
5 Copyright (C) Jelmer Vernooij 2004-2005
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 "lib/registry/registry.h"
24 #include "gtk/common/gtk-smb.h"
25 #include "lib/events/events.h"
26 #include "lib/registry/reg_backend_rpc.h"
27 #include "auth/credentials/credentials.h"
29 static GtkTreeStore
*store_keys
;
30 static GtkListStore
*store_vals
;
31 static GtkWidget
*tree_keys
;
32 static GtkWidget
*tree_vals
;
33 static GtkWidget
*mainwin
;
34 static GtkWidget
*mnu_add_key
, *mnu_set_value
, *mnu_del_key
, *mnu_del_value
, *mnu_find
;
35 static TALLOC_CTX
*mem_ctx
; /* FIXME: Split up */
37 static GtkWidget
*save
;
38 static GtkWidget
*save_as
;
39 static GtkWidget
* create_openfilewin (void);
40 static GtkWidget
* create_savefilewin (void);
41 struct registry_context
*registry
= NULL
;
42 struct registry_key
*current_key
= NULL
;
44 static GtkWidget
* create_FindDialog (void)
46 GtkWidget
*FindDialog
;
47 GtkWidget
*dialog_vbox2
;
51 GtkWidget
*entry_pattern
;
53 GtkWidget
*alignment3
;
55 GtkWidget
*checkbutton1
;
56 GtkWidget
*checkbutton2
;
57 GtkWidget
*checkbutton3
;
59 GtkWidget
*dialog_action_area2
;
60 GtkWidget
*cancelbutton2
;
63 FindDialog
= gtk_dialog_new ();
64 gtk_window_set_title (GTK_WINDOW (FindDialog
), "Find Key or Value");
65 gtk_window_set_resizable (GTK_WINDOW (FindDialog
), FALSE
);
66 gtk_window_set_type_hint (GTK_WINDOW (FindDialog
), GDK_WINDOW_TYPE_HINT_DIALOG
);
68 dialog_vbox2
= GTK_DIALOG (FindDialog
)->vbox
;
70 vbox1
= gtk_vbox_new (FALSE
, 0);
71 gtk_box_pack_start (GTK_BOX (dialog_vbox2
), vbox1
, TRUE
, TRUE
, 0);
73 hbox1
= gtk_hbox_new (FALSE
, 0);
74 gtk_box_pack_start (GTK_BOX (vbox1
), hbox1
, TRUE
, TRUE
, 0);
76 label6
= gtk_label_new ("Find String");
77 gtk_box_pack_start (GTK_BOX (hbox1
), label6
, FALSE
, FALSE
, 0);
79 entry_pattern
= gtk_entry_new ();
80 gtk_box_pack_start (GTK_BOX (hbox1
), entry_pattern
, TRUE
, TRUE
, 0);
82 frame3
= gtk_frame_new (NULL
);
83 gtk_box_pack_start (GTK_BOX (vbox1
), frame3
, TRUE
, TRUE
, 0);
84 gtk_frame_set_shadow_type (GTK_FRAME (frame3
), GTK_SHADOW_NONE
);
86 alignment3
= gtk_alignment_new (0.5, 0.5, 1, 1);
87 gtk_container_add (GTK_CONTAINER (frame3
), alignment3
);
88 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment3
), 0, 0, 12, 0);
90 vbox2
= gtk_vbox_new (FALSE
, 0);
91 gtk_container_add (GTK_CONTAINER (alignment3
), vbox2
);
93 checkbutton1
= gtk_check_button_new_with_mnemonic ("_Key Names");
94 gtk_box_pack_start (GTK_BOX (vbox2
), checkbutton1
, FALSE
, FALSE
, 0);
96 checkbutton2
= gtk_check_button_new_with_mnemonic ("_Value Names");
97 gtk_box_pack_start (GTK_BOX (vbox2
), checkbutton2
, FALSE
, FALSE
, 0);
99 checkbutton3
= gtk_check_button_new_with_mnemonic ("Value _Data");
100 gtk_box_pack_start (GTK_BOX (vbox2
), checkbutton3
, FALSE
, FALSE
, 0);
102 label7
= gtk_label_new ("<b>Search in</b>");
103 gtk_frame_set_label_widget (GTK_FRAME (frame3
), label7
);
104 gtk_label_set_use_markup (GTK_LABEL (label7
), TRUE
);
106 dialog_action_area2
= GTK_DIALOG (FindDialog
)->action_area
;
107 gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area2
), GTK_BUTTONBOX_END
);
109 cancelbutton2
= gtk_button_new_from_stock ("gtk-cancel");
110 gtk_dialog_add_action_widget (GTK_DIALOG (FindDialog
), cancelbutton2
, GTK_RESPONSE_CANCEL
);
111 GTK_WIDGET_SET_FLAGS (cancelbutton2
, GTK_CAN_DEFAULT
);
113 okbutton2
= gtk_button_new_from_stock ("gtk-ok");
114 gtk_dialog_add_action_widget (GTK_DIALOG (FindDialog
), okbutton2
, GTK_RESPONSE_OK
);
115 GTK_WIDGET_SET_FLAGS (okbutton2
, GTK_CAN_DEFAULT
);
117 gtk_widget_show_all (dialog_vbox2
);
122 static GtkWidget
* create_SetValueDialog (GtkWidget
**entry_name
, GtkWidget
**entry_type
, GtkWidget
**entry_data
)
124 GtkWidget
*SetValueDialog
;
125 GtkWidget
*dialog_vbox1
;
130 GtkWidget
*entry_value_name
;
131 GtkWidget
*value_data
;
132 GtkWidget
*combo_data_type
;
133 GtkWidget
*dialog_action_area1
;
134 GtkWidget
*cancelbutton1
;
135 GtkWidget
*okbutton1
;
137 SetValueDialog
= gtk_dialog_new ();
138 gtk_window_set_title (GTK_WINDOW (SetValueDialog
), "Set Registry Value");
139 gtk_window_set_position (GTK_WINDOW (SetValueDialog
), GTK_WIN_POS_CENTER
);
140 gtk_window_set_resizable (GTK_WINDOW (SetValueDialog
), FALSE
);
141 gtk_window_set_type_hint (GTK_WINDOW (SetValueDialog
), GDK_WINDOW_TYPE_HINT_DIALOG
);
143 dialog_vbox1
= GTK_DIALOG (SetValueDialog
)->vbox
;
145 table1
= gtk_table_new (3, 2, FALSE
);
146 gtk_box_pack_start (GTK_BOX (dialog_vbox1
), table1
, TRUE
, TRUE
, 0);
148 label3
= gtk_label_new ("Value name:");
149 gtk_table_attach (GTK_TABLE (table1
), label3
, 0, 1, 0, 1,
150 (GtkAttachOptions
) (GTK_FILL
),
151 (GtkAttachOptions
) (0), 0, 0);
152 gtk_misc_set_alignment (GTK_MISC (label3
), 0, 0.5);
154 label4
= gtk_label_new ("Data Type:");
155 gtk_table_attach (GTK_TABLE (table1
), label4
, 0, 1, 1, 2,
156 (GtkAttachOptions
) (GTK_FILL
),
157 (GtkAttachOptions
) (0), 0, 0);
158 gtk_misc_set_alignment (GTK_MISC (label4
), 0, 0.5);
160 label5
= gtk_label_new ("Data:");
161 gtk_table_attach (GTK_TABLE (table1
), label5
, 0, 1, 2, 3,
162 (GtkAttachOptions
) (GTK_FILL
),
163 (GtkAttachOptions
) (0), 0, 0);
164 gtk_misc_set_alignment (GTK_MISC (label5
), 0, 0.5);
166 *entry_name
= entry_value_name
= gtk_entry_new ();
167 gtk_table_attach (GTK_TABLE (table1
), entry_value_name
, 1, 2, 0, 1,
168 (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
),
169 (GtkAttachOptions
) (0), 0, 0);
171 *entry_data
= value_data
= gtk_entry_new ();
172 gtk_table_attach (GTK_TABLE (table1
), value_data
, 1, 2, 2, 3,
173 (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
),
174 (GtkAttachOptions
) (0), 0, 0);
176 *entry_type
= combo_data_type
= gtk_combo_box_new_text ();
178 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type
), "REG_NONE");
179 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type
), "REG_SZ");
180 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type
), "REG_EXPAND_SZ");
181 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type
), "REG_BINARY");
182 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type
), "REG_DWORD_LE");
183 gtk_combo_box_append_text(GTK_COMBO_BOX(combo_data_type
), "REG_DWORD_BE");
185 gtk_table_attach (GTK_TABLE (table1
), combo_data_type
, 1, 2, 1, 2,
186 (GtkAttachOptions
) (GTK_FILL
),
187 (GtkAttachOptions
) (GTK_FILL
), 0, 0);
189 dialog_action_area1
= GTK_DIALOG (SetValueDialog
)->action_area
;
190 gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1
), GTK_BUTTONBOX_END
);
192 cancelbutton1
= gtk_button_new_from_stock ("gtk-cancel");
193 gtk_dialog_add_action_widget (GTK_DIALOG (SetValueDialog
), cancelbutton1
, GTK_RESPONSE_CANCEL
);
194 GTK_WIDGET_SET_FLAGS (cancelbutton1
, GTK_CAN_DEFAULT
);
196 okbutton1
= gtk_button_new_from_stock ("gtk-ok");
197 gtk_dialog_add_action_widget (GTK_DIALOG (SetValueDialog
), okbutton1
, GTK_RESPONSE_OK
);
198 GTK_WIDGET_SET_FLAGS (okbutton1
, GTK_CAN_DEFAULT
);
200 gtk_widget_show_all (dialog_vbox1
);
202 return SetValueDialog
;
205 static GtkWidget
* create_NewKeyDialog (GtkWidget
**name_entry
)
207 GtkWidget
*NewKeyDialog
;
208 GtkWidget
*dialog_vbox2
;
211 GtkWidget
*entry_key_name
;
212 GtkWidget
*dialog_action_area2
;
213 GtkWidget
*cancelbutton2
;
214 GtkWidget
*okbutton2
;
216 NewKeyDialog
= gtk_dialog_new ();
217 gtk_window_set_title (GTK_WINDOW (NewKeyDialog
), "New Registry Key");
218 gtk_window_set_position (GTK_WINDOW (NewKeyDialog
), GTK_WIN_POS_CENTER
);
219 gtk_window_set_resizable (GTK_WINDOW (NewKeyDialog
), FALSE
);
220 gtk_window_set_type_hint (GTK_WINDOW (NewKeyDialog
), GDK_WINDOW_TYPE_HINT_DIALOG
);
222 dialog_vbox2
= GTK_DIALOG (NewKeyDialog
)->vbox
;
224 hbox1
= gtk_hbox_new (FALSE
, 0);
225 gtk_box_pack_start (GTK_BOX (dialog_vbox2
), hbox1
, TRUE
, TRUE
, 0);
227 label6
= gtk_label_new ("Name:");
228 gtk_box_pack_start (GTK_BOX (hbox1
), label6
, FALSE
, FALSE
, 0);
230 entry_key_name
= gtk_entry_new ();
231 gtk_box_pack_start (GTK_BOX (hbox1
), entry_key_name
, TRUE
, TRUE
, 0);
233 dialog_action_area2
= GTK_DIALOG (NewKeyDialog
)->action_area
;
234 gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area2
), GTK_BUTTONBOX_END
);
236 *name_entry
= entry_key_name
;
238 cancelbutton2
= gtk_button_new_from_stock ("gtk-cancel");
239 gtk_dialog_add_action_widget (GTK_DIALOG (NewKeyDialog
), cancelbutton2
, GTK_RESPONSE_CANCEL
);
240 GTK_WIDGET_SET_FLAGS (cancelbutton2
, GTK_CAN_DEFAULT
);
242 okbutton2
= gtk_button_new_from_stock ("gtk-ok");
243 gtk_dialog_add_action_widget (GTK_DIALOG (NewKeyDialog
), okbutton2
, GTK_RESPONSE_OK
);
244 GTK_WIDGET_SET_FLAGS (okbutton2
, GTK_CAN_DEFAULT
);
246 gtk_widget_show_all (dialog_vbox2
);
251 static void expand_key(GtkTreeView
*treeview
, GtkTreeIter
*parent
, GtkTreePath
*arg2
)
253 GtkTreeIter firstiter
, iter
, tmpiter
;
254 struct registry_key
*k
, *sub
;
259 gtk_tree_model_iter_children(GTK_TREE_MODEL(store_keys
), &firstiter
, parent
);
261 /* See if this row has ever had a name gtk_tree_store_set()'ed to it.
262 If not, read the directory contents */
263 gtk_tree_model_get(GTK_TREE_MODEL(store_keys
), &firstiter
, 0, &name
, -1);
267 gtk_tree_model_get(GTK_TREE_MODEL(store_keys
), parent
, 1, &k
, -1);
271 for(i
= 0; W_ERROR_IS_OK(error
= reg_key_get_subkey_by_index(mem_ctx
, k
, i
, &sub
)); i
++) {
273 /* Replace the blank child with the first directory entry
274 You may be tempted to remove the blank child node and then
275 append a new one. Don't. If you remove the blank child
276 node GTK gets confused and won't expand the parent row. */
281 gtk_tree_store_append(store_keys
, &iter
, parent
);
283 gtk_tree_store_set (store_keys
,
291 if(W_ERROR_IS_OK(reg_key_num_subkeys(sub
, &count
)) && count
> 0)
292 gtk_tree_store_append(store_keys
, &tmpiter
, &iter
);
295 if(!W_ERROR_EQUAL(error
, WERR_NO_MORE_ITEMS
)) {
296 gtk_show_werror(mainwin
, "While enumerating subkeys", error
);
300 static void registry_load_hive(struct registry_key
*root
)
302 GtkTreeIter iter
, tmpiter
;
303 gtk_list_store_clear(store_vals
);
305 gtk_tree_store_append(store_keys
, &iter
, NULL
);
306 gtk_tree_store_set (store_keys
,
309 root
->name
?root
->name
:"",
314 gtk_tree_store_append(store_keys
, &tmpiter
, &iter
);
316 gtk_widget_set_sensitive( save
, True
);
317 gtk_widget_set_sensitive( save_as
, True
);
320 static void registry_load_root(void)
322 struct registry_key
*root
;
324 if(!registry
) return;
326 gtk_list_store_clear(store_vals
);
327 gtk_tree_store_clear(store_keys
);
329 for(i
= HKEY_CLASSES_ROOT
; i
<= HKEY_PERFORMANCE_NLSTEXT
; i
++)
331 if (!W_ERROR_IS_OK(reg_get_predefined_key(registry
, i
, &root
))) { continue; }
333 registry_load_hive(root
);
337 static void on_open_file_activate (GtkMenuItem
*menuitem
, gpointer user_data
)
339 GtkWidget
*openfilewin
;
341 char *filename
, *tmp
;
342 struct registry_key
*root
;
345 openfilewin
= create_openfilewin();
347 result
= gtk_dialog_run(GTK_DIALOG(openfilewin
));
350 case GTK_RESPONSE_OK
:
351 filename
= strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(openfilewin
)));
352 error
= reg_open_hive(NULL
, user_data
, filename
, NULL
, NULL
, &root
);
353 if(!W_ERROR_IS_OK(error
)) {
354 gtk_show_werror(mainwin
, "Error while opening hive", error
);
358 tmp
= g_strdup_printf("Registry Editor - %s", filename
);
359 gtk_window_set_title (GTK_WINDOW (mainwin
), tmp
);
361 gtk_tree_store_clear(store_keys
);
362 registry_load_hive(root
);
368 gtk_widget_destroy(openfilewin
);
371 static void on_open_gconf_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
373 struct registry_key
*root
;
374 WERROR error
= reg_open_hive(NULL
, "gconf", NULL
, NULL
, NULL
, &root
);
375 if(!W_ERROR_IS_OK(error
)) {
376 gtk_show_werror(mainwin
, "Error while opening GConf", error
);
380 gtk_window_set_title (GTK_WINDOW (mainwin
), "Registry Editor - GConf");
382 gtk_tree_store_clear(store_keys
);
383 registry_load_hive(root
);
386 static void on_open_local_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
388 WERROR error
= reg_open_local(NULL
, ®istry
, NULL
, NULL
);
389 if(!W_ERROR_IS_OK(error
)) {
390 gtk_show_werror(mainwin
, "Error while opening local registry", error
);
393 registry_load_root();
396 static void on_open_remote_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
399 GtkWidget
*rpcwin
= GTK_WIDGET(gtk_rpc_binding_dialog_new(NULL
));
400 gint result
= gtk_dialog_run(GTK_DIALOG(rpcwin
));
402 struct cli_credentials
*creds
;
404 if(result
!= GTK_RESPONSE_ACCEPT
)
406 gtk_widget_destroy(rpcwin
);
410 creds
= cli_credentials_init(mem_ctx
);
411 cli_credentials_guess(creds
);
412 cli_credentials_set_gtk_callbacks(creds
);
414 error
= reg_open_remote(®istry
,
417 gtk_rpc_binding_dialog_get_binding_string(GTK_RPC_BINDING_DIALOG(rpcwin
), mem_ctx
),
420 if(!W_ERROR_IS_OK(error
)) {
421 gtk_show_werror(mainwin
, "Error while opening remote registry", error
);
422 gtk_widget_destroy(rpcwin
);
426 tmp
= g_strdup_printf("Registry Editor - Remote Registry at %s", gtk_rpc_binding_dialog_get_host(GTK_RPC_BINDING_DIALOG(rpcwin
)));
427 gtk_window_set_title (GTK_WINDOW (mainwin
), tmp
);
430 registry_load_root();
433 gtk_widget_destroy(rpcwin
);
437 static void on_save_as_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
440 WERROR error
= WERR_OK
;
441 GtkWidget
*savefilewin
= create_savefilewin();
442 result
= gtk_dialog_run(GTK_DIALOG(savefilewin
));
444 case GTK_RESPONSE_OK
:
445 /* FIXME: error = reg_dump(registry, gtk_file_selection_get_filename(GTK_FILE_SELECTION(savefilewin))); */
446 if(!W_ERROR_IS_OK(error
)) {
447 gtk_show_werror(mainwin
, "Error while saving as", error
);
455 gtk_widget_destroy(savefilewin
);
459 static void on_quit_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
465 static void on_delete_value_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
471 if (!gtk_tree_selection_get_selected (gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_vals
)), NULL
, &iter
)) {
475 gtk_tree_model_get(GTK_TREE_MODEL(store_vals
), &iter
, 0, &value
, -1);
477 error
= reg_del_value(current_key
, value
);
479 if (!W_ERROR_IS_OK(error
)) {
480 gtk_show_werror(NULL
, "Error while deleting value", error
);
485 static void on_delete_key_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
488 GtkTreeIter iter
, parentiter
;
489 struct registry_key
*parent_key
;
491 if (!gtk_tree_selection_get_selected (gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_keys
)), NULL
, &iter
)) {
495 if (!gtk_tree_model_iter_parent(GTK_TREE_MODEL(store_keys
), &parentiter
, &iter
)) {
499 gtk_tree_model_get(GTK_TREE_MODEL(store_keys
), &parentiter
, 1, &parent_key
, -1);
501 error
= reg_key_del(parent_key
, current_key
->name
);
503 if (!W_ERROR_IS_OK(error
)) {
504 gtk_show_werror(NULL
, "Error while deleting key", error
);
509 static void on_add_key_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
512 GtkDialog
*addwin
= GTK_DIALOG(create_NewKeyDialog(&entry
));
513 gint result
= gtk_dialog_run(addwin
);
515 if (result
== GTK_RESPONSE_OK
)
517 struct registry_key
*newkey
;
518 WERROR error
= reg_key_add_name(mem_ctx
, current_key
, gtk_entry_get_text(GTK_ENTRY(entry
)), 0, NULL
, &newkey
);
520 if (!W_ERROR_IS_OK(error
)) {
521 gtk_show_werror(NULL
, "Error while adding key", error
);
525 gtk_widget_destroy(GTK_WIDGET(addwin
));
528 static void on_value_activate(GtkTreeView
*treeview
, GtkTreePath
*arg1
,
529 GtkTreeViewColumn
*arg2
, gpointer user_data
)
531 GtkWidget
*entry_name
, *entry_type
, *entry_value
;
532 GtkDialog
*addwin
= GTK_DIALOG(create_SetValueDialog(&entry_name
, &entry_type
, &entry_value
));
534 struct registry_value
*value
;
537 gtk_tree_model_get_iter(GTK_TREE_MODEL(store_vals
), &iter
, arg1
);
539 gtk_tree_model_get(GTK_TREE_MODEL(store_vals
), &iter
, 3, &value
, -1);
541 gtk_widget_set_sensitive(entry_name
, FALSE
);
542 gtk_entry_set_text(GTK_ENTRY(entry_name
), value
->name
);
543 gtk_entry_set_text(GTK_ENTRY(entry_value
), reg_val_data_string(mem_ctx
, value
->data_type
, &value
->data
));
544 gtk_combo_box_set_active(GTK_COMBO_BOX(entry_type
), value
->data_type
);
546 result
= gtk_dialog_run(addwin
);
547 if (result
== GTK_RESPONSE_OK
)
553 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
)), &data_type
, &data
);
555 error
= reg_val_set(current_key
, gtk_entry_get_text(GTK_ENTRY(entry_name
)), data_type
, data
);
557 if (!W_ERROR_IS_OK(error
)) {
558 gtk_show_werror(NULL
, "Error while setting value", error
);
561 gtk_widget_destroy(GTK_WIDGET(addwin
));
564 static void on_set_value_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
566 GtkWidget
*entry_name
, *entry_type
, *entry_value
;
567 GtkDialog
*addwin
= GTK_DIALOG(create_SetValueDialog(&entry_name
, &entry_type
, &entry_value
));
568 gint result
= gtk_dialog_run(addwin
);
569 if (result
== GTK_RESPONSE_OK
)
575 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
)), &data_type
, &data
);
577 error
= reg_val_set(current_key
, gtk_entry_get_text(GTK_ENTRY(entry_name
)), data_type
, data
);
579 if (!W_ERROR_IS_OK(error
)) {
580 gtk_show_werror(NULL
, "Error while setting value", error
);
583 gtk_widget_destroy(GTK_WIDGET(addwin
));
586 static void on_find_activate(GtkMenuItem
*menuitem
, gpointer user_data
)
588 GtkDialog
*findwin
= GTK_DIALOG(create_FindDialog());
589 /*gint result = gtk_dialog_run(findwin);
591 gtk_widget_destroy(GTK_WIDGET(findwin
));
594 static void on_about_activate (GtkMenuItem
*menuitem
, gpointer user_data
)
596 GtkDialog
*aboutwin
= GTK_DIALOG(create_gtk_samba_about_dialog("gregedit"));
597 gtk_dialog_run(aboutwin
);
598 gtk_widget_destroy(GTK_WIDGET(aboutwin
));
601 static gboolean
on_key_activate(GtkTreeSelection
*selection
,
604 gboolean path_currently_selected
,
608 struct registry_key
*k
;
609 struct registry_value
*val
;
613 gtk_widget_set_sensitive(mnu_add_key
, !path_currently_selected
);
614 gtk_widget_set_sensitive(mnu_set_value
, !path_currently_selected
);
615 gtk_widget_set_sensitive(mnu_del_key
, !path_currently_selected
);
616 gtk_widget_set_sensitive(mnu_del_value
, !path_currently_selected
);
617 gtk_widget_set_sensitive(mnu_find
, !path_currently_selected
);
619 if(path_currently_selected
) {
624 gtk_tree_model_get_iter(GTK_TREE_MODEL(store_keys
), &parent
, path
);
625 gtk_tree_model_get(GTK_TREE_MODEL(store_keys
), &parent
, 1, &k
, -1);
629 if (!k
) return FALSE
;
631 gtk_list_store_clear(store_vals
);
633 for(i
= 0; W_ERROR_IS_OK(error
= reg_key_get_value_by_index(mem_ctx
, k
, i
, &val
)); i
++) {
635 gtk_list_store_append(store_vals
, &iter
);
636 gtk_list_store_set (store_vals
,
641 str_regtype(val
->data_type
),
643 reg_val_data_string(mem_ctx
, val
->data_type
, &val
->data
),
649 if(!W_ERROR_EQUAL(error
, WERR_NO_MORE_ITEMS
)) {
650 gtk_show_werror(mainwin
, "Error while enumerating values", error
);
656 static GtkWidget
* create_mainwindow(void)
660 GtkWidget
*menu_file
;
661 GtkWidget
*menu_file_menu
;
665 GtkWidget
*open_gconf
;
666 GtkWidget
*open_remote
;
667 GtkWidget
*open_local
;
668 GtkWidget
*separatormenuitem1
;
671 GtkWidget
*men_key_menu
;
672 GtkCellRenderer
*renderer
;
673 GtkTreeViewColumn
*curcol
;
675 GtkWidget
*help_menu
;
678 GtkWidget
*scrolledwindow1
;
679 GtkWidget
*scrolledwindow2
;
680 GtkWidget
*statusbar
;
681 GtkAccelGroup
*accel_group
;
683 accel_group
= gtk_accel_group_new ();
685 mainwin
= gtk_window_new (GTK_WINDOW_TOPLEVEL
);
686 gtk_window_set_title (GTK_WINDOW (mainwin
), "Registry editor");
687 gtk_window_set_default_size (GTK_WINDOW (mainwin
), 642, 562);
689 vbox1
= gtk_vbox_new (FALSE
, 0);
690 gtk_container_add (GTK_CONTAINER (mainwin
), vbox1
);
692 menubar
= gtk_menu_bar_new ();
693 gtk_box_pack_start (GTK_BOX (vbox1
), menubar
, FALSE
, FALSE
, 0);
695 menu_file
= gtk_menu_item_new_with_mnemonic ("_File");
696 gtk_container_add (GTK_CONTAINER (menubar
), menu_file
);
698 menu_file_menu
= gtk_menu_new ();
699 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_file
), menu_file_menu
);
701 open_local
= gtk_menu_item_new_with_mnemonic ("Open _Local");
702 gtk_container_add (GTK_CONTAINER (menu_file_menu
), open_local
);
703 g_signal_connect ((gpointer
) open_local
, "activate",
704 G_CALLBACK (on_open_local_activate
), NULL
);
706 if(reg_has_backend("rpc")) {
707 open_remote
= gtk_menu_item_new_with_mnemonic ("Open _Remote");
708 gtk_container_add (GTK_CONTAINER (menu_file_menu
), open_remote
);
710 g_signal_connect ((gpointer
) open_remote
, "activate",
711 G_CALLBACK (on_open_remote_activate
),
715 separatormenuitem1
= gtk_menu_item_new ();
716 gtk_container_add (GTK_CONTAINER (menu_file_menu
), separatormenuitem1
);
717 gtk_widget_set_sensitive (separatormenuitem1
, FALSE
);
720 if(reg_has_backend("nt4")) {
721 open_nt4
= gtk_image_menu_item_new_with_mnemonic("Open _NT4 file");
722 gtk_container_add (GTK_CONTAINER (menu_file_menu
), open_nt4
);
724 g_signal_connect(open_nt4
, "activate",
725 G_CALLBACK (on_open_file_activate
),
726 discard_const_p(char, "nt4"));
729 if(reg_has_backend("w95")) {
730 open_w95
= gtk_image_menu_item_new_with_mnemonic("Open Win_9x file");
731 gtk_container_add (GTK_CONTAINER (menu_file_menu
), open_w95
);
733 g_signal_connect (open_w95
, "activate",
734 G_CALLBACK (on_open_file_activate
),
735 discard_const_p(char, "w95"));
738 if(reg_has_backend("gconf")) {
739 open_gconf
= gtk_image_menu_item_new_with_mnemonic ("Open _GConf");
740 gtk_container_add (GTK_CONTAINER (menu_file_menu
), open_gconf
);
742 g_signal_connect ((gpointer
) open_gconf
, "activate",
743 G_CALLBACK (on_open_gconf_activate
),
747 if(reg_has_backend("ldb")) {
748 open_ldb
= gtk_image_menu_item_new_with_mnemonic("Open _LDB file");
749 gtk_container_add (GTK_CONTAINER (menu_file_menu
), open_ldb
);
751 g_signal_connect(open_ldb
, "activate",
752 G_CALLBACK (on_open_file_activate
),
753 discard_const_p(char, "ldb"));
756 separatormenuitem1
= gtk_menu_item_new ();
757 gtk_container_add (GTK_CONTAINER (menu_file_menu
), separatormenuitem1
);
758 gtk_widget_set_sensitive (separatormenuitem1
, FALSE
);
760 save
= gtk_image_menu_item_new_from_stock ("gtk-save", accel_group
);
761 gtk_widget_set_sensitive( save
, False
);
762 gtk_container_add (GTK_CONTAINER (menu_file_menu
), save
);
764 save_as
= gtk_image_menu_item_new_from_stock ("gtk-save-as", accel_group
);
765 gtk_widget_set_sensitive( save_as
, False
);
766 gtk_container_add (GTK_CONTAINER (menu_file_menu
), save_as
);
768 separatormenuitem1
= gtk_menu_item_new ();
769 gtk_container_add (GTK_CONTAINER (menu_file_menu
), separatormenuitem1
);
770 gtk_widget_set_sensitive (separatormenuitem1
, FALSE
);
772 quit
= gtk_image_menu_item_new_from_stock ("gtk-quit", accel_group
);
773 gtk_container_add (GTK_CONTAINER (menu_file_menu
), quit
);
775 men_key
= gtk_menu_item_new_with_mnemonic ("_Key");
776 gtk_container_add (GTK_CONTAINER (menubar
), men_key
);
778 men_key_menu
= gtk_menu_new ();
779 gtk_menu_item_set_submenu (GTK_MENU_ITEM (men_key
), men_key_menu
);
781 mnu_add_key
= gtk_image_menu_item_new_with_mnemonic("Add _Subkey");
782 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_add_key
), gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU
));
784 gtk_widget_set_sensitive(mnu_add_key
, False
);
785 gtk_container_add (GTK_CONTAINER (men_key_menu
), mnu_add_key
);
787 mnu_set_value
= gtk_image_menu_item_new_with_mnemonic("Set _Value");
788 gtk_widget_set_sensitive(mnu_set_value
, False
);
789 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_set_value
), gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU
));
790 gtk_container_add (GTK_CONTAINER (men_key_menu
), mnu_set_value
);
792 mnu_find
= gtk_image_menu_item_new_from_stock ("gtk-find", accel_group
);
793 gtk_widget_set_sensitive(mnu_find
, False
);
794 gtk_container_add (GTK_CONTAINER (men_key_menu
), mnu_find
);
796 mnu_del_key
= gtk_image_menu_item_new_with_mnemonic ("Delete Key");
797 gtk_widget_set_sensitive(mnu_del_key
, False
);
798 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_del_value
), gtk_image_new_from_stock ("gtk-delete", GTK_ICON_SIZE_MENU
));
799 gtk_container_add (GTK_CONTAINER (men_key_menu
), mnu_del_key
);
801 mnu_del_value
= gtk_image_menu_item_new_with_mnemonic ("Delete Value");
802 gtk_widget_set_sensitive(mnu_del_value
, False
);
803 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mnu_del_value
), gtk_image_new_from_stock ("gtk-delete", GTK_ICON_SIZE_MENU
));
804 gtk_container_add (GTK_CONTAINER (men_key_menu
), mnu_del_value
);
807 help
= gtk_menu_item_new_with_mnemonic ("_Help");
808 gtk_container_add (GTK_CONTAINER (menubar
), help
);
810 help_menu
= gtk_menu_new ();
811 gtk_menu_item_set_submenu (GTK_MENU_ITEM (help
), help_menu
);
813 about
= gtk_menu_item_new_with_mnemonic ("_About");
814 gtk_container_add (GTK_CONTAINER (help_menu
), about
);
816 hbox1
= gtk_hbox_new (FALSE
, 0);
817 gtk_box_pack_start (GTK_BOX (vbox1
), hbox1
, TRUE
, TRUE
, 0);
819 scrolledwindow1
= gtk_scrolled_window_new (NULL
, NULL
);
820 gtk_box_pack_start (GTK_BOX (hbox1
), scrolledwindow1
, TRUE
, TRUE
, 0);
822 tree_keys
= gtk_tree_view_new ();
825 curcol
= gtk_tree_view_column_new ();
826 gtk_tree_view_column_set_title(curcol
, "Name");
827 renderer
= gtk_cell_renderer_text_new();
828 gtk_tree_view_column_pack_start(curcol
, renderer
, True
);
830 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_keys
), curcol
);
832 gtk_tree_view_column_add_attribute(curcol
, renderer
, "text", 0);
833 gtk_container_add (GTK_CONTAINER (scrolledwindow1
), tree_keys
);
834 store_keys
= gtk_tree_store_new(2, G_TYPE_STRING
, G_TYPE_POINTER
);
835 gtk_tree_view_set_model(GTK_TREE_VIEW(tree_keys
), GTK_TREE_MODEL(store_keys
));
836 g_object_unref(store_keys
);
838 gtk_tree_selection_set_select_function (gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_keys
)), on_key_activate
, NULL
, NULL
);
840 g_signal_connect ((gpointer
) tree_keys
, "row-expanded",
841 G_CALLBACK (expand_key
),
845 scrolledwindow2
= gtk_scrolled_window_new (NULL
, NULL
);
846 gtk_box_pack_start (GTK_BOX (hbox1
), scrolledwindow2
, TRUE
, TRUE
, 0);
848 tree_vals
= gtk_tree_view_new ();
851 curcol
= gtk_tree_view_column_new ();
852 gtk_tree_view_column_set_title(curcol
, "Name");
853 renderer
= gtk_cell_renderer_text_new();
854 gtk_tree_view_column_pack_start(curcol
, renderer
, True
);
855 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_vals
), curcol
);
856 gtk_tree_view_column_add_attribute(curcol
, renderer
, "text", 0);
858 curcol
= gtk_tree_view_column_new ();
859 gtk_tree_view_column_set_title(curcol
, "Type");
860 renderer
= gtk_cell_renderer_text_new();
861 gtk_tree_view_column_pack_start(curcol
, renderer
, True
);
862 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_vals
), curcol
);
863 gtk_tree_view_column_add_attribute(curcol
, renderer
, "text", 1);
865 curcol
= gtk_tree_view_column_new ();
866 gtk_tree_view_column_set_title(curcol
, "Value");
867 renderer
= gtk_cell_renderer_text_new();
868 gtk_tree_view_column_pack_start(curcol
, renderer
, True
);
869 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_vals
), curcol
);
870 gtk_tree_view_column_add_attribute(curcol
, renderer
, "text", 2);
873 gtk_container_add (GTK_CONTAINER (scrolledwindow2
), tree_vals
);
875 store_vals
= gtk_list_store_new(4, G_TYPE_STRING
, G_TYPE_STRING
, G_TYPE_STRING
, G_TYPE_POINTER
);
876 gtk_tree_view_set_model(GTK_TREE_VIEW(tree_vals
), GTK_TREE_MODEL(store_vals
));
877 g_object_unref(store_vals
);
879 statusbar
= gtk_statusbar_new ();
880 gtk_box_pack_start (GTK_BOX (vbox1
), statusbar
, FALSE
, FALSE
, 0);
881 gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (statusbar
), FALSE
);
883 g_signal_connect ((gpointer
) save_as
, "activate",
884 G_CALLBACK (on_save_as_activate
),
886 g_signal_connect ((gpointer
) quit
, "activate",
887 G_CALLBACK (on_quit_activate
),
889 g_signal_connect ((gpointer
) mnu_add_key
, "activate",
890 G_CALLBACK (on_add_key_activate
),
892 g_signal_connect ((gpointer
) mnu_set_value
, "activate",
893 G_CALLBACK (on_set_value_activate
),
895 g_signal_connect ((gpointer
) mnu_find
, "activate",
896 G_CALLBACK (on_find_activate
),
898 g_signal_connect ((gpointer
) mnu_del_key
, "activate",
899 G_CALLBACK (on_delete_key_activate
),
901 g_signal_connect ((gpointer
) mnu_del_value
, "activate",
902 G_CALLBACK (on_delete_value_activate
),
904 g_signal_connect ((gpointer
) about
, "activate",
905 G_CALLBACK (on_about_activate
),
908 g_signal_connect ((gpointer
) tree_vals
, "row-activated",
909 G_CALLBACK (on_value_activate
),
913 gtk_window_add_accel_group (GTK_WINDOW (mainwin
), accel_group
);
918 static GtkWidget
* create_openfilewin (void)
920 GtkWidget
*openfilewin
;
921 GtkWidget
*ok_button
;
922 GtkWidget
*cancel_button
;
924 openfilewin
= gtk_file_selection_new ("Select File");
925 gtk_container_set_border_width (GTK_CONTAINER (openfilewin
), 10);
927 ok_button
= GTK_FILE_SELECTION (openfilewin
)->ok_button
;
928 GTK_WIDGET_SET_FLAGS (ok_button
, GTK_CAN_DEFAULT
);
930 cancel_button
= GTK_FILE_SELECTION (openfilewin
)->cancel_button
;
931 GTK_WIDGET_SET_FLAGS (cancel_button
, GTK_CAN_DEFAULT
);
936 static GtkWidget
* create_savefilewin (void)
938 GtkWidget
*savefilewin
;
939 GtkWidget
*ok_button
;
940 GtkWidget
*cancel_button
;
942 savefilewin
= gtk_file_selection_new ("Select File");
943 gtk_container_set_border_width (GTK_CONTAINER (savefilewin
), 10);
945 ok_button
= GTK_FILE_SELECTION (savefilewin
)->ok_button
;
946 GTK_WIDGET_SET_FLAGS (ok_button
, GTK_CAN_DEFAULT
);
948 cancel_button
= GTK_FILE_SELECTION (savefilewin
)->cancel_button
;
949 GTK_WIDGET_SET_FLAGS (cancel_button
, GTK_CAN_DEFAULT
);
954 static int gregedit_load_defaults(void)
956 WERROR error
= reg_open_local(NULL
, ®istry
, NULL
, NULL
);
957 if(!W_ERROR_IS_OK(error
)) {
958 gtk_show_werror(mainwin
, "Error while loading local registry", error
);
961 registry_load_root();
966 int main(int argc
, char *argv
[])
971 setup_logging(argv
[0], DEBUG_STDERR
);
973 mem_ctx
= talloc_init("gregedit");
977 gtk_init(&argc
, &argv
);
978 mainwin
= create_mainwindow();
979 gtk_widget_show_all(mainwin
);
981 ret
= gregedit_load_defaults();
982 if (ret
!= 0) goto failed
;
984 ret
= gtk_event_loop();
987 talloc_free(mem_ctx
);