2013-02-12 3 views
5

я хочу использовать следующий C как ОЦП Go содержит:идти + ОЦП и связь

#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 

я переписал этот код для ОЦП Go содержит:

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, которая, вероятно, отсутствует. Я должен был сделать еще несколько изменений, чтобы сделать его сборкой. Кажется, он возвращает правильный ответ на моей Linux-машине!

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 и расширение ScreenSaver:

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

проблема с гос XGB в том, что если у меня нет .XAuthority в моем доме. NewConn() терпит неудачу с сообщением «Не удается подключиться». –

+0

XGB должен выпустить предупреждающее сообщение, но подключиться в любом случае. Не могли бы вы представить отчет об ошибке с тестовым примером и описанием вашей среды? https://github.com/BurntSushi/xgb/issues – BurntSushi5

Смежные вопросы