PDA

View Full Version : GTK finestre senza bordo


x110
04-09-2003, 09:31
ho cercato, ma mi ritrovo qua....
come si pu' fare a creare finestre senza bordo tramite le gtk?
da quello che posso capire questo settaggio non fa parte dei widget
gtk ma come per win e' una funzione del windows manager.....

non vorrei avere: barra del titolo, toolbox chiudi minimizza ingrandisci,
e possibilmente neanche il bordo. stile flat.
grazie.

mjordan
04-09-2003, 19:35
Originariamente inviato da x110
ho cercato, ma mi ritrovo qua....
come si pu' fare a creare finestre senza bordo tramite le gtk?
da quello che posso capire questo settaggio non fa parte dei widget
gtk ma come per win e' una funzione del windows manager.....

non vorrei avere: barra del titolo, toolbox chiudi minimizza ingrandisci,
e possibilmente neanche il bordo. stile flat.
grazie.

L'unica cosa che puoi togliere è il bottone di minimizzazione e ingrandimento, mediante accurata definizione dei parametri nella gtk_window_set_policy().

Il resto non puoi farlo perchè fa parte del Window Manager. E poi sarebbe una cosa stupida farlo, completamente inutile. A che pro?

x110
04-09-2003, 19:53
perche' deve essere stupida? a me servirebbe
mi dai qualche info in piu circa le policy?

mjordan
05-09-2003, 02:44
E' stupida perchè non è standard. Le applicazioni grafiche non devono funzionare così. Hanno i loro standard.
E poi come la chiuderesti l'applicazione senza casella di chiusura sulla title bar??

Ti faccio l'esempio della gtk_window_set_policy():


#include <gtk/gtk.h>

/* Dovrebbero autoesplicare i parametri di gtk_window_set_policy() */
#define ALLOW_GROW TRUE
#define NOT_ALLOW_GROW !ALLOW_GROW
#define ALLOW_SHRINK TRUE
#define NOT_ALLOW_SHRINK !ALLOW_SHRINK
#define AUTO_SHRINK TRUE
#define NO_AUTO_SHRINK !AUTO_SHRINK

gint
delete_event_callback(GtkWidget * widget,
gpointer user_data)
{
return FALSE;
}

int
main(int argc, char ** argv)
{
GtkWidget * top_window;

gtk_init(&argc, &argv);

top_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(top_window), 320, 200);
gtk_window_set_policy(GTK_WINDOW(top_window),
NOT_ALLOW_SHRINK,
NOT_ALLOW_GROW,
NO_AUTO_SHRINK);

gtk_signal_connect(GTK_OBJECT(top_window), "delete_event",
GTK_SIGNAL_FUNC(delete_event_callback), NULL);
gtk_signal_connect(GTK_OBJECT(top_window), "destroy",
gtk_main_quit, NULL);

gtk_widget_show(top_window);
gtk_main();

return 0;
}


Te l'ho scritto molto al volo quindi se non compila cerca di aggiustarlo.

Ciao.

Icedguardian
05-09-2003, 12:00
Non credo sia una cosa stupida anzi molti programmi la usano per fare "Splash screen" o come cavolo si chiamano.

Ciao

mjordan
05-09-2003, 12:18
Originariamente inviato da Icedguardian
Non credo sia una cosa stupida anzi molti programmi la usano per fare "Splash screen" o come cavolo si chiamano.

Ciao

Bhè...Allora dillo prima che ti servono gli spash screen ... Quelle non sono affatto finestre. Sono widgets con una gtkImage incorporata, mostrata su schermo senza l'intervento del WM. Si dovrebbe fare un pesante uso di GDK per realizzare una fighettata del genere. (A meno, ovviamente, di usare le API di gnome che dovrebbe avere una funzione apposita).

Icedguardian
05-09-2003, 12:22
Hmmm, in realtà a me non servono, ho solo cercato di immaginare a cosa potesse servire una cosa del genere :D
Io tra un mesetto diventerò molto presente da queste parti quando inizierò a fare la tesi :cool:

x110
06-09-2003, 11:12
non ho capito bene...
per fare uno splash bisogna usare le GDK? o c'e' una via piu' veloce?

comunque uscire dallo standard non e' stupido....
(non mollo). lo standard nei pc e' windows il che vuol dire che siamo tutti stupidi:cry:

a parte gli scherzi. a me piacerebbe ci fosse questa possibilita' che spesso usavo in vb.
anche semplicemente per dare uno stile diverso dagli altri programmi che pur che siano
fatti bene, a me non piacciono e voglio crearmi un mio stile. per esempio xmm ha un suo stile
che non e' quello standard e non usa lo stile del coontesto e del wm.

comunque sia...

grazie per la policy.
mi toglie solo il pulsante di ingrandimento e non quello di minimizzazione e chiusura.
per quello di chiusura non c'e' problema ma mi sebra mi dicesti che anche quello di
minimizzazione si potesse togliere.

mjordan
06-09-2003, 17:27
Bhe ... Tutto dipende da cosa si vuole fare ... XMMS per esempio è una combinazione fra un tema fatto apposta e la programmazione di widget ad hoc.

Comunque GDK è importantissimo per fare cose un pochino + spinte. Sopratutto per modificare il comportamento dei widgets.
Ricordatevi che con GTK+ potete far una programmazione OO e potete ereditare le caratteristiche di un widget per costruirne un altro o modificarne le funzionalità.

In ogni caso vi consiglio di cercare sul reference manual delle API. Se non c'è li, non esiste.

Comunque per creare uno splash screen in genere si fa così:

Si crea una nuova finestra che non sia una main window:


GtkWidget * splash_screen = gtk_window_new(GTK_WINDOW_POPUP);


Lo splash screen ha una dimensione fissa ed inoltre va posizionato al centro dello schermo:


gtk_widget_set_usize(splash_screen, 428, 314);
gtk_window_set_position(GTK_WINDOW(splash_screen), GTK_WIN_POS_CENTER);


Uno splash screen ha anche un'immagine in esso (altrimenti che splash sarebbe :p ):


GtkWidget * pixmap = create_pixmap_from_data(splash_screen, splash_xpm);
gtk_container_add(GTK_CONTAINER(splash_screen, pixmap);
gtk_widget_show(pixmap);
gtk_widget_show(splash_screen);


A questo punto lo splash è costruito. Poichè dovrebbe essere visualizzato ad un certo istante di esecuzione, per forzare la sua visualizzazione usiamo la funzione:


gdk_flush(); /* Pensatela come una fflush(stdout); ;) */


Lo splash ad un certo punto deve andare via. Impostiamo un timer di timeout che gli dica di scomparire dopo tre secondi:


gtk_timeout_add(3000, splash_screen_cb, splash_screen);


dove splash_screen_cb è un puntatore alla funzione di callback che deve essere eseguita passati i tre secondi. La possiamo implementare per esempio così:


gint
splash_screen_cb(GtkWidget * widget, gpointer user_data)
{
return (gtk_widget_hide(widget) &&
gtk_widget_destroy(widget));
}

x110
06-09-2003, 18:26
spiegazione chiara e lineare...
compliments.

mjordan
06-09-2003, 18:44
A proposito gente... C'è la 2.2.4 sul sito ;)