Author: juha Date: 2007-12-18 23:31:14 +0000 (Tue, 18 Dec 2007) New Revision: 26494
Modified: xfcalendar/trunk/src/appointment.h xfcalendar/trunk/src/day-view.c xfcalendar/trunk/src/day-view.h xfcalendar/trunk/src/event-list.c xfcalendar/trunk/src/event-list.h xfcalendar/trunk/src/functions.c xfcalendar/trunk/src/functions.h Log: day view improvments: added menus and toolbuttons and made scrollbar to remember the position when changing day Modified: xfcalendar/trunk/src/appointment.h =================================================================== --- xfcalendar/trunk/src/appointment.h 2007-12-18 06:05:15 UTC (rev 26493) +++ xfcalendar/trunk/src/appointment.h 2007-12-18 23:31:14 UTC (rev 26494) @@ -29,16 +29,13 @@ typedef struct _appt_win { + GtkAccelGroup *accel_group; + GtkTooltips *Tooltips; + GtkWidget *Window; GtkWidget *Vbox; GtkWidget *Menubar; - GtkWidget *Revert; - GtkWidget *Delete; - GtkWidget *Duplicate; - GtkWidget *Save; - GtkWidget *SaveClose; - GtkWidget *File_menu; GtkWidget *File_menu_save; GtkWidget *File_menu_saveclose; @@ -48,6 +45,11 @@ GtkWidget *File_menu_close; GtkWidget *Toolbar; + GtkWidget *Revert; + GtkWidget *Delete; + GtkWidget *Duplicate; + GtkWidget *Save; + GtkWidget *SaveClose; GtkWidget *Notebook; GtkWidget *General_notebook_page; @@ -168,9 +170,6 @@ GtkWidget *Recur_byday_spin_hbox; GtkWidget *Recur_byday_spin[7]; /* 0=Mo, 1=Tu ... 6=Su */ - GtkAccelGroup *accel_group; - GtkTooltips *Tooltips; - xfical_appt *appt; gchar *xf_uid; gchar *par; Modified: xfcalendar/trunk/src/day-view.c =================================================================== --- xfcalendar/trunk/src/day-view.c 2007-12-18 06:05:15 UTC (rev 26493) +++ xfcalendar/trunk/src/day-view.c 2007-12-18 23:31:14 UTC (rev 26494) @@ -28,6 +28,7 @@ #include <glib.h> #include <glib/gprintf.h> +#include <gdk/gdkkeysyms.h> #include <gdk/gdk.h> #include <gtk/gtk.h> @@ -39,9 +40,37 @@ #include "event-list.h" #include "appointment.h" -void program_log (const char *format, ...); + static void refresh_day_view_table(day_win *dw); +static void set_scroll_position(day_win *dw) +{ + GtkAdjustment *v_adj; + + v_adj = gtk_scrolled_window_get_vadjustment( + GTK_SCROLLED_WINDOW(dw->scroll_win)); + if (dw->scroll_pos > 0) /* we have old value */ + gtk_adjustment_set_value(v_adj, dw->scroll_pos); + else if (dw->scroll_pos < 0) + /* default: let's try to start roughly from line 8 = 8 o'clock */ + gtk_adjustment_set_value(v_adj, v_adj->upper/3); +} + +static gboolean scroll_position_timer(gpointer user_data) +{ + set_scroll_position((day_win *)user_data); + return(FALSE); /* only once */ +} + +static void get_scroll_position(day_win *dw) +{ + GtkAdjustment *v_adj; + + v_adj = gtk_scrolled_window_get_vadjustment( + GTK_SCROLLED_WINDOW(dw->scroll_win)); + dw->scroll_pos = gtk_adjustment_get_value(v_adj); +} + static GtkWidget *build_line(day_win *dw, gint left_x, gint top_y , gint width, gint height, GtkWidget *hour_line) { @@ -103,36 +132,194 @@ close_window((day_win *)user_data); } +static void on_Close_clicked(GtkButton *b, gpointer user_data) +{ + close_window((day_win *)user_data); +} + +static void create_new_appointment(day_win *dw) +{ + char *s_date, a_day[10]; + + s_date = (char *)gtk_button_get_label(GTK_BUTTON(dw->StartDate_button)); + strcpy(a_day, orage_i18_date_to_icaltime(s_date)); + + create_appt_win("NEW", a_day, NULL); +} + +static void on_File_newApp_activate_cb(GtkMenuItem *mi, gpointer user_data) +{ + create_new_appointment((day_win *)user_data); +} + +static void on_Create_toolbutton_clicked_cb(GtkButton *mi, gpointer user_data) +{ + create_new_appointment((day_win *)user_data); +} + +static void on_View_refresh_activate_cb(GtkMenuItem *mi, gpointer user_data) +{ + refresh_day_view_table((day_win *)user_data); +} + +static void on_Refresh_clicked(GtkButton *b, gpointer user_data) +{ + refresh_day_view_table((day_win *)user_data); +} + +static void changeSelectedDate(day_win *dw, gint day) +{ + struct tm tm_date; + + tm_date = orage_i18_date_to_tm_date( + gtk_button_get_label(GTK_BUTTON(dw->StartDate_button))); + orage_move_day(&tm_date, day); + gtk_button_set_label(GTK_BUTTON(dw->StartDate_button) + , orage_tm_date_to_i18_date(&tm_date)); + refresh_day_view_table(dw); +} + +static void go_to_today(day_win *dw) +{ + gtk_button_set_label(GTK_BUTTON(dw->StartDate_button) + , orage_localdate_i18()); + refresh_day_view_table(dw); +} + +static void on_Today_clicked(GtkButton *b, gpointer user_data) +{ + go_to_today((day_win *)user_data); +} + +static void on_Go_today_activate_cb(GtkMenuItem *mi, gpointer user_data) +{ + go_to_today((day_win *)user_data); +} + +static void on_Go_previous_activate_cb(GtkMenuItem *mi, gpointer user_data) +{ + changeSelectedDate((day_win *)user_data, -1); +} + +static void on_Previous_clicked(GtkButton *b, gpointer user_data) +{ + changeSelectedDate((day_win *)user_data, -1); +} + +static void on_Go_next_activate_cb(GtkMenuItem *mi, gpointer user_data) +{ + changeSelectedDate((day_win *)user_data, 1); +} + +static void on_Next_clicked(GtkButton *b, gpointer user_data) +{ + changeSelectedDate((day_win *)user_data, 1); +} + static void build_menu(day_win *dw) { + GtkWidget *menu_separator; + dw->Menubar = gtk_menu_bar_new(); gtk_box_pack_start(GTK_BOX(dw->Vbox), dw->Menubar, FALSE, FALSE, 0); - /* File menu */ + /********** File menu **********/ dw->File_menu = orage_menu_new(_("_File"), dw->Menubar); + dw->File_menu_new = orage_image_menu_item_new_from_stock("gtk-new" + , dw->File_menu, dw->accel_group); + + menu_separator = orage_separator_menu_item_new(dw->File_menu); + dw->File_menu_close = orage_image_menu_item_new_from_stock("gtk-close" , dw->File_menu, dw->accel_group); + /********** View menu **********/ + dw->View_menu = orage_menu_new(_("_View"), dw->Menubar); + dw->View_menu_refresh = orage_image_menu_item_new_from_stock ("gtk-refresh" + , dw->View_menu, dw->accel_group); + gtk_widget_add_accelerator(dw->View_menu_refresh + , "activate", dw->accel_group + , GDK_r, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); + gtk_widget_add_accelerator(dw->View_menu_refresh + , "activate", dw->accel_group + , GDK_Return, 0, 0); + gtk_widget_add_accelerator(dw->View_menu_refresh + , "activate", dw->accel_group + , GDK_KP_Enter, 0, 0); + + /********** Go menu **********/ + dw->Go_menu = orage_menu_new(_("_Go"), dw->Menubar); + dw->Go_menu_today = orage_image_menu_item_new_from_stock("gtk-home" + , dw->Go_menu, dw->accel_group); + gtk_widget_add_accelerator(dw->Go_menu_today + , "activate", dw->accel_group + , GDK_Home, GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); + dw->Go_menu_prev = orage_image_menu_item_new_from_stock("gtk-go-back" + , dw->Go_menu, dw->accel_group); + gtk_widget_add_accelerator(dw->Go_menu_prev + , "activate", dw->accel_group + , GDK_Left, GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); + dw->Go_menu_next = orage_image_menu_item_new_from_stock("gtk-go-forward" + , dw->Go_menu, dw->accel_group); + gtk_widget_add_accelerator(dw->Go_menu_next + , "activate", dw->accel_group + , GDK_Right, GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); + + g_signal_connect((gpointer)dw->File_menu_new, "activate" + , G_CALLBACK(on_File_newApp_activate_cb), dw); g_signal_connect((gpointer)dw->File_menu_close, "activate" - , G_CALLBACK(on_File_close_activate_cb), dw); + , G_CALLBACK(on_File_close_activate_cb), dw); + g_signal_connect((gpointer)dw->View_menu_refresh, "activate" + , G_CALLBACK(on_View_refresh_activate_cb), dw); + g_signal_connect((gpointer)dw->Go_menu_today, "activate" + , G_CALLBACK(on_Go_today_activate_cb), dw); + g_signal_connect((gpointer)dw->Go_menu_prev, "activate" + , G_CALLBACK(on_Go_previous_activate_cb), dw); + g_signal_connect((gpointer)dw->Go_menu_next, "activate" + , G_CALLBACK(on_Go_next_activate_cb), dw); } -static void on_Close_clicked(GtkButton *b, gpointer user_data) -{ - close_window((day_win *)user_data); -} - static void build_toolbar(day_win *dw) { + GtkWidget *toolbar_separator; int i = 0; dw->Toolbar = gtk_toolbar_new(); gtk_box_pack_start(GTK_BOX(dw->Vbox), dw->Toolbar, FALSE, FALSE, 0); gtk_toolbar_set_tooltips(GTK_TOOLBAR(dw->Toolbar), TRUE); + dw->Create_toolbutton = orage_toolbar_append_button(dw->Toolbar + , "gtk-new", dw->Tooltips, _("New"), i++); + + toolbar_separator = orage_toolbar_append_separator(dw->Toolbar, i++); + + dw->Previous_toolbutton = orage_toolbar_append_button(dw->Toolbar + , "gtk-go-back", dw->Tooltips, _("Back"), i++); + dw->Today_toolbutton = orage_toolbar_append_button(dw->Toolbar + , "gtk-home", dw->Tooltips, _("Today"), i++); + dw->Next_toolbutton = orage_toolbar_append_button(dw->Toolbar + , "gtk-go-forward", dw->Tooltips, _("Forward"), i++); + + toolbar_separator = orage_toolbar_append_separator(dw->Toolbar, i++); + + dw->Refresh_toolbutton = orage_toolbar_append_button(dw->Toolbar + , "gtk-refresh", dw->Tooltips, _("Refresh"), i++); + + toolbar_separator = orage_toolbar_append_separator(dw->Toolbar, i++); + dw->Close_toolbutton = orage_toolbar_append_button(dw->Toolbar - , "gtk-close", dw->Tooltips, _("Close"), i++); + , "gtk-close", dw->Tooltips, _("Close"), i++); + g_signal_connect((gpointer)dw->Create_toolbutton, "clicked" + , G_CALLBACK(on_Create_toolbutton_clicked_cb), dw); + g_signal_connect((gpointer)dw->Previous_toolbutton, "clicked" + , G_CALLBACK(on_Previous_clicked), dw); + g_signal_connect((gpointer)dw->Today_toolbutton, "clicked" + , G_CALLBACK(on_Today_clicked), dw); + g_signal_connect((gpointer)dw->Next_toolbutton, "clicked" + , G_CALLBACK(on_Next_clicked), dw); + g_signal_connect((gpointer)dw->Refresh_toolbutton, "clicked" + , G_CALLBACK(on_Refresh_clicked), dw); g_signal_connect((gpointer)dw->Close_toolbutton, "clicked" , G_CALLBACK(on_Close_clicked), dw); } @@ -189,7 +376,6 @@ { gchar *uid; - g_print("pressed button %d\n", event->button); uid = g_object_get_data(G_OBJECT(widget), "UID"); create_appt_win("UPDATE", uid, NULL); } @@ -202,24 +388,12 @@ gchar *text, *tip, *start_date, *end_date; GtkWidget *ev, *lab, *hb; struct tm tm_start, tm_end, tm_first; - /* - GDate *g_start, *g_end, *g_first; - */ /* First clarify timings */ tm_start = orage_icaltime_to_tm_time(appt->starttimecur, FALSE); tm_end = orage_icaltime_to_tm_time(appt->endtimecur, FALSE); tm_first = orage_icaltime_to_tm_time(a_day, FALSE); - /* - g_start = g_date_new_dmy(tm_start.tm_mday, tm_start.tm_mon - , tm_start.tm_year); - g_end = g_date_new_dmy(tm_end.tm_mday, tm_end.tm_mon - , tm_end.tm_year); - g_first = g_date_new_dmy(tm_first.tm_mday, tm_first.tm_mon - , tm_first.tm_year); - col = g_date_days_between(g_first, g_start)+1; / * col 0 == hour headers * / - */ col = orage_days_between(&tm_first, &tm_start)+1; if (col < 1) { col = 1; @@ -254,9 +428,6 @@ hb = gtk_hbox_new(TRUE, 1); else hb = dw->element[row][col]; - /* - if (g_date_days_between(g_start, g_end) == 0) - */ if (orage_days_between(&tm_start, &tm_end) == 0) tip = g_strdup_printf("%s\n%02d:%02d-%02d:%02d\n%s" , appt->title @@ -301,17 +472,11 @@ /* * same_date = !strncmp(start_ical_time, end_ical_time, 8); * */ - /* - start_col = g_date_days_between(g_first, g_start)+1; - */ start_col = orage_days_between(&tm_first, &tm_start)+1; if (start_col < 1) first_col = 1; else first_col = start_col; - /* - end_col = g_date_days_between(g_first, g_end)+1; - */ end_col = orage_days_between(&tm_first, &tm_end)+1; if (end_col > days) last_col = days; @@ -340,11 +505,6 @@ } } } - /* - g_date_free(g_start); - g_date_free(g_end); - g_date_free(g_first); - */ } static void app_rows(day_win *dw, char *a_day , xfical_type ical_type @@ -672,26 +832,20 @@ fill_days(dw, days); } -static void set_scroll_position(day_win *dw) -{ - GtkAdjustment *v_adj; - - /* let's try to start roughly from line 8 = 8 o'clock */ - v_adj = gtk_scrolled_window_get_vadjustment( - GTK_SCROLLED_WINDOW(dw->scroll_win)); - gtk_adjustment_set_value(v_adj, v_adj->upper/3); -} - static void refresh_day_view_table(day_win *dw) { program_log("***** refresh_day_view_table started"); + get_scroll_position(dw); gtk_widget_destroy(dw->scroll_win_h); program_log("***** refresh_day_view_table destroyed"); build_day_view_table(dw); program_log("***** refresh_day_view_table built"); gtk_widget_show_all(dw->scroll_win_h); + gtk_widget_show_now(dw->scroll_win_h); program_log("***** refresh_day_view_table showed"); - set_scroll_position(dw); + /* I was not able to get this work without the timer. Ugly yes, but + * it works and does not hurt - much */ + g_timeout_add(100, (GtkFunction)scroll_position_timer, (gpointer)dw); program_log("***** refresh_day_view_table done"); } @@ -702,6 +856,7 @@ program_log("create_day_win started"); /* initialisation + main window + base vbox */ dw = g_new0(day_win, 1); + dw->scroll_pos = -1; /* not set */ dw->Tooltips = gtk_tooltips_new(); dw->accel_group = gtk_accel_group_new(); Modified: xfcalendar/trunk/src/day-view.h =================================================================== --- xfcalendar/trunk/src/day-view.h 2007-12-18 06:05:15 UTC (rev 26493) +++ xfcalendar/trunk/src/day-view.h 2007-12-18 23:31:14 UTC (rev 26494) @@ -34,17 +34,29 @@ GtkWidget *Window; GtkWidget *Vbox; - GtkWidget *StartDate_button; - GtkRequisition StartDate_button_req; - GtkWidget *day_spin; - GtkWidget *Menubar; GtkWidget *File_menu; + GtkWidget *File_menu_new; GtkWidget *File_menu_close; + GtkWidget *View_menu; + GtkWidget *View_menu_refresh; + GtkWidget *Go_menu; + GtkWidget *Go_menu_today; + GtkWidget *Go_menu_prev; + GtkWidget *Go_menu_next; GtkWidget *Toolbar; + GtkWidget *Create_toolbutton; + GtkWidget *Previous_toolbutton; + GtkWidget *Today_toolbutton; + GtkWidget *Next_toolbutton; + GtkWidget *Refresh_toolbutton; GtkWidget *Close_toolbutton; + GtkWidget *StartDate_button; + GtkRequisition StartDate_button_req; + GtkWidget *day_spin; + GtkWidget *day_view_vbox; GtkWidget *scroll_win_h; GtkWidget *dtable_h; /* header of day table */ @@ -57,6 +69,7 @@ GtkWidget *line[24][MAX_DAYS]; guint upd_timer; + gdouble scroll_pos; /* remember the scroll position */ GdkColor bg1, bg2, line_color; } day_win; Modified: xfcalendar/trunk/src/event-list.c =================================================================== --- xfcalendar/trunk/src/event-list.c 2007-12-18 06:05:15 UTC (rev 26493) +++ xfcalendar/trunk/src/event-list.c 2007-12-18 23:31:14 UTC (rev 26494) @@ -64,13 +64,7 @@ #include "day-view.h" -/* Direction for changing day to look at */ enum { - PREVIOUS, - NEXT -}; - -enum { COL_TIME = 0 ,COL_FLAGS ,COL_HEAD @@ -744,55 +738,26 @@ refresh_el_win((el_win*)user_data); } -static void changeSelectedDate(el_win *el, gint direction) +static void changeSelectedDate(el_win *el, gint day) { - int year, month, day; - guint monthdays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; - char *title; struct tm tm_date; - title = (char *)gtk_window_get_title(GTK_WINDOW(el->Window)); - tm_date = orage_i18_date_to_tm_date(title); - year = tm_date.tm_year + 1900; - month = tm_date.tm_mon; /* gtk calendar starts from 0 month */ - day = tm_date.tm_mday; - if (((year%4) == 0) && (((year%100) != 0) || ((year%400) == 0))) - ++monthdays[1]; - - switch(direction) { - case PREVIOUS: - if (--day == 0) { - if (--month == -1) { - --year; - month = 11; - } - day = monthdays[month]; - } - break; - case NEXT: - if (++day == (monthdays[month]+1)) { - if (++month == 12) { - ++year; - month = 0; - } - day = 1; - } - break; - default: - break; - } - orage_select_date(GTK_CALENDAR(g_par.xfcal->mCalendar), year, month, day); + tm_date = orage_i18_date_to_tm_date( + gtk_window_get_title(GTK_WINDOW(el->Window))); + orage_move_day(&tm_date, day); + orage_select_date(GTK_CALENDAR(g_par.xfcal->mCalendar) + , tm_date.tm_year + 1900, tm_date.tm_mon, tm_date.tm_mday); set_el_data_from_cal(el); } static void on_Previous_clicked(GtkButton *b, gpointer user_data) { - changeSelectedDate((el_win *)user_data, PREVIOUS); + changeSelectedDate((el_win *)user_data, -1); } static void on_Go_previous_activate_cb(GtkMenuItem *mi, gpointer user_data) { - changeSelectedDate((el_win *)user_data, PREVIOUS); + changeSelectedDate((el_win *)user_data, -1); } static void go_to_today(el_win *el) @@ -813,12 +778,12 @@ static void on_Next_clicked(GtkButton *b, gpointer user_data) { - changeSelectedDate((el_win *)user_data, NEXT); + changeSelectedDate((el_win *)user_data, 1); } static void on_Go_next_activate_cb(GtkMenuItem *mi, gpointer user_data) { - changeSelectedDate((el_win *)user_data, NEXT); + changeSelectedDate((el_win *)user_data, 1); } static void create_new_appointment(el_win *el) @@ -954,14 +919,13 @@ el->Menubar = gtk_menu_bar_new(); gtk_box_pack_start(GTK_BOX(el->Vbox), el->Menubar, FALSE, FALSE, 0); - /* File menu */ + /********** File menu **********/ el->File_menu = orage_menu_new(_("_File"), el->Menubar); el->File_menu_new = orage_image_menu_item_new_from_stock("gtk-new" , el->File_menu, el->accel_group); menu_separator = orage_separator_menu_item_new(el->File_menu); - /* add event copying and day cleaning */ el->File_menu_duplicate = orage_menu_item_new_with_mnemonic(_("D_uplicate") , el->File_menu); gtk_widget_add_accelerator(el->File_menu_duplicate @@ -978,7 +942,7 @@ el->File_menu_close = orage_image_menu_item_new_from_stock("gtk-close" , el->File_menu, el->accel_group); - /* View menu */ + /********** View menu **********/ el->View_menu = orage_menu_new(_("_View"), el->Menubar); el->View_menu_refresh = orage_image_menu_item_new_from_stock ("gtk-refresh" , el->View_menu, el->accel_group); @@ -997,7 +961,7 @@ el->View_menu_search = orage_image_menu_item_new_from_stock("gtk-find" , el->View_menu, el->accel_group); - /* Go menu */ + /********** Go menu **********/ el->Go_menu = orage_menu_new(_("_Go"), el->Menubar); el->Go_menu_today = orage_image_menu_item_new_from_stock("gtk-home" , el->Go_menu, el->accel_group); @@ -1008,12 +972,12 @@ , el->Go_menu, el->accel_group); gtk_widget_add_accelerator(el->Go_menu_prev , "activate", el->accel_group - , GDK_b, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); + , GDK_Left, GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); el->Go_menu_next = orage_image_menu_item_new_from_stock("gtk-go-forward" , el->Go_menu, el->accel_group); gtk_widget_add_accelerator(el->Go_menu_next , "activate", el->accel_group - , GDK_f, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); + , GDK_Right, GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); g_signal_connect((gpointer)el->File_menu_new, "activate" , G_CALLBACK(on_File_newApp_activate_cb), el); @@ -1021,8 +985,6 @@ , G_CALLBACK(on_File_duplicate_activate_cb), el); g_signal_connect((gpointer)el->File_menu_delete, "activate" , G_CALLBACK(on_File_delete_activate_cb), el); - g_signal_connect((gpointer)el->File_menu_close, "activate" - , G_CALLBACK(on_File_close_activate_cb), el); g_signal_connect((gpointer)el->View_menu_refresh, "activate" , G_CALLBACK(on_View_refresh_activate_cb), el); g_signal_connect((gpointer)el->View_menu_search, "activate" @@ -1033,6 +995,8 @@ , G_CALLBACK(on_Go_previous_activate_cb), el); g_signal_connect((gpointer)el->Go_menu_next, "activate" , G_CALLBACK(on_Go_next_activate_cb), el); + g_signal_connect((gpointer)el->File_menu_close, "activate" + , G_CALLBACK(on_File_close_activate_cb), el); } static void build_toolbar(el_win *el) Modified: xfcalendar/trunk/src/event-list.h =================================================================== --- xfcalendar/trunk/src/event-list.h 2007-12-18 06:05:15 UTC (rev 26493) +++ xfcalendar/trunk/src/event-list.h 2007-12-18 23:31:14 UTC (rev 26494) @@ -37,6 +37,7 @@ { GtkAccelGroup *accel_group; GtkTooltips *Tooltips; + GtkWidget *Window; GtkWidget *Vbox; Modified: xfcalendar/trunk/src/functions.c =================================================================== --- xfcalendar/trunk/src/functions.c 2007-12-18 06:05:15 UTC (rev 26493) +++ xfcalendar/trunk/src/functions.c 2007-12-18 23:31:14 UTC (rev 26494) @@ -409,6 +409,34 @@ return(orage_tm_date_to_i18_date(t)); } +/* move one day forward or backward */ +void orage_move_day(struct tm *t, int day) +{ + guint monthdays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + + t->tm_year += 1900; + if (((t->tm_year%4) == 0) + && (((t->tm_year%100) != 0) || ((t->tm_year%400) == 0))) + ++monthdays[1]; /* leap year, february has 29 days */ + + t->tm_mday += day; /* may be negative */ + if (t->tm_mday == 0) { /* we went to previous month */ + if (--t->tm_mon == -1) { /* previous year */ + --t->tm_year; + t->tm_mon = 11; + } + t->tm_mday = monthdays[t->tm_mon]; + } + else if (t->tm_mday > (monthdays[t->tm_mon])) { /* next month */ + if (++t->tm_mon == 12) { + ++t->tm_year; + t->tm_mon = 0; + } + t->tm_mday = 1; + } + t->tm_year -= 1900; +} + gint orage_days_between(struct tm *t1, struct tm *t2) { GDate *g_t1, *g_t2; Modified: xfcalendar/trunk/src/functions.h =================================================================== --- xfcalendar/trunk/src/functions.h 2007-12-18 06:05:15 UTC (rev 26493) +++ xfcalendar/trunk/src/functions.h 2007-12-18 23:31:14 UTC (rev 26494) @@ -66,6 +66,7 @@ char *orage_i18_date_to_icaltime(const char *i18_date); char *orage_cal_to_i18_date(GtkCalendar *cal); char *orage_localdate_i18(); +void orage_move_day(struct tm *t, int day); gint orage_days_between(struct tm *t1, struct tm *t2); void orage_select_date(GtkCalendar *cal, guint year, guint month, guint day); _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits