📄 callbacks.c
字号:
#ifdef HAVE_CONFIG_H# include <config.h>#endif#include <gtk/gtk.h>#include <time.h>
#include <stdio.h>
#include <string.h>
#include "callbacks.h"#include "interface.h"#include "support.h"#include "clock.h"
#include "calendar.h"#include "lunarcalendar.h"
#include "function.h"
extern MyClock *pclock;extern gboolean isclear;extern gboolean ringstate;extern GdkPixmap *RingPixmap;extern GdkPixmap *clockfacepixmap;
extern GtkWidget *ClockCalendarFixed;gboolean timeout = TRUE;
GdkPixmap *gdkxmp[11];static GtkWidget *modebutton = NULL;voidon_modebutton_clicked (GtkButton *button, gpointer user_data){ GtkWidget *widget = GTK_WIDGET (user_data);//widget is drawingarea GtkWidget *child;
GdkBitmap *mask ;
static GdkPixmap *pixmap12 = NULL, *pixmap24 = NULL;
g_return_if_fail (button != NULL);
if (!pixmap12) pixmap12 = gdk_pixmap_colormap_create_from_xpm (NULL, gtk_widget_get_default_colormap (),
&mask, NULL, "./xpm/clockxpm/12.xpm");
if (!pixmap24)
pixmap24 = gdk_pixmap_colormap_create_from_xpm (NULL, gtk_widget_get_default_colormap (),
&mask, NULL, "./xpm/clockxpm/24.xpm");
isclear = FALSE;
child = gtk_container_children (GTK_CONTAINER(button))->data;
if (!pclock->military_time)
{ pclock->military_time = TRUE; // use 24 hour mode
gtk_pixmap_set (GTK_PIXMAP(child), pixmap24, NULL);
} else {
pclock->military_time = FALSE; // use 12 hour mode
gtk_pixmap_set (GTK_PIXMAP(child), pixmap12, NULL);
}
if (pclock->timer)
{
gtk_timeout_remove (pclock->timer);
pclock->timer = gtk_timeout_add (pclock->interval, (GtkFunction) clock_timer, (gpointer) widget);
}
clock_draw_internal (widget);}voidon_ClockSetButton_clicked (GtkButton *button, gpointer user_data){ GtkWidget *clocksetwindow; GtkWidget *widgettemp; int flag = 0, hour = 0, minute = 0; clocksetwindow = create_and_init_ClockSetWindow ();
clock_read_date (&hour, &minute, &flag); if (flag == 1) { //The "ClockTSOpenCheckButton" button仅仅一次 widgettemp = lookup_widget (clocksetwindow, "ClockTSOpenCheckButton"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widgettemp), TRUE); } else if (flag == 2) { //The "ClockTSOpenCheckButton" button每天提示 widgettemp = lookup_widget (clocksetwindow, "ClockTSCloseCheckButton"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widgettemp), TRUE); }
if (flag == 1 || flag == 2) { //闹钟为开启 widgettemp = lookup_widget (clocksetwindow, "ClockOpenCheckButton");
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widgettemp), TRUE);
ringstate = TRUE; }
else
{ //闹钟为关闭,设置其它选项为无效
gtk_widget_set_sensitive(lookup_widget(clocksetwindow, "ClockTSCloseCheckButton"), FALSE);
gtk_widget_set_sensitive(lookup_widget(clocksetwindow, "ClockTSOpenCheckButton"), FALSE);
gtk_widget_set_sensitive(lookup_widget(clocksetwindow, "HourSpinButton"), FALSE);
gtk_widget_set_sensitive(lookup_widget(clocksetwindow, "MinuteSpinButton"), FALSE);
}
gtk_spin_button_set_value(GTK_SPIN_BUTTON(lookup_widget (clocksetwindow, "HourSpinButton")), hour);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(lookup_widget (clocksetwindow, "MinuteSpinButton")), minute);
gtk_widget_show (clocksetwindow);}voidon_NumberModeButton_clicked (GtkButton *button, gpointer user_data){ gint i;
GdkColor newcolor;
GtkStyle *newstyle;
GdkBitmap *mask;
GtkWidget *drawingarea;
g_return_if_fail (button != NULL);
drawingarea = lookup_widget (GTK_WIDGET (button), "Drawingarea");
if (gdkxmp[0] == NULL)//第一次使用数字模式时,初始化gdkxmp数组
leds_clock_create_pixmap (drawingarea);
gdk_draw_rectangle (drawingarea->window, drawingarea->style->black_gc, TRUE, 0, 0, 168, 173);//用于PDA上屏幕刷新
gtk_widget_set_uposition (drawingarea, 0, 22);//在本电话机上必须使用,否则位置不正确
gtk_widget_set_usize (drawingarea, 168, 173);
if (pclock->mode != CLOCK_LEDS)
{
newstyle = gtk_style_copy (gtk_widget_get_style (drawingarea));
newcolor.red = 0*0xffff;
newcolor.green = 0*0xffff;
newcolor.blue = 0*0xffff;
for (i = 0; i < 5; i++)
newstyle->bg[i] = newcolor;
gtk_widget_set_style (drawingarea, newstyle);
}
gtk_widget_set_uposition (ClockCalendarFixed, 0, 20);//在本电话机上必须使用,否则位置不正确。并且程序执行顺序不能改动
gtk_widget_set_usize (ClockCalendarFixed, 320, 195);
if (modebutton == NULL) modebutton = create_and_init_modebutton (drawingarea);//第一次使用数字模式时,建立并初始化12/24模式按钮 else gtk_widget_show_all (modebutton);//以后使用12/24模式按钮时只显示出来 if (ringstate)//取当前闹铃状态,并设置当前闹铃图标 RingPixmap = gdk_pixmap_create_from_xpm (drawingarea->window, &mask, &drawingarea->style->bg[GTK_STATE_NORMAL], "./xpm/clockxpm/ringonclockface1.xpm"); else RingPixmap = gdk_pixmap_create_from_xpm (drawingarea->window, &mask, &drawingarea->style->bg[GTK_STATE_NORMAL], "./xpm/clockxpm/ringonclockface0.xpm");
pclock->mode = CLOCK_LEDS;//时钟显示方式置为LED模式
if (GTK_WIDGET_REALIZED (drawingarea))
clock_draw_internal (drawingarea);
}voidon_ClockModeButton_clicked (GtkButton *button, gpointer user_data){ gint i;
GdkColor newcolor;
GtkStyle *newstyle;
GdkBitmap *mask;
GtkWidget *drawingarea; g_return_if_fail (button != NULL);
if (modebutton !=NULL)//隐藏12/24模式按钮 gtk_widget_hide (modebutton);
if (ringstate)//取当前闹铃状态,并设置当前闹铃图标
RingPixmap = gdk_pixmap_colormap_create_from_xpm (NULL, gtk_widget_get_default_colormap (),
&mask, NULL, "./xpm/clockxpm/ringonclockface3.xpm");
else
RingPixmap = gdk_pixmap_colormap_create_from_xpm (NULL, gtk_widget_get_default_colormap (),
&mask, NULL, "./xpm/clockxpm/ringonclockface4.xpm");
drawingarea = lookup_widget (GTK_WIDGET (button), "Drawingarea"); gdk_draw_rectangle (drawingarea->window, drawingarea->style->white_gc, TRUE, 0, 0, 168, 173);//用于PDA上屏幕刷新
gtk_widget_set_uposition (drawingarea, 41, 69);//在本电话机上必须使用,否则位置不正确
gtk_widget_set_usize (drawingarea, 88, 86);
if (pclock->mode != CLOCK_ANALOG)
{
newstyle = gtk_style_copy (gtk_widget_get_style (drawingarea));
newcolor.red = 1*0xffff;
newcolor.green = 1*0xffff;
newcolor.blue = 1*0xffff;
for (i = 0; i < 5; i++)
newstyle->bg[i] = newcolor;
gtk_widget_set_style (drawingarea, newstyle);
}
gtk_widget_set_uposition (ClockCalendarFixed, 0, 20);//在本电话机上必须使用,否则位置不正确。
gtk_widget_set_usize (ClockCalendarFixed, 320, 195);//并且程序执行顺序不能改动
pclock->mode = CLOCK_ANALOG;//时钟显示方式置为ANALOG模式
if (GTK_WIDGET_REALIZED (drawingarea))
clock_draw_internal (drawingarea);
}voidon_Calendar_day_selected (Calendar *calendar,
gpointer user_data){ struct tm tm;
gchar buffer[40];
gchar szText[]="鼠牛虎兔龙蛇马羊猴鸡狗猪";
WORD LunarYear, LunarMonth, LunarDay;
WORD solartermnum;
GtkWidget *label;
memset (&tm, 0, sizeof (tm));
calendar_get_date (CALENDAR(calendar), &tm.tm_year, &tm.tm_mon, &tm.tm_mday);
if (tm.tm_year > 2050) { strcpy (buffer, "万年历只提供农历到2050年"); label = lookup_widget (GTK_WIDGET(calendar), "LCalendar");
gtk_label_set_text(GTK_LABEL(label), buffer); return;
}
tm.tm_mon += 1;
//得到农历年、月、日及24节气的代号
solartermnum = GetLunarDate(tm.tm_year, tm.tm_mon, tm.tm_mday,
&LunarYear, &LunarMonth, &LunarDay);
FormatLunarYear(LunarYear, buffer);//得到年的天干法表示
memcpy(buffer+5,szText+((LunarYear-4)%12)*2,2);
strcpy(buffer+7, ")年 ");
if (solartermnum)
{//如果当天为节气日,则显示“甲子 马年 今日 立冬”
if (DayIsHoliday(LunarYear, LunarMonth, LunarDay, buffer+11))//节气和节日重叠时
{
gchar str[15];
PaintChineseInfo(str, solartermnum);//得到节气代码的中文表示“今日 **”
buffer[21] = '(';
strncpy(buffer+22, str+6, 4);
buffer[26] = ')';
buffer[27] = '\0';
}
else
PaintChineseInfo(buffer+11, solartermnum);//得到节气代码的中文表示“今日 **”
}
else//显示“甲子(马) 农历:**月**日”
if(!(DayIsHoliday(LunarYear, LunarMonth, LunarDay, buffer+11)))
{
strcpy(buffer + 11, "农历:");
FormatMonth(LunarMonth, buffer + 16, 1);//得到农历月的中文表示
if(LunarMonth <= 10)
FormatLunarDay(LunarDay, buffer + 20);//得到农历日的中文表示
else
FormatLunarDay(LunarDay, buffer + 22);
}
label = lookup_widget (GTK_WIDGET(calendar), "LCalendar");
gtk_label_set_text(GTK_LABEL(label), buffer); timeout = FALSE;//在进行对My日历操作时,不对My日历复位,只有在操作挂起一段时间后才对My日历复位
}voidon_Calendar_next_month (Calendar *calendar, gpointer user_data){ calendar_mark_holy_days (GTK_WIDGET(calendar));//设置节假日数字变红
}voidon_Calendar_prev_month (Calendar *calendar, gpointer user_data){ calendar_mark_holy_days (GTK_WIDGET(calendar));}voidon_Calendar_next_year (Calendar *calendar, gpointer user_data){ calendar_mark_holy_days (GTK_WIDGET(calendar));//设置节假日数字变红}voidon_Calendar_prev_year (Calendar *calendar, gpointer user_data){ calendar_mark_holy_days (GTK_WIDGET(calendar));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -