gtkdialog1-1.4

For discussions about programming, programming questions/advice, and projects that don't really have anything to do with Puppy.
Post Reply
Message
Author
User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#16 Post by technosaurus »

Note: some of these may be off by a line or 2 because I added #include "config.h" to all of the .c files, so I didn't need all of the -D... stuff to compile

Edit -- approximate eqivalent to locate (for the purposes of gtkdlg)

Code: Select all

#!/bin/sh
find /usr $HOME /opt -iname ${1##*/}
I did a bit of comparison shopping using thunor's patches from here:
http://code.google.com/p/gtkdialog/sour ... &start=320

In no particular order, except that I took note of them...

to help with using shells other than bash, he replaced

Code: Select all

source %s
with

Code: Select all

. %s
http://code.google.com/p/gtkdialog/source/detail?r=4#
I grepped them to be at
~246 of actions.c
~330 of widgets.c

this commit fixes the slow reading of vars (using -p / --program) compared to stdin (-s)
http://code.google.com/p/gtkdialog/source/detail?r=308#
I think this corresponds to ~152 of main.c
Fixed the longstanding issue with expand and fill being FALSE when packing
widgets into boxes. A message said that the original author couldn't get it to
work, but I can't see anything wrong with it.
many of these are ifdef gtk2, but Thunor's patch seems gtk1 doable:
http://code.google.com/p/gtkdialog/source/detail?r=296#

btw more gtk1/2 apps to scrape:
minimum profit 3
gftp <2.19
mtpaint
wireshark?
jpilot?
freeciv?
classicladder?
kmd (komodo manchester debugger)
http://www.web100.org/download/
http://mahjong.julianbradfield.org/Source/
http://ftp.eenet.ee/gentoo-portage/medi ... -gtk.patch
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

goingnuts
Posts: 932
Joined: Sun 07 Dec 2008, 13:33
Contact:

#17 Post by goingnuts »

amigo wrote:Keep up the good work. At some point I might work on patching the full sources so that config-time option for gtk1 can be used.

Text and tree code is the hardest to convert. For tips and example code, look at older source which allowed using either gtk1 or gtk1. rox-1.2.2 is one example. I'll have to dig to make more suggestions. even if you never get every possible widget working, having a few of the basics working will be great in order to use the same scripts with either toolkit.
Thank you amigo - your offer is much appreciated - and your input on the tree/text widgets have convinced me that at least the tree should be left out. Concerning using the gtk-pixbuffer: I have no clue how to do it. For me the main thing missing right now is to be able to use more image-types - not just xpm - so if that can be done easily (with or without) gtk-pixbuffer...?

Technosaurous: Thanks for the pointers - I will add those!

There are other low hanging fruits: word-wrap to the edit-widget + default value and the geometry switch also seems easy done.

I have not been making a lot of shell gtk scripts until now - and begin to understand your blended feelings about the "xml-syntax". Maybe a more stringent structure is needed. Haven't thought this totally through but it seems that some of the tags means different things depending on which widget they are serving. I have done a lot of html and do not find that hard to write/read and maybe a clean up of the tags are needed? Maybe only "clean" tags (<button> and no <button ok>, <input> and no <input file>)? Some of the tags express both what I would call state and value (ex: <default>)...

At least a mapping of the present hierarchy of widgets, childs, childs child, attributes and actions should be done.

As for other programs to "scrape" the Xdialog-2.3.1 is quite relevant.

User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#18 Post by technosaurus »

would it be easier to develop something from scratch?
I used code from glade to help implement this:

Code: Select all

#include <stdio.h>
#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>

/* TODO use these for switch case(s) in main loop */
#define FIVE_CHARS(x1,x2,x3,x4,x5)   (((((((((x5)<<8)|(x4))<<8)|(x3))<<8)|(x2))<<8)|(x1))

void on_button_clicked(GtkButton *button, char *user_data){printf("action=\"%s\"\n",user_data);}
void on_checkbutton_toggled(GtkToggleButton *togglebutton, char *user_data){
	if (GTK_TOGGLE_BUTTON(togglebutton)->active){
		printf("%s=\"on\"\n",user_data);
	}else{
		printf("%s=\"off\"\n",user_data);
	}
}

int main(int argc, char *argv[]){
GtkWidget *widgets[99],packers[9];
char *button_action[0];
int widget=1, packer=0 ,i=1;

gtk_set_locale ();
gtk_init (&argc, &argv);

/* TODO shift this into main loop and add title support */
widgets[0] = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_object_set_data (GTK_OBJECT (widgets[0]), "window", widgets[0]);
gtk_window_set_title (GTK_WINDOW (widgets[0]), "title");

/* TODO shift this into main loop and add hbox support - need packer stack */

/* TODO shift stuff into this loop and add widgets */
while (i<argc){ /* loop through args to make widgets - buttons with actions */
switch ( FIVE_CHARS(argv[i][0],argv[i][1],argv[i][2],argv[i][3],argv[i][4]) ) {
case FIVE_CHARS('-','v','b','o','x')   :
	widgets[widget] = gtk_vbox_new (FALSE, 0);
	gtk_widget_ref (widgets[widget]);
	gtk_object_set_data_full(GTK_OBJECT(widgets[0]), "box", widgets[widget],
		(GtkDestroyNotify) gtk_widget_unref);
	gtk_widget_show (widgets[widget]);
	gtk_container_add(GTK_CONTAINER (widgets[0]), widgets[widget]);
	i++;widget++;
break;

case FIVE_CHARS('-','h','b','o','x')   :
	widgets[widget] = gtk_hbox_new (FALSE, 0);
	gtk_widget_ref (widgets[widget]);
	gtk_object_set_data_full(GTK_OBJECT(widgets[0]), "box", widgets[widget],
		(GtkDestroyNotify) gtk_widget_unref);
	gtk_widget_show (widgets[widget]);
	gtk_container_add(GTK_CONTAINER (widgets[0]), widgets[widget]);
	i++;widget++;
break;

case FIVE_CHARS('-','b','u','t','t')   :
	i++;
/* TODO make this a switch case here for widgets */
	widgets[widget] = gtk_button_new_with_label(argv[i]);
	gtk_widget_ref (widgets[widget]);
/* TODO? is widget 0 always correct? */
	gtk_object_set_data_full(GTK_OBJECT (widgets[0]), argv[i], widgets[widget],(GtkDestroyNotify) gtk_widget_unref);
	gtk_widget_show(widgets[widget]);
/* TODO replace hardcoded packer with a "stack" */
	gtk_box_pack_start(GTK_BOX (widgets[1]), widgets[widget], FALSE, FALSE, 0);
/* TODO replace button_action with generic char array */
	i++;
	button_action[widget] = argv[i];
	if (button_action[widget] != NULL){
		gtk_signal_connect(GTK_OBJECT (widgets[widget]), "clicked", 
			GTK_SIGNAL_FUNC(on_button_clicked),button_action[widget]);
		i++;
		}
	widget++;
break;

case FIVE_CHARS('-','c','h','e','c')   :
	i++;
	widgets[widget] = gtk_check_button_new_with_label (argv[i]);
	gtk_widget_ref (widgets[widget]);
	gtk_object_set_data_full (GTK_OBJECT (widgets[0]), argv[i], widgets[widget],
		(GtkDestroyNotify) gtk_widget_unref);
	gtk_widget_show (widgets[widget]);
	gtk_box_pack_start (GTK_BOX (widgets[1]), widgets[widget], FALSE, FALSE, 0);
	i++;
	gtk_signal_connect (GTK_OBJECT (widgets[widget]), "toggled",
		GTK_SIGNAL_FUNC (on_checkbutton_toggled), argv[i]);
	i++;widget++;
break;

default   :
	printf("usage:\n%s -{v,h}box [-button label action] [-checkbox label variable]\n",argv[0]);
	goto END;
	break;
}
}

gtk_signal_connect(GTK_OBJECT (widgets[0]), "destroy", GTK_SIGNAL_FUNC (gtk_main_quit),NULL);
gtk_widget_show(widgets[0]);
gtk_main();
END:
return 0;
}
Last edited by technosaurus on Thu 09 Feb 2012, 02:10, edited 4 times in total.
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

amigo
Posts: 2629
Joined: Mon 02 Apr 2007, 06:52

#19 Post by amigo »

For an example of stacking widgets, see greq:
http://distro.ibiblio.org/pub/linux/dis ... req-0.9.4/

It uses a little known feature of bash -PIPE_STATUS to return the results. It also lets you add a checkbutton after any normal widget.

As for re-inventing the wheel, it might be best to just hack one of the existing programs, but that's just me thinking. I'd really like to see a gtk1 version of gtkdialog which implements as many of the features of the gtk2 version as possible, using the same syntax. The dual-toolkit compatibility is the magic of it.

I think most of problem you are having with the includes must come from not having configuration done properly at the top-level of the sources. Most gtk1/gtk2 capable programs manage to live in the same files without having to do major re-writes -just some -maybe lots, of ifdefs.

I wish I could be more helpful but my hands are tied right now with other things.

I have built lots of small 'programs' using scriptable widgets made from Xdialog, greq, gtk-shell and the other things found here:
http://distro.ibiblio.org/pub/linux/dis ... req-0.9.4/

I like the ability to create more complex UI's that is possible with gtkdialog, but do not like the startup latency of any gtk2 apps. The libxml overhead is probably livable...

gdk-pixbuf should load any of the common types of images/icons -png-support would be the best choice if only one is to be supported. rox has good example of gdk-pixbuf support -if you look through my rox-1.2.2.x sources you'll find a patch where I made it use png toolbar icons instead of xpm's. I still think it might be a good idea to run the whole idea by thunor as he may be able to get some things going which are harder for you -maybe the whole enchilada...

goingnuts
Posts: 932
Joined: Sun 07 Dec 2008, 13:33
Contact:

#20 Post by goingnuts »

technosaurus & amigo: Thanks for input! Might be difficult to make it gtk2 compatible as this include hacking the parser as far as I can see (to accept the newer script syntax). To start from scratch is tempting when one view the simple structure of the possible coding...but may be too big a project for now...
Spend some time in hacking the edit and fileselect to play well with a menu-driven small text-editor but hit a problem with interference with the event-triggers trying to implement a "save as..." function...
I miss the ability to assign values to internal variables from script, run an external function (script) to change/add values...or just an invisible widget or two that act as the normal widgets...

User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#21 Post by technosaurus »

I am working on "sdialog" ... just to learn C really ... I have it set up to use simple templates for each widget. I did study the api enough to use an array of widgets so that they remain available for modification (it would be smaller/simpler to use a single widget pointer to temporarily store non-container type widgets, but then we couldn't reference them for change) , but correct me if this is wrong. It may be possible to emulate zenity/yad in this manner (syntactically, not necessarily graphically), but I was thinking more along the line of gtkdialog's ability to manipulate the interface.

I was considering using a pipe based interface such that we could pipe the output out to a fifo that could be read by a while-read-case loop that can output to another fifo that is used for interacting (via input from the fifo)



I know this seems ridiculous to write yet another dialog program, but none of them seem to be simple _and_ versatile.

Code: Select all

 
mkfifo /tmp/useractions
mkfifo /tmp/scriptactions

sdialog -args... </tmp/scriptactions >/tmp/useractions &

while read LINE; do
case "$LINE" in
...
esac
done </tmp/useractions >/tmp/scriptactions &
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

goingnuts
Posts: 932
Joined: Sun 07 Dec 2008, 13:33
Contact:

#22 Post by goingnuts »

The different action possibilities for the widget are a nice feature but we might have to modify/adjust them. The present problem with making a simple text editor for example seems to be that the <action>fileselect>/action> spawns the filedialog but does not wait for it to complete before running next action. The present code is below and I have tried to implement a wait for child process but without succes. Any hints are welcome:

Code: Select all

if (strncasecmp(str, "fileselect:", 11) == 0) {
	action_fileselect(button, &((char *) str)[11]);
	//GN how to wait here for this to close before running further actions?
	return;
	}

User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#23 Post by technosaurus »

did you try something like
while ( ! fd ) usleep (1000);

I haven't messed much with fselect yet, but it must change some other values too, because the user may choose not to select a file and it would freeze... perhaps its return value
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

goingnuts
Posts: 932
Joined: Sun 07 Dec 2008, 13:33
Contact:

#24 Post by goingnuts »

Thanks - yes I did try that. After some more hours I think I got the answer: It might not be possible... The actions are fired by the

Code: Select all

gtk_signal_connect(GTK_OBJECT(Widget), "clicked", GTK_SIGNAL_FUNC (button_pressed), (gpointer) act);

where act is the command and this is initially set to the button-actions...
Therefore it seems impossible to put execution on wait in any of the loops before or after the fileselect call. sleep just stops the execution at the specific point in the loop.

I guess that the signals for the other actions (after a button press) are just sitting there waiting to be fired (or already are starting execution) and the only thing one put to sleep is the actual fileselect call.

What was needed was a fileselect-call and after that an update-call (from the same button press) - but if you try to sleep and wait for the fileselect the dialog box never shows up and program "hangs". :cry:

User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#25 Post by technosaurus »

the tutorial talks about timeouts and idle functions, which seem like they could be used for a hack, but I haven't played with them yet.
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

goingnuts
Posts: 932
Joined: Sun 07 Dec 2008, 13:33
Contact:

#26 Post by goingnuts »

Edit 200212: Uploaded new snapshot. Most warnings gone, deactivated tree. A lot of edits in sources...
Now an editor can be made, example in source. Modified afishe2000´s pmenu to test tables/buttons/actions ect. also attached in examples.
Now with build in images for the stock buttons to ease use.
Maybe a small comment on the fileselect action: Every call to fileselect widget causes the main loop to continue after gtk_signal_connect is run in the fileselect window. The ideal solution would be a capture of all actions meant to run after fileselect and then run them when file select done. To overcome some of this I hard coded capture of 1 instance of action save and 1 instance of action refresh. Also implemented an internal variable named OUTFILE that will hold last selected file and the value is exported as OUTFILE=$OUTFILE - so it can be used in the script globally (view some usage in the edit_test example).
Would have liked to include notebook but I just cant understand the parser system.
Below image of the modified pmenu running...
Attachments
snap0004.png
(59.71 KiB) Downloaded 1624 times

goingnuts
Posts: 932
Joined: Sun 07 Dec 2008, 13:33
Contact:

#27 Post by goingnuts »

Fixed list widget so now should be working as intended.
Word-wrap now default for text. gvim widget compiles...have not testet as I do not have gvim.
Added gtkrc-file support.
Examples of pmenu, bootmanager, wideowizard and wakepup in examples.
Found that scripts for gtkdialog sometimes use the "export -f" leaving ash-people in the dark...

To convert the export -f the below is quite simple to do:
The bash version:

Code: Select all

#!/bin/bash

my_func () { echo $1; }
export -f my_func

export MAIN_DIALOG='
<vbox>
 <frame List>
  <list>
   <variable>LIST</variable>
   <input>ls</input>
   <action>my_func "${LIST}"</action>
  </list>
 </frame>
</vbox>
'
.././gtkdlg1 --program=MAIN_DIALOG
...and the ash-version (updated according to Technosaurous post below):

Code: Select all

#!/bin/ash
echo '
my_func () { echo $1; }
#export -f my_func
' > /tmp/ashfunc

export MAIN_DIALOG='
<vbox>
 <frame List>
  <list>
   <variable>LIST</variable>
   <input>ls</input>
   <action>my_func "${LIST}"</action>
  </list>
 </frame>
</vbox>
'
.././gtkdlg1 --program=MAIN_DIALOG -i  /tmp/ashfunc
...the last could be the default method.
Last edited by goingnuts on Fri 24 Feb 2012, 06:21, edited 1 time in total.

User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#28 Post by technosaurus »

yeah, I had a similar workaround, but don't remember what script it is in. It went something like this though

export Myfunction='..... \
.....'

then use eval $Myfunction

btw, the whole premise of my bashbox stuff was to make this easier - you can call a function by

Code: Select all

bashbox <function>
... or just

Code: Select all

function
if there is a symlink to bashbox

that was before I discovered the -i argument (to include files)
just put all of your functions in a function file and use

Code: Select all

. functionfile
and

Code: Select all

gtkdlg1 -i functionfile ...
(no need to generate it on the fly if that is working)
(I swore I saw that in the gtkdlg1 sources but maybe I am misremembering ... that was the source vs. 'dot' patch I mentioned right?)
Attachments
source_gtklauncher.patch.gz
I guess I missed one
(272 Bytes) Downloaded 659 times
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

disciple
Posts: 6984
Joined: Sun 21 May 2006, 01:46
Location: Auckland, New Zealand

#29 Post by disciple »

Guys, this is fantastic!
If you got this up to gtkdialog4 compatibility then a gtk1-only distro would be a really good proposition again.
Do you know a good gtkdialog program? Please post a link here

Classic Puppy quotes

ROOT FOREVER
GTK2 FOREVER

goingnuts
Posts: 932
Joined: Sun 07 Dec 2008, 13:33
Contact:

#30 Post by goingnuts »

technosaurus: Thanks - the "-i" method is really sweet. Updated example above accordingly.
disciple: Guess that gtkdialog4 compatibility would be to hard/much work. If gtkdlg1 can run most scripts by (gentle) editing the script-syntax of scripts meant for younger gtkdialog versions - I am satisfied. Seems that the missing notebook-widget and the ability to use other image formates that xpm is the big missing things for now...

User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#31 Post by technosaurus »

I put this notebook example together from glade-0.6 (not all the stuff is necessary, but I tried to get the equivalent actions to gtkdialog)

Code: Select all

#include <gtk/gtk.h>

int main (int argc, char *argv[]){
GtkWidget *window1, *notebook1, *frame1, *label4, *label1, *frame2, *label5, *label2;

gtk_set_locale ();
gtk_init (&argc, &argv);

window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_name (window1, "window1");
gtk_object_set_data (GTK_OBJECT (window1), "window1", window1);
gtk_window_set_title (GTK_WINDOW (window1), "window1");

notebook1 = gtk_notebook_new ();
gtk_widget_set_name (notebook1, "notebook1");
gtk_widget_ref (notebook1);
gtk_object_set_data_full (GTK_OBJECT (window1), "notebook1", notebook1,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (notebook1);
gtk_container_add (GTK_CONTAINER (window1), notebook1);

frame1 = gtk_frame_new ("frame1");
gtk_widget_set_name (frame1, "frame1");
gtk_widget_ref (frame1);
gtk_object_set_data_full (GTK_OBJECT (window1), "frame1", frame1,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (frame1);
gtk_container_add (GTK_CONTAINER (notebook1), frame1);

label4 = gtk_label_new ("label4");
gtk_widget_set_name (label4, "label4");
gtk_widget_ref (label4);
gtk_object_set_data_full (GTK_OBJECT (window1), "label4", label4,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (label4);
gtk_container_add (GTK_CONTAINER (frame1), label4);

label1 = gtk_label_new ("label1");
gtk_widget_set_name (label1, "label1");
gtk_widget_ref (label1);
gtk_object_set_data_full (GTK_OBJECT (window1), "label1", label1,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (label1);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), label1);

frame2 = gtk_frame_new (NULL);
gtk_widget_set_name (frame2, "frame2");
gtk_widget_ref (frame2);
gtk_object_set_data_full (GTK_OBJECT (window1), "frame2", frame2,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (frame2);
gtk_container_add (GTK_CONTAINER (notebook1), frame2);

label5 = gtk_label_new ("label5");
gtk_widget_set_name (label5, "label5");
gtk_widget_ref (label5);
gtk_object_set_data_full (GTK_OBJECT (window1), "label5", label5,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (label5);
gtk_container_add (GTK_CONTAINER (frame2), label5);

label2 = gtk_label_new ("label2");
gtk_widget_set_name (label2, "label2");
gtk_widget_ref (label2);
gtk_object_set_data_full (GTK_OBJECT (window1), "label2", label2,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (label2);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 1), label2);
gtk_widget_show (window1);

gtk_main ();
return 0;
}
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

goingnuts
Posts: 932
Joined: Sun 07 Dec 2008, 13:33
Contact:

#32 Post by goingnuts »

Thanks! The first problem is the parser part: notebook is first included in 59.2 but along with that some other changes to the syntax which I prefer to leave out if possible. I did try to use lexer, parser.c and parser.y from 59.2, got it to compile but notebook token was not recoqnized... Slightly reluctant to start learning lex and YACC just to get notebook on board...but maybe not too difficult in the end so lets see.

User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#33 Post by technosaurus »

Yes, the parser was what tripped me up before, and why I decided to just do a quicky using c's built in parsing. I think I could even make it compatible with gtk3 & gtk2, but gtkdialog is a better choice just by the fact that so many apps already use it, but I want to do it anyways. However if you get stuck on anything specific, please post ... If nothing else when you lose steam, dump a (preferably detailed) todo list ... It's not always intuitive to find corresponding code blocks.
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

goingnuts
Posts: 932
Joined: Sun 07 Dec 2008, 13:33
Contact:

#34 Post by goingnuts »

Haven't lost steam yet :). I finally got gdk-pixbuf working so now png/jpg/xpm can be used. Unfortunately it breaks my static build (builds ok but segfaults) so I wont post code or build before that is fixed. But below a preview...and I will try make a to-do list on my way...
Attachments
snap0005.png
(42.77 KiB) Downloaded 942 times

amigo
Posts: 2629
Joined: Mon 02 Apr 2007, 06:52

#35 Post by amigo »

Looking really good there -I'm still following this. About gdk-pixbuf, make sure you have the static version of the library present -many distros disable static libs as much as (what they think) is possible.

Post Reply