Bool RenderWindowLinux::Open( const VideoMode & p_VideoMode, const std::string & p_Title, const Uint32 p_Style ) { // open a connection with X server if( ( m_pDisplay = XOpenDisplay( NULL ) ) == NULL ) { std::cout << "[RenderWindowLinux::Create] Can not connect to X server." << std::endl; return false; } // Initialize the X thread // Should we?!?! XInitThreads( ); // Get the screen m_Screen = DefaultScreen( m_pDisplay ); // Creat the window attributes XSetWindowAttributes WindowAttributes; WindowAttributes.colormap = DefaultColormap( m_pDisplay, m_Screen ); WindowAttributes.event_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | PointerMotionMask | EnterWindowMask | LeaveWindowMask | VisibilityChangeMask | FocusChangeMask | ExposureMask | StructureNotifyMask; // Create the window m_Window = XCreateWindow( m_pDisplay, DefaultRootWindow( m_pDisplay ), 0, 0, p_VideoMode.GetSize( ).x, p_VideoMode.GetSize( ).y, 0, DefaultDepth( m_pDisplay, m_Screen ), InputOutput, DefaultVisual( m_pDisplay, m_Screen ), CWBorderPixel | CWEventMask | CWColormap, &WindowAttributes ); // It's very important to set the delete message. Else we wont be able to close the window. ::Atom wmDeleteMessage = XInternAtom( m_pDisplay, "WM_DELETE_WINDOW", false ); XSetWMProtocols( m_pDisplay, m_Window, &wmDeleteMessage, 1 ); // Set the window title SetTitle( p_Title.c_str( ) ); // Let's set up the window decoration and the functionality ::Atom PropertyAtom = XInternAtom( m_pDisplay, "_MOTIF_WM_HINTS", false ); if( PropertyAtom ) { struct HintsStruct { Uint32 Flags; Uint32 Functions; Uint32 Decorations; Int32 InputMode; Uint32 State; }; HintsStruct Hints; Hints.Flags = MWM_HINTS_FUNCTIONS | MWM_HINTS_FUNCTIONS; Hints.Functions = 0; Hints.Decorations = 0; // Go through all the styles we want to apply to the window if( p_Style == Bit::Style::Default ) { Hints.Functions |= MWM_FUNC_ALL; Hints.Decorations |= MWM_DECOR_ALL; } else { // Always set the resize and maximize functions and decorations. // Some window managers seems to require this. // Resizing can be disabled. Hints.Functions |= MWM_FUNC_RESIZE | MWM_FUNC_MAXIMIZE; Hints.Decorations |= MWM_DECOR_RESIZEH | MWM_DECOR_MAXIMIZE; if( p_Style & Bit::Style::Close ) { Hints.Functions |= MWM_FUNC_CLOSE; } if( p_Style & Bit::Style::Minimize ) { Hints.Functions |= MWM_FUNC_MINIMIZE; Hints.Decorations |= MWM_DECOR_MINIMIZE; } if( p_Style & Bit::Style::TitleBar ) { Hints.Functions |= MWM_FUNC_MOVE | MWM_FUNC_MINIMIZE; Hints.Decorations |= MWM_DECOR_BORDER | MWM_DECOR_TITLE | MWM_DECOR_MENU | MWM_DECOR_MINIMIZE; } } // Apply the changes XChangeProperty( m_pDisplay, m_Window, PropertyAtom, PropertyAtom, 32, PropModeReplace, (unsigned char *) &Hints, 5 ); // Force x server to disable window resizing if (!( p_Style & Bit::Style::Resize ) ) { XSizeHints * SizeHints = XAllocSizeHints( ); SizeHints->flags = PMinSize | PMaxSize; SizeHints->min_width = p_VideoMode.GetSize( ).x; SizeHints->min_height = p_VideoMode.GetSize( ).y; SizeHints->max_width = p_VideoMode.GetSize( ).x; SizeHints->max_height = p_VideoMode.GetSize( ).y; // Set the hints XSetWMNormalHints( m_pDisplay, m_Window, SizeHints); // Free the size hints XFree(SizeHints); } } else { std::cout << "[RenderWindowLinux::Open] Can not get the property atom \"_MOTIF_WM_HINTS\"." << std::endl; } // Display the window. XMapWindow( m_pDisplay, m_Window ); XFlush( m_pDisplay ); // Set the rest of the member variables m_VideoMode = p_VideoMode; m_Title = p_Title; m_Style = p_Style; m_Size = p_VideoMode.GetSize( ); m_Open = true; m_Focused = true; return true; }