Такая вот проблема: хочу завернуть X окно в класс.
Я поставил на перехват событие ResizeRequest. Так вот, при изменении размера окно не перерисовывается. Точнее, перерисовывается та часть, которая соответствует первоначальным размерам.
Вот код:
Form.h
Код: Выделить всё
// Класс формы
class CForm
{
Display * m_pDisplay;
Window m_nWindow;
void createCustomForm( int x, int y, int width, int height, const char * caption = 0 );
protected:
// События
...
virtual void onResize( int width, int height );
...
public:
// Полноэкранное
CForm();
// Оконное
CForm( int x, int y, int width, int height, const char * caption );
virtual ~CForm();
...
// Главный цикл событий
void run();
};Form.cpp:
Код: Выделить всё
// Полноэкранное
CForm::CForm() :
m_pDisplay( 0 ),
m_nWindow( 0 )
{
createCustomForm( 0, 0, 100, 100 );
}
// Оконное
CForm::CForm( int x, int y, int width, int height, const char * caption ) :
m_pDisplay( 0 ),
m_nWindow( 0 )
{
createCustomForm( x, y, width, height, caption );
}
CForm::~CForm()
{
XDestroyWindow( m_pDisplay, m_nWindow );
XCloseDisplay( m_pDisplay );
}
// Главный цикл событий
void CForm::run()
{
bool bExited = false;
XEvent event;
...
while ( !bExited )
{
XNextEvent( m_pDisplay, &event );
switch ( event.type )
{
...
case ResizeRequest:
{
int width = event.xresizerequest.width;
int height = event.xresizerequest.height;
/* ?????? */
onResize( width, height );
break;
}
...
}
}
...
}
// События
...
void CForm::onResize( int width, int height )
{
}
...
void CForm::createCustomForm( int x, int y, int width, int height, const char * caption )
{
m_pDisplay = XOpenDisplay( NULL );
if ( m_pDisplay )
{
int nScreen = XDefaultScreen( m_pDisplay );
m_nWindow = XCreateSimpleWindow( m_pDisplay, XRootWindow( m_pDisplay, nScreen ),
x, y, width, height, 0, BlackPixel( m_pDisplay, nScreen ), BlackPixel( m_pDisplay, nScreen ) );
XMapWindow( m_pDisplay, m_nWindow );
if ( caption )
{
XStoreName( m_pDisplay, m_nWindow, caption );
/* ?????? */
}
XSizeHints hints;
hints.flags = PPosition;
XSetWMNormalHints( m_pDisplay, m_nWindow, &hints );
/* Окно на весь экран */
XSelectInput( m_pDisplay, m_nWindow, KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |
EnterWindowMask | LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | ResizeRedirectMask );
}
}Итак, на место первого /* ?????? */ необходимо вставить что-то, что заставит окно вести себя нормально.
И ещё один вопрос: когда запускается программа, на панели задач её название отображается как "??". Скажите, как туда поместить её заголовок caption ? (на место второго /* ?????? */)
Спасибо за внимание!
ЗЫ Пока ошибки создания окна и вызовов функций не обрабатывал, так что просьба не критиковать по этому поводу.