0032308: Configuration - make Xlib dependency optional
[occt.git] / src / Aspect / Aspect_DisplayConnection.cxx
1 // Copyright (c) 2013-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #include <Aspect_DisplayConnection.hxx>
15
16 #include <Aspect_DisplayConnectionDefinitionError.hxx>
17 #include <OSD_Environment.hxx>
18
19 #if defined(HAVE_XLIB)
20   #include <X11/Xlib.h>
21   #include <X11/Xutil.h>
22   #include <X11/Xatom.h>
23 #endif
24
25 IMPLEMENT_STANDARD_RTTIEXT(Aspect_DisplayConnection,Standard_Transient)
26
27 // =======================================================================
28 // function : Aspect_DisplayConnection
29 // purpose  :
30 // =======================================================================
31 Aspect_DisplayConnection::Aspect_DisplayConnection()
32 {
33 #if defined(HAVE_XLIB)
34   myDisplay = NULL;
35   myDefVisualInfo = NULL;
36   myDefFBConfig = NULL;
37   myIsOwnDisplay = false;
38   OSD_Environment anEnv ("DISPLAY");
39   myDisplayName = anEnv.Value();
40   Init (NULL);
41 #endif
42 }
43
44 // =======================================================================
45 // function : ~Aspect_DisplayConnection
46 // purpose  :
47 // =======================================================================
48 Aspect_DisplayConnection::~Aspect_DisplayConnection()
49 {
50 #if defined(HAVE_XLIB)
51   if (myDefVisualInfo != NULL)
52   {
53     XFree (myDefVisualInfo);
54   }
55   if (myDisplay != NULL
56    && myIsOwnDisplay)
57   {
58     XCloseDisplay ((Display* )myDisplay);
59   }
60 #endif
61 }
62
63 // =======================================================================
64 // function : Aspect_DisplayConnection
65 // purpose  :
66 // =======================================================================
67 Aspect_DisplayConnection::Aspect_DisplayConnection (const TCollection_AsciiString& theDisplayName)
68 : myDisplay (NULL),
69   myDefVisualInfo (NULL),
70   myDefFBConfig (NULL),
71   myIsOwnDisplay (false)
72 {
73   myDisplayName = theDisplayName;
74   Init (NULL);
75 }
76
77 // =======================================================================
78 // function : Aspect_DisplayConnection
79 // purpose  :
80 // =======================================================================
81 Aspect_DisplayConnection::Aspect_DisplayConnection (Aspect_XDisplay* theDisplay)
82 : myDisplay (NULL),
83   myDefVisualInfo (NULL),
84   myDefFBConfig (NULL),
85   myIsOwnDisplay (false)
86 {
87   Init (theDisplay);
88 }
89
90 // =======================================================================
91 // function : SetDefaultVisualInfo
92 // purpose  :
93 // =======================================================================
94 void Aspect_DisplayConnection::SetDefaultVisualInfo (Aspect_XVisualInfo* theVisual,
95                                                      Aspect_FBConfig theFBConfig)
96 {
97   if (myDefVisualInfo != NULL)
98   {
99   #if defined(HAVE_XLIB)
100     XFree (myDefVisualInfo);
101   #endif
102   }
103   myDefVisualInfo = theVisual;
104   myDefFBConfig = theFBConfig;
105 }
106
107 // =======================================================================
108 // function : Init
109 // purpose  :
110 // =======================================================================
111 void Aspect_DisplayConnection::Init (Aspect_XDisplay* theDisplay)
112 {
113 #if defined(HAVE_XLIB)
114   if (myDisplay != NULL
115    && myIsOwnDisplay)
116   {
117     XCloseDisplay ((Display* )myDisplay);
118   }
119   myIsOwnDisplay = false;
120   myAtoms.Clear();
121
122   myDisplay = theDisplay != NULL ? theDisplay : (Aspect_XDisplay* )XOpenDisplay (myDisplayName.ToCString());
123   if (myDisplay == NULL)
124   {
125     TCollection_AsciiString aMessage;
126     aMessage += "Can not connect to the server \"";
127     aMessage += myDisplayName + "\"";
128     throw Aspect_DisplayConnectionDefinitionError(aMessage.ToCString());
129   }
130   else
131   {
132     myIsOwnDisplay = theDisplay == NULL;
133     myAtoms.Bind (Aspect_XA_DELETE_WINDOW, (uint64_t )XInternAtom((Display* )myDisplay, "WM_DELETE_WINDOW", False));
134   }
135 #else
136   myDisplay = theDisplay;
137   myIsOwnDisplay = theDisplay == NULL;
138 #endif
139 }