diff -Nur gnome-panel-2.12.3/applets/clock/clock.c gnome-panel-2.12.3.new/applets/clock/clock.c --- gnome-panel-2.12.3/applets/clock/clock.c 2006-03-30 19:08:51.642329000 +0200 +++ gnome-panel-2.12.3.new/applets/clock/clock.c 2006-03-30 19:10:27.996350750 +0200 @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -112,7 +113,7 @@ /* widgets */ GtkWidget *applet; GtkWidget *clockw; - GtkWidget *toggle; +// GtkWidget *toggle; GtkWidget *props; GtkWidget *about; GtkWidget *calendar_popup; @@ -148,6 +149,11 @@ int fixed_width; int fixed_height; + int width; + int height; + int face_size; + + int toggle; GtkWidget *showseconds_check; GtkWidget *showdate_check; @@ -182,9 +188,17 @@ static void unfix_size (ClockData *cd) { - cd->fixed_width = -1; - cd->fixed_height = -1; - gtk_widget_queue_resize (cd->toggle); + int vertical = 0; + if (cd->orient == PANEL_APPLET_ORIENT_LEFT ||cd->orient == PANEL_APPLET_ORIENT_RIGHT) + vertical = 1; + + if (vertical) + gtk_widget_set_size_request(cd->applet, -1, cd->size -3); + else + gtk_widget_set_size_request(cd->applet, cd->size -3, -1); + //cd->fixed_width = -1; + //cd->fixed_height = -1; + //gtk_widget_queue_resize (cd->toggle); } static void @@ -215,7 +229,7 @@ time (&new_time); - if (!cd->showseconds && + /*if (!cd->showseconds && cd->format != CLOCK_FORMAT_UNIX && cd->format != CLOCK_FORMAT_CUSTOM) { if (cd->format == CLOCK_FORMAT_INTERNET && @@ -229,7 +243,8 @@ } } else { update_clock (cd); - } + }*/ + update_clock (cd); return TRUE; } @@ -366,12 +381,87 @@ atk_object_set_name (obj, name); } -static void -update_clock (ClockData * cd) -{ - struct tm *tm; - char date[256], hour[256]; - char *utf8, *loc; +#define DRAW_LINE(red,green,blue,line_width,inner_radius,outer_radius,angle_60ths) \ + h = sin ((angle_60ths) * M_PI / 30); \ + v = -cos ((angle_60ths) * M_PI / 30); \ + \ + cairo_save (cr); \ + cairo_set_source_rgb (cr, red, green, blue); \ + cairo_set_line_width (cr, (line_width) * cairo_get_line_width (cr)); \ + cairo_move_to (cr, \ + cd->width / 2 + (inner_radius) * radius * h, \ + cd->height / 2 + (inner_radius) * radius * v); \ + cairo_line_to (cr, \ + cd->width / 2 + (outer_radius) * radius * h, \ + cd->height / 2 + (outer_radius) * radius * v); \ + cairo_stroke (cr); \ + cairo_restore (cr); + +#define DRAW_HAND(red,green,blue,blob_radius, outer_radius,angle_60ths) \ + h = sin ((angle_60ths) * M_PI / 30); \ + v = -cos ((angle_60ths) * M_PI / 30); \ + \ + cairo_save (cr); \ + cairo_set_source_rgb (cr, red, green, blue); \ + cairo_arc_negative(cr, cd->width/2, cd->height/2, (blob_radius) * radius,\ + (angle_60ths)*M_PI/30 - M_PI, \ + (angle_60ths)*M_PI/30); \ + cairo_arc_negative (cr, \ + cd->width / 2 + (outer_radius) * radius * h, \ + cd->height / 2 + (outer_radius) * radius * v, \ + 0.3*(blob_radius)*radius, \ + (angle_60ths)*M_PI/30, \ + (angle_60ths)*M_PI/30 + M_PI); \ + cairo_fill (cr); \ + cairo_restore (cr); + +static gboolean expose_callback(GtkWidget *widget, GdkEventExpose *event, ClockData * cd){ + int i; + char date[256]; + char *utf8, *loc; + struct tm *tm; + double h,v; + + time (&cd->current_time); + + if (cd->gmt_time) + tm = gmtime (&cd->current_time); + else + tm = localtime (&cd->current_time); + + cairo_t *cr = gdk_cairo_create (cd->clockw->window); + + int radius = cd->face_size/2; + cairo_set_line_width(cr, 1); + cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); + + cairo_arc (cr, cd->width / 2, cd->height / 2, radius, 0, 2 * M_PI); + cairo_set_source_rgb (cr, 0.95, 0.95, 0.95); + cairo_fill_preserve (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_stroke (cr); + + cairo_arc (cr, cd->width / 2, cd->height / 2, 0.5 * radius, 0, 2 * M_PI); + cairo_set_source_rgb (cr, 0.75, 0.75, 0.8); + cairo_fill (cr); + + for (i = 0; i < 4; i++) + { + double inset, width; + inset = 0.2; + width = 1; + DRAW_LINE(0, 0, 0, width, 1.0 - inset, 1.0, i * 15); + } + + DRAW_HAND(0, 0, 0, 0.12, 0.6,tm->tm_hour * 5 + tm->tm_min / 12.0); + DRAW_HAND(0.1, 0.1, 0.1, 0.08, 0.9,tm->tm_min + tm->tm_sec / 60.0); + DRAW_LINE(1, 0, 0, 1.0, 0, 0.8,tm->tm_sec); + + cairo_destroy (cr); + cr = NULL; + +/* struct tm *tm; time (&cd->current_time); @@ -409,35 +499,35 @@ utf8 = g_locale_to_utf8 (hour, -1, NULL, NULL, NULL); gtk_label_set_text (GTK_LABEL (cd->clockw), utf8); + g_free (utf8);*/ + + //gtk_widget_queue_resize (cd->toggle); + + loc = g_locale_from_utf8 (_("%A %B %d, %H:%M:%S"), -1, NULL, NULL, NULL); + if (!loc) + strcpy (date, "???"); + else if (strftime (date, sizeof (date), loc, tm) <= 0) + strcpy (date, "???"); + g_free (loc); + + utf8 = g_locale_to_utf8 (date, -1, NULL, NULL, NULL); + set_tooltip (cd->applet, cd->clockw, utf8); + //set_tooltip (cd->applet, cd->toggle, utf8); g_free (utf8); - gtk_widget_queue_resize (cd->toggle); + return TRUE; - if (!cd->showdate) { - /* Show date in tooltip */ - loc = g_locale_from_utf8 (_("%A %B %d"), -1, NULL, NULL, NULL); - if (!loc) - strcpy (date, "???"); - else if (strftime (date, sizeof (date), loc, tm) <= 0) - strcpy (date, "???"); - g_free (loc); - - utf8 = g_locale_to_utf8 (date, -1, NULL, NULL, NULL); - set_tooltip (cd->applet, cd->toggle, utf8); - g_free (utf8); - } else { -#ifdef HAVE_LIBECAL - set_tooltip (cd->applet, cd->toggle, _("Click to view your appointments and tasks")); -#else - set_tooltip (cd->applet, cd->toggle, _("Click to view month calendar")); -#endif - } +} + +static void +update_clock (ClockData * cd){ + gtk_widget_queue_draw(cd->clockw); } static void refresh_clock (ClockData *cd) { - unfix_size (cd); +// unfix_size (cd); update_clock (cd); } @@ -446,7 +536,7 @@ { int timeouttime; - unfix_size (cd); +// unfix_size (cd); update_timeformat (cd); @@ -525,7 +615,8 @@ ClockData *cd) { if (event->keyval == GDK_Escape) { - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cd->toggle), FALSE); + //gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cd->toggle), FALSE); + cd->toggle = FALSE; return TRUE; } @@ -537,7 +628,8 @@ GdkEvent *event, ClockData *cd) { - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cd->toggle), FALSE); + //gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cd->toggle), FALSE); + cd->toggle = FALSE; return TRUE; } @@ -829,8 +921,8 @@ create_hig_frame (const char *title) { GtkWidget *vbox; - GtkWidget *alignment; GtkWidget *label; + GtkWidget *alignment; char *bold_title; vbox = gtk_vbox_new (FALSE, 6); @@ -1542,7 +1634,8 @@ static void update_popup (ClockData *cd) { - if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cd->toggle))) { + //if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cd->toggle))) { + if (!cd->toggle) { if (cd->calendar_popup) gtk_widget_destroy (cd->calendar_popup); cd->calendar_popup = NULL; @@ -1555,13 +1648,13 @@ (gpointer *) &cd->calendar_popup); } - if (cd->calendar_popup && GTK_WIDGET_REALIZED (cd->toggle)) { + if (cd->calendar_popup && GTK_WIDGET_REALIZED (cd->clockw)) { #ifdef HAVE_LIBECAL if (cd->tasks_filter && cd->task_list) gtk_tree_model_filter_refilter (cd->tasks_filter); #endif - present_calendar_popup (cd, cd->calendar_popup, cd->toggle); + present_calendar_popup (cd, cd->calendar_popup, cd->clockw); gtk_window_present (GTK_WINDOW (cd->calendar_popup)); } } @@ -1570,15 +1663,22 @@ toggle_calendar (GtkWidget *button, ClockData *cd) { - update_popup (cd); + cd->toggle = !cd->toggle; + update_popup(cd); } static gboolean do_not_eat_button_press (GtkWidget *widget, - GdkEventButton *event) + GdkEventButton *event, + ClockData *cd) { if (event->button != 1) g_signal_stop_emission_by_name (widget, "button_press_event"); + else { + cd->toggle = !cd->toggle; + update_popup (cd); + } + return FALSE; } @@ -1600,6 +1700,17 @@ req->height = cd->fixed_height; } +static void +clock_size_allocate (GtkWidget *clock, GtkAllocation *alloc, gpointer data) +{ + ClockData *cd = data; + + cd->width = alloc->width; + cd->height = alloc->height; + cd->face_size = alloc->width < alloc->height ? alloc->width : alloc->height; + +} + static inline void force_no_focus_padding (GtkWidget *widget) { @@ -1625,40 +1736,55 @@ create_clock_widget (ClockData *cd) { GtkWidget *clock; - GtkWidget *toggle; - GtkWidget *alignment; + //GtkWidget *toggle; - clock = gtk_label_new ("hmm?"); + //clock = gtk_label_new ("hmm?"); + clock = gtk_drawing_area_new(); g_signal_connect (clock, "size_request", G_CALLBACK (clock_size_request), cd); + g_signal_connect (clock, "size_allocate", + G_CALLBACK (clock_size_allocate), + cd); g_signal_connect_swapped (clock, "style_set", G_CALLBACK (unfix_size), cd); - gtk_label_set_justify (GTK_LABEL (clock), GTK_JUSTIFY_CENTER); + g_signal_connect (G_OBJECT (clock), + "expose_event", + G_CALLBACK (expose_callback), + cd); + gtk_widget_add_events(clock, GDK_ENTER_NOTIFY_MASK | + GDK_LEAVE_NOTIFY_MASK | + GDK_BUTTON_PRESS_MASK); + + g_signal_connect (clock, "button_press_event", + G_CALLBACK (do_not_eat_button_press), cd); + +// gtk_label_set_justify (GTK_LABEL (clock), GTK_JUSTIFY_CENTER); gtk_widget_show (clock); - toggle = gtk_toggle_button_new (); - gtk_container_set_resize_mode (GTK_CONTAINER (toggle), GTK_RESIZE_IMMEDIATE); - gtk_button_set_relief (GTK_BUTTON (toggle), GTK_RELIEF_NONE); + //toggle = gtk_toggle_button_new (); + //gtk_container_set_resize_mode (GTK_CONTAINER (toggle), GTK_RESIZE_IMMEDIATE); + //gtk_button_set_relief (GTK_BUTTON (toggle), GTK_RELIEF_NONE); - force_no_focus_padding (toggle); + //force_no_focus_padding (toggle); - alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0); - gtk_container_add (GTK_CONTAINER (alignment), clock); - gtk_container_set_resize_mode (GTK_CONTAINER (alignment), GTK_RESIZE_IMMEDIATE); - gtk_widget_show (alignment); - gtk_container_add (GTK_CONTAINER (toggle), alignment); + //alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0); + //gtk_container_add (GTK_CONTAINER (alignment), clock); + //gtk_container_set_resize_mode (GTK_CONTAINER (alignment), GTK_RESIZE_IMMEDIATE); + //gtk_widget_show (alignment); + //gtk_container_add (GTK_CONTAINER (toggle), alignment); + //gtk_container_add (GTK_CONTAINER (applet), clock); - g_signal_connect (toggle, "button_press_event", - G_CALLBACK (do_not_eat_button_press), NULL); + //g_signal_connect (toggle, "button_press_event", + // G_CALLBACK (do_not_eat_button_press), NULL); - g_signal_connect (toggle, "toggled", - G_CALLBACK (toggle_calendar), cd); + //g_signal_connect (toggle, "toggled", + // G_CALLBACK (toggle_calendar), cd); - gtk_widget_show (toggle); + //gtk_widget_show (toggle); - cd->toggle = toggle; + //cd->toggle = toggle; cd->clockw = clock; @@ -1667,12 +1793,12 @@ cd->orient = panel_applet_get_orient (PANEL_APPLET (cd->applet)); /* Initialize label orientation */ - if (cd->orient == PANEL_APPLET_ORIENT_LEFT) + /* if (cd->orient == PANEL_APPLET_ORIENT_LEFT) gtk_label_set_angle (GTK_LABEL (cd->clockw), 270); else if (cd->orient == PANEL_APPLET_ORIENT_RIGHT) gtk_label_set_angle (GTK_LABEL (cd->clockw), 90); else - gtk_label_set_angle (GTK_LABEL (cd->clockw), 0); + gtk_label_set_angle (GTK_LABEL (cd->clockw), 0); */ cd->size = panel_applet_get_size (PANEL_APPLET (cd->applet)); @@ -1683,6 +1809,7 @@ set_atk_name_description (GTK_WIDGET (cd->applet), NULL, _("Computer Clock")); + /* Refresh the clock so that it paints its first state */ refresh_clock_timeout(cd); } @@ -1696,13 +1823,15 @@ { cd->orient = orient; + /* if (cd->orient == PANEL_APPLET_ORIENT_LEFT) gtk_label_set_angle (GTK_LABEL (cd->clockw), 270); else if (cd->orient == PANEL_APPLET_ORIENT_RIGHT) gtk_label_set_angle (GTK_LABEL (cd->clockw), 90); else gtk_label_set_angle (GTK_LABEL (cd->clockw), 0); - + */ + unfix_size (cd); update_clock (cd); update_popup (cd); @@ -1737,6 +1866,7 @@ g_object_unref (style->bg_pixmap[GTK_STATE_NORMAL]); style->bg_pixmap[GTK_STATE_NORMAL] = g_object_ref (pixmap); gtk_widget_set_style (GTK_WIDGET (cd->applet), style); + gtk_widget_set_style (GTK_WIDGET (cd->clockw), style); g_object_unref (style); break; } @@ -2110,7 +2240,7 @@ options); position_calendar_popup (clock, clock->calendar_popup, - clock->toggle); + clock->clockw); } } @@ -2237,6 +2367,8 @@ cd->fixed_width = -1; cd->fixed_height = -1; + cd->toggle = FALSE; + cd->applet = GTK_WIDGET (applet); setup_gconf (cd); @@ -2278,8 +2410,9 @@ create_clock_widget (cd); gtk_container_set_border_width (GTK_CONTAINER (cd->applet), 0); - gtk_container_set_border_width (GTK_CONTAINER (cd->toggle), 0); - gtk_container_add (GTK_CONTAINER (cd->applet), cd->toggle); + //gtk_container_set_border_width (GTK_CONTAINER (cd->toggle), 0); + //gtk_container_add (GTK_CONTAINER (cd->applet), cd->toggle); + gtk_container_add (GTK_CONTAINER (cd->applet), cd->clockw); gtk_window_set_default_icon_name ("clock"); gtk_widget_show (cd->applet);