Index: orage/src/mainbox.c =================================================================== --- orage/src/mainbox.c (revision 247) +++ orage/src/mainbox.c (revision 254) @@ -357,19 +357,43 @@ , G_CALLBACK(mHelp_about_activate_cb),(gpointer) cal); } +/* + Remove the reference to a destroyed appointment window from + its todo label. +*/ +static void appt_window_destroyed(GtkWidget *widget + , gpointer user_data) +{ + GtkWidget *wd = (GtkWidget*)user_data; + g_object_set_data(G_OBJECT(wd), "APPT_WINDOW", NULL); +} + static void todo_clicked(GtkWidget *widget , GdkEventButton *event, gpointer *user_data) { #undef P_N #define P_N "todo_clicked: " gchar *uid; + GtkWidget *win; #ifdef ORAGE_DEBUG orage_message(-100, P_N); #endif if (event->type==GDK_2BUTTON_PRESS) { uid = g_object_get_data(G_OBJECT(widget), "UID"); - create_appt_win("UPDATE", uid); + win=(GtkWidget*)g_object_get_data(G_OBJECT(widget), "APPT_WINDOW"); + + if (win) { + /* window already exists, just bring it to the front and give it focus. */ + gtk_window_present(GTK_WINDOW(win)); + } + else { + /* create a new window. */ + win=create_appt_win("UPDATE", uid)->Window; + g_signal_connect((gpointer) win, "destroy" + , G_CALLBACK(appt_window_destroyed), widget); + g_object_set_data(G_OBJECT(widget), "APPT_WINDOW", win); + } } }