6

Go の cgo として次の c を使用したい:

#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 の cgo 用にそのコードを書き直しました。

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: 関数_cgo_c0e279f6f16e_Cfunc_XScreenSaverAllocInfo': ./x11.go:52: undefined reference to内 XScreenSaverAllocInfo' /tmp/go-build076004816/opensource.stdk/lib/tools/_obj/x11.cgo2.o:関数_cgo_c0e279f6f16e_Cfunc_XScreenSaverQueryInfo': ./x11.go:65: undefined reference toXScreenSaverQueryInfo' collect2: エラー: ld が 1 つの終了ステータスを返しました

私は何を間違っていますか?

4

2 に答える 2

5

こんな感じでビルドできました。#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
}
于 2013-02-12T23:06:45.393 に答える
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)
}

出力:

[andrew@Liger go] go run xscreensaver_idle.go 
Idle: 1040
于 2013-02-13T16:44:40.467 に答える