Bonjour a tous,

je debute en GTK+ (WinXP SP3 / MS Visual C++ 2008 express edition) et suis confronte a un petit souci.

J'ai cree une fenetre principale, une table qui contient un bouton et une barre de progression.

Quand je clique sur le bouton, la fonction callback appellee fait progresser la barre (20 iterations avec un Sleep de 500 ms). Pendant que la barre de progression evolue, je bloque les actions de l'utilisateur (gtk_grab_add) et lui rend la main a la fin (gtk_grab_remove). ca marche bien sauf que :

Si l'utilisateur clique, attend la fin du scenario barre de progression, et ne bouge pas la souris, le fait de recliquer sur le bouton est sans effet, sauf s'il ballade la souris et la replace sur le bouton.

Y a t'il un moyen de resoudre ce souci (controler un mouvement de souris hors du bouton et la remettre a sa place sans que l'utilisateur le voit, ...).

J'ai fait un code allege qui montre bien le probleme :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
// Specific librairies
#include <gtk/gtk.h>
 
void OnDestroy(GtkWidget *pWidget, gpointer pData);
void OnTop(GtkWidget *pWidget, gpointer pData);
 
static GtkWidget *pProgressBar;
 
int main(int argc,char **argv)
{
 
	// Declare widgets
	GtkWidget *pWindow;
	GtkWidget *pTable;
	GtkWidget *pTopBtn;
 
	gtk_init(&argc,&argv);
 
	// Create the main window
	pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_position(GTK_WINDOW(pWindow), GTK_WIN_POS_CENTER);
	gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
	gtk_window_set_title(GTK_WINDOW(pWindow), "Control Panel");
	g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(OnDestroy), NULL);
 
	// Create table : 2 rows / 4 columns
	pTable=gtk_table_new(2,4,TRUE);
	gtk_container_add(GTK_CONTAINER(pWindow), GTK_WIDGET(pTable));
 
	// Create TOP Button
	pTopBtn = gtk_button_new_with_label("Click on me");
	g_signal_connect(G_OBJECT(pTopBtn), "clicked", G_CALLBACK(OnTop),NULL);
 
	// Create progress bar
 
	pProgressBar = gtk_progress_bar_new();
	gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(pProgressBar),
	GTK_PROGRESS_LEFT_TO_RIGHT);
 
	// Insert the widgets in the table
	gtk_table_attach_defaults(GTK_TABLE(pTable), pTopBtn,
	1, 3, 0, 1);
	gtk_table_attach(GTK_TABLE(pTable), pProgressBar,
	0, 4, 1, 2,
	GTK_EXPAND | GTK_FILL, GTK_EXPAND,
	0, 0);
 
	// Display main window
	gtk_widget_show_all(pWindow);
 
	// Start events loop
	gtk_main();
 
	return EXIT_SUCCESS;
}
 
void OnDestroy(GtkWidget *pWidget, gpointer pData)
{	
	gtk_main_quit();
}
 
 
void OnTop(GtkWidget *pWidget, gpointer pData)
{
	gdouble dFraction;	
	gint i, iTotal;
	iTotal = 10;
	// Use grab to prevent the user to press any button 
	gtk_grab_add(pProgressBar);
	for(i = 1 ; i <= iTotal ; ++i)
	{
		Sleep(500);
		dFraction = (gdouble)i / (gdouble)iTotal;		
		gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pProgressBar), dFraction);
		// GTK+ becomes active to refresh the progress bar
		gtk_main_iteration ();
	}
	gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pProgressBar), 0.0);	
	// Give the hand to the user
	gtk_grab_remove(pProgressBar);
}
Merci d'avance.

LePapat

PS : j'en profite, si vous avez des conseils. Je voudrais definir toutes mes fonctions callback dans un autre fichier callback.c et inserer un callback.h dans mon fichier main. Mais je suis bloque sur le fait que j'appelle la progressbar depuis un callback appelle par un autre widget. L'ideal serait de la passer en argument mais je ne me suis pas encore documente sur le sujet