Hi Erik,In the meantime I have looked a little deeper into this issue. I got a C-program working and also managed to get it running with GTK-server, after some changes to the sources, of course.
The idea is that functions like 'gtk_tree_view_column_set_cell_data_func' need to be declared with a GTK-server macro, as follows:
gtk_server_define gtk_tree_view_column_set_cell_data_func NONE NONE 5 WIDGET WIDGET /*MACRO*/ POINTER NULL
Now, to invoke this function, use the macroname as argument:gtk_tree_view_column_set_cell_data_func $COLUMN1 $RENDERER1 /*GtkTreeCellDataFunc*/ $FIRST_COL $NULL
Here, the macro is called 'GtkTreeCellDataFunc', but it can have any name of course. In the GTK-server configfile, define a macro which renders the correct text from the ListStore or TreeStore into the cell. Excerpt of the macro below:
--------------------------------------------- MACRO GtkTreeCellDataFunc # Get the data $float : gtk_tree_model_get $3 $4 $5 0 -1 # Allocate memory for string $buffer : g_malloc 20 g_snprintf $buffer 20 %.2f $float # Set the data g_object_set $2 text $buffer NULL # Free the alloc'ed memory again g_free $buffer ENDMACRO ---------------------------------------------So, the each time GTK calls the callback function 'GtkTreeCellDataFunc', the GTK-server will run the corresponding macro. IMHO this will give the best freedom for all possibilities, for you can always create any macro with any desired rendering.
Attached to this mail you will find a screenshot and a Kornshell demoprogram. The code is commented and should show how it all works. You can find the full macro and Kornshelll demo also in the 2.2.8 beta (http://www.gtk-server.org/beta/gtk-server-2.2.8.tar.gz).
I made a Win32 beta installer also, which you can obtain from here: http://www.gtk-server.org/beta/gtk-server-2.2.8-installer.exe. Please try to run your program with the Win32 version, and let me know if it works for you.
Regards Peter Erik Winkels schreef:
Date: Tue, 9 Sep 2008 01:28:46 -0700 From: "John Spikowski" <johnspikowski@xxxxxxxxx>From: Erik Winkels <euqirea@xxxxxxxxx> Date: Tue, 9 Sep 2008 09:09:02 +0200 Still, wanting control over the amount of decimals should be one of the most (of not the most) common cases.Isn't the hosting language's FORMAT function (our something similar) responsible for expressions processing and data formatting?No, that's the whole problem. Otherwise I wouldn't have had this conversation with Peter :-) My problem is this: I've got a column with monetary (floats) values that also needs to be sortable. If I tell GTK the column contains strings I can use my hosting language's formatting and it'll look exactly the way I want it to, but the numbers will also be sorted as strings which is incorrect, ie: 1 10 11 2 3 instead of: 1 2 3 10 11 I could temporarily use ugly hacks like putting zeroes in front of all the numbers so they all will be of equal length. Now, when I tell GTK the column contains floats GTK somehow insists on using its own format and prints them all with six decimals in my case, no matter what I fill the columns with. So if I fill the model column like this: 123 987.6543 777.12345678 456.78 912.45 It will be printed in the view like this:123.000000987.654300 777.123456 456.780000 912.450000 Which is horrible if you want to display monetary values, but the sorting does work ;-) Hope this explains it. Erik
#!/bin/ksh # Communication function; assignment function function gtk { print -p $1; read -p GTK; } function define { $2 "$3"; eval $1="\"$GTK\""; } #---------------------------------------------------------------------------------- # Define some constants NULL="NULL" FIRST_COL=0 SECOND_COL=1 NUM_COLS=2 TRUE=1 # Start GTK-server gtk-server -stdin |& # Initialize GTK gtk "gtk_init $NULL $NULL" # Define main window and some attributes define WINDOW gtk "gtk_window_new GTK_WINDOW_TOPLEVEL" gtk "gtk_window_set_title $WINDOW 'Floats in lists'" gtk "gtk_window_set_resizable $WINDOW 0" gtk "gtk_window_set_icon_name $WINDOW gtk-info" gtk "gtk_widget_set_size_request $WINDOW 200 200" # Create a model define VIEW gtk "gtk_tree_view_new" gtk "gtk_tree_view_set_headers_clickable $VIEW $TRUE" gtk "gtk_tree_view_set_grid_lines $VIEW 3" # Create columns define COLUMN1 gtk "gtk_tree_view_column_new" gtk "gtk_tree_view_column_set_title $COLUMN1 Column1" gtk "gtk_tree_view_append_column $VIEW $COLUMN1" gtk "gtk_tree_view_column_set_resizable $COLUMN1 $TRUE" gtk "gtk_tree_view_column_set_clickable $COLUMN1 $TRUE" define COLUMN2 gtk "gtk_tree_view_column_new" gtk "gtk_tree_view_column_set_title $COLUMN2 Column2" gtk "gtk_tree_view_append_column $VIEW $COLUMN2" gtk "gtk_tree_view_column_set_resizable $COLUMN2 $TRUE" gtk "gtk_tree_view_column_set_clickable $COLUMN2 $TRUE" # Create renderers to show contents define RENDERER1 gtk "gtk_cell_renderer_text_new" gtk "gtk_tree_view_column_pack_start $COLUMN1 $RENDERER1 $TRUE" define RENDERER2 gtk "gtk_cell_renderer_text_new" gtk "gtk_tree_view_column_pack_start $COLUMN2 $RENDERER2 $TRUE" # Define the store where the actual data is kept gtk "gtk_server_redefine gtk_list_store_new NONE WIDGET 3 INT INT INT" define LST gtk "gtk_list_store_new 2 G_TYPE_DOUBLE G_TYPE_DOUBLE" # Fill store with some data define ITER gtk "gtk_server_opaque" gtk "gtk_server_redefine gtk_list_store_set NONE NONE 5 WIDGET WIDGET INT DOUBLE INT" # First column gtk "gtk_list_store_append $LST $ITER" gtk "gtk_list_store_set $LST $ITER $FIRST_COL 1.23456 -1" gtk "gtk_list_store_set $LST $ITER $SECOND_COL 9.87654 -1" gtk "gtk_list_store_append $LST $ITER" gtk "gtk_list_store_set $LST $ITER $FIRST_COL 5.43210 -1" gtk "gtk_list_store_set $LST $ITER $SECOND_COL 4.56789 -1" gtk "gtk_list_store_append $LST $ITER" gtk "gtk_list_store_set $LST $ITER $FIRST_COL 10.13578 -1" gtk "gtk_list_store_set $LST $ITER $SECOND_COL 1.010101 -1" # Attach store to model gtk "gtk_tree_view_set_model $VIEW $LST" # Make sure all memory is released when the model is destroyed gtk "g_object_unref $LST" # Set the mode of the view define SEL gtk "gtk_tree_view_get_selection $VIEW" gtk "gtk_tree_selection_set_mode $SEL GTK_SELECTION_SINGLE" # Define a scrolled window define SW gtk "gtk_scrolled_window_new $NULL $NULL" gtk "gtk_scrolled_window_set_policy $SW 1 1" gtk "gtk_scrolled_window_set_shadow_type $SW 1" gtk "gtk_container_add $SW $VIEW" # Now register the render function for both columns - using the same macro with different column number gtk "gtk_server_define gtk_tree_view_column_set_cell_data_func NONE NONE 5 WIDGET WIDGET MACRO POINTER NULL" gtk "gtk_tree_view_column_set_cell_data_func $COLUMN1 $RENDERER1 GtkTreeCellDataFunc $FIRST_COL $NULL" gtk "gtk_tree_view_column_set_cell_data_func $COLUMN2 $RENDERER2 GtkTreeCellDataFunc $SECOND_COL $NULL" # Finish gui gtk "gtk_container_add $WINDOW $SW" gtk "gtk_widget_show_all $WINDOW" # Set ordering variable ORDER_FIRST=0 ORDER_SECOND=1 # MAINLOOP until [[ $EVENT = $WINDOW ]] do define EVENT gtk "gtk_server_callback wait" case $EVENT in $COLUMN1) let ORDER_FIRST=1-$ORDER_FIRST let ORDER_SECOND=1-$ORDER_SECOND gtk "gtk_tree_sortable_set_sort_column_id $LST $FIRST_COL $ORDER_FIRST";; $COLUMN2) let ORDER_FIRST=1-$ORDER_FIRST let ORDER_SECOND=1-$ORDER_SECOND gtk "gtk_tree_sortable_set_sort_column_id $LST $SECOND_COL $ORDER_SECOND";; esac done gtk "gtk_server_exit"