Zu Beginn meiner Gtk-Gdk-Kairo-Pango App schaffe ich das Fenster:Unterschied zwischen GtkWindow und GdkWindow?
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
Erstens gibt es GtkWindow
, aber gtk_create_window
kehrt GtkWidget
, nicht GtkWindow
, warum?
Dann erfordern einige Funktionen wie gdk_window_process_updates(..)
GdkWindow*
.
gtk_window_set_geometry_hints()
auf der anderen Seite erfordert GtkWindow*
. In der Dokumentation gibt es auch GdkWindow* gdk_window_new()
, GdkWindow
zurückgegeben.
Sicher gibt es documentation saying:
A GdkWindow ein rechteckiger Bereich auf dem Bildschirm ist. Es handelt sich um ein Low-Level-Objekt , mit dem High-Level-Objekte wie GtkWidget und GtkWindow auf der GTK + -Ebene implementiert werden. Ein GtkWindow ist ein Toplevel-Fenster, das Ding, das ein Benutzer als "Fenster" mit einer Titelleiste und so weiter denken könnte; a GtkWindow kann viele GdkWindow enthalten.
Aber es sagt mir immer noch nicht, wenn und warum Ich soll Gtk oder Gdk Fenster schaffen? Was ist das Muster hier zu folgen?
Jetzt fragen Sie, welches spezielle Problem versuche ich zu lösen? Klar, ich versuche Text mit cairo + pango auf gtk + gdk zu zeichnen, direkt nach der Mausbewegung. Das Problem ist, dass, obwohl die tatsächliche Zeichnung scheint schnell zu sein, ich kann es nicht passieren, genau wie die Maus bewegt. In meinem motion_notify_event
Ich rufe gerade gtk_widget_queue_draw(GtkWidget)
, aber es gibt offensichtliche Verzögerung hinter der tatsächlichen Maus, die auf Bildschirm bewegt, selbst wenn ich einzelnes Zeichen zeichnet, ist es nicht mit dem Mauszeiger während der Bewegungsphase ausgerichtet und fängt es nur, nachdem die Maus gestoppt wird.
Was ich versuchte ist, um das Update zu beschleunigen, indem Sie gdk_window_process_updates(GDK_WINDOW(window), false);
aufrufen, der Compiler isst es, aber ich habe Runtime Assertion: Gdk-CRITICAL **: gdk_window_process_updates: assertion 'GDK_IS_WINDOW (window)' failed
. Ich kann keine Informationen zu diesem Makro finden und wie/wann es zu verwenden ist.
umfassen
#include <gtk/gtk.h>
#define TXT "1234567890"
int X = 0, Y = 0;
static void do_drawing(cairo_t *);
GtkWidget *window;
PangoLayout *layout = 0;
static gboolean on_draw_event(GtkWidget *widget, cairo_t *cr,
gpointer user_data) {
do_drawing(cr);
return FALSE;
}
static void do_drawing(cairo_t *cr) {
if (layout == 0) {
layout = pango_cairo_create_layout (cr);
pango_layout_set_text (layout, TXT, -1);
}
for (int y = 0; y < 2; y++) {
cairo_set_source_rgb (cr, 1, 0, 1);
cairo_move_to (cr, 0+X, 0 + y * 20 + Y);
pango_cairo_show_layout (cr, layout);
}
gtk_widget_queue_draw(window);
}
static gint onmouse(GtkWidget *widget, GdkEventMotion *event) {
X = event->x; Y = event->y;
gtk_widget_queue_draw(widget);
gdk_window_process_updates(GDK_WINDOW(widget), false);
}
int main(int argc, char *argv[]) {
GtkWidget *darea;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
darea = gtk_drawing_area_new();
gtk_container_add(GTK_CONTAINER(window), darea);
gtk_widget_set_events (window, GDK_EXPOSURE_MASK
| GDK_LEAVE_NOTIFY_MASK | GDK_POINTER_MOTION_MASK);
g_signal_connect(G_OBJECT(darea), "draw", G_CALLBACK(on_draw_event), NULL);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(window, "motion_notify_event", G_CALLBACK(onmouse), NULL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 5000, 5000);
gtk_window_set_title(GTK_WINDOW(window), "Lines");
gtk_widget_show_all(window);
gtk_main();
return 0;
}
X11 ist ein Windowing-System gestartet werden soll (bei zumindest nennt das Wikipedia es), kein Fenstermanager. Wayland ist etwas anderes, aber kein Fenstermanager. Fenstermanager sind z.B. i3wm und xfwm. – Powersource
Fantastische Antwort! Die Dokumentation sollte grundlegende Architektur und Beziehungen haben, die im ersten Kapitel erläutert werden. –