PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Subroutinen mit C/GTK



cubical
14-12-2001, 15:31
hallo


ich hab ein kleines problem. und
zwar will ich aus einer unterfunktion heraus,
dir eigenschaften von widgets, die in main()
erzeugt wurden, aendern. z.b. bei nem Toggle-Button. nur wie muss diese zeile
in einer unterfunktion aussehen??

gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(win dow.powerbutton),TRUE);

das soll z.b. gemacht werden, wenn ich nen
anderen button klicke...

bye & thx


cubical

Mombartz
14-12-2001, 17:43
Moin cubical,

ich denke es gibt 2 Möglichkeiten für dieses Problem.
Entweder alle Widgets global verfügbar machen oder mit hilfe von »helferlein.c« die Widgets suchen; was allderdings voraussetzt, daß Du ihnen via gtk_object_set_data_full() einen eindeutigen Namen verpasst hast.

Gruß
Mombartz

Jetzt geht's looos:



/* haupt.c */

#include <gtk/gtk.h>
#include "helferlein.h"
#include "unterfunktionen.h"

int main(int argc, char *argv[])
{
GtkWidget *fenster, *fixed, *knopf, *test_knopf;

gtk_init(&argc, &argv);

fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_object_set_data(GTK_OBJECT(fenster), "fenster", fenster);
gtk_window_set_title(GTK_WINDOW(fenster), "fenster");
gtk_widget_show(fenster);

fixed = gtk_fixed_new();
gtk_widget_ref(fixed);
gtk_object_set_data_full(GTK_OBJECT(fenster), "fixed", fixed, (GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show(fixed);
gtk_container_add(GTK_CONTAINER(fenster), fixed);

knopf = gtk_toggle_button_new();
gtk_widget_ref(knopf);
gtk_object_set_data_full(GTK_OBJECT(fenster), "knopf", knopf, (GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show(knopf);
gtk_widget_set_uposition(knopf, 65, 65);
gtk_widget_set_usize(knopf, 65, 65);
gtk_container_add(GTK_CONTAINER(fixed), knopf);

test_knopf = gtk_button_new_with_label("DRUECKE MICH");
gtk_widget_ref(test_knopf);
gtk_object_set_data_full(GTK_OBJECT(fenster), "test_knopf", test_knopf, (GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show(test_knopf);
gtk_widget_set_uposition(test_knopf, 40, 5);
gtk_widget_set_usize(test_knopf, 120, 20);
gtk_container_add(GTK_CONTAINER(fixed), test_knopf);

gtk_signal_connect(GTK_OBJECT(test_knopf), "pressed", GTK_SIGNAL_FUNC(test_funktion), 0);

gtk_main();
return 0;
}


/* helferlein.c */

#include <gtk/gtk.h>
#include "helferlein.h"

GtkWidget *suche_fenster(GtkWidget * fenster, const gchar * fenster_name)
{
GtkWidget *eltern_fenster, *gefundenes_fenster;

while (1)
{
if (GTK_IS_MENU(fenster))
eltern_fenster = gtk_menu_get_attach_widget(GTK_MENU(fenster));
else
eltern_fenster = fenster->parent;
if (!eltern_fenster)
break;
fenster = eltern_fenster;
}
gefundenes_fenster = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(fenster), fenster_name);
if (!gefundenes_fenster)
g_warning("Fenster nicht gefunden: %s", fenster_name);
return gefundenes_fenster;
}


/* helferlein.h */

#ifndef _helferlein_h_
#define _helferlein_h_

GtkWidget *suche_fenster(GtkWidget * fenster, const gchar * fenster_name);

#endif /* _helferlein_h_ */


/* unterfunktionen.c */

#include <gtk/gtk.h>
#include "helferlein.h"

gboolean test_funktion(GtkWidget * w, GdkEvent * ev, gpointer data)
{
static int i = 0;
static GtkWidget *knopf, *test_knopf;
char buf[2];

if (i++ == 5)
gtk_main_quit();
if (!knopf)
knopf = suche_fenster(w, "knopf");
if (!test_knopf)
test_knopf = suche_fenster(w, "test_knopf");
g_snprintf(buf, 2, "%d", 6 - i);
gtk_label_set_text(GTK_LABEL(GTK_BUTTON(test_knopf )->child), buf);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(kno pf), TRUE);
return FALSE;
}


/* unterfunktionen.h */

#ifndef _unterfunktionen_h_
#define _unterfunktionen_h_

gboolean test_funktion(GtkWidget * w, GdkEvent * ev, gpointer data);

#endif /* _unterfunktionen_h_ */