Otóz mam pewne problemy z gtk :). Nauka trwa a o odpowiedzi ciężko. więc z góry dziękuje tym, co przyjrzą się mojemu problemowi. Na początku kod
GtkWidget* WindowC::CreateMenuListItem (GtkWidget *menu, char *szNazwa, int ackey, GCallback functodo, gchar *functioninfo, GtkWindow *pWindow)
{
GtkWidget *elmenu;
//GtkWidget *podmenu;
/* --- tworzymy element menu --- */
elmenu = gtk_menu_item_new_with_label (szNazwa);
g_signal_connect(GTK_OBJECT(elmenu),"button_press_event", G_CALLBACK(functodo), (gpointer)pWindow);
/* --- dodajemy je do paska menu --- */
gtk_menu_append (GTK_MENU(menu), elmenu);
gtk_widget_add_accelerator(elmenu, "activate", shortcut,ackey,GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
return elmenu;
}
void WindowC::CreateToolbarItem(GtkWidget *toolbar, gchar *stockname, GCallback functodo, gchar *message, int num, GtkWindow *pWindow)
{
GtkToolItem *newstock;
newstock=gtk_tool_button_new_from_stock( stockname );
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), newstock, num);
g_signal_connect(GTK_OBJECT(newstock), "clicked", G_CALLBACK(functodo), (gpointer)pWindow);
}
W wyżej wpisanych funkcjach istnieje pewien błąd. Mianowicie chodzi o przypisanie poprzez g_signal_connect() funkcji do wykonania. Wybranie jednej opcji z menu powinno działać identycznie jak wybrania elementu na pasku skrótów jednak jest inaczej. Oto jak wywołuje powyzsze funkcje
Wywołanie dodania funkcji do menu(które nie działa)
GtkWidget tempelmenu;
tempelmenu=CreateMenuListItem(smenu, (char)g_strdup("Zaloguj"),GDK_l, G_CALLBACK(LogInToServer), g_strdup("Loguje"), GTK_WINDOW(window));
Wywolanie dodania skrótu do paska(które działa)
GtkWidget *toolbar;
CreateToolbarItem(toolbar, g_strdup(GTK_STOCK_CONNECT), G_CALLBACK(LogInToServer), g_strdup("Loguje 2"), numberoficonplace++, GTK_WINDOW(window));
Oba elementy mają wykonywać tę samą funkcję (która będzie poniżej ponieważ w niej też mam drobny problem) jednak za chiny element w menu nie robi tego. Do tego nie działa do niego tez skrót klawiszowy.
A teraz funkcja, która wywołują
gboolean WindowC::delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
{
g_print("-> delete_event\n");
return FALSE;
}
void WindowC::LogInToServer(GtkWidget *widget, GtkWindow *pWindow)
{
//zmienne okna logowania
GtkWidget *logwin;
GtkWidget *button;
GtkWidget *table;
GtkWidget *entrylogin;
GtkWidget *entrypass;
GtkWidget *label;
//tworzymy okno i ustawiamy jego parametry
logwin=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(logwin),"iNote - Logowanie");
gtk_container_set_border_width (GTK_CONTAINER (logwin), 10);
gtk_window_position(GTK_WINDOW(logwin), GTK_WIN_POS_CENTER);
gtk_window_set_resizable(GTK_WINDOW (logwin), FALSE);
gtk_window_set_decorated(GTK_WINDOW (logwin), TRUE);
gtk_window_set_transient_for(GTK_WINDOW (logwin),pWindow);
//tworzymy kontenery
table=gtk_table_new(3,3,TRUE);
gtk_container_add(GTK_CONTAINER(logwin),table);
//kontrolki w oknie
label=gtk_label_new("Login");
gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,0,1);
entrylogin=gtk_entry_new_with_max_length(16);
gtk_table_attach_defaults(GTK_TABLE(table),entrylogin,1,3,0,1);
label=gtk_label_new("Hasło");
gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,1,2);
entrypass=gtk_entry_new_with_max_length(32);
gtk_table_attach_defaults(GTK_TABLE(table),entrypass,1,3,1,2);
button=gtk_button_new_with_label("Zaloguj");
gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,2,3);
gtk_signal_connect(GTK_OBJECT(button),"button_press_event",G_CALLBACK (delete_event),NULL);
button=gtk_button_new_with_label("Anuluj");
gtk_table_attach_defaults(GTK_TABLE(table),button,2,3,2,3);
gtk_signal_connect(GTK_OBJECT(button),"button_press_event",G_CALLBACK(NULL),NULL);
gtk_signal_connect(GTK_OBJECT(logwin),"delete_event",G_CALLBACK (delete_event),NULL);
gtk_widget_show_all (logwin);
}
Funkcja ta ma na razie tworzyć okno i wyświetlać 2 miejsca do wpisania hasła i loginu. potrzebna jest mi wiedza jak dokladnie za pomocą gtk_entry_get_text() wyciągnąć ze zmiennych entrylogin i entrypass wyciągnąć te rzeczy. Inna bajką jest wyłączane okna. Jak zrobić aby przycisk Anuluj działał tak samo jak kliknięcie krzyżyka?