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

📄 calendar.c

📁 一个linux下的时钟软件
💻 C
📖 第 1 页 / 共 5 页
字号:
    calendar->highlight_row = -1;  calendar->highlight_col = -1;    calendar->focus_row = -1;  calendar->focus_col = -1;  calendar->xor_gc = NULL;  calendar->setting = 0;  private_data->max_year_width = 0;  private_data->max_month_width = 0;  private_data->max_day_char_width = 0;  private_data->max_week_char_width = 0;  private_data->max_day_char_ascent = 0;  private_data->max_day_char_descent = 0;  private_data->max_label_char_ascent = 0;  private_data->max_label_char_descent = 0;  private_data->arrow_width = 10;  private_data->freeze_count = 0;  private_data->dirty_header = 0;  private_data->dirty_day_names = 0;  private_data->dirty_week = 0;  private_data->dirty_main = 0;}GtkWidget*calendar_new (void){  return GTK_WIDGET (gtk_type_new (calendar_get_type()));}/* column_from_x: returns the column 0-6 that the * x pixel of the xwindow is in */static gintcolumn_from_x (Calendar *calendar,	       gint	    event_x){  gint c, column;  gint x_left, x_right;    column = -1;    for (c = 0; c < 7; c++)    {      x_left = left_x_for_column (calendar, c);      x_right = x_left + CALENDAR_PRIVATE_DATA (calendar)->day_width;            if (event_x >= x_left && event_x < x_right)		{		  column = c;		  break;		}    }    return column;}static gintrow_height (Calendar *calendar){  return (CALENDAR_PRIVATE_DATA (calendar)->main_h - CALENDAR_MARGIN				- ((calendar->display_flags & CALENDAR_SHOW_DAY_NAMES)				? CALENDAR_YSEP : CALENDAR_MARGIN)) / 6;}
/* row_from_y: returns the row 0-5 that the * y pixel of the xwindow is in */static gintrow_from_y (Calendar *calendar,	    gint	 event_y){  gint r, row;  gint height;  gint y_top, y_bottom;    height = row_height (calendar);  row = -1;    for (r = 0; r < 6; r++)    {      y_top = top_y_for_row (calendar, r);      y_bottom = y_top + height;            if (event_y >= y_top && event_y < y_bottom)		{		  row = r;		  break;		}    }    return row;}/* left_x_for_column: returns the x coordinate * for the left of the column */static gintleft_x_for_column (Calendar *calendar,		   gint		column){  gint width;  gint x_left;    width = CALENDAR_PRIVATE_DATA (calendar)->day_width;  if (calendar->display_flags & CALENDAR_SHOW_WEEK_NUMBERS)    x_left =  DAY_XSEP + (width + DAY_XSEP) * column;  else    x_left = CALENDAR_MARGIN + (width + DAY_XSEP) * column;    return x_left;}/* top_y_for_row: returns the y coordinate * for the top of the row */static ginttop_y_for_row (Calendar *calendar,	       gint	    row){    return (CALENDAR_PRIVATE_DATA (calendar)->main_h 				- (CALENDAR_MARGIN + (6 - row)				* row_height (calendar)));}/* This function should be done by the toolkit, but we don't like the * GTK arrows because they don't look good on this widget */static voiddraw_arrow_right (GdkWindow *window,		  GdkGC	    *gc,		  gint	     x,		  gint	     y,		  gint	     size){  gint i;    for (i = 0; i <= size / 2; i++)      gdk_draw_line (window, gc,		     x + i,		     y + i,		     x + i,		     y + size - i);}/* This function should be done by the toolkit, but we don't like the * GTK arrows because they don't look good on this widget */static voiddraw_arrow_left (GdkWindow *window,		 GdkGC	   *gc,		 gint	    x,		 gint	    y,		 gint	    size){  gint i;    for (i = 0; i <= size / 2; i++)      gdk_draw_line (window, gc,		     x + size/2 - i,		     y + i,		     x + size/2 - i,		     y + size - i);}static voidcalendar_set_month_prev (Calendar *calendar){  gint month_len;    if (calendar->display_flags & CALENDAR_NO_MONTH_CHANGE)    return;    if (calendar->month == 0)    {	  if(calendar->year == 1901)
		return;
      calendar->month = 11;      calendar->year--;    }   else     calendar->month--;
  month_len = month_length[leap (calendar->year)][calendar->month + 1];    calendar_freeze (calendar);  calendar_compute_days (calendar);    gtk_signal_emit (GTK_OBJECT (calendar), calendar_signals[PREV_MONTH_SIGNAL]);  gtk_signal_emit (GTK_OBJECT (calendar), calendar_signals[MONTH_CHANGED_SIGNAL]);    if (month_len < calendar->selected_day)    {      calendar->selected_day = 0;      calendar_select_day (calendar, month_len);    }  else    {      if (calendar->selected_day < 0)		calendar->selected_day = calendar->selected_day + 1 + 
					month_length[leap (calendar->year)][calendar->month + 1];      calendar_select_day (calendar, calendar->selected_day);    }    calendar_paint (GTK_WIDGET (calendar), NULL);  calendar_thaw (calendar);}static voidcalendar_set_month_next (Calendar *calendar){  gint month_len;    g_return_if_fail (calendar != NULL);  g_return_if_fail (GTK_IS_WIDGET (calendar));    if (calendar->display_flags & CALENDAR_NO_MONTH_CHANGE)    return;    if (calendar->month == 11)    {      calendar->month = 0;      calendar->year++;    }   else     calendar->month++;  calendar_freeze (calendar);  calendar_compute_days (calendar);  gtk_signal_emit (GTK_OBJECT (calendar), calendar_signals[NEXT_MONTH_SIGNAL]);  gtk_signal_emit (GTK_OBJECT (calendar), calendar_signals[MONTH_CHANGED_SIGNAL]);    month_len = month_length[leap (calendar->year)][calendar->month + 1];    if (month_len < calendar->selected_day)    {      calendar->selected_day = 0;      calendar_select_day (calendar, month_len);    }  else    calendar_select_day (calendar, calendar->selected_day);    calendar_paint (GTK_WIDGET(calendar), NULL);  calendar_thaw (calendar);}static voidcalendar_set_year_prev (Calendar *calendar){  gint month_len;    g_return_if_fail (calendar != NULL);  g_return_if_fail (GTK_IS_WIDGET (calendar));
  if(calendar->year == 1901)
	return;
  calendar->year--;    calendar_freeze (calendar);  calendar_compute_days (calendar);  gtk_signal_emit (GTK_OBJECT (calendar), calendar_signals[PREV_YEAR_SIGNAL]);  gtk_signal_emit (GTK_OBJECT (calendar), calendar_signals[MONTH_CHANGED_SIGNAL]);    month_len = month_length[leap (calendar->year)][calendar->month + 1];    if (month_len < calendar->selected_day)    {      calendar->selected_day = 0;      calendar_select_day (calendar, month_len);    }  else    calendar_select_day (calendar, calendar->selected_day);    calendar_paint (GTK_WIDGET (calendar), NULL);  calendar_thaw (calendar);}static voidcalendar_set_year_next (Calendar *calendar){  gint month_len;  GtkWidget *widget;    g_return_if_fail (calendar != NULL);  g_return_if_fail (GTK_IS_WIDGET (calendar));    widget = GTK_WIDGET (calendar);
  calendar_freeze (calendar);    calendar->year++;  calendar_compute_days (calendar);  gtk_signal_emit (GTK_OBJECT (calendar), calendar_signals[NEXT_YEAR_SIGNAL]);  gtk_signal_emit (GTK_OBJECT (calendar), calendar_signals[MONTH_CHANGED_SIGNAL]);    month_len = month_length[leap (calendar->year)][calendar->month + 1];    if (month_len < calendar->selected_day)    {      calendar->selected_day = 0;      calendar_select_day (calendar, month_len);    }  else    calendar_select_day (calendar, calendar->selected_day);    calendar_paint (GTK_WIDGET (calendar), NULL);  calendar_thaw (calendar);}static voidcalendar_main_button (GtkWidget	 *widget,			  GdkEventButton *event){  Calendar *calendar;  gint x, y;  gint row, col;  gint day_month;  gint old_focus_row, old_focus_col;    calendar = CALENDAR (widget);    x = (gint) (event->x);  y = (gint) (event->y);    row = row_from_y (calendar, y);  col = column_from_x (calendar, x);  /* If row or column isn't found, just return. */  if (row == -1 || col == -1)    return;    day_month = calendar->day_month[row][col];    if (day_month == MONTH_CURRENT)    {      if (event->type == GDK_2BUTTON_PRESS)		gtk_signal_emit (GTK_OBJECT (calendar), calendar_signals[DAY_SELECTED_DOUBLE_CLICK_SIGNAL]);      else		{		  if (!GTK_WIDGET_HAS_FOCUS (widget))		    gtk_widget_grab_focus (widget);		  old_focus_row = calendar->focus_row;		  old_focus_col = calendar->focus_col;		  calendar->focus_row = row;		  calendar->focus_col = col;		  calendar_paint_day (widget, old_focus_row, old_focus_col);		  calendar_select_day (calendar, calendar->day[row][col]);		}    }  else if (day_month == MONTH_PREV)    calendar_set_month_prev (calendar);  else if (day_month == MONTH_NEXT)    calendar_set_month_next (calendar);}static voidcalendar_realize_arrows (GtkWidget *widget){  Calendar *calendar;  CalendarPrivateData *private_data;  GdkWindowAttr attributes;  gint attributes_mask;  gint i;    g_return_if_fail (widget != NULL);  g_return_if_fail (IS_CALENDAR (widget));    calendar = CALENDAR (widget);  private_data = CALENDAR_PRIVATE_DATA (widget);  /* Arrow windows ------------------------------------- */  if (! (calendar->display_flags & CALENDAR_NO_MONTH_CHANGE)      && (calendar->display_flags & CALENDAR_SHOW_HEADING))    {      attributes.wclass = GDK_INPUT_OUTPUT;      attributes.window_type = GDK_WINDOW_CHILD;      attributes.visual = gtk_widget_get_visual (widget);      attributes.colormap = gtk_widget_get_colormap (widget);      attributes.event_mask = (gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK			       | GDK_BUTTON_PRESS_MASK	| GDK_BUTTON_RELEASE_MASK			       | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);      attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;      attributes.y = 3;      attributes.width  = private_data->arrow_width;      attributes.height = private_data->header_h - 7;      for (i = 0; i < 4; i++)	  {	   switch (i)	    {	     case ARROW_MONTH_LEFT:	      attributes.x = 3;	      break;	     case ARROW_MONTH_RIGHT:	      attributes.x = (private_data->arrow_width 			      + private_data->max_month_width);	      break;	     case ARROW_YEAR_LEFT:	      attributes.x = (widget->allocation.width - 4			      - (3 + 2*private_data->arrow_width 				  + private_data->max_year_width));	      break;	     case ARROW_YEAR_RIGHT:	      attributes.x = (widget->allocation.width - 4 			      - 3 - private_data->arrow_width);	      break;		}	   private_data->arrow_win[i] = gdk_window_new (private_data->header_win, &attributes, 													attributes_mask);	   private_data->arrow_state[i] = GTK_STATE_NORMAL;	   gdk_window_set_background (private_data->arrow_win[i], HEADER_BG_COLOR (GTK_WIDGET (calendar)));	   gdk_window_show (private_data->arrow_win[i]);	   gdk_window_set_user_data (private_data->arrow_win[i], widget);	  }    }  else      for (i = 0; i < 4; i++)		private_data->arrow_win[i] = NULL;}static voidcalendar_realize_header (GtkWidget *widget){  Calendar *calendar;  CalendarPrivateData *private_data;  GdkWindowAttr attributes;  gint attributes_mask;    g_return_if_fail (widget != NULL);  g_return_if_fail (IS_CALENDAR (widget));    calendar = CALENDAR (widget);  private_data = CALENDAR_PRIVATE_DATA (widget);  /* Header window ------------------------------------- */  if (calendar->display_flags & CALENDAR_SHOW_HEADING)    {      attributes.wclass = GDK_INPUT_OUTPUT;      attributes.window_type = GDK_WINDOW_CHILD;      attributes.visual = gtk_widget_get_visual (widget);      attributes.colormap = gtk_widget_get_colormap (widget);      attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK;      attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;      attributes.x = 2;      attributes.y = 2;      attributes.width = widget->allocation.width - 4;      attributes.height = private_data->header_h;      private_data->header_win = gdk_window_new (widget->window, &attributes, attributes_mask);	  gdk_window_set_background (private_data->header_win, HEADER_BG_COLOR (GTK_WIDGET (calendar)));      gdk_window_show (private_data->header_win);      gdk_window_set_user_data (private_data->header_win, widget);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -