我是GTK的新手,我正在尝试让Vala感受到。 (我正在使用gtk + 3.0)
任何人都可以解释为什么事件 - > is_hint似乎总是返回1?从文档中我得到的印象是它应该有助于减少多余的动作事件。
这是一个小型Vala样本。 motion_notify_event处理程序永远不会有机会遵循else子句。
我是否犯了这个错误,或犯了一个愚蠢的错误,或者这是GTK + 3尚未准备好的事情?
/* To compile: valac --pkg gtk+-3.0 appname.vala */
using Cairo;
namespace Demo {
public class Scribble : Gtk.DrawingArea {
public Scribble () {
this.add_events ( Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.POINTER_MOTION_HINT_MASK );
this.set_size_request (100,100);
}
private void draw_circ ( Cairo.Context cr ) {
var y = get_allocated_height () / 2;
var radius = double.min (get_allocated_width () / 2, get_allocated_height () / 2) - 5;
cr.arc (y, y, radius, 0, 2 * Math.PI);
cr.set_source_rgb (1, 1, 1);
cr.fill_preserve ();
cr.set_source_rgb (0, 0, 0);
cr.stroke ();
}
public override bool draw ( Cairo.Context cr ) {
this.draw_circ ( cr);
return false;
}
public override bool motion_notify_event (Gdk.EventMotion event ) {
//Seems event.is_hint is *always* 1
//stdout.printf ( "is_hint: %d\n", event.is_hint );
if (event.is_hint == 1) {
stdout.printf ( "is hint\n" );
Gdk.Event.request_motions(event); //Always 1, so what's the point?
} else {
//Never gets here. Why?
stdout.printf ( "normal motion at: %G, %G\n", event.x, event.y );
}
return true; //false does not change anything either.
}
}
}
int main ( string[] args ) {
Gtk.init ( ref args );
var window = new Gtk.Window ();
var scribble = new Demo.Scribble ();
window.add (scribble);
window.show_all ();
window.destroy.connect (Gtk.main_quit);
Gtk.main ();
return 0;
}
答案 0 :(得分:1)
不完全是is_hint
(我无法发表评论),但如果您想减少动作通知,请考虑使用idle_add
。
它可用于在不再有运动事件后处理运动事件。
答案 1 :(得分:1)
设置GDK_POINTER_MOTION_MASK时 =>你会收到每一只鼠标
设置GDK_POINTER_MOTION_HINT_MASK时 =>你应该接受较少的运动事件 =>您的应用的任何部分都可以通过调用gdk_window_get_pointer()来触发动作事件。
当你同时设置两个中止从接收较少动作提示中获益时
尝试在运动事件回调中添加一些计数器来测量差异 http://www.gtk.org/api/2.6/gdk/gdk-Events.html#GdkEventMask