Merge remote-tracking branch 'glBitmap.delphigl.com/unstable'
[LazOpenGLCore.git] / uglcContextGtk2GLX.pas
1 unit uglcContextGtk2GLX;\r
2 \r
3 { Package:      OpenGLCore\r
4   Prefix:       glc - OpenGL Core\r
5   Beschreibung: diese Unit enthält eine Klassen-Kapselung für OpenGL Kontexte für Linux\r
6   Hint:         diese Unit sollte niemals direkt genutzt werden (siehe uglcContext) }\r
7 \r
8 interface\r
9 \r
10 uses\r
11   SysUtils, Controls, uglcContext, LCLType, XUtil, XLib, gdk2x, gtk2, gdk2, dglOpenGL,\r
12   LMessages, uglcContextGtkCustomVisual;\r
13 \r
14 type\r
15   EGLXError = class(EGLError);\r
16 \r
17   TRenderControl = class(TCustomVisualControl)\r
18   private\r
19     fTarget: TWinControl;\r
20   protected\r
21     procedure WndProc(var Message: TLMessage); override;\r
22   public\r
23     property Target: TWinControl read fTarget write fTarget;\r
24   end;\r
25 \r
26   { TglcContextGtk2GLX }\r
27 \r
28   TglcContextGtk2GLX = class(TglcContext)\r
29   private\r
30     FVisual: PXVisualInfo;\r
31     FDisplay: PDisplay;\r
32     FWidget: PGtkWidget;\r
33     FContext: GLXContext;\r
34     FRenderControl: TRenderControl;\r
35     procedure UpdateVisual(const aControl: TWinControl);\r
36   protected\r
37     procedure OpenContext; override;\r
38   public\r
39     constructor Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings); override; overload;\r
40     constructor Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings; const aVersionSettings: TglcContextVersionSettings); override; overload;\r
41     destructor Destroy; override;\r
42 \r
43     procedure CloseContext; override;\r
44     procedure Activate; override;\r
45     procedure Deactivate; override;\r
46     function IsActive: boolean; override;\r
47     procedure SwapBuffers; override;\r
48     procedure SetSwapInterval(const aInterval: GLint); override;\r
49     procedure Share(const aContext: TglcContext); override;\r
50 \r
51     class function ChangeDisplaySettings(const aWidth, aHeight,\r
52       aBitPerPixel, aFreq: Integer; const aFlags: TglcDisplayFlags): Boolean; override;\r
53     class function IsAnyContextActive: boolean; override;\r
54   end;\r
55 \r
56 implementation\r
57 \r
58 type\r
59   TGLIntArray = packed array of GLInt;\r
60 \r
61 {$region messages -fold}\r
62 procedure TRenderControl.WndProc(var Message: TLMessage);\r
63 begin\r
64   case Message.msg of\r
65     //LM_ACTIVATEITEM,\r
66     //LM_CHANGED,\r
67     //LM_FOCUS,\r
68     LM_CLICKED,\r
69     //LM_RELEASED,\r
70     LM_ENTER,\r
71     LM_LEAVE,\r
72     //LM_CHECKRESIZE,\r
73     //LM_SETEDITABLE,\r
74     //LM_MOVEWORD,\r
75     //LM_MOVEPAGE,\r
76     //LM_MOVETOROW,\r
77     //LM_MOVETOCOLUMN,\r
78     //LM_KILLCHAR,\r
79     //LM_KILLWORD,\r
80     //LM_KILLLINE,\r
81     //LM_CLOSEQUERY,\r
82     //LM_DRAGSTART,\r
83     //LM_MONTHCHANGED,\r
84     //LM_YEARCHANGED,\r
85     //LM_DAYCHANGED,\r
86     LM_LBUTTONTRIPLECLK,\r
87     LM_LBUTTONQUADCLK,\r
88     LM_MBUTTONTRIPLECLK,\r
89     LM_MBUTTONQUADCLK,\r
90     LM_RBUTTONTRIPLECLK,\r
91     LM_RBUTTONQUADCLK,\r
92     LM_MOUSEENTER,\r
93     LM_MOUSELEAVE,\r
94     LM_XBUTTONTRIPLECLK,\r
95     LM_XBUTTONQUADCLK,\r
96 \r
97     //SC_SIZE,\r
98     //SC_MOVE,\r
99     //SC_MINIMIZE,\r
100     //SC_MAXIMIZE,\r
101     //SC_NEXTWINDOW,\r
102     //SC_PREVWINDOW,\r
103     //SC_CLOSE,\r
104     SC_VSCROLL,\r
105     SC_HSCROLL,\r
106     SC_MOUSEMENU,\r
107     SC_KEYMENU,\r
108     //SC_ARRANGE,\r
109     //SC_RESTORE,\r
110     //SC_TASKLIST,\r
111     //SC_SCREENSAVE,\r
112     //SC_HOTKEY,\r
113     //SC_DEFAULT,\r
114     //SC_MONITORPOWER,\r
115     //SC_CONTEXTHELP,\r
116     //SC_SEPARATOR,\r
117 \r
118     //LM_MOVE,\r
119     //LM_SIZE,\r
120     LM_ACTIVATE,\r
121     LM_SETFOCUS,\r
122     LM_KILLFOCUS,\r
123     //LM_ENABLE,\r
124     //LM_GETTEXTLENGTH,\r
125     //LM_SHOWWINDOW,\r
126     //LM_CANCELMODE,\r
127     //LM_DRAWITEM,\r
128     //LM_MEASUREITEM,\r
129     //LM_DELETEITEM,\r
130     //LM_VKEYTOITEM,\r
131     //LM_CHARTOITEM,\r
132     //LM_COMPAREITEM,\r
133     //LM_WINDOWPOSCHANGING,\r
134     //LM_WINDOWPOSCHANGED,\r
135     //LM_NOTIFY,\r
136     //LM_HELP,\r
137     //LM_NOTIFYFORMAT,\r
138     //LM_CONTEXTMENU,\r
139     //LM_NCCALCSIZE,\r
140     //LM_NCHITTEST,\r
141     //LM_NCPAINT,\r
142     //LM_NCACTIVATE,\r
143     //LM_GETDLGCODE,\r
144     LM_NCMOUSEMOVE,\r
145     LM_NCLBUTTONDOWN,\r
146     LM_NCLBUTTONUP,\r
147     LM_NCLBUTTONDBLCLK,\r
148     LM_KEYDOWN,\r
149     LM_KEYUP,\r
150     LM_CHAR,\r
151     LM_SYSKEYDOWN,\r
152     LM_SYSKEYUP,\r
153     LM_SYSCHAR,\r
154     LM_COMMAND,\r
155     LM_SYSCOMMAND,\r
156     LM_TIMER,\r
157     LM_HSCROLL,\r
158     LM_VSCROLL,\r
159     //LM_CTLCOLORMSGBOX,\r
160     //LM_CTLCOLOREDIT,\r
161     //LM_CTLCOLORLISTBOX,\r
162     //LM_CTLCOLORBTN,\r
163     //LM_CTLCOLORDLG,\r
164     //LM_CTLCOLORSCROLLBAR,\r
165     //LM_CTLCOLORSTATIC,\r
166     LM_MOUSEMOVE,\r
167     LM_LBUTTONDOWN,\r
168     LM_LBUTTONUP,\r
169     LM_LBUTTONDBLCLK,\r
170     LM_RBUTTONDOWN,\r
171     LM_RBUTTONUP,\r
172     LM_RBUTTONDBLCLK,\r
173     LM_MBUTTONDOWN,\r
174     LM_MBUTTONUP,\r
175     LM_MBUTTONDBLCLK,\r
176     LM_MOUSEWHEEL,\r
177     LM_XBUTTONDOWN,\r
178     LM_XBUTTONUP,\r
179     LM_XBUTTONDBLCLK,\r
180     //LM_PARENTNOTIFY,\r
181     //LM_CAPTURECHANGED,\r
182     //LM_DROPFILES,\r
183     //LM_SELCHANGE,\r
184     LM_CUT,\r
185     LM_COPY,\r
186     LM_PASTE,\r
187     //LM_CLEAR,\r
188     //LM_CONFIGUREEVENT,\r
189     //LM_EXIT,\r
190     //LM_QUIT,\r
191     //LM_NULL,\r
192     //LM_PAINT,\r
193     //LM_ERASEBKGND,\r
194     //LM_SETCURSOR,\r
195     //LM_SETFONT:\r
196 \r
197     //CM_ACTIVATE,\r
198     //CM_DEACTIVATE,\r
199     //CM_FOCUSCHANGED,\r
200     //CM_PARENTFONTCHANGED,\r
201     //CM_PARENTCOLORCHANGED,\r
202     //CM_HITTEST,\r
203     //CM_VISIBLECHANGED,\r
204     //CM_ENABLEDCHANGED,\r
205     //CM_COLORCHANGED,\r
206     //CM_FONTCHANGED,\r
207     //CM_CURSORCHANGED,\r
208     //CM_TEXTCHANGED,\r
209     CM_MOUSEENTER,\r
210     CM_MOUSELEAVE,\r
211     //CM_MENUCHANGED,\r
212     //CM_APPSYSCOMMAND,\r
213     //CM_BUTTONPRESSED,\r
214     //CM_SHOWINGCHANGED,\r
215     //CM_ENTER,\r
216     //CM_EXIT,\r
217     //CM_DESIGNHITTEST,\r
218     //CM_ICONCHANGED,\r
219     //CM_WANTSPECIALKEY,\r
220     //CM_RELEASE,\r
221     //CM_FONTCHANGE,\r
222     //CM_TABSTOPCHANGED,\r
223     //CM_UIACTIVATE,\r
224     //CM_CONTROLLISTCHANGE,\r
225     //CM_GETDATALINK,\r
226     //CM_CHILDKEY,\r
227     //CM_HINTSHOW,\r
228     //CM_SYSFONTCHANGED,\r
229     //CM_CONTROLCHANGE,\r
230     //CM_CHANGED,\r
231     //CM_BORDERCHANGED,\r
232     //CM_BIDIMODECHANGED,\r
233     //CM_PARENTBIDIMODECHANGED,\r
234     //CM_ALLCHILDRENFLIPPED,\r
235     //CM_ACTIONUPDATE,\r
236     //CM_ACTIONEXECUTE,\r
237     //CM_HINTSHOWPAUSE,\r
238     //CM_DOCKNOTIFICATION,\r
239     CM_MOUSEWHEEL,\r
240     //CM_APPSHOWBTNGLYPHCHANGED,\r
241     //CM_APPSHOWMENUGLYPHCHANGED,\r
242 \r
243     //CN_BASE,\r
244     //CN_CHARTOITEM,\r
245     //CN_COMMAND,\r
246     //CN_COMPAREITEM,\r
247     //CN_CTLCOLORBTN,\r
248     //CN_CTLCOLORDLG,\r
249     //CN_CTLCOLOREDIT,\r
250     //CN_CTLCOLORLISTBOX,\r
251     //CN_CTLCOLORMSGBOX,\r
252     //CN_CTLCOLORSCROLLBAR,\r
253     //CN_CTLCOLORSTATIC,\r
254     //CN_DELETEITEM,\r
255     //CN_DRAWITEM,\r
256     CN_HSCROLL,\r
257     //CN_MEASUREITEM,\r
258     //CN_PARENTNOTIFY,\r
259     //CN_VKEYTOITEM,\r
260     CN_VSCROLL,\r
261     CN_KEYDOWN,\r
262     CN_KEYUP,\r
263     CN_CHAR,\r
264     CN_SYSKEYUP,\r
265     CN_SYSKEYDOWN,\r
266     CN_SYSCHAR,\r
267     CN_NOTIFY:\r
268     begin\r
269       if Assigned(fTarget) then\r
270         Message.Result := fTarget.Perform(Message.msg, Message.wParam, Message.lParam);\r
271     end;\r
272   end;\r
273   inherited WndProc(Message);\r
274 end;\r
275 \r
276 {$endregion}\r
277 \r
278 function CreateOpenGLContextAttrList(UseFB: boolean; pf: TglcContextPixelFormatSettings): TGLIntArray;\r
279 var\r
280   p: integer;\r
281 \r
282   procedure Add(i: integer);\r
283   begin\r
284     SetLength(Result, p+1);\r
285     Result[p]:=i;\r
286     inc(p);\r
287   end;\r
288 \r
289   procedure CreateList;\r
290   begin\r
291     if UseFB then begin Add(GLX_X_RENDERABLE); Add(1); end;\r
292     if pf.DoubleBuffered then begin\r
293       if UseFB then begin\r
294         Add(GLX_DOUBLEBUFFER); Add(1);\r
295       end else\r
296         Add(GLX_DOUBLEBUFFER);\r
297     end;\r
298     if not UseFB and (pf.ColorBits>24) then Add(GLX_RGBA);\r
299     if UseFB then begin\r
300       Add(GLX_DRAWABLE_TYPE);\r
301       Add(GLX_WINDOW_BIT);\r
302     end;\r
303     Add(GLX_RED_SIZE);  Add(8);\r
304     Add(GLX_GREEN_SIZE);  Add(8);\r
305     Add(GLX_BLUE_SIZE);  Add(8);\r
306     if pf.ColorBits>24 then\r
307       Add(GLX_ALPHA_SIZE);  Add(8);\r
308     Add(GLX_DEPTH_SIZE);  Add(pf.DepthBits);\r
309     Add(GLX_STENCIL_SIZE);  Add(pf.StencilBits);\r
310     Add(GLX_AUX_BUFFERS);  Add(pf.AUXBuffers);\r
311 \r
312     if pf.MultiSampling > 1 then begin\r
313       Add(GLX_SAMPLE_BUFFERS_ARB); Add(1);\r
314       Add(GLX_SAMPLES_ARB); Add(pf.MultiSampling);\r
315     end;\r
316 \r
317     Add(0); { 0 = X.None (be careful: GLX_NONE is something different) }\r
318   end;\r
319 \r
320 begin\r
321   SetLength(Result, 0);\r
322   p:=0;\r
323   CreateList;\r
324 end;\r
325 \r
326 function FBglXChooseVisual(dpy:PDisplay; screen:longint; attrib_list:Plongint):PXVisualInfo;\r
327 type\r
328   PGLXFBConfig = ^GLXFBConfig;\r
329 var\r
330   FBConfigsCount: integer;\r
331   FBConfigs: PGLXFBConfig;\r
332   FBConfig: GLXFBConfig;\r
333 begin\r
334   Result:= nil;\r
335   FBConfigsCount:=0;\r
336   FBConfigs:= glXChooseFBConfig(dpy, screen, attrib_list, @FBConfigsCount);\r
337   if FBConfigsCount = 0 then\r
338     exit;\r
339 \r
340   { just choose the first FB config from the FBConfigs list.\r
341     More involved selection possible. }\r
342   FBConfig := FBConfigs^;\r
343   Result:=glXGetVisualFromFBConfig(dpy, FBConfig);\r
344 end;\r
345 \r
346 \r
347 { TglcContextGtk2GLX }\r
348 \r
349 procedure TglcContextGtk2GLX.UpdateVisual(const aControl: TWinControl);\r
350 var\r
351   attrList: TGLIntArray;\r
352   drawable: PGdkDrawable;\r
353 begin\r
354   if not Assigned(aControl) then\r
355     raise EArgumentException.Create('aControl is not assigned');\r
356 \r
357   {\r
358     Temporary (realized) widget to get to display\r
359   }\r
360   FWidget:= {%H-}PGtkWidget(PtrUInt(aControl.Handle));\r
361   gtk_widget_realize(FWidget);\r
362   drawable:= GTK_WIDGET(FWidget)^.window;\r
363 \r
364   FDisplay:= GDK_WINDOW_XDISPLAY(drawable);\r
365 \r
366   {\r
367     Find a suitable visual from PixelFormat using GLX 1.3 FBConfigs or\r
368     old-style Visuals\r
369   }\r
370   if Assigned(glXChooseFBConfig) then begin\r
371     attrList := CreateOpenGLContextAttrList(true, fPixelFormatSettings);\r
372     FVisual  := FBglXChooseVisual(FDisplay, DefaultScreen(FDisplay), @attrList[0]);\r
373     if not Assigned(FVisual) and (fPixelFormatSettings.MultiSampling > 1) then begin\r
374       fPixelFormatSettings.MultiSampling := 1;\r
375       attrList := CreateOpenGLContextAttrList(true, fPixelFormatSettings);\r
376       FVisual  := FBglXChooseVisual(FDisplay, DefaultScreen(FDisplay), @attrList[0]);\r
377     end;\r
378   end;\r
379   if not Assigned(FVisual) then begin\r
380     attrList := CreateOpenGLContextAttrList(false, fPixelFormatSettings);\r
381     FVisual  := glXChooseVisual(FDisplay, DefaultScreen(FDisplay), @attrList[0]);\r
382     if not Assigned(FVisual) and (fPixelFormatSettings.MultiSampling > 1) then begin\r
383       fPixelFormatSettings.MultiSampling := 1;\r
384       attrList := CreateOpenGLContextAttrList(false, fPixelFormatSettings);\r
385       FVisual  := glXChooseVisual(FDisplay, DefaultScreen(FDisplay), @attrList[0]);\r
386     end;\r
387   end;\r
388   if not Assigned(FVisual) then\r
389     raise EGLXError.Create('choose visual failed');\r
390 \r
391   {\r
392     Most widgets inherit the drawable of their parent. In contrast to Windows, descending from\r
393     TWinControl does not mean it's actually always a window of its own.\r
394     Famous example: TPanel is just a frame painted on a canvas.\r
395     Also, the LCL does somethin weird to colormaps in window creation, so we have\r
396     to use a custom widget here to have full control about visual selection.\r
397   }\r
398   FRenderControl:= TRenderControl.Create(aControl, FVisual^.visual^.visualid);\r
399   try\r
400     FRenderControl.Parent := aControl;\r
401     FRenderControl.HandleNeeded;\r
402     FRenderControl.Target := aControl;\r
403   except\r
404     FreeAndNil(FRenderControl);\r
405     raise;\r
406   end;\r
407 \r
408   {\r
409     Real Widget handle, unrealized!!!\r
410   }\r
411   FWidget:= FRenderControl.Widget;\r
412   gtk_widget_realize(FWidget);\r
413   drawable:= GTK_WIDGET(FWidget)^.window;\r
414   FDisplay:= GDK_WINDOW_XDISPLAY(drawable);\r
415 \r
416   // FRenderControl.Align:= alClient breaks the context or something\r
417   FRenderControl.BoundsRect := aControl.ClientRect;\r
418   FRenderControl.Anchors    := [akLeft, akTop, akRight, akBottom];\r
419 end;\r
420 \r
421 procedure TglcContextGtk2GLX.OpenContext;\r
422 var\r
423   Attribs: array of GLint;\r
424   tmpContext: GLXContext;\r
425   glxID: GLXDrawable;\r
426 begin\r
427   inherited OpenContext;\r
428 \r
429   if not Assigned(FVisual) then\r
430     raise EGLXError.Create('Failed to find Visual');\r
431 \r
432   tmpContext := glXCreateContext(FDisplay, FVisual, nil, true);\r
433   if fUseVersion and\r
434      (fVersionSettings.Major <> GLC_CONTEXT_VERSION_UNKNOWN) and\r
435      (fVersionSettings.Minor <> GLC_CONTEXT_VERSION_UNKNOWN) then\r
436   begin\r
437     // Set attributes to describe our requested context\r
438     SetLength(Attribs, 5);\r
439     Attribs[0] := WGL_CONTEXT_MAJOR_VERSION_ARB;\r
440     Attribs[1] := fVersionSettings.Major;\r
441     Attribs[2] := WGL_CONTEXT_MINOR_VERSION_ARB;\r
442     Attribs[3] := fVersionSettings.Minor;\r
443 \r
444     // Add context flag for forward compatible context\r
445     // Forward compatible means no more support for legacy functions like\r
446     // immediate mode (glvertex, glrotate, gltranslate, etc.)\r
447     if fVersionSettings.ForwardCompatible then begin\r
448       SetLength(Attribs, Length(Attribs)+2);\r
449       Attribs[4] := WGL_CONTEXT_FLAGS_ARB;\r
450       Attribs[5] := WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;\r
451     end;\r
452 \r
453     // Attribute flags must be finalized with a zero\r
454     SetLength(Attribs, 1);\r
455     Attribs[High(Attribs)] := 0;\r
456 \r
457     glxID := GDK_DRAWABLE_XID(GTK_WIDGET(FWidget)^.window);\r
458     glXMakeCurrent(FDisplay, glxID, tmpContext);\r
459     ReadImplementationProperties;\r
460     if not Assigned(glXCreateContextAttribsARB) or not GLX_ARB_create_context then begin\r
461       glXDestroyContext(FDisplay, tmpContext);\r
462       raise Exception.Create('GLX_ARB_create_context not supported');\r
463     end;\r
464     FContext := glXCreateContextAttribsARB(FDisplay, FVisual, nil, true, @Attribs[0]);\r
465 \r
466     glXDestroyContext(FDisplay, tmpContext);\r
467   end else\r
468     FContext := tmpContext;\r
469 \r
470   if (FContext = nil) then\r
471     raise EGLXError.Create('Failed to create Context');\r
472 end;\r
473 \r
474 constructor TglcContextGtk2GLX.Create(const aControl: TWinControl;\r
475   const aPixelFormatSettings: TglcContextPixelFormatSettings);\r
476 begin\r
477   inherited Create(aControl, aPixelFormatSettings);\r
478   UpdateVisual(aControl);\r
479 end;\r
480 \r
481 constructor TglcContextGtk2GLX.Create(const aControl: TWinControl;\r
482   const aPixelFormatSettings: TglcContextPixelFormatSettings;\r
483   const aVersionSettings: TglcContextVersionSettings);\r
484 begin\r
485   inherited Create(aControl, aPixelFormatSettings, aVersionSettings);\r
486   UpdateVisual(aControl);\r
487 end;\r
488 \r
489 destructor TglcContextGtk2GLX.Destroy;\r
490 begin\r
491   FreeAndNil(FRenderControl);\r
492   XFree(FVisual);\r
493   inherited Destroy;\r
494 end;\r
495 \r
496 procedure TglcContextGtk2GLX.CloseContext;\r
497 begin\r
498   if not Assigned(FWidget) then exit;\r
499   if Assigned(FContext) then\r
500     glXDestroyContext(FDisplay, FContext);\r
501   FreeAndNil(FRenderControl);\r
502 end;\r
503 \r
504 procedure TglcContextGtk2GLX.Activate;\r
505 var\r
506    glxID: GLXDrawable;\r
507 begin\r
508   if not Assigned(FWidget) then exit;\r
509   // make sure the widget is realized\r
510   gtk_widget_realize(FWidget);\r
511   if not GTK_WIDGET_REALIZED(FWidget) then exit;\r
512 \r
513   // make current\r
514   glxID := GDK_DRAWABLE_XID(GTK_WIDGET(FWidget)^.window);\r
515   glXMakeCurrent(FDisplay, glxID, FContext);\r
516 end;\r
517 \r
518 procedure TglcContextGtk2GLX.Deactivate;\r
519 var\r
520    glxID: GLXDrawable;\r
521 begin\r
522   if not Assigned(FWidget) then exit;\r
523   glxID := GDK_DRAWABLE_XID(GTK_WIDGET(FWidget)^.window);\r
524   glXMakeCurrent(FDisplay, glxID, nil);\r
525 end;\r
526 \r
527 function TglcContextGtk2GLX.IsActive: boolean;\r
528 var\r
529   glxID: GLXDrawable;\r
530 begin\r
531   glxID := GDK_DRAWABLE_XID(GTK_WIDGET(FWidget)^.window);\r
532   Result:= (FContext = glXGetCurrentContext()) and\r
533            Assigned(FWidget) and\r
534            (glxID = glXGetCurrentDrawable());\r
535 end;\r
536 \r
537 procedure TglcContextGtk2GLX.SwapBuffers;\r
538 var\r
539   glxID: GLXDrawable;\r
540 begin\r
541   if not Assigned(FWidget) then exit;\r
542   glxID := GDK_DRAWABLE_XID(GTK_WIDGET(FWidget)^.window);\r
543   glXSwapBuffers(FDisplay, glxID);\r
544 end;\r
545 \r
546 procedure TglcContextGtk2GLX.SetSwapInterval(const aInterval: GLint);\r
547 var\r
548   drawable: PGdkDrawable;\r
549 begin\r
550   drawable:= GTK_WIDGET(FWidget)^.window;\r
551   if GLX_EXT_swap_control then\r
552     glXSwapIntervalEXT(FDisplay, GDK_WINDOW_XWINDOW(drawable), aInterval);\r
553 end;\r
554 \r
555 procedure TglcContextGtk2GLX.Share(const aContext: TglcContext);\r
556 begin\r
557   raise Exception.Create('not yet implemented');\r
558 end;\r
559 \r
560 class function TglcContextGtk2GLX.{%H-}ChangeDisplaySettings(const aWidth, aHeight,\r
561   aBitPerPixel, aFreq: Integer; const aFlags: TglcDisplayFlags): Boolean;\r
562 begin\r
563   raise Exception.Create('not yet implemented');\r
564 end;\r
565 \r
566 class function TglcContextGtk2GLX.IsAnyContextActive: boolean;\r
567 begin\r
568   Result:= (glXGetCurrentContext()<>nil) and (glXGetCurrentDrawable()<>0);\r
569 end;\r
570 \r
571 end.\r
572 \r