/* * Private font initialisation function. */ PROTECTED void init_fonts(void) { HDC info; /* get system information */ info = CreateIC("DISPLAY", NULL, NULL, NULL); screen_dpix = GetDeviceCaps(info, LOGPIXELSX); screen_dpiy = GetDeviceCaps(info, LOGPIXELSY); DeleteDC(info); /* set up standard fonts */ SystemFont = new_font_object(GetStockObject(DEFAULT_GUI_FONT)); if (SystemFont) SystemFont->text = new_string("SystemFont"); FixedFont = new_font_object(GetStockObject(OEM_FIXED_FONT)); Times = newfont("Times New Roman", Plain, -10); Helvetica = newfont("Arial", SansSerif, -10); Courier = newfont("Courier New", FixedWidth, -10); protect_object(SystemFont); protect_object(FixedFont); protect_object(Times); protect_object(Helvetica); protect_object(Courier); }
void Window_cancel_children( Handle self) { protect_object( self); if ( my-> get_modalHorizon( self)) { Handle next = var-> nextSharedModal; while ( next) { CWindow( next)-> cancel( next); next = var-> nextSharedModal; } } else { Handle mh = my-> get_horizon( self); Handle next = ( mh == application) ? PApplication(mh)-> sharedModal : PWindow(mh)-> nextSharedModal; while ( next) { if ( Widget_is_child( next, self)) { CWindow( next)-> cancel( next); next = PWindow(mh)-> nextSharedModal; } else next = PWindow(next)-> nextSharedModal; } } unprotect_object( self); }
int Window_execute( Handle self, Handle insertBefore) { if ( var-> modal) return mbCancel; protect_object( self); if ( insertBefore && ( insertBefore == self || !kind_of( insertBefore, CWindow) || PWindow( insertBefore)-> modal != mtExclusive)) insertBefore = nilHandle; if ( !apc_window_execute( self, insertBefore)) var-> modalResult = mbCancel; unprotect_object( self); return var-> modalResult; }
Handle AbstractMenu_image( Handle self, Bool set, char * varName, Handle image) { PMenuItemReg m; PImage i = ( PImage) image; if ( var-> stage > csFrozen) return nilHandle; m = find_menuitem( self, varName, true); if ( m == nil) return nilHandle; if ( !m-> bitmap) return nilHandle; if ( !set) { if ( PObject( m-> bitmap)-> stage == csDead) return nilHandle; return m-> bitmap; } if (( image == nilHandle) || !( kind_of( image, CImage))) { warn("invalid object passed to ::image"); return nilHandle; } if ( i-> w == 0 || i-> h == 0) { warn("invalid object passed to ::image"); return nilHandle; } SvREFCNT_inc( SvRV(( PObject( image))-> mate)); protect_object( image); if ( PObject( m-> bitmap)-> stage < csDead) SvREFCNT_dec( SvRV(( PObject( m-> bitmap))-> mate)); unprotect_object( m-> bitmap); m-> bitmap = image; if ( m-> id > 0) if ( var-> stage <= csNormal && var-> system) apc_menu_item_set_image( self, m); return nilHandle; }
void Application_init( Handle self, HV * profile) { dPROFILE; int hintPause = pget_i( hintPause); Color hintColor = pget_i( hintColor), hintBackColor = pget_i( hintBackColor); SV * hintFont = pget_sv( hintFont); SV * sv; char * hintClass = pget_c( hintClass); if ( application != nilHandle) croak( "Attempt to create more than one application instance"); CDrawable-> init( self, profile); list_create( &var-> widgets, 16, 16); list_create( &var-> modalHorizons, 0, 8); application = self; if ( !apc_application_create( self)) croak( "Error creating application"); /* Widget init */ SvHV_Font( pget_sv( font), &Font_buffer, "Application::init"); my-> set_font( self, Font_buffer); SvHV_Font( pget_sv( popupFont), &Font_buffer, "Application::init"); my-> set_popup_font( self, Font_buffer); { AV * av = ( AV *) SvRV( pget_sv( designScale)); SV ** holder = av_fetch( av, 0, 0); if ( holder) var-> designScale. x = SvNV( *holder); else warn("Array panic on 'designScale'"); holder = av_fetch( av, 1, 0); if ( holder) var-> designScale. y = SvNV( *holder); else warn("Array panic on 'designScale'"); pdelete( designScale); } var-> text = duplicate_string(""); opt_set( optModalHorizon); /* store extra info */ { HV * hv = ( HV *) SvRV( var-> mate); (void) hv_store( hv, "PrinterClass", 12, newSVpv( pget_c( printerClass), 0), 0); (void) hv_store( hv, "PrinterModule", 13, newSVpv( pget_c( printerModule), 0), 0); (void) hv_store( hv, "HelpClass", 9, newSVpv( pget_c( helpClass), 0), 0); (void) hv_store( hv, "HelpModule", 10, newSVpv( pget_c( helpModule), 0), 0); } { HV * profile = newHV(); static Timer_vmt HintTimerVmt; pset_H( owner, self); pset_i( timeout, hintPause); pset_c( name, "HintTimer"); var-> hintTimer = create_instance( "Prima::Timer"); protect_object( var-> hintTimer); hv_clear( profile); memcpy( &HintTimerVmt, CTimer, sizeof( HintTimerVmt)); HintTimerVmt. handle_event = Application_HintTimer_handle_event; (( PTimer) var-> hintTimer)-> self = &HintTimerVmt; pset_H( owner, self); pset_i( color, hintColor); pset_i( backColor, hintBackColor); pset_i( visible, 0); pset_i( selectable, 0); pset_i( showHint, 0); pset_c( name, "HintWidget"); pset_sv( font, hintFont); var-> hintWidget = create_instance( hintClass); protect_object( var-> hintWidget); sv_free(( SV *) profile); } if ( SvTYPE( sv = pget_sv( accelItems)) != SVt_NULL) my-> set_accelItems( self, sv); if ( SvTYPE( sv = pget_sv( popupItems)) != SVt_NULL) my-> set_popupItems( self, sv); pdelete( accelTable); pdelete( accelItems); pdelete( popupItems); my-> set( self, profile); CORE_INIT_TRANSIENT(Application); }
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; }