MESSAGE
DATE | 2002-06-09 |
FROM | Ruben I Safir
|
SUBJECT | Subject: [hangout] Re: Changing a Label Presentation
|
Dov
Thanks for the reply. I've finally had time to get back to this problem.
It seems I'm going through some growing pains with GTK at this junction.
I took your suggestion and I tried to fork the taring process and capture the output in a text object, in a new toplevel window. This resulted in a common problem, with an error mesage from X related to threading which I didn't really intend to use:
See ref(http://groups.google.com/groups?q=Xlib:+unexpected+async+reply+GTK&hl=en&lr=&selm=abei4b%246bp%244%40news1.kornet.net&rnum=5)
Xlib: unexpected async reply
I wanted to fork the tar process off by itself have it show in it's own window.
In fact, I've been trying to seperate the programming logic from the display segments of the program, and I'm stumbling. I assume there is a way to handle this common problem with forking without having to rely on threading. Popup windows with forked processes happen all the time. The code looks like this:
gint createbackup(){ gint ret; // gint pid; gchar buffer[512]; FILE *tarcommand; GtkWidget *window_proc; GtkWidget *text; GtkWidget *box; GtkWidget *vscroll; const char *command = "/bin/tar -cvpPf /tmp/apache.tar /usr/local/apache/htdocs/nylinux/ 2>/dev/null"; const char *command2 = "/bin/tar -tf /tmp/apache.tar 1> /home/ruben/backuplist"; GdkColormap *cmap; GdkColor color;
/* pid = fork(); if(pid != 0){ perror("We are in the child"); */ gtk_window_new(GTK_WINDOW_TOPLEVEL); window_proc = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_set_usize(window_proc, 600, 400); gtk_signal_connect(GTK_OBJECT(window_proc), "delete_event", GTK_SIGNAL_FUNC(delete_win),NULL); text = gtk_text_new(NULL,NULL); gtk_text_set_editable(GTK_TEXT(text), FALSE); box = gtk_hbox_new(FALSE,0); vscroll=gtk_vscrollbar_new(GTK_TEXT(text)->vadj); gtk_container_add(GTK_CONTAINER(window_proc), box); gtk_box_pack_start(GTK_BOX(box), text, TRUE, TRUE,0); gtk_box_pack_start(GTK_BOX(box), vscroll, FALSE, FALSE,0); gtk_widget_show(vscroll); gtk_widget_show(text); gtk_widget_show(box); gtk_widget_show(window_proc); cmap = gdk_colormap_get_system(); color.red = 0xffff; color.green = 0; color.blue = 0; if (!gdk_color_alloc(cmap, &color)) { g_error("couldn't allocate color"); }
tarcommand = popen(command, "r"); while(fgets(buffer, 512, tarcommand)){ // gtk_text_freeze(GTK_TEXT(text)); gtk_text_insert(GTK_TEXT(text),NULL,NULL,NULL, buffer, strlen(buffer)); // gtk_text_thaw(GTK_TEXT(text)); } gtk_text_insert(GTK_TEXT(text),NULL,&color,NULL, "DONE", -1); ret = pclose(tarcommand); ret = system(command2);
if( ret == 127 ){ g_print("Can not open shell\n"); exit(0); } return ret; /* }else{ */ /*ret = fgetc(tar);*/ /* ret = 0; return(ret); } */ }
I tried system() and popen.
Also, in the other segment I'm writing, I'm trying to display a list of all the files which have been tarred up, for untarring. This can be a LONG list, and I tried to use the GtkList object to try to display this for user input. When I tried to create a Glib GList and add it to the GtkList widget, no matter how I tried to run gtk_widget_show(item); it wouldn't show and I got empty windows. I had to resort to entering them item by item like this:
GList *createlist(void){ GtkWidget *item; GList *list = NULL; GtkWidget *listbox; GtkWidget * window_select; FILE *fp; char file[512]; fp = fopen("/home/ruben/backuplist", "r"); window_select = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_container_border_width(GTK_CONTAINER(window_select), 10); gtk_window_set_title(GTK_WINDOW(window_select), "Files to Restore"); listbox = gtk_list_new(); gtk_list_set_selection_mode(GTK_LIST(listbox), GTK_SELECTION_BROWSE); gtk_container_add(GTK_CONTAINER(window_select), listbox); while(fgets(file, 512, fp)){ g_print("%s",file); item = gtk_list_item_new_with_label(file); gtk_container_add(GTK_CONTAINER(listbox), item); gtk_widget_show(item); } fclose(fp); gtk_widget_show(listbox); gtk_widget_show(window_select);
return(list); }
When I really wanted to append the whole list at once. Further, when I looked up the GktList object on the GTK docs, I see it's being phased out. It didn't work anyway. Too many records need to be displayed and it used up all my memory. It might do better with a scroll bar, which is the next thing to try. But is GtkList is being phased out, and appending a Glist isn't working ANYWAY, what's the proper widget to use?
Ruben On 2002.05.19 10:00 Dov Grobgeld wrote: > The reason that the label isn't drawn is that the graphics context > isn't flushed. This may be done simply by calling gtk_flush(). But > there is a more fundemental problem with your program, and it has > to do with the concept of event driven programming. In your callback > you are doing an operation which is taking a very long time. This > is basically a no-no, as you are taking away the control from the > gtk_main() loop. What you should do in such a case is to fork off > a child that runs the backup process in the background. (If you want > to you can read stdout from the standard output and put it e.g. in > a text view widget). When the child process is terminated it sends > to its parent a SIG_CHILD unix signal. By catching this unix signal > you can figure out that your child process is finished and change > the value of your label. > > I hope this helps. > > Regards, > Dov > > On Sun, May 19, 2002 at 02:14:20AM -0400, Ruben I Safir wrote: > > Hello > > > > I'm trying to write a program which changes a label from a callback and it's not working. > > > > rmbackup.c > > > > #include > > #include "tarlib.h" > > #include "backprog.h" > > > > int main(int argc, char **argv){ > > struct s1 window1; > > gtk_init(&argc, &argv); > > window1 = screen1(); > > gtk_main(); > > exit(0); > > } > > > > backprog.c > > > > struct s1 maketoggles(){ > > static struct s1 handle; > > GtkWidget *button; > > GtkWidget *vbox; > > GtkWidget *label; > > > > vbox = gtk_vbox_new(TRUE, 0); > > > > label = gtk_label_new("Choose an Option"); > > > > gtk_widget_show(label); > > > > gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE,3); > > > > button = gtk_toggle_button_new_with_label("Create Backup"); > > gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, FALSE, 0); > > gtk_widget_show(button); > > gtk_signal_connect(GTK_OBJECT(button), "clicked", > > GTK_SIGNAL_FUNC(startbackup), > > label ); > > > > ........ > > > > void startbackup( GtkWidget *widget, GtkWidget *lab){ > > gint ret; > > gtk_label_set_text(GTK_LABEL(lab), "CREATING BACKUP"); <-----Not changing > > ret = createbackup(); > > g_print("%d",ret); > > g_print("\n"); > > gtk_label_set_text(GTK_LABEL(lab), "Choose an Option"); > > > > } > > > > > > -- > > __________________________ > > > > Brooklyn Linux Solutions > > __________________________ > > http://www.mrbrklyn.com - Consulting > > http://www.brooklynonline.com - For the love of Brooklyn > > http://www.nylxs.com - Leadership Development in Free Software > > http://www.nyfairuse.org - The foundation of Democracy > > http://www2.mrbrklyn.com/resources - Unpublished Archive or stories and articles from around the net > > http://www2.mrbrklyn.com/mp3/dr.mp3 - Imagine my surprise when I saw you... > > http://www2.mrbrklyn.com/downtown.html - See the New Downtown Brooklyn.... > > > > 1-718-382-5752 > > > > > > > > _______________________________________________ > > gtk-list mailing list > > gtk-list-at-gnome.org > > http://mail.gnome.org/mailman/listinfo/gtk-list > > -- > ___ ___ > / o \ o \ > Dov Grobgeld ( o o ) o | > The Weizmann Institute of Science, Israel \ o /o o / > "Where the tree of wisdom carries oranges" | | | | > _| |_ _| |_ > > -- __________________________
Brooklyn Linux Solutions __________________________ http://www.mrbrklyn.com - Consulting http://www.brooklynonline.com - For the love of Brooklyn http://www.nylxs.com - Leadership Development in Free Software http://www.nyfairuse.org - The foundation of Democracy http://www2.mrbrklyn.com/resources - Unpublished Archive or stories and articles from around the net http://www2.mrbrklyn.com/mp3/dr.mp3 - Imagine my surprise when I saw you... http://www2.mrbrklyn.com/downtown.html - See the New Downtown Brooklyn....
1-718-382-5752
____________________________ New Yorker Linux Users Scene Fair Use - because it's either fair use or useless....
|
|