Bonjour,
Je débute en GTK+ et je part d'un code que j'ai un peu ajuster venant de LINUX MAGAZINE, comment puis-je faire pour qu'une nouvelle fenêtre s'ouvre lorsque j'appuie sur le bouton, mais pour que l'appui du bouton continu d'analyser si le mot de passe est bon et ouvre la fenêtre seulement si celui-ci est bon, sinon, non :

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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include <gtk/gtk.h>
#include <glib/gi18n.h>
 
// Voir a la fin du fichier
void addCSS();
GtkWidget* findChildByName(GtkWidget *container,const gchar *name);
 
#define PACKAGE "cb-login"
#define LOCALE_DIR "/usr/share/locale"
 
///////////////////////////////////////////////////////////////////////////////
// Prise en compte des fichiers de traduction
///////////////////////////////////////////////////////////////////////////////
void addInternationalisation() {
  bindtextdomain(PACKAGE,LOCALE_DIR);
  bind_textdomain_codeset(PACKAGE,"UTF-8");
  textdomain(PACKAGE);
}
 
 
///////////////////////////////////////////////////////////////////////////////
// Fonction d'authentification
///////////////////////////////////////////////////////////////////////////////
static int auth(GtkWidget *b,gpointer data) {
  GtkWidget *user=NULL;
  GtkWidget *pass=NULL;
 
 
  if (data!=NULL) {
    GtkWidget *window=(GtkWidget *)data;
    user=findChildByName(window,"user");
    pass=findChildByName(window,"pass");
  }
  if (user!=NULL&&pass!=NULL) {
    const gchar *u=gtk_entry_get_text(GTK_ENTRY(user));
    const gchar *p=gtk_entry_get_text(GTK_ENTRY(pass));
    //printf("User: %s\n",u);
    //printf("Pass: %s\n",p);
 if (strncmp(u,"christopher",11)==0 && strncmp(p,"password",8)==0) {
      printf("Welcome %s !\n",u);
		return 1;
    } else {
      printf("Wrong password !\n");
		return 0;
    }  
 	gtk_entry_set_text(GTK_ENTRY(pass),"");
 
	}
 
	return 2;
}
 
 
 
 
 
 
///////////////////////////////////////////////////////////////////////////////
// Creation de la fenetre et de son contenu
///////////////////////////////////////////////////////////////////////////////
static void startApplication(GtkApplication *app,gpointer data) {
  addCSS();
  GtkWidget *window=gtk_application_window_new(app);
  gtk_window_set_title(GTK_WINDOW(window)," Application ");
  gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(window),600,400);
 
  gtk_container_set_border_width(GTK_CONTAINER(window),10);
 
  GtkWidget *grid=gtk_grid_new();
  gtk_container_add(GTK_CONTAINER(window),grid);
  gtk_grid_set_row_spacing(GTK_GRID(grid),2);
  gtk_grid_set_column_spacing(GTK_GRID(grid),5);
  gtk_widget_set_valign(grid,GTK_ALIGN_CENTER);
  gtk_widget_set_halign(grid,GTK_ALIGN_CENTER);
 
  int col=0,row=0;
  GtkWidget *label_user=gtk_label_new(_("UserName"));
  gtk_grid_attach(GTK_GRID(grid),label_user,col,row,1,1);
  col++;
  GtkWidget *entry_user=gtk_entry_new();
  gtk_widget_set_name(entry_user,"user");
  gtk_entry_set_placeholder_text(GTK_ENTRY(entry_user),_("UserName"));
  gtk_grid_attach(GTK_GRID(grid),entry_user,col,row,1,1);
  col=0;row++;
  GtkWidget *label_pass=gtk_label_new(_("Password"));
  gtk_grid_attach(GTK_GRID(grid),label_pass,col,row,1,1);
  col++;
  GtkWidget *entry_pass=gtk_entry_new();
  gtk_widget_set_name(entry_pass,"pass");
  gtk_entry_set_placeholder_text(GTK_ENTRY(entry_pass),_("Password"));
  gtk_entry_set_visibility(GTK_ENTRY(entry_pass),FALSE);
  gtk_grid_attach(GTK_GRID(grid),entry_pass,col,row,1,1);
  col=0;row++;
  GtkWidget *btn=gtk_button_new_with_label(_("Authentication"));
  gtk_grid_attach(GTK_GRID(grid),btn,col,row,2,1);
  g_signal_connect(btn,"clicked",G_CALLBACK(auth),window);
 
 
  gtk_widget_show_all(window);
}
///////////////////////////////////////////////////////////////////////////////
// Programme principal
///////////////////////////////////////////////////////////////////////////////
int main(int argc,char *argv[]) {
  addInternationalisation();
  GtkApplication *app=gtk_application_new("fr.iutbeziers.gtk3-06",
                                          G_APPLICATION_FLAGS_NONE);
  g_signal_connect(app,"activate",G_CALLBACK(startApplication),NULL);
  int status=g_application_run(G_APPLICATION(app),argc,argv);
  g_object_unref(app);
  return status;
}
///////////////////////////////////////////////////////////////////////////////
// Recherche recursive d'un nom dans un conteneur
///////////////////////////////////////////////////////////////////////////////
GtkWidget* findChildByName(GtkWidget *container,const gchar *name) {
  if (GTK_IS_WIDGET(container)) {
    const gchar *cName=gtk_widget_get_name(container);
    if (g_strcmp0(cName,name)==0) { // Le nom du conteneur correspond
      return container;
    }
    if (GTK_IS_BIN(container)) { // Conteneur avec un seul enfant
      GtkWidget *child=gtk_bin_get_child(GTK_BIN(container));
      return findChildByName(child,name);
    }
    if (GTK_IS_CONTAINER(container)) { // Recherche dans la liste des enfants
      GList *childs=gtk_container_get_children(GTK_CONTAINER(container));
      GList *item;
      for(item=childs;item!=NULL;item=g_list_next(item)) {
        GtkWidget *widget=findChildByName(item->data,name);
        if (widget!=NULL) {
          g_list_free(childs);
          return widget;
        }
      }
      if (childs!=NULL) g_list_free(childs);
    }
  }
  return NULL;
}
///////////////////////////////////////////////////////////////////////////////
// Ajout de la mise en forme CSS
///////////////////////////////////////////////////////////////////////////////
void addCSS() {
  GtkCssProvider *provider=gtk_css_provider_new();
  GdkDisplay *display=gdk_display_get_default();
  GdkScreen *screen=gdk_display_get_default_screen(display);
  gtk_style_context_add_provider_for_screen(screen,
                                            GTK_STYLE_PROVIDER(provider),
                                            GTK_STYLE_PROVIDER_PRIORITY_USER);
  GError *error=NULL;
  gtk_css_provider_load_from_path(provider,"style.css",&error);
  if (error!=NULL) {
    fprintf(stderr,"Unable to load CSS file: %s !\n",error->message);
    g_error_free(error);
  }
  g_object_unref(provider);
}


et le fichier CSS :

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
.button {margin:0;padding:5px;}
GtkWindow {background-color:#F9E589;}/* orange */
GtkGrid {background-color:#800000;}/* marron */
GtkLabel {padding:2px;font:Sans 12;font-weight:bold;}
GtkButton, GtkButton GtkLabel {
  border-radius:5px;
  border-width:2px;
  font:Sans 12;
  background-color:#F98F89;/* rouge */
  border-color:#CE3551;
}
GtkButton:hover, GtkButton:hover GtkLabel {
  background-color:#89C1F9;/* bleu */
  border-color:#3571AD;
  transition:500ms ease-in-out;
}
GtkButton:hover:active, GtkButton:hover:active GtkLabel {
  background-color:#82ED90;/* vert */
  border-color:#2C934D;
}
GtkEntry#user {color:#E81BF7;}/* rose */