[Xfce4-commits] r24060 - xfcalendar/trunk/src
Juha Kautto
juha at xfce.org
Fri Dec 8 01:16:06 CET 2006
Author: juha
Date: 2006-12-08 00:16:06 +0000 (Fri, 08 Dec 2006)
New Revision: 24060
Modified:
xfcalendar/trunk/src/appointment.c
xfcalendar/trunk/src/appointment.h
Log:
fixing possible core dump in appointment timezone selection.
Modified: xfcalendar/trunk/src/appointment.c
===================================================================
--- xfcalendar/trunk/src/appointment.c 2006-12-07 21:46:12 UTC (rev 24059)
+++ xfcalendar/trunk/src/appointment.c 2006-12-08 00:16:06 UTC (rev 24060)
@@ -434,6 +434,16 @@
mark_appointment_changed((appt_win *)user_data);
}
+void free_apptw(appt_win *apptw)
+{
+ gtk_widget_destroy(apptw->appWindow);
+ gtk_object_destroy(GTK_OBJECT(apptw->appTooltips));
+ g_free(apptw->xf_uid);
+ g_free(apptw->par);
+ xfical_appt_free(apptw->appt);
+ g_free(apptw);
+}
+
gboolean
appWindow_check_and_close(appt_win *apptw)
{
@@ -449,16 +459,11 @@
GTK_STOCK_NO, GTK_RESPONSE_CANCEL,
NULL);
- if (result == GTK_RESPONSE_ACCEPT) {
- gtk_widget_destroy(apptw->appWindow);
- g_free(apptw);
- }
+ if (result == GTK_RESPONSE_ACCEPT)
+ free_apptw(apptw);
}
- else{
- gtk_widget_destroy(apptw->appWindow);
- gtk_object_destroy(GTK_OBJECT(apptw->appTooltips));
- g_free(apptw);
- }
+ else
+ free_apptw(apptw);
return TRUE;
}
@@ -526,8 +531,6 @@
g_sprintf(appt->starttime, XFICAL_APPT_TIME_FORMAT
, current_t.tm_year + 1900, current_t.tm_mon + 1, current_t.tm_mday
, current_t.tm_hour, current_t.tm_min, 0);
- appt->start_tz_loc = g_strdup(g_object_get_data(
- G_OBJECT(apptw->appStartTimezone_button), "LOCATION_ENG"));
/* Get the end date and time and timezone */
current_t = display_to_year_month_day(gtk_button_get_label(
@@ -541,8 +544,6 @@
g_sprintf(appt->endtime, XFICAL_APPT_TIME_FORMAT
, current_t.tm_year + 1900, current_t.tm_mon + 1, current_t.tm_mday
, current_t.tm_hour, current_t.tm_min, 0);
- appt->end_tz_loc = g_strdup(g_object_get_data(
- G_OBJECT(apptw->appEndTimezone_button), "LOCATION_ENG"));
/* Get the duration */
appt->use_duration = gtk_toggle_button_get_active(
@@ -643,7 +644,7 @@
save_xfical_from_appt_win(appt_win *apptw)
{
gboolean ok = FALSE;
- appt_data *appt = xfical_appt_alloc();
+ appt_data *appt = apptw->appt;
if (fill_appt_from_apptw(appt, apptw)) {
/* Here we try to save the event... */
@@ -680,7 +681,6 @@
}
}
- xfical_appt_free(appt);
return (ok);
}
@@ -699,10 +699,8 @@
void
save_xfical_from_appt_win_and_close(appt_win *apptw)
{
- if (save_xfical_from_appt_win(apptw)) {
- gtk_widget_destroy(apptw->appWindow);
- g_free(apptw);
- }
+ if (save_xfical_from_appt_win(apptw))
+ free_apptw(apptw);
}
void
@@ -748,10 +746,7 @@
refresh_eventlist_win((eventlist_win *)apptw->eventlist);
xfcalendar_mark_appointments();
- gtk_widget_destroy(apptw->appWindow);
- g_free(apptw->xf_uid);
- g_free(apptw->par);
- g_free(apptw);
+ free_apptw(apptw);
}
}
@@ -871,10 +866,10 @@
}
void
-on_appStartEndTimezone_clicked_cb(GtkWidget *button, gpointer *user_data)
+on_appTimezone_clicked_cb(GtkWidget *button, appt_win *apptw
+ , gchar **tz)
{
#define MAX_AREA_LENGTH 20
- appt_win *apptw = (appt_win *)user_data;
GtkTreeStore *store;
GtkTreeIter iter1, iter2;
GtkWidget *tree;
@@ -882,7 +877,7 @@
GtkTreeViewColumn *col;
GtkWidget *window;
GtkWidget *sw;
- xfical_timezone_array tz;
+ xfical_timezone_array tz_a;
int i, j, result;
char area_old[MAX_AREA_LENGTH], *loc, *loc_eng, *loc_int;
GtkTreeSelection *sel;
@@ -892,17 +887,17 @@
/* enter data */
store = gtk_tree_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING);
strcpy(area_old, "S T a R T");
- tz = xfical_get_timezones();
- for (i=0; i < tz.count-2; i++) {
+ tz_a = xfical_get_timezones();
+ for (i=0; i < tz_a.count-2; i++) {
/* first area */
- if (! g_str_has_prefix(tz.city[i], area_old)) {
- for (j=0; tz.city[i][j] != '/' && j < MAX_AREA_LENGTH; j++) {
- area_old[j] = tz.city[i][j];
+ if (! g_str_has_prefix(tz_a.city[i], area_old)) {
+ for (j=0; tz_a.city[i][j] != '/' && j < MAX_AREA_LENGTH; j++) {
+ area_old[j] = tz_a.city[i][j];
}
if (j < MAX_AREA_LENGTH)
area_old[j] = 0;
else
- g_warning("on_appStartEndTimezone_clicked_cb: too long line in zones.tab %s", tz.city[i]);
+ g_warning("on_appStartEndTimezone_clicked_cb: too long line in zones.tab %s", tz_a.city[i]);
gtk_tree_store_append(store, &iter1, NULL);
gtk_tree_store_set(store, &iter1
@@ -913,8 +908,8 @@
/* then city translated and in base form used internally */
gtk_tree_store_append(store, &iter2, &iter1);
gtk_tree_store_set(store, &iter2
- , LOCATION, _(tz.city[i])
- , LOCATION_ENG, tz.city[i]
+ , LOCATION, _(tz_a.city[i])
+ , LOCATION_ENG, tz_a.city[i]
, -1);
}
@@ -959,9 +954,8 @@
, &loc_eng, -1);
}
else {
- loc = g_strdup(gtk_button_get_label(GTK_BUTTON(button)));
- loc_eng = g_object_get_data(G_OBJECT(button)
- , "LOCATION_ENG");
+ loc = g_strdup(_(*tz));
+ loc_eng = g_strdup((*tz));
}
break;
case 1:
@@ -973,8 +967,8 @@
loc_eng = g_strdup("floating");
break;
default:
- loc = g_strdup(gtk_button_get_label(GTK_BUTTON(button)));
- loc_eng = g_object_get_data(G_OBJECT(button), "LOCATION_ENG");
+ loc = g_strdup(_(*tz));
+ loc_eng = g_strdup((*tz));
break;
}
} while (result == 0) ;
@@ -983,39 +977,40 @@
mark_appointment_changed(apptw);
}
gtk_button_set_label(GTK_BUTTON(button), loc);
- if ((loc_int = g_object_get_data(G_OBJECT(button), "LOCATION_ENG")))
- g_free(loc_int);
- loc_int = g_strdup(loc_eng);
- g_object_set_data(G_OBJECT(button), "LOCATION_ENG", loc_int);
+ if (*tz)
+ g_free(*tz);
+ *tz = g_strdup(loc_eng);
g_free(loc);
g_free(loc_eng);
gtk_widget_destroy(window);
}
+static void on_appStartTimezone_clicked_cb(GtkWidget *button
+ , gpointer *user_data)
+{
+ appt_win *apptw = (appt_win *)user_data;
+ appt_data *appt;
+
+ appt = apptw->appt;
+ on_appTimezone_clicked_cb(button, apptw, &appt->start_tz_loc);
+}
+
+static void on_appEndTimezone_clicked_cb(GtkWidget *button
+ , gpointer *user_data)
+{
+ appt_win *apptw = (appt_win *)user_data;
+ appt_data *appt;
+
+ appt = apptw->appt;
+ on_appTimezone_clicked_cb(button, apptw, &appt->end_tz_loc);
+}
+
void
fill_appt_window_times(appt_win *apptw, appt_data *appt)
{
char *startdate_to_display, *enddate_to_display;
int year, month, day, hours, minutes;
- gchar *s_tz, *e_tz, *s_tze, *e_tze;
- if (appt->start_tz_loc) {
- s_tze = g_strdup(appt->start_tz_loc);
- s_tz = g_strdup(_(appt->start_tz_loc));
- }
- else { /* null = local = no timezone = floating */
- s_tze = g_strdup("floating");
- s_tz = g_strdup(_("floating"));
- }
- if (appt->end_tz_loc) {
- e_tze = g_strdup(appt->end_tz_loc);
- e_tz = g_strdup(_(appt->end_tz_loc));
- }
- else { /* null = local = no timezone = floating */
- e_tze = g_strdup("floating");
- e_tz = g_strdup(_("floating"));
- }
-
/* all day ? */
gtk_toggle_button_set_active(
GTK_TOGGLE_BUTTON(apptw->appAllDay_checkbutton), appt->allDay);
@@ -1034,12 +1029,9 @@
gtk_spin_button_set_value(
GTK_SPIN_BUTTON(apptw->appStartTime_spin_mm), (gdouble)minutes);
}
- if (s_tz) {
+ if (appt->start_tz_loc) {
gtk_button_set_label(GTK_BUTTON(apptw->appStartTimezone_button)
- , s_tz);
- g_free(s_tz);
- g_object_set_data(G_OBJECT(apptw->appStartTimezone_button)
- , "LOCATION_ENG", s_tze);
+ , _(appt->start_tz_loc));
}
else /* we should never get here */
g_warning("fill_appt_window_times: s_tz is null");
@@ -1061,12 +1053,9 @@
gtk_spin_button_set_value(
GTK_SPIN_BUTTON(apptw->appEndTime_spin_mm), (gdouble)minutes);
}
- if (e_tz) {
+ if (appt->end_tz_loc) {
gtk_button_set_label(GTK_BUTTON(apptw->appEndTimezone_button)
- , e_tz);
- g_free(e_tz);
- g_object_set_data(G_OBJECT(apptw->appEndTimezone_button)
- , "LOCATION_ENG", e_tze);
+ , _(appt->end_tz_loc));
}
else /* we should never get here */
g_warning("fill_appt_window_times: e_tz is null");
@@ -1169,7 +1158,15 @@
g_error("fill_appt_window: Appointment initialization failed");
return;
}
+ apptw->appt = appt;
+ /* let's make sure timezones are never null.
+ * Remember: null means use floating */
+ if (!appt->start_tz_loc)
+ appt->start_tz_loc = g_strdup("floating");
+ if (!appt->end_tz_loc)
+ appt->end_tz_loc = g_strdup("floating");
+
/* first flags */
apptw->xf_uid = g_strdup(appt->uid);
apptw->par = g_strdup((const gchar *)par);
@@ -1317,7 +1314,6 @@
gtk_toggle_button_set_active(
GTK_TOGGLE_BUTTON(apptw->appRecur_feature_normal_rb), TRUE);
}
- xfical_appt_free(appt);
set_time_sensitivity(apptw);
set_repeat_sensitivity(apptw);
@@ -1852,10 +1848,10 @@
G_CALLBACK(on_app_spin_button_changed_cb), apptw);
g_signal_connect((gpointer) apptw->appStartTimezone_button, "clicked",
- G_CALLBACK(on_appStartEndTimezone_clicked_cb), apptw);
+ G_CALLBACK(on_appStartTimezone_clicked_cb), apptw);
g_signal_connect((gpointer) apptw->appEndTimezone_button, "clicked",
- G_CALLBACK(on_appStartEndTimezone_clicked_cb), apptw);
+ G_CALLBACK(on_appEndTimezone_clicked_cb), apptw);
g_signal_connect((gpointer) apptw->appDur_checkbutton, "clicked",
G_CALLBACK(appDur_checkbutton_clicked_cb), apptw);
Modified: xfcalendar/trunk/src/appointment.h
===================================================================
--- xfcalendar/trunk/src/appointment.h 2006-12-07 21:46:12 UTC (rev 24059)
+++ xfcalendar/trunk/src/appointment.h 2006-12-08 00:16:06 UTC (rev 24060)
@@ -80,6 +80,7 @@
typedef struct
{
GtkWidget *appWindow;
+ appt_data *appt;
GtkAccelGroup *appAccelgroup;
GtkWidget *appVBox1;
GtkWidget *appMenubar;
More information about the Xfce4-commits
mailing list