/* (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) (c) Copyright 2000-2004 Convergence (integrated media) GmbH All rights reserved. Written by Denis Oliver Kropp , Andreas Hundt , Sven Neumann , Ville Syrjälä and Claudio Ciccani . This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include IDirectFB *idirectfb_singleton = NULL; static DFBResult CreateRemote( const char *host, int session, IDirectFB **ret_interface ); /* * Version checking */ const unsigned int directfb_major_version = DIRECTFB_MAJOR_VERSION; const unsigned int directfb_minor_version = DIRECTFB_MINOR_VERSION; const unsigned int directfb_micro_version = DIRECTFB_MICRO_VERSION; const unsigned int directfb_binary_age = DIRECTFB_BINARY_AGE; const unsigned int directfb_interface_age = DIRECTFB_INTERFACE_AGE; const char * DirectFBCheckVersion( unsigned int required_major, unsigned int required_minor, unsigned int required_micro ) { if (required_major > DIRECTFB_MAJOR_VERSION) return "DirectFB version too old (major mismatch)"; if (required_major < DIRECTFB_MAJOR_VERSION) return "DirectFB version too new (major mismatch)"; if (required_minor > DIRECTFB_MINOR_VERSION) return "DirectFB version too old (minor mismatch)"; if (required_minor < DIRECTFB_MINOR_VERSION) return "DirectFB version too new (minor mismatch)"; if (required_micro < DIRECTFB_MICRO_VERSION - DIRECTFB_BINARY_AGE) return "DirectFB version too new (micro mismatch)"; if (required_micro > DIRECTFB_MICRO_VERSION) return "DirectFB version too old (micro mismatch)"; return NULL; } const char * DirectFBUsageString( void ) { return dfb_config_usage(); } DFBResult DirectFBInit( int *argc, char *(*argv[]) ) { DFBResult ret; #ifdef DSLINUX IDirectFBEventBuffer_Dispatcher_ctor(); IDirectFBDataBuffer_Dispatcher_ctor(); IDirectFBWindow_Requestor_ctor(); IDirectFBSurface_Requestor_ctor(); IDirectFBScreen_Requestor_ctor(); IDirectFBPalette_Requestor_ctor(); IDirectFBInputDevice_Requestor_ctor(); IDirectFBImageProvider_Requestor_ctor(); IDirectFBFont_Requestor_ctor(); IDirectFBDisplayLayer_Requestor_ctor(); IDirectFB_Requestor_ctor(); #endif ret = dfb_config_init( argc, argv ); if (ret) return ret; return DFB_OK; } DFBResult DirectFBSetOption( const char *name, const char *value ) { DFBResult ret; if (dfb_config == NULL) { D_ERROR( "DirectFBSetOption: DirectFBInit has to be " "called before DirectFBSetOption!\n" ); return DFB_INIT; } if (idirectfb_singleton) { D_ERROR( "DirectFBSetOption: DirectFBSetOption has to be " "called before DirectFBCreate!\n" ); return DFB_INIT; } if (!name) return DFB_INVARG; ret = dfb_config_set( name, value ); if (ret) return ret; return DFB_OK; } /* * Programs have to call this to get the super interface * which is needed to access other functions */ DFBResult DirectFBCreate( IDirectFB **interface ) { DFBResult ret; IDirectFB *dfb; CoreDFB *core_dfb; if (!dfb_config) { /* don't use D_ERROR() here, it uses dfb_config */ direct_log_printf( NULL, "(!) DirectFBCreate: DirectFBInit " "has to be called before DirectFBCreate!\n" ); return DFB_INIT; } if (!interface) return DFB_INVARG; if (idirectfb_singleton) { idirectfb_singleton->AddRef( idirectfb_singleton ); *interface = idirectfb_singleton; return DFB_OK; } direct_initialize(); if ( !(direct_config->quiet & DMT_BANNER) && dfb_config->banner) { direct_log_printf( NULL, "\n" " ~~~~~~~~~~~~~~~~~~~~~~~~~~| DirectFB " DIRECTFB_VERSION " |~~~~~~~~~~~~~~\n" " (c) 2001-2009 The world wide DirectFB Open Source Community\n" " (c) 2000-2004 Convergence (integrated media) GmbH\n" " ----------------------------------------------------------------\n" "\n" ); } #ifndef DIRECTFB_PURE_VOODOO if (dfb_config->remote.host) return CreateRemote( dfb_config->remote.host, dfb_config->remote.session, interface ); ret = dfb_core_create( &core_dfb ); if (ret) return ret; DIRECT_ALLOCATE_INTERFACE( dfb, IDirectFB ); ret = IDirectFB_Construct( dfb, core_dfb ); if (ret) { dfb_core_destroy( core_dfb, false ); return ret; } if (dfb_core_is_master( core_dfb )) { /* not fatal */ ret = dfb_wm_post_init( core_dfb ); if (ret) D_DERROR( ret, "DirectFBCreate: Post initialization of WM failed!\n" ); dfb_core_activate( core_dfb ); } *interface = idirectfb_singleton = dfb; return DFB_OK; #else return CreateRemote( dfb_config->remote.host ?: "", dfb_config->remote.session, interface ); #endif } DFBResult DirectFBError( const char *msg, DFBResult error ) { if (msg) direct_log_printf( NULL, "(#) DirectFBError [%s]: %s\n", msg, DirectFBErrorString( error ) ); else direct_log_printf( NULL, "(#) DirectFBError: %s\n", DirectFBErrorString( error ) ); return error; } const char * DirectFBErrorString( DFBResult error ) { if (D_RESULT_TYPE_IS( error, 'D','F','B' )) { switch (error) { case DFB_NOVIDEOMEMORY: return "Out of video memory!"; case DFB_MISSINGFONT: return "No font has been set!"; case DFB_MISSINGIMAGE: return "No image has been set!"; default: return "UKNOWN DIRECTFB RESULT!"; } } return DirectResultString( error ); } DFBResult DirectFBErrorFatal( const char *msg, DFBResult error ) { DirectFBError( msg, error ); //if (idirectfb_singleton) //IDirectFB_Destruct( idirectfb_singleton ); exit( error ); } /**************************************************************************************************/ static DFBResult CreateRemote( const char *host, int session, IDirectFB **ret_interface ) { DFBResult ret; DirectInterfaceFuncs *funcs; void *interface; D_ASSERT( host != NULL ); D_ASSERT( ret_interface != NULL ); ret = DirectGetInterface( &funcs, "IDirectFB", "Requestor", NULL, NULL ); if (ret) return ret; ret = funcs->Allocate( &interface ); if (ret) return ret; ret = funcs->Construct( interface, host, session ); if (ret) return ret; #ifndef DIRECTFB_PURE_VOODOO *ret_interface = idirectfb_singleton = interface; #else *ret_interface = interface; #endif return DFB_OK; }