J'ai un programme basé sur Existe-t-il un moyen de verrouiller l'état maximisé ou de désactiver le comportement de l'en-tête? Essayer d'utiliser J'utilise J'ai demandé sur le forum GTK + et la suggestion que j'ai eue était d'utiliser une fenêtre plein écran pour les applications de kiosque. J'ai essayé cette approche (j'ai dû réécrire une partie de mon code car en plein écran la barre d'en-tête de l'application disparaît) et cela fonctionne bien. La question d'origine est toujours d'actualité. GtkApplication
cela doit toujours être montré maximisé. Cela se fait facilement en utilisant gtk_window_maximize
. Le problème est que vous pouvez toujours double-cliquer ou faire glisser le GtkHeaderBar
pour désactiver l'état maximisé. gtk_window_set_resizable
verrouille efficacement la taille de la fenêtre, mais il interdit également l'effet de maximisation. xfwm4
, le gestionnaire de fenêtres XFCE par défaut. gtk_application_add_window(application, window);
gtk_window_maximize(window);
// Resizing instead of maximizing does not change anything: resetting
// the resizable property shrinks the window to its original size
//gtk_window_set_default_size(window, 1024, 768);
//gtk_window_resize(window, 1024, 768);
//gtk_widget_set_size_request(GTK_WIDGET(window), 1024, 768);
// The following line "demaximizes" the window
//gtk_window_set_resizable(window, FALSE);
// Using a different window type, as suggested by theGtknerd, does
// not help either. The following line makes it behave properly but
// disables the app menu (like any type other than NORMAL).
//gtk_window_set_type_hint(window, GDK_WINDOW_TYPE_HINT_SPLASHSCREEN);
gtk_widget_show_all(GTK_WIDGET(window));
Addendum
3 Réponses :
Vous pouvez vérifier gtk-window- décoré . Notez que types de fenêtres sont également utile. En raison de votre gestionnaire de fenêtres et de l'environnement du système d'exploitation, il n'y a pas de meilleur moyen d'obtenir ce que vous recherchez, d'où ma réponse vague.
Modifier :
Vous pouvez définir le size-request
de la fenêtre à la taille actuelle après avoir agrandi la fenêtre. Cela empêchera l'utilisateur de le réduire à nouveau.
Et voici un MCVE en Python:
#!/usr/bin/env python import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, GLib window = Gtk.Window() def on_window_destroy(window): Gtk.main_quit() window.connect('destroy', on_window_destroy) def lock_window_size(): size = window.get_allocated_size().allocation window.set_size_request(size.width, size.height) GLib.timeout_add_seconds(1, lock_window_size) # allow for the delay of maximizing, etc window.show_all() window.maximize() Gtk.main()
Je ne pense pas que la décoration fera une différence, car une fois maximisée, le gestionnaire de fenêtres la dépouille déjà. J'essaierai de jouer avec les différents types et de rendre compte, peut-être que GDK_WINDOW_TYPE_HINT_DESKTOP
résoudra mon problème.
Malheureusement, la définition d'un type de fenêtre différent n'aide pas: j'ai mis à jour l'exemple en conséquence.
Comme vous pouvez le deviner, redimensionner la fenêtre n'est pas la même chose que la maximiser: le gestionnaire de fenêtres décore les deux cas différemment. Bref, j'ai juste essayé et ... pas de joie. J'ai mis à jour l'exemple pour refléter cela.
Vous pouvez essayer mon MCVE. Je ne sais pas si ça aide.
Pas besoin d'utiliser 1 seconde de retard: 0 fonctionnera très bien. Voir ma réponse ici pour la justification.
Oui, cela verrouille la taille mais pas la position. Par exemple, vous pouvez toujours faire glisser la barre d'en-tête et déplacer la fenêtre.
Le problème peut être atténué en désactivant certains événements dangereux, en particulier le double clic et les événements de glissement sur la barre de titre. C'est un truc moche et vous pouvez toujours déplacer la fenêtre en faisant glisser le menu de l'application (ou tout autre widget à l'intérieur de la barre d'en-tête).
static gboolean disable_dangerous_events(GtkWidget *widget, GdkEvent *event) { return event->type == GDK_MOTION_NOTIFY || event->type == GDK_WINDOW_STATE ? GDK_EVENT_STOP : GDK_EVENT_PROPAGATE; } ... gtk_application_add_window(application, window); gtk_window_maximize(window); g_signal_connect(gs.gtk.window, "event", G_CALLBACK(disable_dangerous_events), NULL); gtk_widget_show_all(GTK_WIDGET(window)); ...
Vous pouvez toujours redimensionner la fenêtre avec des touches de raccourci mais, étant exécuté sur un système tactile, ce n'est pas un problème.
"C'est un truc laid cependant" pourquoi? Que diriez-vous lorsque la fenêtre a le focus pour désactiver non seulement le double clic, mais également les raccourcis nécessaires?
@Michi J'ai découvert que vous pouvez toujours faire glisser la fenêtre depuis le menu de l'application ... très mauvais. À la fin, cela ne fonctionne tout simplement pas, j'ai donc réécrit le code en utilisant une fenêtre plein écran, comme suggéré dans le Forum GTK .
Que diriez-vous si vous définissez les décorations de fenêtres sur FALSE et créez votre propre menu / barre de navigation?
avez-vous essayé? developer.gnome.org/gtk3/stable/…
Vous pouvez définir le Plein écran
en utilisant void gtk_window_fullscreen ()
:
gtk_window_fullscreen (GTK_WINDOW(gtk_widget_get_root_window (widget)));