본문 바로가기

Developement/C/C++

[FLTK] X11/nano-X 에서 FLTK 화면 flushing



 FLTK 를 X11 이나 nano-X 에서 그리는 경우 화면 갱신을 Fl::check(); 또는 Fl::wait(); 등으로 갱신 시키지 않는 방법으로 이전의 글을 posting 했습니다만, 실제 nano-X 에서는 XFlush() 를 쓰지 않고 갱신 하는 것이 좀 더 안정이 있는 것으로 판단 되어 수정된 코드를 올립니다.

 특히 XFlush() 는 thread-unsafe 이므로 중복으로 호출 되는 경우가 없어야 하는 것을 고려 해야 하므로 static bool 변수를 하나 사용하여 중복 호출의 위험을 줄였습니다.


#ifdef _WIN32
    #include <windows.h>
#else
	#include <X11⁄Xlib.h>
#endif

static bool isRedrawingFLTK = false;

void RedrawFLTK()
{
	if ( isRedrawingFLTK == true )
		return;
		
	isRedrawingFLTK = true;
	
#ifdef _WIN32
    HWND hWnd = fl_xid( mainWindow );
    if ( hWnd != NULL )
    {
        RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
    }
#else
    extern Display *fl_display;

    Window wind = fl_xid( mainWindow );
    if ( wind != NULL )
    {
        XEvent xevt = {0};
        xevt.type = Expose;
        xevt.xexpose.window = wind;

        XSendEvent( fl_display, wind, false, ExposureMask, &xevt );
        ⁄⁄ -- XFlush( fl_display );
    }
#endif

	isRedrawingFLTK = false;
}

 사용자는 자신이 사용하는 환경에 따라 XFlush() 를 쓸것인지 말것인지 판단 해야 하는데, 실제 XSendEvent() 를 사용하여 X11(nano-X) 가 이를 다시 갱신 할 것인지를 판단 하도록 처리 하는 것이 더 나아 보였습니다.

 실제 ARM Cortex-A8 1GHz 기반에 WVGA 해상도를 사용하는 시스템 적용을 해 보았을 경우 안정적인 갱신은 10frames/sec 정도이며, 이는 실제 FLTK 에서 그리는 개채 수에 따라 다를수도 있겠습니다만, Windows 처럼 빠른 화면 갱신은 어려움이 많았습니다.


 이 코드가 FLTK 를 X11 이나, nano-X 에 붙여 사용하시는 분들의 화면 갱신 방법의 또 다른 형태로 도움이 되길 바랍니다.