⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 callbacks.c

📁 一个linux下的时钟软件
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -