All'inizio della mia Gtk-Gdk-Cairo-Pango app, ho creare la finestra:Differenza tra GtkWindow e GdkWindow?
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
In primo luogo, v'è GtkWindow
, ma gtk_create_window
rendimenti GtkWidget
, non GtkWindow
, perché?
Quindi, alcune funzioni, come gdk_window_process_updates(..)
, richiedono GdkWindow*
.
gtk_window_set_geometry_hints()
d'altra parte richiede GtkWindow*
.
Nella documentazione è anche GdkWindow* gdk_window_new()
che restituisce GdkWindow
.
Certo c'è documentation saying:
Una GdkWindow è una regione rettangolare sullo schermo. È un oggetto di livello basso , utilizzato per implementare oggetti di livello elevato come GtkWidget e GtkWindow a livello di GTK +. Un GtkWindow è una finestra di livello superiore, la cosa che un utente potrebbe pensare come una "finestra" con una barra del titolo e così via; a GtkWindow può contenere molti GdkWindow.
Ma ancora non mi dice, quando e perché dovrei creare Gtk o GDK finestre? Qual è lo schema qui da seguire?
Ora si chiede, quale problema specifico sto cercando di risolvere? Certo, provo a disegnare il testo usando cairo + pango sopra gtk + gdk, subito dopo le mosse del mouse. Il problema è che anche se il disegno reale sembra essere veloce, non riesco a farlo accadere esattamente come le mosse del mouse. Nel mio motion_notify_event
ho appena chiamato gtk_widget_queue_draw(GtkWidget)
ma c'è un lag evidente dietro lo spostamento del mouse sullo schermo, anche se disegno un singolo carattere non è allineato con il puntatore del mouse durante la fase di spostamento e lo cattura solo dopo che il mouse è stato fermato.
Quello che ho provato è di velocizzare l'aggiornamento chiamando gdk_window_process_updates(GDK_WINDOW(window), false);
, il compilatore lo mangia, ma ho ottenuto l'asserzione di runtime: Gdk-CRITICAL **: gdk_window_process_updates: assertion 'GDK_IS_WINDOW (window)' failed
. Non riesco a trovare alcuna informazione su questa macro e su come/quando usarla.
includono
#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 è un sistema a finestre (in almeno questo è ciò che lo chiama wikipedia), non un gestore di finestre. Wayland è qualcos'altro ma non un gestore di finestre. I gestori di finestre sono ad es. i3wm e xfwm. – Powersource
Risposta fantastica! La documentazione dovrebbe avere l'architettura di base e le relazioni spiegate nel primo capitolo. –