[Initng-svn] r3797 - initng-gui/initng-gnome/src
svn at initng.thinktux.net
svn at initng.thinktux.net
Thu Apr 13 15:50:17 CEST 2006
Author: danne
Date: Thu Apr 13 15:50:06 2006
New Revision: 3797
Modified:
initng-gui/initng-gnome/src/callbacks.c
initng-gui/initng-gnome/src/initng-gnome.glade
initng-gui/initng-gnome/src/main.c
initng-gui/initng-gnome/src/ngehandler.c
initng-gui/initng-gnome/src/serviceparser.c
initng-gui/initng-gnome/src/serviceparser.h
Log:
I actually think saving services works now! Please try it out! (preferrably after taking a backup of /etc/initng ;-). Well. Happy easter!
Modified: initng-gui/initng-gnome/src/callbacks.c
==============================================================================
--- initng-gui/initng-gnome/src/callbacks.c (original)
+++ initng-gui/initng-gnome/src/callbacks.c Thu Apr 13 15:50:06 2006
@@ -65,8 +65,7 @@
GtkWidget *save_button = glade_xml_get_widget(xml, "save_button");
GtkWidget *save1 = glade_xml_get_widget(xml, "save1");
save_rl();
- //Don't enable save_all_services() unless you know exactly what you are doing!!!
- //save_all_services();
+ save_all_services();
gtk_widget_set_sensitive(save_button, FALSE);
gtk_widget_set_sensitive(save1, FALSE);
}
@@ -272,7 +271,7 @@
initconf_show_service = glade_xml_get_widget(xml_show_service, "initconf_show_service");
- load_service(GTK_WIDGET(treeview));
+ show_service(GTK_WIDGET(treeview));
glade_xml_signal_autoconnect(xml_show_service);
}
@@ -281,29 +280,12 @@
}
void on_ok_edit_service_button_clicked(GtkButton *button, gpointer user_data) {
- /* GtkWidget *textview = glade_xml_get_widget(xml_show_service, "service_textview");
- GtkTreeSelection *selected;
- GtkTreeIter iter;
- GtkTreeModel *model;
- GtkWidget *service_list = glade_xml_get_widget(xml, "service_list");
- GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
- GtkTextIter start, end;
GtkWidget *save_button = glade_xml_get_widget(xml, "save_button");
GtkWidget *save1 = glade_xml_get_widget(xml, "save1");
-
- selected = gtk_tree_view_get_selection(GTK_TREE_VIEW(service_list));
-
- gtk_tree_selection_get_selected(selected, &model, &iter);
- struct s_info *serviceinfo;
- gtk_tree_model_get(model, &iter, 4, &serviceinfo, -1);
- serviceinfo->file_content->needs_saving = TRUE;
-
- gtk_text_buffer_get_bounds(buffer, &start, &end);
- serviceinfo->data = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
-
gtk_widget_set_sensitive(save_button, TRUE);
gtk_widget_set_sensitive(save1, TRUE);
- gtk_widget_destroy(gtk_widget_get_toplevel(GTK_WIDGET(button)));*/
+ change_service();
+ gtk_widget_destroy(gtk_widget_get_toplevel(GTK_WIDGET(button)));
}
void on_show_runlevel_editor_activate (GtkMenuItem *menuitem, gpointer user_data)
Modified: initng-gui/initng-gnome/src/initng-gnome.glade
==============================================================================
--- initng-gui/initng-gnome/src/initng-gnome.glade (original)
+++ initng-gui/initng-gnome/src/initng-gnome.glade Thu Apr 13 15:50:06 2006
@@ -619,7 +619,7 @@
<property name="title" translatable="yes">Edit service or daemon</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
+ <property name="modal">True</property>
<property name="default_width">400</property>
<property name="default_height">500</property>
<property name="resizable">True</property>
Modified: initng-gui/initng-gnome/src/main.c
==============================================================================
--- initng-gui/initng-gnome/src/main.c (original)
+++ initng-gui/initng-gnome/src/main.c Thu Apr 13 15:50:06 2006
@@ -89,7 +89,6 @@
/* Enable threading, to make glib and gtk thread safe */
g_thread_init (NULL);
gdk_threads_init();
- gdk_threads_enter();
/* Enable native language support */
#ifdef ENABLE_NLS
@@ -128,12 +127,12 @@
misc_config(initconf_app);
/* Okay, Showtime */
- gtk_widget_show (initconf_app);
+ glade_xml_signal_autoconnect(xml);
/* Create the thread that will listen to nge, and update status realtime */
pthread_create(&ngethread, NULL, nge_thread, initconf_app);
- glade_xml_signal_autoconnect(xml);
+ gdk_threads_enter();
/* go, mainloop */
gtk_main ();
Modified: initng-gui/initng-gnome/src/ngehandler.c
==============================================================================
--- initng-gui/initng-gnome/src/ngehandler.c (original)
+++ initng-gui/initng-gnome/src/ngehandler.c Thu Apr 13 15:50:06 2006
@@ -40,7 +40,7 @@
gboolean valid = gtk_tree_model_get_iter_first(service_model, &iter);
while(valid) {
gtk_tree_model_get(service_model, &iter, 0, &str_data, -1);
- if(!strcmp(str_data, service)) {
+ if(str_data && !strcmp(str_data, service)) {
break;
}
valid = gtk_tree_model_iter_next(service_model, &iter);
@@ -52,7 +52,6 @@
gtk_list_store_append (GTK_LIST_STORE(service_model), &iter);
gtk_list_store_set(GTK_LIST_STORE(service_model), &iter, 0, service, 1, "unknown",
2, NULL, 4, serviceinfo, -1);
- serviceinfo->name = service;
serviceinfo->type = UNKNOWN;
serviceinfo->file_content = NULL;
}
@@ -94,16 +93,20 @@
//fprintf(stderr, "service_change, service=%s, state=%s\n", service, state);
initial_service_state(e, service, is, state);
+ gdk_threads_enter();
gtk_tree_model_filter_refilter(filtermodel);
+ gdk_threads_leave();
}
void initial_state_finished(nge_event *e) {
+ gdk_threads_enter();
GtkTreeView *service_list = GTK_TREE_VIEW(glade_xml_get_widget(xml, "service_list"));
GtkTreeModelSort *sortmodel = GTK_TREE_MODEL_SORT(gtk_tree_view_get_model(service_list));
GtkTreeModelFilter *filtermodel = GTK_TREE_MODEL_FILTER(gtk_tree_model_sort_get_model(sortmodel));
fprintf(stderr, "initial_state_finished\n");
gtk_tree_model_filter_refilter(filtermodel);
+ gdk_threads_leave();
}
void *nge_thread(void *args) {
@@ -114,7 +117,8 @@
/* set the hooks */
e.service_state_change = &service_change;
- e.initial_service_state = &service_change;
+ e.initial_service_state = &initial_service_state;
+ e.initial_state_finished = &initial_state_finished;
/* open correct socket */
ngeclient_open_socket(&e, NGE_REAL);
@@ -126,6 +130,9 @@
return;
}
+ //Avoid nasty race scenarios
+ sleep(1);
+
/* this is the MAIN LOOP for ngeclient */
ngeclient_exec(&e);
Modified: initng-gui/initng-gnome/src/serviceparser.c
==============================================================================
--- initng-gui/initng-gnome/src/serviceparser.c (original)
+++ initng-gui/initng-gnome/src/serviceparser.c Thu Apr 13 15:50:06 2006
@@ -115,7 +115,6 @@
struct stat buff;
char *fullpath = malloc(strlen(path) + strlen(namelist[n]->d_name) + 2);
sprintf(fullpath, "%s/%s", path, namelist[n]->d_name);
- fprintf(stderr, "Opening file %s\n", fullpath);
if(lstat(fullpath, &buff)<0)
break;
if(S_ISDIR(buff.st_mode)) {
@@ -142,7 +141,6 @@
tok = strtok(NULL, " ");
gtk_list_store_prepend (store, &iter);
gtk_list_store_set (store, &iter, 0, tok, 1, "daemon", 2, NULL, 4, serviceinfo, -1);
- serviceinfo->name = tok;
serviceinfo->type = DAEMON;
serviceinfo->file_content = file_content;
} else if(strstr(buffer, "service") == buffer) {
@@ -153,7 +151,6 @@
tok = strtok(NULL, " ");
gtk_list_store_prepend (store, &iter);
gtk_list_store_set (store, &iter, 0, tok, 1, "service", 2, NULL, 4, serviceinfo, -1);
- serviceinfo->name = tok;
serviceinfo->type = SERVICE;
serviceinfo->file_content = file_content;
} else if(strstr(buffer, "virtual") == buffer) {
@@ -164,7 +161,6 @@
tok = strtok(NULL, " ");
gtk_list_store_prepend (store, &iter);
gtk_list_store_set (store, &iter, 0, tok, 1, "virtual", 2, NULL, 4, serviceinfo, -1);
- serviceinfo->name = tok;
serviceinfo->type = VIRTUAL;
serviceinfo->file_content = file_content;
}
@@ -186,7 +182,6 @@
gtk_list_store_prepend (store, &iter);
gtk_list_store_set(store, &iter, 0, namelist[n]->d_name, 1, "runlevel",
2, NULL, 4, serviceinfo, -1);
- serviceinfo->name = namelist[n]->d_name;
serviceinfo->type = RUNLEVEL;
serviceinfo->startline = NULL;
serviceinfo->file_content = file_content;
@@ -205,7 +200,6 @@
gtk_list_store_prepend (store, &iter);
gtk_list_store_set(store, &iter, 0, namelist[n]->d_name, 1, "virtual",
2, NULL, 4, serviceinfo, -1);
- serviceinfo->name = namelist[n]->d_name;
serviceinfo->type = VIRTUALFILE;
serviceinfo->startline = NULL;
serviceinfo->file_content = file_content;
@@ -218,14 +212,15 @@
}
}
-void load_service(GtkWidget *treeview) {
+void show_service(GtkWidget *treeview) {
GtkWidget *service_textview = glade_xml_get_widget(xml_show_service, "service_textview");
GtkTreeSelection *selected = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(service_textview));
+ GtkWidget *initconf_show_service = glade_xml_get_widget(xml_show_service, "initconf_show_service");
+
GtkTreeIter iter;
GtkTreeModel *model;
gchar *servicename;
- struct stat buff;
FILE *stream;
gchar res;
int depth = 1;
@@ -236,10 +231,6 @@
gtk_tree_model_get(model, &iter, 0, &servicename, 4, &serviceinfo, -1);
struct s_file_content *file_content = serviceinfo->file_content;
- if(lstat(file_content->path, &buff)<0)
- perror("Strange fault!");
-
- //file = fopen(serviceinfo->path, "rt");
stream = (FILE*)fmemopen(file_content->data, strlen(file_content->data), "r");
if (stream == NULL)
return;
@@ -256,7 +247,6 @@
gtk_text_buffer_set_text(buffer, "", 0);
- fprintf(stderr, "Loading service\n");
do {
res = fgetc(stream);
if(res == '{') {
@@ -269,12 +259,90 @@
gtk_text_buffer_insert_at_cursor(buffer, &res, 1);
} while(TRUE);
gtk_text_buffer_get_bounds(buffer, &start, &end);
+
+ gtk_window_set_title(GTK_WINDOW(initconf_show_service), servicename);
+ g_free(servicename);
+}
+
+void change_service() {
+ GtkWidget *service_textview = glade_xml_get_widget(xml_show_service, "service_textview");
+ GtkWidget *service_list = glade_xml_get_widget(xml, "service_list");
+ GtkTreeSelection *selected = gtk_tree_view_get_selection(GTK_TREE_VIEW(service_list));
+ GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(service_textview));
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ gchar *servicename;
+ gchar *newdata;
+ FILE *oldstream, *newstream;
+ size_t newsize;
+ gchar res;
+ int depth = 0;
+ GtkTextIter start, end;
+ gtk_tree_selection_get_selected(selected, &model, &iter);
+ struct s_info *serviceinfo;
+ gtk_tree_model_get(model, &iter, 0, &servicename, 4, &serviceinfo, -1);
+ struct s_file_content *file_content = serviceinfo->file_content;
+
+ oldstream = (FILE*)fmemopen(file_content->data, strlen(file_content->data), "r");
+ if (oldstream == NULL)
+ return;
+ newstream = (FILE*)open_memstream(&newdata, &newsize);
+
+ //Put anything before the current service into the file
+ if(serviceinfo->type != RUNLEVEL && serviceinfo->type != VIRTUALFILE) {
+ char* temp = malloc(255); //UGLY!
+ while(fgets(temp, 255, oldstream) > 0) {
+ fputs(temp, newstream);
+ if(strcmp(temp, serviceinfo->startline) == 0) {
+ break;
+ }
+ }
+ free(temp);
+ if(strrchr(serviceinfo->startline, '{'))
+ depth++;
+ }
+
+ //Put the old contents of the service into the trash
+ do {
+ res = fgetc(oldstream);
+ if(res == '{') {
+ depth++;
+ } else if(res == '}') {
+ depth--;
+ }
+ if(depth <= 0 || res == EOF)
+ break;
+ } while(TRUE);
+
+ //Put the new contents of the service into the file
+ gtk_text_buffer_get_bounds(buffer, &start, &end);
+ fputs(gtk_text_buffer_get_text(buffer, &start, &end, FALSE), newstream);
+
+ //Put anything after the current service into the file
+ if(serviceinfo->type != RUNLEVEL && serviceinfo->type != VIRTUALFILE) {
+ fputs("}", newstream);
+ do {
+ res = fgetc(oldstream);
+ if(res == EOF)
+ break;
+ fputc(res, newstream);
+ } while(TRUE);
+ }
+
+ fclose(oldstream);
+ fclose(newstream);
+
+ free(file_content->data);
+
+ file_content->data = newdata;
+ file_content->needs_saving = TRUE;
+
g_free(servicename);
}
void save_all_services() {
- /*GtkTreeView *service_list = GTK_TREE_VIEW(glade_xml_get_widget(xml, "service_list"));
+ GtkTreeView *service_list = GTK_TREE_VIEW(glade_xml_get_widget(xml, "service_list"));
GtkTreeModelSort *sortmodel = GTK_TREE_MODEL_SORT(gtk_tree_view_get_model(service_list));
GtkTreeModelFilter *filtermodel = GTK_TREE_MODEL_FILTER(gtk_tree_model_sort_get_model(sortmodel));
GtkTreeModel *model = gtk_tree_model_filter_get_model(filtermodel);
@@ -285,14 +353,16 @@
gboolean valid = gtk_tree_model_get_iter_first(model, &iter);
while(valid) {
gtk_tree_model_get(model, &iter, 4, &serviceinfo, -1);
- if(serviceinfo->needs_saving) {
- file = fopen(serviceinfo->path, "r+");
- if (file == NULL)
- return;
- fputs(serviceinfo->data, file);
+ struct s_file_content *file_content = serviceinfo->file_content;
+ if(file_content && file_content->needs_saving) {
+ file = fopen(file_content->path, "w");
+ if (file == NULL)
+ break;
+ fputs(file_content->data, file);
+ file_content->needs_saving = FALSE;
}
valid = gtk_tree_model_iter_next(model, &iter);
- }*/
+ }
}
gint service_sorter(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data) {
@@ -300,8 +370,6 @@
gint ret = 0;
gchar *name1, *name2;
- fprintf(stderr, "service_sorter check 1\n");
-
gtk_tree_model_get(model, a, sortcol, &name1, -1);
gtk_tree_model_get(model, b, sortcol, &name2, -1);
@@ -314,6 +382,7 @@
}
void populate_service_list() {
+ gdk_threads_enter();
GtkWidget *service_list = glade_xml_get_widget(xml, "service_list");
GtkTreeModel *filtermodel, *sortmodel;
GtkTreeViewColumn *column;
@@ -359,4 +428,5 @@
service_filter, NULL, NULL);
sortmodel = gtk_tree_model_sort_new_with_model(filtermodel);
gtk_tree_view_set_model(GTK_TREE_VIEW(service_list), sortmodel);
+ gdk_threads_leave();
}
Modified: initng-gui/initng-gnome/src/serviceparser.h
==============================================================================
--- initng-gui/initng-gnome/src/serviceparser.h (original)
+++ initng-gui/initng-gnome/src/serviceparser.h Thu Apr 13 15:50:06 2006
@@ -27,7 +27,8 @@
gboolean service_filter(GtkTreeModel *model, GtkTreeIter *iter, gpointer data);
void populate_service_list();
-void load_service(GtkWidget *treeview);
+void show_service(GtkWidget *treeview);
+void change_service();
void save_all_services();
void servicelist_cleanup();
@@ -41,21 +42,24 @@
};
struct s_file_content {
- char *data;
- gboolean needs_saving;
- char *path;
+ char *data; //Entire file contents
+ gboolean needs_saving; //Whether this file has been altered
+ char *path; //Full path to file
};
struct s_info {
//char *path;
- char *name;
- char type;
- char *startline;
- e_is status_id;
+ //char *name; //Name of service;
+ char type; //Type (See enum above)
+ char *startline; //First line of service in file
+ e_is status_id; //Status of service
//gboolean needs_saving;
//char *file_contents;
//gchar *data;
- struct s_file_content *file_content;
+ struct s_file_content *file_content; //Pointer to file contents
+ //int startpos;
+ //int endpos;
+ //int size; //Size of service in bytes
};
More information about the Initng-svn
mailing list