Hi Mark,
thanks for all the help in this - I really appreciate it. My problem
still stands, though. As most Wx applications, it's a big app, but I
managed to get only the important bits to reproduce the bug. Here's a
(complete) failing code:
-------------------8<-------------------
use strict;
use warnings;
use Wx (':everything');
local $| = 1;
warn "creating dialog";
my $dialog = Wx::Dialog->new(
undef,
-1,
Wx::gettext("Padre Preferences"),
Wx::wxDefaultPosition,
Wx::wxDefaultSize,
Wx::wxDEFAULT_DIALOG_STYLE | Wx::wxRESIZE_BORDER,
);
$dialog->SetSizeHints( Wx::wxDefaultSize, Wx::wxDefaultSize );
warn "dialog created" if $dialog->isa('Wx::Dialog');
warn "creating treebook";
my $treebook = Wx::Treebook->new(
$dialog,
-1,
Wx::wxDefaultPosition,
Wx::wxDefaultSize,
);
warn "treebook created" if $treebook->isa('Wx::Treebook');
warn "creating panel";
my $m_panel3 = Wx::Panel->new(
$treebook,
-1,
Wx::wxDefaultPosition,
Wx::wxDefaultSize,
Wx::wxTAB_TRAVERSAL,
);
warn "panel created" if $m_panel3->isa('Wx::Panel');
warn "creating fontpicker";
my $ctrl = Wx::FontPickerCtrl->new(
$m_panel3,
-1,
Wx::wxNullFont,
Wx::wxDefaultPosition,
Wx::wxDefaultSize,
Wx::wxFNTP_DEFAULT_STYLE,
);
$ctrl->SetMaxPointSize(100);
warn "fontpicker created" if $ctrl->isa('Wx::FontPickerCtrl');
my $value = '';
warn "setting up font";
my $font = Wx::Font->new(Wx::wxNullFont);
warn "font created" if $font->isa('Wx::Font');
{
warn "setting native";
local $@;
eval { $font->SetNativeFontInfoUserDesc($value); };
if ($@) {
warn "something's wrong: $@";
$font = Wx::Font->new(Wx::wxNullFont)
}
}
warn "yes, it's still a font" if $font->isa('Wx::Font');
warn "setting selected font";
$ctrl->SetSelectedFont($font);
warn "done!";
------------------->8-------------------
The output goes like this:
$ perl test.pl
creating dialog at test.pl line 7.
dialog created at test.pl line 17.
creating treebook at test.pl line 19.
treebook created at test.pl line 26.
creating panel at test.pl line 28.
panel created at test.pl line 36.
creating fontpicker at test.pl line 38.
fontpicker created at test.pl line 48.
setting up font at test.pl line 53.
font created at test.pl line 55.
setting native at test.pl line 57.
yes, it's still a font at test.pl line 65.
setting selected font at test.pl line 67.
Segmentation fault
I'm running wxPerl 0.99, wxWidgets 2.8.12
$ perl -V
Summary of my perl5 (revision 5 version 14 subversion 0) configuration:
Platform:
osname=linux, osvers=2.6.35-28-generic,
archname=x86_64-linux-thread-multi
uname='linux bebop 2.6.35-28-generic #50-ubuntu smp fri mar 18
18:42:20 utc 2011 x86_64 gnulinux '
config_args='-de
-Dprefix=/home/garu/perl5/perlbrew/perls/perl-5.14.0 -Dusethreads'
hint=recommended, useposix=true, d_sigaction=define
useithreads=define, usemultiplicity=define
useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
use64bitint=define, use64bitall=define, uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing
-pipe -fstack-protector -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
optimize='-O2',
cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe
-fstack-protector'
ccversion='', gccversion='4.4.5', gccosandvers=''
intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t',
lseeksize=8
alignbytes=8, prototype=define
Linker and Libraries:
ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
libpth=/usr/local/lib /lib/../lib /usr/lib/../lib /lib /usr/lib
/lib64 /usr/lib64
libs=-lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
perllibs=-lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
libc=/lib/libc-2.12.1.so, so=so, useshrplib=false, libperl=libperl.a
gnulibc_version='2.12.1'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
cccdlflags='-fPIC', lddlflags='-shared -O2 -L/usr/local/lib
-fstack-protector'
Characteristics of this binary (from libperl):
Compile-time options: MULTIPLICITY PERL_DONT_CREATE_GVSV
PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP
PERL_PRESERVE_IVUV USE_64_BIT_ALL USE_64_BIT_INT
USE_ITHREADS USE_LARGE_FILES USE_PERLIO USE_PERL_ATOF
USE_REENTRANT_API
Built under linux
Compiled at May 14 2011 23:11:55
%ENV:
PERLBREW_PATH="/home/garu/perl5/perlbrew/bin:/home/garu/perl5/perlbrew/perls/perl-5.14.0/bin"
PERLBREW_PERL="perl-5.14.0"
PERLBREW_ROOT="/home/garu/perl5/perlbrew"
PERLBREW_VERSION="0.16"
@INC:
/home/garu/perl5/perlbrew/perls/perl-5.14.0/lib/site_perl/5.14.0/x86_64-linux-thread-multi
/home/garu/perl5/perlbrew/perls/perl-5.14.0/lib/site_perl/5.14.0
/home/garu/perl5/perlbrew/perls/perl-5.14.0/lib/5.14.0/x86_64-linux-thread-multi
/home/garu/perl5/perlbrew/perls/perl-5.14.0/lib/5.14.0
.
Thanks!
breno
On Mon, May 16, 2011 at 9:25 AM, Mark Dootson<mark.doot...@znix.com>
wrote:
Hi,
You need to construct the Wx::FontpickerCtrl with the minimum arguments
my $ctrl = Wx::FontPickerCtrl->new($someparentwindow, -1);
Passing a font then seems to work OK?
$ctrl->SetSelectedFont(wxNullFont);
.. gets you no font selected
$ctrl->SetSelectedFont (wxSWISS_FONT);
.. gets you an appropriate default font.
If you still have difficulty, what are your versions of Wx, wxWidgets
and
operating system?
Regards
Mark
On 15/05/2011 14:01, breno wrote:
Hi everyone!
The code below SegFaults when it tries to
$ctrl->SetSelectedFont($font):
----------------------8<----------------------
use strict;
use warnings;
use Wx (':everything');
my $ctrl = Wx::FontPickerCtrl->new();
my $value = '';
my $font = Wx::Font->new(Wx::wxNullFont);
{
local $@;
eval { $font->SetNativeFontInfoUserDesc($value); };
if ($@) {
warn "something's wrong: $@";
$font = Wx::Font->new(Wx::wxNullFont)
}
}
$ctrl->SetSelectedFont($font);
print "yay";
---------------------->8----------------------
I think this might be related to
https://rt.cpan.org/Ticket/Display.html?id=66648 though I'm not sure
how to fix it, since I don't have control over the creation of the
$ctrl variable, only from "my $value = ''" onwards. Assuming this is
not a bug in Wx, what would be the best way to avoid the SegFault?
What I'm thinking is only calling $ctrl->SetSelectedFont($font) if
$value is defined, but shouldn't it work with Wx::wxNullFont ?
Thanks!
breno