From: Laurent R. <ro...@cl...> - 2004-10-07 21:23:35
|
Hi Blair, Fix and commit on CVS. Problem come from BS_CENTER style is BS_LEFT | BS_RIGHT so SwitchBit order it's important. I rewrite like this : if(strcmp(option, "-align") == 0) { // BS_CENTER is BS_LEFT | BS_RIGHT if(strcmp(SvPV_nolen(value), "left") == 0) { SwitchBit(perlcs->cs.style, BS_RIGHT, 0); SwitchBit(perlcs->cs.style, BS_LEFT, 1); } else if(strcmp(SvPV_nolen(value), "center") == 0) { SwitchBit(perlcs->cs.style, BS_CENTER, 1); } else if(strcmp(SvPV_nolen(value), "right") == 0) { SwitchBit(perlcs->cs.style, BS_LEFT, 0); SwitchBit(perlcs->cs.style, BS_RIGHT, 1); } else { if(PL_dowarn) warn("Win32::GUI: Invalid value for -align!"); } } Thank for bug report. Laurent. > I've noticed that the button attribute "align" breaks if you specify > "center", if empty it works (i.e. default). > > <pre> > use Win32::GUI; > my $W = new GUI::Window(-height=>100,-width=>100); > my $B = $W->AddButton(-text=>'Test', -width=>'100', -align=>'center'); > $W->Center(); > $W->Show(); > Win32::GUI::Dialog; > </pre> > > If one replaces "center" with "right" it works as expected. The error is > not apparent in Button.xs and I've happens on XPsp2 and W2Ksp4. > > Blair > |
From: Glenn L. <pe...@ne...> - 2004-10-07 22:15:32
|
On approximately 10/7/2004 2:23 PM, came the following characters from the keyboard of Laurent ROCHER: > Hi Blair, > > Fix and commit on CVS. > > Problem come from BS_CENTER style is BS_LEFT | BS_RIGHT so SwitchBit > order it's important. > > I rewrite like this : > > if(strcmp(option, "-align") == 0) { > // BS_CENTER is BS_LEFT | BS_RIGHT > if(strcmp(SvPV_nolen(value), "left") == 0) { > SwitchBit(perlcs->cs.style, BS_RIGHT, 0); > SwitchBit(perlcs->cs.style, BS_LEFT, 1); > } else if(strcmp(SvPV_nolen(value), "center") == 0) { > SwitchBit(perlcs->cs.style, BS_CENTER, 1); Shouldn't this be SwitchBit(perlcs->cs.style, BS_CENTER, 3); or alternately (to expose that BS_CENTER is BS_LEFT | BS_RIGHT) SwitchBit(perlcs->cs.style, BS_RIGHT, 1); SwitchBit(perlcs->cs.style, BS_LEFT, 1); > } else if(strcmp(SvPV_nolen(value), "right") == 0) { > SwitchBit(perlcs->cs.style, BS_LEFT, 0); > SwitchBit(perlcs->cs.style, BS_RIGHT, 1); > } else { > if(PL_dowarn) warn("Win32::GUI: Invalid value for -align!"); > } > } > > Thank for bug report. > > Laurent. > > > >>I've noticed that the button attribute "align" breaks if you specify >>"center", if empty it works (i.e. default). >> >><pre> >>use Win32::GUI; >>my $W = new GUI::Window(-height=>100,-width=>100); >>my $B = $W->AddButton(-text=>'Test', -width=>'100', -align=>'center'); >>$W->Center(); >>$W->Show(); >>Win32::GUI::Dialog; >></pre> >> >>If one replaces "center" with "right" it works as expected. The error is >>not apparent in Button.xs and I've happens on XPsp2 and W2Ksp4. >> >>Blair >> > > > > > ------------------------------------------------------- > This SF.net email is sponsored by: IT Product Guide on ITManagersJournal > Use IT products in your business? Tell us what you think of them. Give us > Your Opinions, Get Free ThinkGeek Gift Certificates! Click to find out more > http://productguide.itmanagersjournal.com/guidepromo.tmpl > _______________________________________________ > Perl-Win32-GUI-Hackers mailing list > Per...@li... > https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-hackers > > > -- Glenn -- http://nevcal.com/ =========================== The best part about procrastination is that you are never bored, because you have all kinds of things that you should be doing. |
From: Glenn L. <pe...@ne...> - 2004-10-07 22:29:25
|
On approximately 10/7/2004 3:15 PM, came the following characters from the keyboard of Glenn Linderman: > On approximately 10/7/2004 2:23 PM, came the following characters from > the keyboard of Laurent ROCHER: > >> Hi Blair, >> >> Fix and commit on CVS. >> >> Problem come from BS_CENTER style is BS_LEFT | BS_RIGHT so SwitchBit >> order it's important. >> >> I rewrite like this : >> >> if(strcmp(option, "-align") == 0) { >> // BS_CENTER is BS_LEFT | BS_RIGHT >> if(strcmp(SvPV_nolen(value), "left") == 0) { >> SwitchBit(perlcs->cs.style, BS_RIGHT, 0); >> SwitchBit(perlcs->cs.style, BS_LEFT, 1); >> } else if(strcmp(SvPV_nolen(value), "center") == 0) { >> SwitchBit(perlcs->cs.style, BS_CENTER, 1); > > > Shouldn't this be > > SwitchBit(perlcs->cs.style, BS_CENTER, 3); No, not this one. I misread how SwitchBit works. Sorry for multiple postings, but I remembered tha SwitchBit was pretty obscure... but I forgot in what way it was obscure. > or alternately (to expose that BS_CENTER is BS_LEFT | BS_RIGHT) > > SwitchBit(perlcs->cs.style, BS_RIGHT, 1); > SwitchBit(perlcs->cs.style, BS_LEFT, 1); This is the only one that will work. SwitchBit is not smart enough to deal with multi-bit values. If the previous value was BS_RIGHT or BS_LEFT, SwitchBit is not smart enough to only turn on the other bit. Because of its "if(!(mask & bit)) test, which will be false. Nor is it smart enough to turn off both bits with "SwitchBit(perlcs->cs.style, BS_CENTER,0);", because it uses "mask ^= bit;" which will turn on the other bit. Really, it would be easier if there were a primitive that dealt with setting bitfields of variable width. Such exist, but not as part of Win32::GUI. #define SetBits(mask, bits) {mask |= bits;} #define ResetBits(mask, bits) {mask &= ~(bits);} #define SwitchBits(mask, bits, set) \ {if (set) SetBits(mask,bits) else ResetBits(mask,bits);} would be more useful, in my opinion. > >> } else if(strcmp(SvPV_nolen(value), "right") == 0) { >> SwitchBit(perlcs->cs.style, BS_LEFT, 0); >> SwitchBit(perlcs->cs.style, BS_RIGHT, 1); >> } else { >> if(PL_dowarn) warn("Win32::GUI: Invalid value for -align!"); >> } >> } >> >> Thank for bug report. >> >> Laurent. >> >> >> >>> I've noticed that the button attribute "align" breaks if you specify >>> "center", if empty it works (i.e. default). >>> >>> <pre> >>> use Win32::GUI; >>> my $W = new GUI::Window(-height=>100,-width=>100); >>> my $B = $W->AddButton(-text=>'Test', -width=>'100', -align=>'center'); >>> $W->Center(); >>> $W->Show(); >>> Win32::GUI::Dialog; >>> </pre> >>> >>> If one replaces "center" with "right" it works as expected. The error is >>> not apparent in Button.xs and I've happens on XPsp2 and W2Ksp4. >>> >>> Blair >>> >> >> >> >> >> ------------------------------------------------------- >> This SF.net email is sponsored by: IT Product Guide on ITManagersJournal >> Use IT products in your business? Tell us what you think of them. Give us >> Your Opinions, Get Free ThinkGeek Gift Certificates! Click to find out >> more >> http://productguide.itmanagersjournal.com/guidepromo.tmpl >> _______________________________________________ >> Perl-Win32-GUI-Hackers mailing list >> Per...@li... >> https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-hackers >> >> >> > -- Glenn -- http://nevcal.com/ =========================== The best part about procrastination is that you are never bored, because you have all kinds of things that you should be doing. |
From: Laurent R. <ro...@cl...> - 2004-10-08 17:41:47
|
Oups, correct and test it too fast :o) It's work when i test because center is default. > > > >> Hi Blair, > >> > >> Fix and commit on CVS. > > or alternately (to expose that BS_CENTER is BS_LEFT | BS_RIGHT) > > > > SwitchBit(perlcs->cs.style, BS_RIGHT, 1); > > SwitchBit(perlcs->cs.style, BS_LEFT, 1); I change -center with 2 SwitchBit. > This is the only one that will work. SwitchBit is not smart enough to > deal with multi-bit values. If the previous value was BS_RIGHT or > BS_LEFT, SwitchBit is not smart enough to only turn on the other bit. > Because of its "if(!(mask & bit)) test, which will be false. Nor is it > smart enough to turn off both bits with "SwitchBit(perlcs->cs.style, > BS_CENTER,0);", because it uses "mask ^= bit;" which will turn on the > other bit. > > Really, it would be easier if there were a primitive that dealt with > setting bitfields of variable width. Such exist, but not as part of > Win32::GUI. > > #define SetBits(mask, bits) {mask |= bits;} > #define ResetBits(mask, bits) {mask &= ~(bits);} > #define SwitchBits(mask, bits, set) \ > {if (set) SetBits(mask,bits) else ResetBits(mask,bits);} Yes, you right. I keep this for later. I don't want to add more stuff now but only bug correction. Laurent. |
From: Glenn L. <pe...@ne...> - 2004-10-08 18:09:20
|
On approximately 10/8/2004 10:42 AM, came the following characters from the keyboard of Laurent ROCHER: > Oups, correct and test it too fast :o) Yes, and I could see there was a problem, but it took me 3 tries to describe it properly! So I understand the problems of doing things too fast. Glad we have a list and can work things out together. And thanks for fixing it again :) > It's work when i test because center is default. Yes, that test case would work. >>#define SetBits(mask, bits) {mask |= bits;} >>#define ResetBits(mask, bits) {mask &= ~(bits);} >>#define SwitchBits(mask, bits, set) \ >> {if (set) SetBits(mask,bits) else ResetBits(mask,bits);} > > > Yes, you right. I keep this for later. > I don't want to add more stuff now but only bug correction. Understood. And I think the above is correct, but I didn't test them. Except that memory reads are faster than memory writes, I'm not sure that the extra conditionals in the current version of SwitchBit (notice I changed the name from SwitchBit to SwitchBits in the above, so they could coexist) are an optimization. Fewer instructions and fewer branches would be generated by the code above.. but one more memory store guaranteed to be performed by the above, which is made optional by the current SwitchBit code with the extra conditionals. -- Glenn -- http://nevcal.com/ =========================== The best part about procrastination is that you are never bored, because you have all kinds of things that you should be doing. |