I encouter linker problems when importing GLFW3 static lib since PB5.4 on linux(ubuntu)
Code: Select all
; /************************************************************************
;  * GLFW - An OpenGL framework
;  * API version: 3.0
;  * WWW:         http://www.glfw.org/
;  *------------------------------------------------------------------------
;  * Copyright (c) 2002-2006 Marcus Geelnard
;  * Copyright (c) 2006-2010 Camilla Berglund
;  *
;  * This software is provided 'as-is', without any express Or implied
;  * warranty. In no event will the authors be held liable For any damages
;  * arising from the use of this software.
;  *
;  * Permission is granted To anyone To use this software For any purpose,
;  * including commercial applications, And To alter it And redistribute it
;  * freely, subject To the following restrictions:
;  *
;  * 1. The origin of this software must Not be misrepresented; you must not
;  *    claim that you wrote the original software. If you use this software
;  *    in a product, an acknowledgment in the product documentation would
;  *    be appreciated but is Not required.
;  *
;  * 2. Altered source versions must be plainly marked As such, And must Not
;  *    be misrepresented As being the original software.
;  *
;  * 3. This notice may Not be removed Or altered from any source
;  *    distribution.
;  *
;  *************************************************************************/
XIncludeFile "OpenGL.pbi"
DeclareModule GLFW
  UseModule OpenGL
  #USE_GLFW = #True
  ; /*************************************************************************
  ;  * GLFW version 
  ;  *************************************************************************/
  
  #GLFW_VERSION_MAJOR  =  3
  #GLFW_VERSION_MINOR =   0
  #GLFW_VERSION_REVISION= 0
  
  
  ; /*************************************************************************
  ;  * Input handling definitions
  ;  *************************************************************************/
  
  ;/* Key And button state/action definitions */
  #GLFW_RELEASE =  0
  #GLFW_PRESS  =  1
  #GLFW_REPEAT = 2
  
  ;/* The unknown key */
  #GLFW_KEY_UNKNOWN           = -1
  
  ;/* Printable keys */
  #GLFW_KEY_SPACE             = 32
  #GLFW_KEY_APOSTROPHE        = 39  ;/* ' */
  #GLFW_KEY_COMMA             = 44  ;/* , */
  #GLFW_KEY_MINUS             = 45  ;/* - */
  #GLFW_KEY_PERIOD            = 46  ;/* . */
  #GLFW_KEY_SLASH             = 47  ;/* / */
  #GLFW_KEY_0                 = 48
  #GLFW_KEY_1                 = 49
  #GLFW_KEY_2                 = 50
  #GLFW_KEY_3                 = 51
  #GLFW_KEY_4                 = 52
  #GLFW_KEY_5                 = 53
  #GLFW_KEY_6                 = 54
  #GLFW_KEY_7                 = 55
  #GLFW_KEY_8                 = 56
  #GLFW_KEY_9                 = 57
  #GLFW_KEY_SEMICOLON         = 59  ;/*  */
  #GLFW_KEY_EQUAL             = 61  ;/* = */
  #GLFW_KEY_A                 = 65
  #GLFW_KEY_B                 = 66
  #GLFW_KEY_C                 = 67
  #GLFW_KEY_D                 = 68
  #GLFW_KEY_E                 = 69
  #GLFW_KEY_F                 = 70
  #GLFW_KEY_G                 = 71
  #GLFW_KEY_H                 = 72
  #GLFW_KEY_I                 = 73
  #GLFW_KEY_J                 = 74
  #GLFW_KEY_K                 = 75
  #GLFW_KEY_L                 = 76
  #GLFW_KEY_M                 = 77
  #GLFW_KEY_N                 = 78
  #GLFW_KEY_O                 = 79
  #GLFW_KEY_P                 = 80
  #GLFW_KEY_Q                 = 81
  #GLFW_KEY_R                 = 82
  #GLFW_KEY_S                 = 83
  #GLFW_KEY_T                 = 84
  #GLFW_KEY_U                 = 85
  #GLFW_KEY_V                 = 86
  #GLFW_KEY_W                 = 87
  #GLFW_KEY_X                 = 88
  #GLFW_KEY_Y                 = 89
  #GLFW_KEY_Z                 = 90
  #GLFW_KEY_LEFT_BRACKET      = 91  ;/* [ */
  #GLFW_KEY_BACKSLASH         = 92  ;/* \ */
  #GLFW_KEY_RIGHT_BRACKET     = 93  ;/* ] */
  #GLFW_KEY_GRAVE_ACCENT      = 96  ;/* ` */
  #GLFW_KEY_WORLD_1           = 161 ;/* non-US #1 */
  #GLFW_KEY_WORLD_2           = 162 ;/* non-US #2 */
  
  ;/* Function keys */
  #GLFW_KEY_ESCAPE            = 256
  #GLFW_KEY_ENTER             = 257
  #GLFW_KEY_TAB               = 258
  #GLFW_KEY_BACKSPACE         = 259
  #GLFW_KEY_INSERT            = 260
  #GLFW_KEY_DELETE            = 261
  #GLFW_KEY_RIGHT             = 262
  #GLFW_KEY_LEFT              = 263
  #GLFW_KEY_DOWN              = 264
  #GLFW_KEY_UP                = 265
  #GLFW_KEY_PAGE_UP           = 266
  #GLFW_KEY_PAGE_DOWN         = 267
  #GLFW_KEY_HOME              = 268
  #GLFW_KEY_END               = 269
  #GLFW_KEY_CAPS_LOCK         = 280
  #GLFW_KEY_SCROLL_LOCK       = 281
  #GLFW_KEY_NUM_LOCK          = 282
  #GLFW_KEY_PRINT_SCREEN      = 283
  #GLFW_KEY_PAUSE             = 284
  #GLFW_KEY_F1                = 290
  #GLFW_KEY_F2                = 291
  #GLFW_KEY_F3                = 292
  #GLFW_KEY_F4                = 293
  #GLFW_KEY_F5                = 294
  #GLFW_KEY_F6                = 295
  #GLFW_KEY_F7                = 296
  #GLFW_KEY_F8                = 297
  #GLFW_KEY_F9                = 298
  #GLFW_KEY_F10               = 299
  #GLFW_KEY_F11               = 300
  #GLFW_KEY_F12               = 301
  #GLFW_KEY_F13               = 302
  #GLFW_KEY_F14               = 303
  #GLFW_KEY_F15               = 304
  #GLFW_KEY_F16               = 305
  #GLFW_KEY_F17               = 306
  #GLFW_KEY_F18               = 307
  #GLFW_KEY_F19               = 308
  #GLFW_KEY_F20               = 309
  #GLFW_KEY_F21               = 310
  #GLFW_KEY_F22               = 311
  #GLFW_KEY_F23               = 312
  #GLFW_KEY_F24               = 313
  #GLFW_KEY_F25               = 314
  #GLFW_KEY_KP_0              = 320
  #GLFW_KEY_KP_1              = 321
  #GLFW_KEY_KP_2              = 322
  #GLFW_KEY_KP_3              = 323
  #GLFW_KEY_KP_4              = 324
  #GLFW_KEY_KP_5              = 325
  #GLFW_KEY_KP_6              = 326
  #GLFW_KEY_KP_7              = 327
  #GLFW_KEY_KP_8              = 328
  #GLFW_KEY_KP_9              = 329
  #GLFW_KEY_KP_DECIMAL        = 330
  #GLFW_KEY_KP_DIVIDE         = 331
  #GLFW_KEY_KP_MULTIPLY       = 332
  #GLFW_KEY_KP_SUBTRACT       = 333
  #GLFW_KEY_KP_ADD            = 334
  #GLFW_KEY_KP_ENTER          = 335
  #GLFW_KEY_KP_EQUAL          = 336
  #GLFW_KEY_LEFT_SHIFT        = 340
  #GLFW_KEY_LEFT_CONTROL      = 341
  #GLFW_KEY_LEFT_ALT          = 342
  #GLFW_KEY_LEFT_SUPER        = 343
  #GLFW_KEY_RIGHT_SHIFT       = 344
  #GLFW_KEY_RIGHT_CONTROL     = 345
  #GLFW_KEY_RIGHT_ALT         = 346
  #GLFW_KEY_RIGHT_SUPER       = 347
  #GLFW_KEY_MENU              = 348
  #GLFW_KEY_LAST              = #GLFW_KEY_MENU
  
  ;/* Modifiers Keys */s
  #GLFW_MOD_SHIFT           = $0001
  #GLFW_MOD_CONTROL         = $0002
  #GLFW_MOD_ALT             = $0004
  #GLFW_MOD_SUPER           = $0008
  
  ;/* Mouse button definitions */
  #GLFW_MOUSE_BUTTON_1   =    0
  #GLFW_MOUSE_BUTTON_2   =   1
  #GLFW_MOUSE_BUTTON_3   =   2
  #GLFW_MOUSE_BUTTON_4   =   3
  #GLFW_MOUSE_BUTTON_5   =   4
  #GLFW_MOUSE_BUTTON_6   =   5
  #GLFW_MOUSE_BUTTON_7   =   6
  #GLFW_MOUSE_BUTTON_8    =  7
  #GLFW_MOUSE_BUTTON_LAST  = #GLFW_MOUSE_BUTTON_8
  
  ;/* Mouse button aliases */
  #GLFW_MOUSE_BUTTON_LEFT   = #GLFW_MOUSE_BUTTON_1
  #GLFW_MOUSE_BUTTON_RIGHT  = #GLFW_MOUSE_BUTTON_2
  #GLFW_MOUSE_BUTTON_MIDDLE  = #GLFW_MOUSE_BUTTON_3
  
  
  ;/* Joystick identifiers */
  #GLFW_JOYSTICK_1   =       0
  #GLFW_JOYSTICK_2   =       1
  #GLFW_JOYSTICK_3    =      2
  #GLFW_JOYSTICK_4    =      3
  #GLFW_JOYSTICK_5    =      4
  #GLFW_JOYSTICK_6    =      5
  #GLFW_JOYSTICK_7    =      6
  #GLFW_JOYSTICK_8    =      7
  #GLFW_JOYSTICK_9    =      8
  #GLFW_JOYSTICK_10   =      9
  #GLFW_JOYSTICK_11    =     10
  #GLFW_JOYSTICK_12    =     11
  #GLFW_JOYSTICK_13    =     12
  #GLFW_JOYSTICK_14    =     13
  #GLFW_JOYSTICK_15    =     14
  #GLFW_JOYSTICK_16     =    15
  #GLFW_JOYSTICK_LAST    =   #GLFW_JOYSTICK_16
  
  ;/*************************************************************************
  ;  * Errors
  ;*************************************************************************/
  #GLFW_NOT_INITIALIZED       = $00010001
  #GLFW_NO_CURRENT_CONTEXT    = $00010002
  #GLFW_INVALID_ENUM          = $00010003
  #GLFW_INVALID_VALUE         = $00010004
  #GLFW_OUT_OF_MEMORY         = $00010005
  #GLFW_API_UNAVAILABLE       = $00010006
  #GLFW_VERSION_UNAVAILABLE   = $00010007
  #GLFW_PLATFORM_ERROR        = $00010008
  #GLFW_FORMAT_UNAVAILABLE    = $00010009
  
  ;/*************************************************************************
  ;  * Other definitions
  ;  *************************************************************************/
  
  ;/* glfwOpenWindow modes */
  #GLFW_FOCUSED              =  $00020001
  #GLFW_ICONIFIED            =  $00020002
  #GLFW_RESIZABLE            =  $00020003
  #GLFW_VISIBLE              =  $00020004
  #GLFW_DECORATED            =  $00020005
  #GLFW_AUTO_ICONIFY         =  $00020006
  #GLFW_FLOATING             =  $00020007
  
  #GLFW_RED_BITS             =  $00021001
  #GLFW_GREEN_BITS           =  $00021002
  #GLFW_BLUE_BITS            =  $00021003
  #GLFW_ALPHA_BITS           =  $00021004
  #GLFW_DEPTH_BITS           =  $00021005
  #GLFW_STENCIL_BITS         =  $00021006
  #GLFW_ACCUM_RED_BITS       =  $00021007
  #GLFW_ACCUM_GREEN_BITS     =  $00021008
  #GLFW_ACCUM_BLUE_BITS      =  $00021009
  #GLFW_ACCUM_ALPHA_BITS     =  $0002100A
  #GLFW_AUX_BUFFERS          =  $0002100B
  #GLFW_STEREO               =  $0002100C
  #GLFW_SAMPLES              =  $0002100D
  #GLFW_SRGB_CAPABLE         =  $0002100E
  #GLFW_REFRESH_RATE         =  $0002100F
  #GLFW_DOUBLEBUFFER         =  $00021010
  
  #GLFW_CLIENT_API           =  $00022001
  #GLFW_CONTEXT_VERSION_MAJOR = $00022002
  #GLFW_CONTEXT_VERSION_MINOR = $00022003
  #GLFW_CONTEXT_REVISION      = $00022004
  #GLFW_CONTEXT_ROBUSTNESS    = $00022005
  #GLFW_OPENGL_FORWARD_COMPAT = $00022006
  #GLFW_OPENGL_DEBUG_CONTEXT  = $00022007
  #GLFW_OPENGL_PROFILE        = $00022008
  
  #GLFW_OPENGL_API            = $00030001
  #GLFW_OPENGL_ES_API         = $00030002
  
  #GLFW_NO_ROBUSTNESS          =         0
  #GLFW_NO_RESET_NOTIFICATION  = $00031001
  #GLFW_LOSE_CONTEXT_ON_RESET  = $00031002
  
  #GLFW_OPENGL_ANY_PROFILE     =         0
  #GLFW_OPENGL_CORE_PROFILE    = $00032001
  #GLFW_OPENGL_COMPAT_PROFILE  = $00032002
  
  #GLFW_CURSOR                = $00033001
  #GLFW_STICKY_KEYS           = $00033002
  #GLFW_STICKY_MOUSE_BUTTONS  = $00033003
  
  #GLFW_CURSOR_NORMAL         = $00034001
  #GLFW_CURSOR_HIDDEN         = $00034002
  #GLFW_CURSOR_DISABLED       = $00034003
  
  #GLFW_ANY_RELEASE_BEHAVIOR  =        0
  #GLFW_RELEASE_BEHAVIOR_FLUSH= $00035001
  #GLFW_RELEASE_BEHAVIOR_NONE = $00035002
  
  ; Cursors
  #GLFW_ARROW_CURSOR          = $00036001
  #GLFW_GLFW_IBEAM_CURSOR     = $00036002
  #GLFW_CROSSHAIR_CURSOR      = $00036003
  #GLFW_HAND_CURSOR           = $00036004
  #GLFW_HRESIZE_CURSOR        = $00036005
  #GLFW_VRESIZE_CURSOR        = $00036006
  
  #GLFW_CONNECTED             = $00040001
  #GLFW_DISCONNECTED          = $00040002
  
  #GLFW_DONT_CARE             = -1
  
  ;/* Time spans longer than this (seconds) are considered To be infinity */
  #GLFW_INFINITY = 100000.0
  
  ;---------------------------------------------------------------------------
  ; Macros
  ;---------------------------------------------------------------------------
  ;{
  ;-----------------------------------------
  ; Get Pseudotype(unicode/ascii)
  ;-----------------------------------------
  CompilerIf #PB_Compiler_Unicode
    Macro GLFWPSEUDOTYPE
      p-utf8
    EndMacro
  CompilerElse
    Macro GLFWPSEUDOTYPE
      p-ascii
    EndMacro
  CompilerEndIf
  
  ;}
  
  ;---------------------------------------------------------------------------
  ; Structures
  ;---------------------------------------------------------------------------
  ;{
  ;--------------------------------------
  ; Monitor (Opaque Structure)
  ;--------------------------------------
  Structure GLFWmonitor : EndStructure
  
  ;--------------------------------------
  ; Window (Opaque Structure)
  ;--------------------------------------
  Structure GLFWwindow : EndStructure
  
  ;--------------------------------------
  ; Cursor (Opaque Structure)
  ;--------------------------------------
  Structure GLFWcursor : EndStructure
  
  ;--------------------------------------
  ; Video Mode
  ;--------------------------------------
  Structure GLFWvidmode
    Width.l
    Height.l
    RedBits.l
    BlueBits.l
    GreenBits.l
  EndStructure
  
  ;--------------------------------------
  ; Gamma Ramp
  ;--------------------------------------
  Structure GLFWgammaramp
    *red      ; pointer to array of unsigned short
    *green    ; pointer to array of unsigned short
    *blue     ; pointer to array of unsigned short
    size.l
  EndStructure
  
  ;--------------------------------------
  ; Image
  ;--------------------------------------
  Structure GLFWimage
    width.i
    height.i
    *pixels; pointer to unsigned char*
  EndStructure
  ;}
  
  
  ;---------------------------------------------------------------------------
  ; Prototypes
  ;---------------------------------------------------------------------------
  ;{
  PrototypeC PGLFWGLPROC()
  PrototypeC PGLFWERROR(err_code.i,description.GLFWPSEUDOTYPE)
  PrototypeC PGLFWCREATEWINDOWPROC(w.i,h.i,name.GLFWPSEUDOTYPE,*monitor.GLFWmonitor=#Null,*parent.GLFWwindow=#Null)
  PrototypeC PGLFWWINDOWPOS(*window.GLFWwindow,posx.i,posy.i)
  PrototypeC PGLFWWINDOWSIZE(*window.GLFWwindow,width.i,height.i)
  PrototypeC PGLFWWINDOWCLOSE(*window.GLFWwindow)
  PrototypeC PGLFWWINDOWREFRESH(*window.GLFWwindow)
  PrototypeC PGLFWWINDOWFOCUS(*window.GLFWwindow)
  PrototypeC PGLFWKEY(*window.GLFWwindow,key.i,scancode.i,action.i,modifier.i)    ; Key Pressed/Released Callback Function
  PrototypeC PGLFWCHAR(*window.GLFWwindow,character.l)                            ; Unicode Character Input Callback Function
  PrototypeC PGLFWMOUSEBUTTON(*window.GLFWwindow,button.i,action.i,modifier.i)    ; Mouse Button  Pressed/Released Callback Function
  PrototypeC PGLFWMOUSEPOS(*window.GLFWwindow,posx.d,posy.d)                      ; Mouse Position Callback Function
  PrototypeC PGLFWMOUSEENTER(*window.GLFWwindow,entered.i)                        ; Mouse Enter/Leave Callback Function 
  PrototypeC PGLFWMOUSESCROLL(*window.GLFWwindow,xoffset.d,yoffset.d)             ; Mouse Scroll(Wheel) Callback Function 
  PrototypeC PGLFWFRAMEBUFFERSIZE(*window.GLFWwindow)
  ;}
    
  ;---------------------------------------------------------------------------
  ; Import Functions
  ;---------------------------------------------------------------------------
  ;{
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    ;___________________________________________________________________________
    ;  Windows
    ;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    ImportC "libs\x64\windows\glfw3.lib"
  
  CompilerElse
      
    ;___________________________________________________________________________
    ;  Linux/MacOSX
    ;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    ImportC "libs/x64/linux/glfw3.a" : EndImport
      
    ImportC "-lGL" : EndImport
    ImportC "-lGLU" : EndImport
    ImportC "-lX11" : EndImport  
    ImportC "-lXinerama" : EndImport  
    ImportC "-lXi" : EndImport  
    ImportC "-lXrandr" : EndImport 
    ImportC "-lXcursor" : EndImport
    ImportC "-lXxf86vm" : EndImport 
    ImportC "libs/x64/linux/glfw3.a"
  
  CompilerEndIf
      
  
  	;/* GLFW initialization, termination And version querying */
  	glfwInit()
  	glfwTerminate()
  	glfwGetVersion(*major, *minor, *rev)                                           ;(*major.i,*minor.i,*rev.i) 
  	glfwGetVersionString()                                                         ; return const char*
  
  	;/* GLFW monitors */
  	glfwGetMonitors(*count)                                                        ;(*count.i) ; return a **GLFWmonitor
  	glfwGetPrimaryMonitor()                                                        ; return a *GLFWmonitor
  	glfwGetMonitorPos(*monitor.GLFWmonitor, *xpos, *ypos)                          ;(*monitor.GLFWmonitor,*xpos.i,*ypos.i)
  	glfwGetMonitorPhysicalSize(*monitor.GLFWmonitor, *width,*height)               ;(*monitor.GLFWmonitor,*xpos.i,*ypsos.i)
  	glfwGetMonitorName(*monitor.GLFWmonitor)                                       ;(*monitor.GLFWmonitor) return const char*
  	glfwSetMonitorCallback(*monitor.GLFWmonitor, callback.i)
  	
  	;/* Windows */
  	glfwGetVideoModes(*monitor.GLFWmonitor,*count);                                ;(*monitor.GLFWmonitor, *count.i)
  	glfwGetVideoMode(*monitor.GLFWmonitor);
  	glfwSetGamma(*monitor.GLFWmonitor, gamma.f);
  	glfwGetGammaRamp(*monitor.GLFWmonitor)                                         ; return a *GLFWgammaramp
  	glfwSetGammaRamp(*monitor.GLFWmonitor, *ramp.GLFWgammaramp);
  	glfwDefaultWindowHints()
  	glfwWindowHint(target.i, hint.i)
  	glfwCreateWindow(w.i,h.i,name.GLFWPSEUDOTYPE,*monitor.GLFWmonitor=#Null,*parent.GLFWwindow=#Null)
  
  	glfwDestroyWindow(*window.GLFWwindow)
  	glfwWindowShouldClose(*window.GLFWwindow)
  	glfwSetWindowShouldClose(*window.GLFWwindow, value.i)
  	glfwSetWindowTitle(*window.GLFWwindow,title.GLFWPSEUDOTYPE)
  	glfwGetWindowPos(*window.GLFWwindow, *xpos, *ypos)                       ;(*window.GLFWwindow,*xpos.i,*ypos.i)
  	glfwSetWindowPos(*window.GLFWwindow, xpos.i, ypos.i)
  	glfwGetWindowSize(*window.GLFWwindow, *width, *height)                   ;(*window.GLFWwindow,*width.i,*height.i)
  	glfwSetWindowSize(*window.GLFWwindow, width.i, height.i)
  	glfwGetFramebufferSize(*window.GLFWwindow, *width, *height)              ;(*window.GLFWwindow,*width.i,*height.i)
  	glfwGetWindowFrameSize(*window.GLFWwindow,*left, *top, *right, *bottom)  ;(*window.GLFWwindow,*left., *top.i, *right.i, *bottom.i);
  	glfwIconifyWindow(*window.GLFWwindow)
  	glfwRestoreWindow(*window.GLFWwindow)
  	glfwShowWindow(*window.GLFWwindow)
  	glfwHideWindow(*window.GLFWwindow)
  	glfwGetWindowMonitor(*window.GLFWwindow)                                 ; return a *GLFWmonitor
  	glfwGetWindowAttrib.i(*window.GLFWwindow, attrib.i)
  	glfwSetWindowUserPointer(*window.GLFWwindow, *ptr)                       ; set-up user pointer for the specified GLFW*window.GLFWwindow
  	glfwGetWindowUserPointer(*window.GLFWwindow)                             ; get user pointer
  	
  	
  	;/* Time */
  	glfwGetTime.d()
  	glfwSetTime(time.d)
  
  	;/* Events */
  	glfwPollEvents()
  	glfwWaitEvents()
  	glfwPostEmptyEvent()
  	
  	;/* Inputs */
  	glfwGetInputMode.i(*window.GLFWwindow, mode.i)                           ; Modes:#GLFW_CURSOR,#GLFW_STICKY_KEYS,#GLFW_STICKY_MOUSE_BUTTONS
  	glfwSetInputMode(*window.GLFWwindow, mode.i, value.i);
  	
    glfwGetKey.i(*window.GLFWwindow, key.i)                                  ; return #GLFW_PRESS or #GLFW_RELEASE
    
    ;/* Mouse */
    glfwGetMouseButton(*window.GLFWwindow, button.i)                         ; return #GLFW_PRESS or #GLFW_RELEASE
    glfwGetCursorPos(*window.GLFWwindow, *xpos, *ypos)                       ;(*window.GLFWwindow,*xpos.d, *ypos.d)
    glfwSetCursorPos(*window.GLFWwindow, xpos.d, ypos.d)
    
    ;/* Cursor */
    glfwCreateCursor(*image.GLFWimage, xhot.i, yhot.i)
    glfwCreateStandardCursor(shape.i)
    glfwDestroyCursor(*cursor.GLFWcursor)
    glfwSetCursor(*window.GLFWwindow,*cursor.GLFWcursor)
    
    ;/* Joystick (untested)*/
  	glfwJoystickPresent(joystick.i)               ; Joystick Is Present?
  	glfwGetJoystickAxes(joystick.i, *count)       ;(joystick.i, *count.i) return const float* describing axis values
  	glfwGetJoystickButtons(joystick.i, *count)    ;(joystick.i, *count.i) return const unsigned char* describing buttons values
  	glfwGetJoystickName(joystick.i)               ; return const char* containing joystick name
  	
  	;/* Clipboard */
  	glfwSetClipboardString(*window.GLFWwindow, string.GLFWPSEUDOTYPE)        ; Put String to Clipboard
  	glfwGetClipboardString(*window.GLFWwindow)                               ; return const char* from clipboard content
  	
  	;/* Callbacks */
    glfwSetErrorCallback(*cb.PGLFWERROR)                                     ; Set Error Callback
  	glfwSetWindowPosCallback(*window.GLFWwindow, *cb.PGLFWWINDOWPOS)         ; Set Window Pos Callback
  	glfwSetWindowSizeCallback(*window.GLFWwindow, *cb.PGLFWWINDOWSIZE)       ; Set Window Size Callback
  	glfwSetWindowCloseCallback(*window.GLFWwindow, *cb.PGLFWWINDOWCLOSE)     ; Set Window Close Callback
  	glfwSetWindowRefreshCallback(*window.GLFWwindow, *cb.PGLFWWINDOWREFRESH) ; Set Window Refresh Callback
  	glfwSetWindowFocusCallback(*window.GLFWwindow, *cb.PGLFWWINDOWFOCUS)     ; Set Window Focus Callback
  	glfwSetKeyCallback(*window.GLFWwindow, *cb.PGLFWKEY)                     ; Set Keyboard Key Callback
  	glfwSetCharCallback(*window.GLFWwindow, *cb.PGLFWCHAR)                   ; Set Keyboard Input Callback
  	glfwSetMouseButtonCallback(*window.GLFWwindow, *cb.PGLFWMOUSEBUTTON)     ; Mouse Button Callback
  	glfwSetCursorPosCallback(*window.GLFWwindow, *cb.PGLFWMOUSEPOS)          ; Mouse Move Callback
  	glfwSetCursorEnterCallback(*window.GLFWwindow, *cb.PGLFWMOUSEENTER)      ; Mouse Enter/Leave Window
  	glfwSetScrollCallback(*window.GLFWwindow, *cb.PGLFWMOUSESCROLL)          ; Mouse Scroll(wheel)
  	glfwSetFramebufferSizeCallback (*window.GLFWwindow, *cb.PGLFWFRAMEBUFFERSIZE); FrameBuffer Size CallBack
  	
  	
  	;/* Contexts */
  	glfwMakeContextCurrent(*window.GLFWwindow)
  	glfwGetCurrentContext()                                       ; return a *GLFWwindow
  	glfwSwapBuffers(*window.GLFWwindow)                           ; Swap Front/Back OpenGL Buffers
  	glfwSwapInterval(interval.i)                                  ; Vertical Retrace Synchronization(VSync)
  	
  	;/* Extensions */
  	glfwExtensionSupported(extension.GLFWPSEUDOTYPE)                           ; Extension Is Supported?
  	;glfwGetProcAddress(procname.GLFWPSEUDOTYPE)
  	glfwGetProcAddress(extname.GLFWPSEUDOTYPE)
  	
  	;/* Underlying Window */
  	CompilerSelect #PB_Compiler_OS
  	  CompilerCase #PB_OS_Windows
  	    glfwGetWin32Window(*window.GLFWwindow)                                 ; return underlying HWND
  	CompilerEndSelect
  
  EndImport
  
  Declare GLFW_Error_Callback(error.i,description.s)
  Declare GLFW_Key_Callback(*window.GLFWwindow,key.i,scancode.i,action.i,modifiers.i)
  Declare GLFW_MouseButton_Callback(*window.GLFWwindow,button.i,action.i,modifier.i)
  Declare GLFW_MouseEnter_Callback(*window.GLFWwindow,entered.i)
  Declare GLFW_MouseMove_Callback(*window.GLFWwindow,entered.i)
  Declare GLFW_WindowRefresh_Callback(*window.GLFWwindow)
  Declare glfwDebugVersion()
  Declare GLFWDLogCurrentMonitorInfo()
  Declare glfwSetParentWindow(*window.GLFWwindow,parentWindow)
  Declare glfwCreateFullScreenWindow()
  ;}
EndDeclareModule
Module GLFW
  UseModule OpenGL
  ;---------------------------------------------------------------------------
  ; Callbacks (exemples)
  ;---------------------------------------------------------------------------
  ;{
  ;-------------------------
  ; Error Callback
  ;-------------------------
  Procedure GLFW_Error_Callback(error.i,description.s)
    Debug description  
  EndProcedure
  
  ;-------------------------
  ; Keyboard Key Callback
  ;-------------------------
  Procedure GLFW_Key_Callback(*window.GLFWwindow,key.i,scancode.i,action.i,modifiers.i)
    If key = #GLFW_KEY_ESCAPE And action = #GLFW_PRESS
      glfwSetWindowShouldClose(*window.GLFWwindow,#True)
    ElseIf key = #GLFW_KEY_S And action = #GLFW_PRESS
      Debug "Activate Camera"
    EndIf
  EndProcedure
  
  ;--------------------------
  ; Mouse Button Callback
  ;--------------------------
  Procedure GLFW_MouseButton_Callback(*window.GLFWwindow,button.i,action.i,modifier.i)
    Debug "GLFW MouseButton Callback"
    If button = #GLFW_MOUSE_BUTTON_LEFT And action = #GLFW_PRESS
      Debug "Left Mouse Button Callback!!"
    EndIf
  EndProcedure
  
  ;--------------------------
  ; Mouse Enter/Leave Callback
  ;--------------------------
  Procedure GLFW_MouseEnter_Callback(*window.GLFWwindow,entered.i)
    If entered = #True
      Debug "Mouse Entered Window..."
    Else
      Debug "Mouse Leaved Window..."
    EndIf
  EndProcedure
  
  ;--------------------------
  ; Mouse Move Callback
  ;--------------------------
  Procedure GLFW_MouseMove_Callback(*window.GLFWwindow,entered.i)
    If entered = #True
      Debug "Mouse Entered Window..."
    Else
      Debug "Mouse Leaved Window..."
    EndIf
  EndProcedure
  
  ; glfwSetCursorEnterCallback(*window,@GLFW_MouseEnter_Callback())
  ; glfwSetWindowFocusCallback(*window,@GLFW_WindowFocusCallback())
  
  ;--------------------------
  ; Window Refresh Callback
  ;--------------------------
  Procedure GLFW_WindowRefresh_Callback(*window.GLFWwindow)
    Debug "GLFW Window Refresh Callback!!"
  EndProcedure
  
  ;}
  
  ;----------------------------------------------------------------------
  ; Debug
  ;----------------------------------------------------------------------
  ;{
  ;----------------------------
  ; Log GLFW Version
  ;----------------------------
  Procedure glfwDebugVersion()
    Protected *version = glfwGetVersionString()
    Debug "GLFW Version : "+ GLGETSTRINGOUTPUT(*version)
  EndProcedure
  
  
  ;-------------------------------------------------------------
  ; Log Current Monitor Infos
  ;-------------------------------------------------------------
  Procedure GLFWDLogCurrentMonitorInfo()
    Protected *monitor.GLFWmonitor = glfwGetPrimaryMonitor()
    Protected *name = glfwGetMonitorName(*monitor)
    Debug "GLFW Current Monitor : "+ GLGETSTRINGOUTPUT(*name)
    Protected width, height
    Debug glfwGetMonitorPhysicalSize(*monitor.GLFWmonitor,@width,@height)
    Debug "Monitor Physical Size ---> Width : "+Str(width)+", Height : "+Str(height)
  EndProcedure
  ;}
  
  ;--------------------------------------------------------------
  ;Set Parent Window
  ;--------------------------------------------------------------
  ;{
  Procedure glfwSetParentWindow(*window.GLFWwindow,parentWindow)
    CompilerIf #PB_Compiler_OS =  #PB_OS_Windows
      Protected HWND.i = glfwGetWin32Window(*window) 
      SetParent_(HWND,parentWindow)
      ;SetWindowPos_(HWND,#HWND_TOPMOST,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE)
    CompilerElse
      Debug "GLFWParentWindow : No Solution for Linux/MacOS yet..."
    CompilerEndIf
  EndProcedure
  ;}
  
  ;--------------------------------------------------------------
  ;Open FullScreen Window
  ;--------------------------------------------------------------
  ;{
  Procedure glfwCreateFullScreenWindow()
    Protected *monitor.GLFWmonitor  = glfwGetPrimaryMonitor()
    Protected *mode.GLFWvidmode  = glfwGetVideoMode(*monitor)
  ;       glfwWindowHint(#GLFW_OPENGL_PROFILE,#GLFW_OPENGL_CORE_PROFILE)
    glfwWindowHint(#GLFW_RED_BITS,*mode\RedBits)
    glfwWindowHint(#GLFW_BLUE_BITS,*mode\BlueBits)
    glfwWindowHint(#GLFW_GREEN_BITS,*mode\GreenBits)
  
    Protected *window.GLFWwindow = glfwCreateWindow(*mode\Width,*mode\Height,"GLFW",*monitor,#Null)
  
    
    If Not *window
      MessageRequester("GLFW", "Fail To Open GLFW FullScreen Window!!")
      ProcedureReturn #False
    EndIf
  
   ;Print out GLFW, OpenGL version And GLEW Version:
    Protected iOpenGLMajor.i = glfwGetWindowAttrib(*window, #GLFW_CONTEXT_VERSION_MAJOR);
    Protected iOpenGLMinor.i = glfwGetWindowAttrib(*window, #GLFW_CONTEXT_VERSION_MINOR);
    Protected iOpenGLRevision.i = glfwGetWindowAttrib(*window, #GLFW_CONTEXT_REVISION)  ;
  
    Debug "Status: Using GLFW Version "+glfwGetVersionString()
    Debug "Status: Using OpenGL Version: "+Str(iOpenGLMajor)+","+Str(iOpenGLMinor)+", Revision : "+Str(iOpenGLRevision)
    glfwMakeContextCurrent(*window)
    ProcedureReturn *window
  EndProcedure
  ;}
EndModule