/** Finalizes native resources of the DirectFB application */ void directfbapp_finalize() { directfbapp_close_window(); releaseInterface(event_buffer); releaseInterface(screen); releaseInterface(window); releaseInterface(dfb); }
/** Opens application window and return pointer to offscreen buffer for */ char *directfbapp_open_window() { DFBWindowDescription wdesc; DFBDisplayLayerConfig lconfig; static char *argv_array[] = { "CVM", "--dfb:system=FBDev" ",force-windowed" /* use windows instead of surfaces */ ",no-vt-switch" /* do not switch between Linux' VT */ ",no-cursor" /* do not use pointer */ // ",no-deinit-check" /* do not check for deinit */ ,NULL }; int argc = sizeof argv_array / sizeof argv_array[0] - 1; char **argv = argv_array; IDirectFBDisplayLayer *dlayer; char *dst; int pitch; unsigned int win_id; int win_x, win_y; DFBCHECK(DirectFBInit(&argc, &argv)); DFBCHECK(DirectFBCreate(&dfb)); DFBCHECK(dfb->SetCooperativeLevel(dfb, DFSCL_NORMAL)); DFBCHECK(dfb->GetDisplayLayer(dfb, DLID_PRIMARY, &dlayer)); DFBCHECK(dlayer->GetConfiguration(dlayer, &lconfig)); wdesc.caps = DWCAPS_DOUBLEBUFFER; wdesc.surface_caps = DSCAPS_DOUBLE; wdesc.pixelformat = DSPF_RGB16; wdesc.width = CHAM_WIDTH; wdesc.height = CHAM_HEIGHT; wdesc.flags = DWDESC_CAPS | DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_PIXELFORMAT | DWDESC_SURFACE_CAPS; DFBCHECK(dlayer->CreateWindow(dlayer, &wdesc, &window)); releaseInterface(dlayer); if ((lconfig.flags & (DLCONF_WIDTH | DLCONF_HEIGHT)) == (DLCONF_WIDTH | DLCONF_HEIGHT)) { DFBCHECK(window->GetID(window, &win_id)); set_win_position(win_id, lconfig.width, lconfig.height, win_x, win_y); DFBCHECK(window->MoveTo(window, win_x, win_y)); } DFBCHECK(window->RaiseToTop(window)); DFBCHECK(window->SetOpacity(window, 0xff)); DFBCHECK(window->RequestFocus(window)); DFBCHECK(window->GetSurface(window, &screen)); DFBCHECK(screen->GetSize(screen, &screen_width, &screen_height)); DFBCHECK(screen->Lock(screen, DSLF_WRITE, (void**)(void*)&dst, &pitch)); if (pitch != (int)sizeof(gxj_pixel_type) * screen_width) { REPORT_ERROR(LC_LOWUI, "Invalid pixel format: Supports only 16-bit, 5:6:5 display"); goto dfb_err; } return dst; dfb_err:; directfbapp_finalize(); exit(1); /* TODO: exit from Java */ /* return NULL; */ }
//-------------------------------------------------------------------------------------------- // implementation of IAppMgrUI::finalize //-------------------------------------------------------------------------------------------- StatusCode MTEventLoopMgr::finalize() { StatusCode sc; MsgStream log(msgSvc(), name()); log << MSG::INFO << " Number of events processed : " << m_total_nevt << endmsg; // Finalize base class MinimalEventLoopMgr::finalize(); // Save Histograms Now if ( 0 != m_histoPersSvc ) { HistogramAgent agent; sc = m_histoDataMgrSvc->traverseTree( &agent ); if( sc.isSuccess() ) { IDataSelector* objects = agent.selectedObjects(); // skip /stat entry! if ( objects->size() > 0 ) { IDataSelector::iterator i; for ( i = objects->begin(); i != objects->end(); i++ ) { IOpaqueAddress* pAddr = 0; StatusCode iret = m_histoPersSvc->createRep(*i, pAddr); if ( iret.isSuccess() ) { (*i)->registry()->setAddress(pAddr); } else { sc = iret; } } for ( i = objects->begin(); i != objects->end(); i++ ) { IRegistry* reg = (*i)->registry(); StatusCode iret = m_histoPersSvc->fillRepRefs(reg->address(), *i); if ( !iret.isSuccess() ) { sc = iret; } } } if ( sc.isSuccess() ) { log << MSG::INFO << "Histograms converted successfully according to request." << endmsg; } else { log << MSG::ERROR << "Error while saving Histograms." << endmsg; } } else { log << MSG::ERROR << "Error while traversing Histogram data store" << endmsg; } } if ( 0 != m_evtCtxt && 0 != m_evtSelector ) { m_evtSelector->releaseContext(m_evtCtxt); m_evtCtxt = 0; } // Release all interfaces... m_histoDataMgrSvc = releaseInterface(m_histoDataMgrSvc); m_histoPersSvc = releaseInterface(m_histoPersSvc); m_evtSelector = releaseInterface(m_evtSelector); m_incidentSvc = releaseInterface(m_incidentSvc); m_evtDataSvc = releaseInterface(m_evtDataSvc); m_evtDataMgrSvc = releaseInterface(m_evtDataMgrSvc); return StatusCode::SUCCESS; }