X window обработка ResizeRequest

Модератор: Модераторы разделов

Carbon
Сообщения: 22
ОС: Xubuntu 8.10

X window обработка ResizeRequest

Сообщение Carbon »

Здравствуйте!

Такая вот проблема: хочу завернуть 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 ? (на место второго /* ?????? */)

Спасибо за внимание!

ЗЫ Пока ошибки создания окна и вызовов функций не обрабатывал, так что просьба не критиковать по этому поводу.
Спасибо сказали: