Esempio n. 1
0
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);
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
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;
}
Esempio n. 6
0
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;
}
Esempio n. 7
0
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;
}
Esempio n. 8
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;
}
Esempio n. 9
0
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;
}
Esempio n. 10
0
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;
}