53a7d3a1617638d09419cc1b1954e62a9715753d
[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 IMPLEMENT_STANDARD_RTTIEXT(Aspect_DisplayConnection,Standard_Transient)
20
21 // =======================================================================
22 // function : Aspect_DisplayConnection
23 // purpose  :
24 // =======================================================================
25 Aspect_DisplayConnection::Aspect_DisplayConnection()
26 {
27 #if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && !defined(__ANDROID__) && !defined(__QNX__) && !defined(__EMSCRIPTEN__)
28   myDisplay = NULL;
29   myDefVisualInfo = NULL;
30   myDefFBConfig = NULL;
31   myIsOwnDisplay = false;
32   OSD_Environment anEnv ("DISPLAY");
33   myDisplayName = anEnv.Value();
34   Init (NULL);
35 #endif
36 }
37
38 // =======================================================================
39 // function : ~Aspect_DisplayConnection
40 // purpose  :
41 // =======================================================================
42 Aspect_DisplayConnection::~Aspect_DisplayConnection()
43 {
44 #if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && !defined(__ANDROID__) && !defined(__QNX__) && !defined(__EMSCRIPTEN__)
45   if (myDefVisualInfo != NULL)
46   {
47     XFree (myDefVisualInfo);
48   }
49   if (myDisplay != NULL
50    && myIsOwnDisplay)
51   {
52     XCloseDisplay (myDisplay);
53   }
54 #endif
55 }
56
57 #if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && !defined(__ANDROID__) && !defined(__QNX__) && !defined(__EMSCRIPTEN__)
58 // =======================================================================
59 // function : Aspect_DisplayConnection
60 // purpose  :
61 // =======================================================================
62 Aspect_DisplayConnection::Aspect_DisplayConnection (const TCollection_AsciiString& theDisplayName)
63 : myDisplay (NULL),
64   myDefVisualInfo (NULL),
65   myDefFBConfig (NULL),
66   myIsOwnDisplay (false)
67 {
68   myDisplayName = theDisplayName;
69   Init (NULL);
70 }
71
72 // =======================================================================
73 // function : Aspect_DisplayConnection
74 // purpose  :
75 // =======================================================================
76 Aspect_DisplayConnection::Aspect_DisplayConnection (Display* theDisplay)
77 : myDisplay (NULL),
78   myDefVisualInfo (NULL),
79   myDefFBConfig (NULL),
80   myIsOwnDisplay (false)
81 {
82   Init (theDisplay);
83 }
84
85 // =======================================================================
86 // function : SetDefaultVisualInfo
87 // purpose  :
88 // =======================================================================
89 void Aspect_DisplayConnection::SetDefaultVisualInfo (XVisualInfo* theVisual,
90                                                      Aspect_FBConfig theFBConfig)
91 {
92   if (myDefVisualInfo != NULL)
93   {
94     XFree (myDefVisualInfo);
95   }
96   myDefVisualInfo = theVisual;
97   myDefFBConfig = theFBConfig;
98 }
99
100 // =======================================================================
101 // function : Init
102 // purpose  :
103 // =======================================================================
104 void Aspect_DisplayConnection::Init (Display* theDisplay)
105 {
106   if (myDisplay != NULL
107    && myIsOwnDisplay)
108   {
109     XCloseDisplay (myDisplay);
110   }
111   myIsOwnDisplay = false;
112   myAtoms.Clear();
113
114   myDisplay = theDisplay != NULL ? theDisplay : XOpenDisplay (myDisplayName.ToCString());
115   if (myDisplay == NULL)
116   {
117     TCollection_AsciiString aMessage;
118     aMessage += "Can not connect to the server \"";
119     aMessage += myDisplayName + "\"";
120     throw Aspect_DisplayConnectionDefinitionError(aMessage.ToCString());
121   }
122   else
123   {
124     myIsOwnDisplay = theDisplay == NULL;
125     myAtoms.Bind (Aspect_XA_DELETE_WINDOW, XInternAtom(myDisplay, "WM_DELETE_WINDOW", False));
126   }
127 }
128
129 // =======================================================================
130 // function : GetAtom
131 // purpose  :
132 // =======================================================================
133 Atom Aspect_DisplayConnection::GetAtom (const Aspect_XAtom theAtom) const
134 {
135   Atom anAtom = myAtoms.Find(theAtom);
136   return anAtom;
137 }
138
139 #endif