Package: unison-gtk Version: 2.13.16-5 Followup-For: Bug #318132 hi
here in attachment is a file that is triggering the bug for me this file had only "props" changed , but I hit "diff" anyway, and this triggered the bug a. -- System Information: Debian Release: testing/unstable APT prefers testing APT policy: (500, 'testing') Architecture: i386 (i686) Shell: /bin/sh linked to /bin/bash Kernel: Linux 2.6.16-1-k7 Locale: LANG=it_IT.UTF-8, LC_CTYPE=it_IT.UTF-8 (charmap=UTF-8) Versions of packages unison-gtk depends on: ii libatk1.0-0 1.12.1-1 The ATK accessibility toolkit ii libc6 2.3.6-16 GNU C Library: Shared libraries ii libcairo2 1.2.2-1 The Cairo 2D vector graphics libra ii libfontconfig1 2.3.2-7 generic font configuration library ii libglib2.0-0 2.10.3-3 The GLib library of C routines ii libgtk2.0-0 2.8.18-1 The GTK+ graphical user interface ii libpango1.0-0 1.12.3-1+b1 Layout and rendering of internatio ii libx11-6 2:1.0.0-8 X11 client-side library ii libxcursor1 1.1.5.2-5 X cursor management library ii libxext6 1:1.0.0-4 X11 miscellaneous extension librar ii libxi6 1:1.0.0-5 X11 Input extension library ii libxinerama1 1:1.0.1-4 X11 Xinerama extension library ii libxrandr2 2:1.1.0.2-4 X11 RandR extension library ii libxrender1 1:0.9.0.2-4 X Rendering Extension client libra Versions of packages unison-gtk recommends: ii openssh-client [ssh-client] 1:4.3p2-3 Secure shell client, an rlogin/rsh ii ssh-askpass-gnome [ssh-askpas 1:4.3p2-3 under X, asks user for a passphras -- no debconf information -- Andrea Mennucc "E' un mondo difficile. Che vita intensa!" (Tonino Carotone)
#include "stdio.h"
#include <string.h> //strlen
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <gtk/gtk.h>
#ifdef USE_IMLIB
#include <gdk_imlib.h>
#else
#include <gdk-pixbuf/gdk-pixbuf.h>
#endif
#include "gtk-meta.h"
#include <math.h>
#include "gtktopdata.h"
#include "gtk_subimagesel.h"
#include "main.h"
#include "callbacks.h"
#include "interface.h"
#include "guide.h"
#include "support.h"
//#include "pixmaps.h"
#ifndef IS_PLYMORPH
#include "mesh-gtk.h"
#include "utils.h"
#include "feature.h"
#include "../libmorph/relax.h"
#endif
#include "mag.h"
#include "fourier.hh"
#include "dialogs.h"
#include "callbacks_fs.h"
#include "loadsave.h"
#ifndef IS_PLYMORPH
#include "loadsave_mesh.h"
#else
#include "loadsave_ply.h"
#endif
#include "callbacks_subimg.h" //redraw_spins
/* some code was taken from the gtk-tutorial , the "scribble" example */
/*******************************************************************
******************************************************************
main window
**********************************************************************
**********************************************************************
*/
gboolean
on_window_main_delete (GtkWidget *widget,
GdkEvent *event,
gpointer user_data)
{
if(guide_callback("delete_event",MAIN_WIN)) {
gtk_widget_hide(widget);
return TRUE;
}
else
{
on_quit1_activate(NULL,NULL);
return TRUE;
}
}
void
on_quit1_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
int lp; char s[MAX_WINS*5+10];
s[0]=0;
/* FIXME < or <= ?? */
for(lp=1;lp<=MAX_WINS; lp++) {
if( sp->im_widget[lp] &&
#ifdef IS_PLYMORPH
sp->im_ply_labels_unsaved[lp]
#else
sp->im_mesh[lp].changed>0
#endif
) {
int l=strlen(s); sprintf(s+l," %d",lp);
}
}
if ( s[0]) {
GtkWidget *q=create_question(), *b;
char *z=g_strdup_printf
(_("the mesh(es) %s were not saved! do you want to exit anyway?"),s);
//gtk_window_set_title(GTK_WINDOW(q),z);
gtk_widget_show(q);
b=lookup_widget(q,"yes");
gtk_signal_connect (GTK_OBJECT (b), "clicked",
GTK_SIGNAL_FUNC (gtk_main_quit),
NULL);
b=lookup_widget(q,"no");
gtk_signal_connect (GTK_OBJECT (b), "clicked",
GTK_SIGNAL_FUNC (gtk_widget_destroy),
q);
b=lookup_widget(q,"questionlabel");
gtk_label_set_text(GTK_LABEL(b),z);
g_free(z);
}
else
gtk_main_quit();
}
void
on_resulting_image_size_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
GtkWidget* hb= lookup_widget ( sp->im_widget[MAIN_WIN] ,
"handlebox_res_size");
g_assert(hb);
gtk_widget_show(hb);
}
void
on_show_morph_factors_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
int lp;
for(lp=1 ; lp <= MAX_WINS; lp ++)
if(sp->im_widget[lp] != NULL) {
//set_editview(lp,EDITVIEW_SHOWMESHES );
setup_handlebox_factor(lp,TRUE);
}
}
//void
//on_logtext_realize (GtkWidget *widget,
// gpointer user_data)
//{
//
//}
/*
main menus callbacks
*/
#include <time.h>
gchar *session_name=NULL;
void
on_load_session_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
fileselection_hook=load_session;
fileselection1_for_image_num_g=MAIN_WIN;
show_fs(//GTK_WIDGET(menuitem),
_("load session")
#if GTK_MAJOR_VERSION >= 2
, GTK_FILE_CHOOSER_ACTION_OPEN
#endif
);
if(session_name)
gtk_file_selection_set_filename ((fileselection_g),session_name);
}
void
on_save_session_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
fileselection_hook=save_session;
fileselection1_for_image_num_g=MAIN_WIN;
show_fs(//GTK_WIDGET(menuitem),
_("save session")
#if GTK_MAJOR_VERSION >= 2
, GTK_FILE_CHOOSER_ACTION_SAVE
#endif
);
if(!session_name){
#if GLIB_MAJOR_VERSION == 1
session_name=g_strdup_printf("gtkmorph.session");
#else
GDate D;
g_date_set_time (&D, time (NULL));
session_name=g_strdup_printf("%d-%02d-%02d.session",
g_date_get_year (&D),g_date_get_month (&D),
g_date_get_day (&D));
#endif
}
gtk_file_selection_set_filename ((fileselection_g),session_name);
}
void
on_add_an_image_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
int lp;
for(lp=1 ; lp <= MAX_WINS; lp ++)
if(sp->im_widget[lp] == NULL)
{
/* we set this before,
otherwise the "factor_normalize" goes berseker */
sp->max_wins++;
create_and_show_image_win(lp);
setup_handlebox_factor(lp,FALSE);
return;
}
}
void
on_view_images1_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
int lp;
for(lp=1 ; lp <= MAIN_WIN ; lp ++)
{
if(sp->im_widget[lp] != NULL)
gtk_widget_show (sp->im_widget[lp]);
}
}
double
tot_mixing_factors()
{
double totdiss;
int lp;
totdiss=0;
for ( lp =1; lp <= MAX_WINS; lp++)
if(sp->im_widget[lp] != NULL)
totdiss += sp->mf.im_dissolve_factor[lp];
// FIXME this is not shown
sp->mf.im_dissolve_factor[MAIN_WIN]=totdiss;
return totdiss;
}
double
tot_mixing_factors_nice()
{
double totdiss=tot_mixing_factors();
int lp;
if ( ABS(totdiss) < 0.001)
{
show_warning( _("\
to blend the images, the sum of the all `image mixing factors' must be nonzero\
\nI have put default values for you"));
for ( lp =1; lp <= MAX_WINS; lp++)
if(sp->im_widget[lp] != NULL) {
sp->mf.im_dissolve_factor[lp]=1.0/(double)sp->max_wins;
//gtk_widget_get_data_top(sp->im_widget[lp],"imagenum")
}
totdiss =1;
redraw_spins(-3);
}
return totdiss;
}
/********************************
does the actual morphing
********************************/
#define PRINT_MORPH_TIME
void
on_morph_images1_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
int lp;
//double totdiss=tot_mixing_factors_nice();
#ifdef PRINT_MORPH_TIME
GTimeVal bef,aft;
g_get_current_time(&bef);
#endif
if( sp->max_wins<=1)
{
show_error( _("\
to morph, you must have at least two input images"));
return;
}
on_interpolate_meshes1_activate (NULL,NULL);
for ( lp =1; lp <= MAX_WINS; lp++)
if(sp->im_widget[lp] != NULL
#ifndef IS_PLYMORPH
&& !sp->im_widget_is_difference_mesh[lp]
#endif
)
{
#ifdef IS_PLYMORPH
extern int reference_ply_surface_n;
g_return_if_fail(reference_ply_surface_n>0);
if( lp != reference_ply_surface_n && ABS(sp->mf.im_dissolve_factor[lp]) < 0.001 )
#else
if(ABS(sp->mf.im_dissolve_factor[lp]) < 0.001 )
#endif
g_message("NOT morphing image %d to resultin mesh", lp);
else
{
g_message("warping image %d to resulting mesh", lp);
// do_warp_an_image_old(lp,r,g,b);
do_warp_an_image_new(lp);
}
}
on_do_mixing_clicked(NULL,NULL);
#ifdef PRINT_MORPH_TIME
g_get_current_time(&aft);
g_message("morph time %.2f",(double)(aft.tv_sec-bef.tv_sec) +
(double)(aft.tv_usec -bef.tv_usec) /1e6 );
#endif
#ifdef IS_PLYMORPH
__after_morph_ply_callback();
#endif
if(settings_get_value( "show warp after warp"))
set_editview(MAIN_WIN, EDITVIEW_SHOW);
MY_GTK_DRAW (sp->im_widget[MAIN_WIN]);
}
/***********************************************************
*
*************************** file selection ************
*
**********************************************************
the following hook is set
so that the same fileselection dialog will be used for many
different purposes
*/
void
on_ok_button1_realize (GtkWidget *widget,
gpointer user_data)
{
// GtkWidget *widget_f= gtk_widget_get_toplevel (widget);
// doesnt work
// gtk_container_add (GTK_CONTAINER (widget_f),
// menu_image_num_g);
// gtk_menu_item_set_submenu(widget,create_menu_image_num_g );
}
void
on_ok_button1_clicked (GtkButton *button,
gpointer user_data)
{
const char *file=
gtk_file_selection_get_filename ( fileselection_g);
g_assert(fileselection1_for_image_num_g > 0);
if( //e.g. fileselection_hook=load_image_from_file
fileselection_hook (fileselection1_for_image_num_g,
file))
{
//gtk_widget_hide(GTK_WIDGET(fileselection_g));
//gtk_file_selection_complete (fileselection_g,"");
gtk_widget_show( sp-> im_widget[fileselection1_for_image_num_g]);
guide_callback("file",fileselection1_for_image_num_g);
// lets be nasty
fileselection1_for_image_num_g=-2;
fileselection_hook=NULL;
gtk_widget_destroy(GTK_WIDGET(fileselection_g));
fileselection_g=NULL;
}
}
#if HAVE_WAILI
#include "wavelet.hh"
GNode *l2_warped_stats[MAX_WINS], *l2_subimage_stats[MAX_WINS];
#endif
#ifndef IS_PLYMORPH
void
on_wavelet_equalize_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
#if HAVE_WAILI
int lp;
GNode *l2_tmp=NULL;
double fact=0;
for ( lp =1; lp <= MAX_WINS; lp++)
if(sp->im_widget[lp] != NULL && sp-> im_subimage_pixbuf[lp] )
fact +=1;
fact = 1/fact;
for ( lp =1; lp <= MAX_WINS; lp++)
if(sp->im_widget[lp] != NULL && sp-> im_subimage_pixbuf[lp] ) {
g_debug(" ----- wavelet L2 energies for subimage image %d\n",lp);
l2_subimage_stats[lp]=wavelet_stats( sp-> im_subimage_pixbuf[lp]);
if(!l2_tmp)
l2_tmp=wavelet_stats_clone(l2_subimage_stats[lp]);
wavelet_stats_sum(l2_tmp,l2_subimage_stats[lp],fact);
}
for ( lp =1; lp <= MAX_WINS; lp++)
if(sp->im_widget[lp] != NULL && sp-> im_subimage_pixbuf[lp] ) {
g_debug(" --- equalizing wavelet L2 energies for image %d\n",lp);
wavelet_equalize(sp-> im_subimage_pixbuf[lp],l2_tmp);
}
#else
show_error(_("gtkmorph was not linked with Waili wavelet library"));
#endif
}
#endif
static int round_and_dither( double v)
{
static double delta=0; double nv;
v=v+delta;
nv=floor(v+0.5);
delta=v-nv;
return (int)nv;
}
void
on_do_mixing_clicked (GtkButton *button,
gpointer user_data)
{
int lp;
double totdiss=tot_mixing_factors_nice();
guint w=sp->resulting_width, h=sp->resulting_height;
int effective_wins=0, max_win=0;
guchar *data[MAX_WINS+2];
g_debug("blending textures of warped images");
for ( lp =1; lp <= MAX_WINS; lp++) {
if(sp->im_widget[lp] != NULL &&
#ifndef IS_PLYMORPH
!sp->im_widget_is_difference_mesh[lp] &&
#endif
ABS(sp->mf.im_dissolve_factor[lp]) >= 0.0001 && lp != MAIN_WIN ) {
effective_wins++; max_win=lp;
data[lp] = gdk_pixbuf_get_pixels(sp-> im_warped_pixbuf[lp]);
g_assert( data[lp] != NULL);
} else
data[lp]=NULL;
}
if( effective_wins <=1) {
//simply copy
if(sp-> im_warped_pixbuf[MAIN_WIN])
gdk_pixbuf_unref(sp-> im_warped_pixbuf[MAIN_WIN]);
sp-> im_warped_pixbuf[MAIN_WIN]=
gdk_pixbuf_copy(sp-> im_warped_pixbuf[max_win]);
#ifndef IS_PLYMORPH
render_pixmap(MAIN_WIN, PIXWARPED);
set_editview(MAIN_WIN, settings_get_value( "show warp after warp"));
MY_GTK_DRAW(sp->im_widget[MAIN_WIN] );
#endif
return;
}
{
/* we precompute some data */
double fact[max_win+1];
guint rowstride[max_win+1];
guint channels[max_win+1];
#if HAVE_WAILI
GNode *l2_average_stat=NULL;
#endif
for ( lp =1; lp <= max_win; lp++)
if(data[lp]) {
fact[lp] = sp->mf.im_dissolve_factor[lp] / totdiss;
rowstride[lp]= gdk_pixbuf_get_rowstride(sp-> im_warped_pixbuf[lp]);
channels[lp]= gdk_pixbuf_get_n_channels(sp-> im_warped_pixbuf[lp]);
}
#if HAVE_WAILI
if( settings_get_value ("wavelet equalization")) {
g_message("collecting wavelet statistics");
for ( lp =1 ; lp <= max_win ; lp++) {
if (data[lp] != NULL){
if(NULL==l2_warped_stats[lp]) {
g_debug(" ----- wavelet L2 energies for image %d\n",lp);
l2_warped_stats[lp]=wavelet_stats( sp-> im_warped_pixbuf[lp]);
}
if(NULL==l2_average_stat)
l2_average_stat=wavelet_stats_clone(l2_warped_stats[lp]);
wavelet_stats_sum(l2_average_stat, l2_warped_stats[lp] , fact[lp] );
}
}}
#endif
{
GdkPixbuf *dpb = sp-> im_warped_pixbuf[MAIN_WIN];
if(dpb==NULL) {
#ifdef IS_PLYMORPH
dpb = sp-> im_warped_pixbuf[MAIN_WIN]=
gdk_pixbuf_new(GDK_COLORSPACE_RGB,//GdkColorspace colorspace,
TRUE,//gboolean has_alpha,
8,//int bits_per_sample,
w,h);//int width, int height);
#else
create__pixbuf(MAIN_WIN, PIXWARPED);
dpb = sp-> im_warped_pixbuf[MAIN_WIN];
#endif
}
guchar *ddata = gdk_pixbuf_get_pixels(dpb);
guint drowstride= gdk_pixbuf_get_rowstride (dpb) ;
guint dchannels= gdk_pixbuf_get_n_channels(dpb);
guint i,j;
double val; int v;
guint dps[max_win+1]; long dp=0; /* data position */
//we clear the old image
gdk_pixbuf_clear(dpb);
//FIXME
for ( lp =max_win ; lp >= 1 ; lp--)
if (data[lp] != NULL)
if( dchannels != channels[lp] ) {
show_error( _("the input images have different numbers of channels: cannot blend"));
return;
}
for( j=0; j< h ; j++) {
dp= drowstride * j;
for ( lp =max_win ; lp >= 1 ; lp--)
if (data[lp] != NULL)
dps[lp]=rowstride[lp] * j;
/* this interpolates also the alpha value, if any */
for( i=0; i< dchannels*w ; i++) {
val = 0 ;
for ( lp =max_win ; lp >= 1 ; lp--) {
if (data[lp] != NULL) {
val += fact[lp] * (double) (data[lp])[dps[lp] + i ] ;
}}
/* FIXME if the image is not 8 bit */
v=round_and_dither(val);
ddata[dp + i] = CLAMP(v, 0, 255);
}
}
#if HAVE_WAILI
if( settings_get_value ("wavelet equalization")) {
g_message("wavelet equalization");
wavelet_equalize(dpb,l2_average_stat);
}
#endif
}
}
#ifndef IS_PLYMORPH
render_pixmap(MAIN_WIN, PIXWARPED);
set_editview(MAIN_WIN, settings_get_value( "show warp after warp"));
#endif
MY_GTK_DRAW(sp->im_widget[MAIN_WIN] );
}
void do_mesh_factors_equal()
{
int lp;
for ( lp =1; lp <= MAX_WINS; lp++)
if( sp->im_widget[lp] != NULL)
sp->mf.im_warp_factor[lp]=1.0/ (double)sp->max_wins;
}
/*
**********************************************************************
************** resulting image, spinbuttons ********************
**********************************************************************
*/
#include "movies.h"
void
on_resulting_apply_clicked (GtkButton *button,
gpointer user_data)
{
double w=sp->resulting_width,h=sp->resulting_height ;
sp->resulting_width = sp->resulting_width_sp;
sp->resulting_height = sp->resulting_height_sp;
{
GtkWidget* hb= lookup_widget ( sp->im_widget[MAIN_WIN] ,
"handlebox_res_size");
g_assert(hb);
gtk_widget_hide(hb);
}
int lp;
#ifndef IS_PLYMORPH
#ifdef ANIMATE_INTERNALLY
int movie_pixmap_free();
#endif
for( lp =1; lp <= MAIN_WIN; lp++)
if ( sp->im_widget[lp] ) {
destroy_image_win_pixbufs(lp,1);
//alloc_image_win_data(lp,1);
{
int j ;
for (j=2;j>=1;j--) {
create__pixbuf(lp,j);
// can't do this now-- need a window --create__pixmap(lp,j);
}}
{
int j ;
for (j=2;j>=1;j--) {
// do this now-- need a window --
create__pixmap(lp,j);
}
}
subimage2affines(lp);
reload_and_scale_image(lp);
meshScaleFreeformat( &(sp->im_mesh[lp]),
(double)sp->resulting_width/w,
(double)sp->resulting_height/h);
}
guide_callback("resulting size",MAIN_WIN);
#endif
for( lp =1; lp <= MAIN_WIN; lp++)
if ( sp->im_widget[lp] ) {
drawingarea_configure(lp);
MY_GTK_DRAW( sp-> im_widget[lp]);
}
}
void spinbutton_res_set()
{
GtkWidget *widget=lookup_widget(sp->im_widget[MAIN_WIN],
"spinbutton_reswidth");
gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget),
sp->resulting_width_sp );
widget=lookup_widget(sp->im_widget[MAIN_WIN],"spinbutton_resheight");
gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget),
sp->resulting_height_sp );
}
void
on_spinbutton_reswidth_changed (my_GtkSpinButton *spinbutton,//GtkEditable *editable,
gpointer user_data)
{
// GtkSpinButton *spin = GTK_SPIN_BUTTON (editable);
sp->resulting_width_sp =gtk_spin_button_get_value_as_float (spinbutton);
}
void
on_spinbutton_resheight_changed (my_GtkSpinButton *spinbutton,//GtkEditable *editable,
gpointer user_data)
{
// GtkSpinButton *spin = GTK_SPIN_BUTTON (editable);
sp->resulting_height_sp =gtk_spin_button_get_value_as_float (spinbutton);
}
void
on_double_size_clicked (GtkButton *button,
gpointer user_data)
{
if( sp->resulting_height_sp <= 5000 && sp->resulting_width_sp <= 5000 ) {
sp->resulting_height_sp *= 2;
sp->resulting_width_sp *=2;
spinbutton_res_set();
MY_GTK_DRAW( sp-> im_widget[MAIN_WIN]);
}
}
void
on_halve_size_clicked (GtkButton *button,
gpointer user_data)
{
if( sp->resulting_height_sp > 8 && sp->resulting_width_sp > 8 ) {
sp->resulting_height_sp /= 2;
sp->resulting_width_sp /= 2;
spinbutton_res_set();
MY_GTK_DRAW( sp-> im_widget[MAIN_WIN]);
}
}
/***********************************************************************
**********************************************************************
image windows callbacks
note: many callbacks are shared with the "resulting image window"
**********************************************************************
*/
gboolean
on_image_win_1_delete_event (GtkWidget *widget,
GdkEvent *event,
gpointer user_data)
{
int i=
GPOINTER_TO_UINT(gtk_widget_get_data_top(widget,"imagenum"));
#ifndef IS_PLYMORPH
mag_xy_track(MAIN_WIN,0,0);
#endif
destroy_image_win_data(i);
sp->mf.im_warp_factor[i]=0;
sp->mf.im_dissolve_factor[i]=0;
return FALSE;
}
gboolean
on_diff_window_delete_event (GtkWidget *widget,
GdkEvent *event,
gpointer user_data)
{
int i=
GPOINTER_TO_UINT(gtk_widget_get_data_top(widget,"imagenum"));
destroy_image_win_data(i);
sp->mf.im_warp_factor[i]=0;
sp->mf.im_dissolve_factor[i]=0;
return FALSE;
}
void
on_load_example_session_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
int lp;
for(lp=1;lp<=MAX_WINS; lp++) {
if( sp->im_widget[lp] &&
#ifdef IS_PLYMORPH
sp->im_ply_labels_unsaved[lp]
#else
sp->im_mesh[lp].changed>0
#endif
) {
show_error(_("Loading the example session may ruin your current session. Please properly save all meshes and retry."));
return;
}
}
gchar *P=NULL;
#ifdef __WIN32__
extern gchar *program_install_dir;
gchar *pp[]={".",program_install_dir,NULL};
gchar *ee[]={"example/ad/gtkmorph.session",
"example/AD/gtkmorph.session",NULL};
lp=0; int le=0;
while(P == NULL && ee[le]) {
while(P == NULL && pp[lp]) {
if(P==NULL) {
P= g_build_filename(pp[lp],ee[le],NULL);
if(!g_file_test(P, G_FILE_TEST_IS_REGULAR)) {
g_free(P);P=NULL;
}
}
lp++;
}
le++;
}
#else
if(P==NULL &&
g_file_test(DATADIR "/" PACKAGE "/example/AD/gtkmorph.session", G_FILE_TEST_IS_REGULAR))
P=g_strdup(DATADIR "/" PACKAGE "/example/AD/gtkmorph.session");
if(P==NULL) {
gchar *s;
if(g_file_test("/etc/debian_version", G_FILE_TEST_IS_REGULAR))
s=g_strdup_printf(_("The 'example' directory should be in '%s' but is not.\nInstall the 'gtkmorph-example' debian package."),
DATADIR "/" PACKAGE );
else
s=g_strdup_printf(_("The 'example' directory should be in '%s' but is not."),
DATADIR "/" PACKAGE);
show_error(s); g_free(s);
}
#endif
if(P) {
g_debug("loading example session from '%s'",P);
load_session(0,P);
g_free(P);
} else g_warning("could not locate example session!");
}
signature.asc
Description: Digital signature

