SV * Drawable_get_text_box( Handle self, SV * text) { gpARGS; Point * p; AV * av; int i; STRLEN dlen; char * c_text = SvPV( text, dlen); Bool utf8 = prima_is_utf8_sv( text); if ( utf8) dlen = utf8_length(( U8*) c_text, ( U8*) c_text + dlen); gpENTER( newRV_noinc(( SV *) newAV())); p = apc_gp_get_text_box( self, c_text, dlen, utf8); gpLEAVE; av = newAV(); if ( p) { for ( i = 0; i < 5; i++) { av_push( av, newSViv( p[ i]. x)); av_push( av, newSViv( p[ i]. y)); }; free( p); } return newRV_noinc(( SV *) av); }
SV * Widget_hint( Handle self, Bool set, SV *hint) { enter_method; if ( set) { if ( var-> stage > csFrozen) return nilSV; my-> first_that( self, (void*)hint_notify, (void*)hint); free( var-> hint); var-> hint = duplicate_string( SvPV_nolen( hint)); opt_assign( optUTF8_hint, prima_is_utf8_sv(hint)); if ( application && (( PApplication) application)-> hintVisible && (( PApplication) application)-> hintUnder == self) { SV * hintText = my-> get_hint( self); Handle hintWidget = (( PApplication) application)-> hintWidget; if ( strlen( var-> hint) == 0) my-> set_hintVisible( self, 0); if ( hintWidget) CWidget(hintWidget)-> set_text( hintWidget, hintText); sv_free( hintText); } opt_clear( optOwnerHint); } else { hint = newSVpv( var-> hint ? var-> hint : "", 0); if ( is_opt( optUTF8_hint)) SvUTF8_on( hint); return hint; } return nilSV; }
static SV * text_server( Handle self, PClipboardFormatReg instance, int function, SV * data) { ClipboardDataRec c; switch( function) { case cefInit: return ( SV *) cfText; case cefFetch: if ( apc_clipboard_get_data( self, cfText, &c)) { data = newSVpv(( char*) c. data, c. length); free( c. data); return data; } break; case cefStore: if ( prima_is_utf8_sv( data)) { /* jump to UTF8. close() will later downgrade data to ascii, if any */ instance = formats + cfUTF8; return instance-> server( self, instance, cefStore, data); } else { c. data = ( Byte*) SvPV( data, c. length); instance-> success = apc_clipboard_set_data( self, cfText, &c); instance-> written = true; } break; } return nilSV; }
Bool Drawable_text_out( Handle self, SV * text, int x, int y) { Bool ok; STRLEN dlen; char * c_text = SvPV( text, dlen); Bool utf8 = prima_is_utf8_sv( text); if ( utf8) dlen = utf8_length(( U8*) c_text, ( U8*) c_text + dlen); ok = apc_gp_text_out( self, c_text, x, y, dlen, utf8); if ( !ok) perl_error(); return ok; }
int Drawable_get_text_width( Handle self, SV * text, Bool addOverhang) { gpARGS; int res; STRLEN dlen; char * c_text = SvPV( text, dlen); Bool utf8 = prima_is_utf8_sv( text); if ( utf8) dlen = utf8_length(( U8*) c_text, ( U8*) c_text + dlen); gpENTER(0); res = apc_gp_get_text_width( self, c_text, dlen, addOverhang, utf8); gpLEAVE; return res; }
SV * Widget_text( Handle self, Bool set, SV *text) { if ( set) { if ( var-> stage > csFrozen) return nilSV; free( var-> text); var-> text = duplicate_string( SvPV_nolen( text)); opt_assign( optUTF8_text, prima_is_utf8_sv(text)); } else { text = newSVpv( var-> text ? var-> text : "", 0); if ( is_opt( optUTF8_text)) SvUTF8_on( text); return text; } return nilSV; }
void AbstractMenu_set_variable( Handle self, char * varName, SV * newName) { PMenuItemReg m; if ( var-> stage > csFrozen) return; m = find_menuitem( self, varName, true); if ( m == nil) return; free( m-> variable); if ( SvTYPE(newName) != SVt_NULL) { STRLEN len; char * v; v = SvPV( newName, len); if ( len > 0) { m-> variable = duplicate_string( v); m-> flags. utf8_variable = prima_is_utf8_sv( newName); return; } } m-> variable = nil; m-> flags. utf8_variable = 0; }
SV * AbstractMenu_text( Handle self, Bool set, char * varName, SV * text) { PMenuItemReg m; if ( var-> stage > csFrozen) return nilSV; m = find_menuitem( self, varName, true); if ( m == nil) return nilSV; if ( m-> text == nil) return nilSV; if ( !set) { SV * sv = newSVpv( m-> text ? m-> text : "", 0); if ( m-> flags. utf8_text) SvUTF8_on( sv); return sv; } free( m-> text); m-> text = nil; m-> text = duplicate_string( SvPV_nolen( text)); m-> flags. utf8_accel = prima_is_utf8_sv( text); if ( m-> id > 0) if ( var-> stage <= csNormal && var-> system) apc_menu_item_set_text( self, m); return nilSV; }
SV * AbstractMenu_action( Handle self, Bool set, char * varName, SV * action) { PMenuItemReg m; if ( var-> stage > csFrozen) return nilSV; m = find_menuitem( self, varName, true); if ( !m) return nilSV; if ( !set) { if ( m-> code) return newSVsv( m-> code); if ( m-> perlSub) { SV * sv = newSVpv( m-> perlSub, 0); if ( m-> flags. utf8_perlSub) SvUTF8_on( sv); return sv; } return nilSV; } if ( m-> flags. divider || m-> down) return nilSV; if ( SvROK( action)) { if ( m-> code) sv_free( m-> code); m-> code = nil; if ( SvTYPE( SvRV( action)) == SVt_PVCV) { m-> code = newSVsv( action); free( m-> perlSub); m-> perlSub = nil; } m-> flags. utf8_perlSub = 0; } else { char * line = ( char *) SvPV_nolen( action); free( m-> perlSub); if ( m-> code) sv_free( m-> code); m-> code = nil; m-> perlSub = duplicate_string( line); m-> flags. utf8_perlSub = prima_is_utf8_sv( action); } return nilSV; }
void * AbstractMenu_new_menu( Handle self, SV * sv, int level) { AV * av; int i, count; int n; PMenuItemReg m = nil; PMenuItemReg curr = nil; Bool rightAdjust = false; if ( level == 0) { if ( SvTYPE( sv) == SVt_NULL) return nil; /* null menu */ } if ( !SvROK( sv) || ( SvTYPE( SvRV( sv)) != SVt_PVAV)) { warn("menu build error: menu is not an array"); return nil; } av = (AV *) SvRV( sv); n = av_len( av); if ( n == -1) { if ( level == 0) return nil; /* null menu */ warn("menu build error: empty array passed"); return nil; } /* cycling the list of items */ for ( i = 0; i <= n; i++) { SV **itemHolder = av_fetch( av, i, 0); AV *item; SV *subItem; PMenuItemReg r; SV **holder; int l_var = -1; int l_text = -1; int l_sub = -1; int l_accel = -1; int l_key = -1; int l_data = -1; if ( itemHolder == nil) { warn("menu build error: array panic"); my-> dispose_menu( self, m); return nil; } if ( !SvROK( *itemHolder) || ( SvTYPE( SvRV( *itemHolder)) != SVt_PVAV)) { warn("menu build error: submenu is not an array"); my-> dispose_menu( self, m); return nil; } /* entering item description */ item = ( AV *) SvRV( *itemHolder); count = av_len( item) + 1; if ( count > 6) { warn("menu build error: extra declaration"); count = 5; } if ( !( r = alloc1z( MenuItemReg))) { warn( "Not enough memory"); my-> dispose_menu( self, m); return nil; } r-> key = kbNoKey; if ( count < 2) { /* empty or 1 means line divisor, no matter of text */ r-> flags. divider = true; rightAdjust = (( level == 0) && ( var-> anchored)); if ( count == 1) l_var = 0; } else if ( count == 2) { l_text = 0; l_sub = 1; } else if ( count == 3) { l_var = 0; l_text = 1; l_sub = 2; } else if ( count == 4) { l_text = 0; l_accel = 1; l_key = 2; l_sub = 3; } else if ( count == 5) { l_var = 0; l_text = 1; l_accel = 2; l_key = 3; l_sub = 4; } else { l_var = 0; l_text = 1; l_accel = 2; l_key = 3; l_sub = 4; l_data = 5; } if ( m) curr = curr-> next = r; else curr = m = r; /* adding to list */ r-> flags. rightAdjust = rightAdjust ? 1 : 0; r-> id = ++(var-> autoEnum); #define a_get( l_, fl_, num) \ if ( num >= 0 ) { \ holder = av_fetch( item, num, 0); \ if ( holder) { \ if ( SvTYPE(*holder) != SVt_NULL) { \ l_ = duplicate_string( SvPV_nolen( *holder)); \ fl_ = prima_is_utf8_sv(*holder); \ } \ } else { \ warn("menu build error: array panic"); \ my-> dispose_menu( self, m); \ return nil; \ } \ } a_get( r-> accel , r-> flags. utf8_accel, l_accel); a_get( r-> variable, r-> flags. utf8_variable, l_var); if ( l_key >= 0) { holder = av_fetch( item, l_key, 0); if ( !holder) { warn("menu build error: array panic"); my-> dispose_menu( self, m); return nil; } r-> key = key_normalize( SvPV_nolen( *holder)); } if ( r-> variable) { #define s r-> variable int i, decr = 0; for ( i = 0; i < 2; i++) { switch ( s[i]) { case '-': r-> flags. disabled = 1; decr++; break; case '*': r-> flags. checked = 1; decr++; break; case '@': if ( r-> flags. divider ) warn("warning: auto-toggle flag @ ignored on a divider menu"); else r-> flags. autotoggle = 1; decr++; break; default: break; } } if ( decr) memmove( s, s + decr, strlen( s) + 1 - decr); if ( strlen( s) == 0 || is_var_id_name( s) != 0) { free( r-> variable); r-> variable = nil; } #undef s } /* parsing text */ if ( l_text >= 0) { holder = av_fetch( item, l_text, 0); if ( !holder) { warn("menu build error: array panic"); my-> dispose_menu( self, m); return nil; } subItem = *holder; if ( SvROK( subItem)) { Handle c_object = gimme_the_mate( subItem); if (( c_object == nilHandle) || !( kind_of( c_object, CImage))) { warn("menu build error: not an image passed"); goto TEXT; } if (((( PImage) c_object)-> w == 0) || ((( PImage) c_object)-> h == 0)) { warn("menu build error: invalid image passed"); goto TEXT; } protect_object( r-> bitmap = c_object); SvREFCNT_inc( SvRV(( PObject( r-> bitmap))-> mate)); } else { TEXT: r-> text = duplicate_string( SvPV_nolen( subItem)); r-> flags. utf8_text = prima_is_utf8_sv( subItem); } } /* parsing sub */ if ( l_sub >= 0) { holder = av_fetch( item, l_sub, 0); if ( !holder) { warn("menu build error: array panic"); my-> dispose_menu( self, m); return nil; } subItem = *holder; if ( SvROK( subItem)) { if ( SvTYPE( SvRV( subItem)) == SVt_PVCV) { r-> code = newSVsv( subItem); } else { r-> down = ( PMenuItemReg) my-> new_menu( self, subItem, level + 1); if ( r-> down == nil) { /* seems error was occured inside this call */ my-> dispose_menu( self, m); return nil; } } } else { if ( SvPOK( subItem)) { r-> perlSub = duplicate_string( SvPV_nolen( subItem)); r-> flags. utf8_perlSub = prima_is_utf8_sv( subItem); } else { warn("menu build error: invalid sub name passed"); } } } /* parsing data */ if ( l_data >= 0) { holder = av_fetch( item, l_data, 0); if ( !holder) { warn("menu build error: array panic"); my-> dispose_menu( self, m); return nil; } r-> data = newSVsv( *holder); } } return m; }