2013-02-12 46 views
5

मैं जाकर के सीजीओ के रूप में निम्नलिखित ग उपयोग करना चाहते हैं:जाने + सीजीओ और जोड़ने

#include <X11/extensions/scrnsaver.h> 

main() { 
    XScreenSaverInfo *info = XScreenSaverAllocInfo(); 
    Display *display = XOpenDisplay(0); 

    XScreenSaverQueryInfo(display, DefaultRootWindow(display), info); 
    printf("%u ms\n", info->idle); 
} 

निर्माण के साथ:

gcc -o idle printXIdleTime.c -lX11 -lXss 

मैं फिर से लिखा जाओ के सीजीओ के लिए कि कोड:

package tools 

// #cgo pkg-config: x11 
// #include <X11/extensions/scrnsaver.h> 
import "C" 

func GetIdleTime() (idleTime uint32) { 
    var info *C.XScreenSaverInfo 
    var display *C.Display 

    info = C.XScreenSaverAllocInfo() 
    display = C.XOpenDisplay(0) 

    defaultRootWindow := C.XDefaultRootWindow(display) 

    C.XScreenSaverQueryInfo(display, defaultRootWindow, info) 
    idleTime = info.idle 

    return 
} 

ने संकलन करने की कोशिश की:

go build -gccgoflags="-lXss -lX11" 

लेकिन मैं हो रही है लिंकर त्रुटियों:

/tmp/go-build076004816/opensource.stdk/lib/tools/_obj/x11.cgo2.o: In function _cgo_c0e279f6f16e_Cfunc_XScreenSaverAllocInfo': ./x11.go:52: undefined reference to XScreenSaverAllocInfo' /tmp/go-build076004816/opensource.stdk/lib/tools/_obj/x11.cgo2.o: In function _cgo_c0e279f6f16e_Cfunc_XScreenSaverQueryInfo': ./x11.go:65: undefined reference to XScreenSaverQueryInfo' collect2: error: ld returned 1 exit status

क्या मैं गलत कर रहा हूँ?

उत्तर

4

इस तरह मुझे इसे बनाने के लिए मिला। #cgo LDFLAGS लाइन पर ध्यान दें जो शायद आप जो खो रहे हैं। इसे बनाने के लिए मुझे कुछ और बदलाव करना पड़ा। ऐसा लगता है कि मेरी लिनक्स मशीन पर सही जवाब लौटा रहा है!

package tools 

// #cgo LDFLAGS: -lXss -lX11 
// #include <X11/extensions/scrnsaver.h> 
import "C" 

func GetIdleTime() (idleTime uint32) { 
    var info *C.XScreenSaverInfo 
    var display *C.Display 

    info = C.XScreenSaverAllocInfo() 
    display = C.XOpenDisplay(nil) 

    defaultRootWindow := C.XDefaultRootWindow(display) 

    C.XScreenSaverQueryInfo(display, C.Drawable(defaultRootWindow), info) 
    idleTime = uint32(info.idle) 

    return 
} 
2

ध्यान दें कि यह देशी X Go Binding और स्क्रीनसेवर विस्तार के साथ किया जा सकता है:

package main 

import (
    "fmt" 
    "log" 

    "github.com/BurntSushi/xgb" 
    "github.com/BurntSushi/xgb/xproto" 
    "github.com/BurntSushi/xgb/screensaver" 
) 

func main() { 
    X, err := xgb.NewConn() 
    if err != nil { 
     log.Fatal(err) 
    } 

    if err = screensaver.Init(X); err != nil { 
     log.Fatal(err) 
    } 

    root := xproto.Setup(X).DefaultScreen(X).Root 
    info, err := screensaver.QueryInfo(X, xproto.Drawable(root)).Reply() 
    if err != nil { 
     log.Fatal(err) 
    } 

    fmt.Printf("Idle: %d\n", info.MsSinceUserInput) 
} 

आउटपुट:

[[email protected] go] go run xscreensaver_idle.go 
Idle: 1040 
+0

GOS XGB के साथ समस्या यह है, मैं नहीं है कि मेरे घर में एक .X प्राधिकरण मौजूद न्यूकॉन() संदेश के साथ विफल रहता है "कनेक्ट नहीं हो सकता" –

+0

एक्सजीबी को एक चेतावनी संदेश उत्सर्जित करना चाहिए, लेकिन फिर भी कनेक्ट करें। क्या आप एक परीक्षण मामले और अपने पर्यावरण के विवरण के साथ एक बग रिपोर्ट जमा कर सकते हैं? https://github.com/BurntSushi/xgb/issues – BurntSushi5