1

GTK+3.xで透明なウィンドウを取得しようとしています。次のコードは機能するはずですが、ウィンドウが「描画」信号を発することはありません。理由は何でしょうか?

私のコード:

using Gtk;

public class WallpaperWindow : Object {
  private Window  window;

  public static int main (string[] args) {
    Gtk.init (ref args);

    new WallpaperWindow();

    Gtk.main();

    return 0;
  }

  public WallpaperWindow() {
    // Initialize window
    this.window = new Window();
    this.window.resize(200, 200);

    this.window.set_decorated(false);
    this.window.set_border_width(8);


    // Enable transparency

    var screen = this.window.get_screen();
    var visual = screen.get_rgba_visual();

    if(visual != null && screen.is_composited()) {
      message("Composition is enabled, enabling transparency");
      this.window.set_visual(visual);
    } else {
      warning("Composition is not enabled, cannot enable transparency");
    }

    this.window.draw.connect(on_window_draw);

    // Run!
    this.window.show_all();

  }

  // NEVER CALLED
  private bool on_window_draw(Cairo.Context cr) {
    warning("on_window_draw");
    cr.set_source_rgba(0.0, 0.0, 0.0, 0.0);
    cr.set_operator(Cairo.Operator.SOURCE);
    cr.paint();
    cr.set_operator(Cairo.Operator.OVER);

    return true;
  }
}
4

2 に答える 2

1

新しく作成されたWallpaperWindowインスタンスを変数に割り当てません。Valaはガベージコレクションされません...オブジェクトがスコープ外になるとすぐに参照されなくなり、変数に割り当てない場合は、コンストラクター呼び出しの最後にスコープ外になります。例から生成されたCは次のようになります。

_tmp0_ = wallpaper_window_new ();
_tmp1_ = _tmp0_;
_g_object_unref0 (_tmp1_);
gtk_main ();

ご覧のとおり、gtk_mainが呼び出される前に、新しいWallpaperWindowは参照されません。それを変数に割り当てると(つまり、それが過ぎても続くgtk_main)、例は期待どおりに機能します。

于 2012-05-19T17:33:06.580 に答える
0

C の転置は期待どおりに機能します。

#include <gtk/gtk.h>

static gboolean
on_window_draw(GtkWidget *window, cairo_t *cr)
{
    g_message("Called!\n");

    cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.0);
    cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
    cairo_paint(cr);
    cairo_set_operator(cr, CAIRO_OPERATOR_OVER);

    return TRUE;
}

int main(int argc, char *argv[])
{
    GtkWidget *window;
    GdkScreen *screen;
    GdkVisual *visual;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_resize(GTK_WINDOW(window), 200, 200);

    gtk_window_set_decorated(GTK_WINDOW(window), FALSE);

    screen = gtk_window_get_screen(GTK_WINDOW(window));
    visual = gdk_screen_get_rgba_visual(screen);

    if (visual != NULL && gdk_screen_is_composited(screen)) {
        g_message("Composition is enabled, enabling transparency");
        gtk_widget_set_visual(window, visual);
    } else {
        g_message("Composition is not enabled, cannot enable transparency");
    }

    g_signal_connect(window, "draw", G_CALLBACK(on_window_draw), NULL);

    gtk_widget_show_all(GTK_WIDGET(window));

    gtk_main();
    return 0;
}

そして、これは私が得るものです:

$ gcc $(pkg-config --cflags --libs gtk+-3.0) a.c
$ ./a.out
** Message: Composition is enabled, enabling transparency
** Message: Called!

** Message: Called!

** Message: Called!

** Message: Called!
于 2012-05-19T11:04:38.307 に答える