After an evaluation, GNOME has moved from Bugzilla to GitLab. Learn more about GitLab.
No new issues can be reported in GNOME Bugzilla anymore.
To report an issue in a GNOME project, go to GNOME GitLab.
Do not go to GNOME Gitlab for: Bluefish, Doxygen, GnuCash, GStreamer, java-gnome, LDTP, NetworkManager, Tomboy.
Bug 22405 - set custom time format
set custom time format
Status: RESOLVED WONTFIX
Product: gnome-panel
Classification: Other
Component: clock
1.5.x
Other Linux
: Normal enhancement
: ---
Assigned To: gnome-core Maintainers
gnome-core Maintainers
Depends on:
Blocks:
 
 
Reported: 2000-08-28 17:40 UTC by Michael.Capell
Modified: 2004-12-22 21:47 UTC
See Also:
GNOME target: ---
GNOME version: Unversioned Enhancement


Attachments
new click looks (39.87 KB, patch)
2001-06-19 08:49 UTC, Kjartan Maraas
none Details | Review

Description Michael.Capell 2001-01-27 20:04:17 UTC
Package:  gnome-core
Severity: normal
Version:  1.2.1
Synopsis: panel clock "improvement" code...
Class:    support

Distribution: Red Hat Linux release 6.2 (Zoot)
System: Linux 2.2.14-5.0 i686 unknown
C library: glibc-2.1.3-15
C compiler: egcs-2.91.66
glib: 1.2.8
GTK+: 1.2.8
ORBit: ORBit 0.5.3
gnome-libs: gnome-libs 1.2.4
libxml: 1.8.9
gnome-print: gnome-print-0.20-0_helix_1
gnome-core: gnome-core 1.2.1


Description:
I'm so stupid, I can't figure out any other way to send "you" foax
code.

Here's a so-called improvement for gnome-core/applets/gen_util/clock.c
which implements customized formatting via strftime & font selection
(or not, defaults are restorable).

I tried to keep it as "lightweight" as possible, but as I havn't got a
clue
how most of these functions work it was more trial and error (that's
why, e.g., I ditched the "table" calls in setting up the properties
page).

If you could at least let me know to stop bothering you.....

Mike



--- Included file ---

/*
 * GNOME time/date display module.
 * (C) 1997 The Free Software Foundation
 *
 * Authors: Miguel de Icaza
 *          Federico Mena
 *          Stuart Parmenter
 *
 * Feel free to implement new look and feels :-)
 * I tried: Mike Capell
 */



#include <stdio.h>
#include <config.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include <time.h>
#include <gnome.h>
#include <gdk/gdkx.h>
#include <libgnomeui/gnome-window-icon.h>
#include <applet-widget.h>

#include "clock.h"

typedef struct _ClockData ClockData;
typedef void (*ClockUpdateFunc) (ClockData *, time_t);
struct _ClockData {
	GtkWidget *applet;
	GtkWidget *clockw;
	int timeout;
	int timeouttime;
	int hourformat;
        gboolean showdate;
	gboolean unixtime;
	gboolean gmt_time;
	gboolean showtooltip;
	ClockUpdateFunc update_func;
	PanelOrientType orient;
	int size;
        gboolean use_custom_fmt;
        char *custom_fmt;
        gboolean use_custom_font;
        char *custom_font;

	GtkWidget *props;
	int prop_hourformat;
        int prop_showdate;
	int prop_unixtime;
	int prop_gmt_time;
	int prop_showtooltip;
        int prop_use_custom_fmt;
        char *prop_custom_fmt;
        int prop_use_custom_font;
        char *prop_custom_font;
        GtkWidget *font_entry;
};

#define DEFAULT_CUSTOM_FMT "%a %d %b%n%H:%M"
#define DEFAULT_CUSTOM_FONT "-misc-fixed-medium-r-normal--20-200-75-75-c-100-iso8859-1"

typedef struct {
	GtkWidget *time; /*the time label*/
	GtkWidget *align; /* Needed for changing the padding */
} ComputerClock;


static void clock_properties (AppletWidget *applet, gpointer data);
static void clock_about      (AppletWidget *applet, gpointer data);
static void help_cb	     (GtkWidget *w, gpointer data);
static void phelp_cb	     (GtkWidget *w, gint tab, gpointer data);

static void
free_data(GtkWidget * widget, gpointer data)
{
	g_free(data);
}

static int
clock_timeout_callback(gpointer data)
{
	ClockData *cd = data;
	time_t current_time;

	time(&current_time);

	(*cd->update_func) (cd, current_time);
	if(cd->unixtime) {
		if (cd->timeouttime != 1000) {
			cd->timeouttime = 1000;
			cd->timeout = gtk_timeout_add(cd->timeouttime,
						      clock_timeout_callback,
						      cd);
			return FALSE;
		}
	} else {
		if (cd->timeouttime != 36000) {
			cd->timeouttime = 36000;
			cd->timeout = gtk_timeout_add(cd->timeouttime,
						      clock_timeout_callback,
						      cd);
			return FALSE;
		}
	}

	return TRUE;
}

static gboolean
applet_save_session(GtkWidget * w,
		    const char *privcfgpath,
		    const char *globcfgpath,
		    gpointer data)
{
	ClockData *cd = data;
	gnome_config_push_prefix(privcfgpath);
	gnome_config_set_int("clock/hourformat", cd->hourformat);
	gnome_config_set_int("clock/showdate", cd->showdate);
	gnome_config_set_int("clock/unixtime", cd->unixtime);
	gnome_config_set_int("clock/showtooltip", cd->showtooltip);
	gnome_config_set_int("clock/gmt_time", cd->gmt_time);
	gnome_config_set_int("clock/use_custom_fmt", cd->use_custom_fmt);
	gnome_config_set_string("clock/custom_fmt", cd->custom_fmt ? 
                                 cd->custom_fmt : DEFAULT_CUSTOM_FMT );
	gnome_config_set_int("clock/use_custom_font", cd->use_custom_font);
	gnome_config_set_string("clock/custom_font", cd->custom_font ? 
                                 cd->custom_font : DEFAULT_CUSTOM_FONT );
	gnome_config_pop_prefix();
	gnome_config_sync();
	gnome_config_drop_all();

	return FALSE;
}

static void
computer_clock_update_func(ClockData * cd, time_t current_time)
{
	ComputerClock *cc;
	struct tm *tm;
	GString *gs = g_string_new("");
	char date[20], hour[20], tooltip[30];

	cc = gtk_object_get_user_data(GTK_OBJECT(cd->clockw));

	if (cd->gmt_time)
		tm = gmtime(&current_time);
	else
		tm = localtime(&current_time);

	if (cd->unixtime) {
		if ((cd->orient == ORIENT_LEFT || cd->orient == ORIENT_RIGHT) &&
		    cd->size >= PIXEL_SIZE_STANDARD) {
			g_snprintf(hour,20,"%lu\n%lu",
				   (unsigned long)(current_time/100000L),
				   (unsigned long)(current_time%100000L));
		} else {
			g_snprintf(hour,20,"%lu",(unsigned long)current_time);
		} 
		g_string_append(gs,hour);
	} else {
	        if (cd->use_custom_fmt) {
		        char s[128];
			char l = sizeof(s);
                        if(cd->custom_fmt){
			        if (strftime(s, l, cd->custom_fmt,tm) == l)
                                        s[l-1] = '\0';
		                g_string_append(gs, s);
			} else 
		                g_string_append(gs, "Ouch");
	        } else {
                        if (cd->hourformat == 0) {
		                /* This format string is used, to display 
                                   the actual time in 12 hour format.  */
		                if ( (cd->orient == ORIENT_LEFT || 
                                      cd->orient == ORIENT_RIGHT) &&
		                    cd->size >= PIXEL_SIZE_STANDARD) {
			                if (strftime(hour, 20, _("%I:%M\n%p"),
                                                     tm) == 20)
                                                hour[19] = '\0';
                         	} else {
			                if (strftime(hour, 20, _("%I:%M %p"),
                                                     tm) == 20)
                                                hour[19] = '\0';
                                }
		                g_string_append(gs,hour);
	                } else if (cd->hourformat == 1) {
		                /* This format string is used, to display 
                                   the actual time in 24 hour format.  */
		                if (strftime(hour, 20, _("%H:%M"), tm) == 20)
			                hour[19] = '\0';
		                g_string_append(gs,hour);
	                } else {
		                g_string_append(gs,"Oops");
                        }
                	if (cd->showdate) {
		                if ((cd->orient == ORIENT_LEFT || 
                                     cd->orient == ORIENT_RIGHT) &&
		                     cd->size   >= PIXEL_SIZE_STANDARD) {
			                /* This format string is used, to 
                                           display the actual day, when 
                                           showing a vertical panel.  For an 
                                           explanation of this format string 
                                           type 'man strftime'.  */
			                if (strftime(date, 20, _("%a\n%b %d"), 
                                                     tm) == 20) date[19] = '\0';
		                } else {
			                /* This format string is used, to 
                                           display the actual day,
			                   when showing a horizontal panel.  */
			                if (strftime(date, 20, _("%a %b %d"), 
                                                     tm) == 20) date[19] = '\0';
		                }
		                if(cd->size < PIXEL_SIZE_STANDARD)
			                g_string_append_c(gs,' ');
		                else
			                g_string_append_c(gs,'\n');
		                g_string_append(gs,date);
	                }
	        }
	        /* Set the applets tooltip */
	        if (cd->showtooltip) {
		        if (strftime(tooltip, 30, _("%A, %B %d"), tm) == 30)
			        date[29] = '\0';
		        applet_widget_set_tooltip(APPLET_WIDGET(cd->applet), 
                                                  tooltip);
	        }
	}

	/*if we are vertical and narrow, just make it char per line*/
	if ((cd->orient == ORIENT_LEFT || cd->orient == ORIENT_RIGHT) &&
	    cd->size < PIXEL_SIZE_STANDARD) {
		char *p;
		GString *gst = g_string_new("");
		for(p=gs->str;*p;p++) {
			if(p!=gs->str)
				g_string_append_c(gst,'\n');
			g_string_append_c(gst,*p);
		}
		g_string_free(gs,TRUE);
		gs = gst;
	}
	gtk_label_set_text(GTK_LABEL(cc->time), gs->str);
	applet_widget_queue_resize(APPLET_WIDGET(cd->applet));
	g_string_free(gs,TRUE);
}

static void
create_computer_clock_widget(GtkWidget ** clock, ClockUpdateFunc * update_func)
{
	GtkWidget *frame;
	GtkWidget *vbox;
	ComputerClock *cc;

	frame = gtk_frame_new(NULL);
	gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
	gtk_widget_show(frame);

	cc = g_new(ComputerClock, 1);

	cc->align = gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
	gtk_container_set_border_width(GTK_CONTAINER(cc->align), 3);
	gtk_container_add(GTK_CONTAINER(frame), cc->align);
	gtk_widget_show(cc->align);

	vbox = gtk_vbox_new(FALSE, FALSE);
	gtk_container_add(GTK_CONTAINER(cc->align), vbox);
	gtk_widget_show(vbox);

	cc->time = gtk_label_new("hmm?");

	gtk_box_pack_start_defaults(GTK_BOX(vbox), cc->time);
	gtk_widget_show(cc->time);

	gtk_object_set_user_data(GTK_OBJECT(frame), cc);
	gtk_signal_connect(GTK_OBJECT(frame), "destroy",
			   (GtkSignalFunc) free_data,
			   cc);

	*clock = frame;
	*update_func = computer_clock_update_func;
}

static void
destroy_clock(GtkWidget * widget, gpointer data)
{
	ClockData *cd = data;
	gtk_timeout_remove(cd->timeout);
	if(cd->props)
		gtk_widget_destroy(cd->props);
	g_free(cd);
}

static void
create_clock_widget(ClockData *cd, GtkWidget * applet)
{
	GtkWidget *clock;
	struct tm *tm;
	time_t current_time;

	/*FIXME: different clock types here */
	create_computer_clock_widget(&clock, &cd->update_func);

	cd->clockw = clock;
	cd->applet = applet;

	cd->props = NULL;

	cd->orient = ORIENT_UP;
	cd->size = PIXEL_SIZE_STANDARD;

	gtk_signal_connect(GTK_OBJECT(clock), "destroy",
			   (GtkSignalFunc) destroy_clock,
			   cd);
	/* Call the clock's update function so that it paints its first state */
	time(&current_time);
	(*cd->update_func) (cd, current_time);

	/* Install timeout handler */
	if (cd->gmt_time)
		tm = gmtime(&current_time);
	else
		tm = localtime(&current_time);
    
	if(cd->unixtime)
		cd->timeouttime = 1000;
	else
		cd->timeouttime = 36000-(tm->tm_sec*600);
	cd->timeout = gtk_timeout_add(cd->timeouttime,
				      clock_timeout_callback,
				      cd);
}

/*these are commands sent over corba: */

/*this is when the panel orientation changes */
static void
applet_change_orient(GtkWidget * w, PanelOrientType o, gpointer data)
{
	ClockData *cd = data;
	time_t current_time;

	time(&current_time);
	cd->orient = o;
	(*cd->update_func) (cd, current_time);
}

/*this is when the panel size changes */
static void
applet_change_pixel_size(GtkWidget * w, int size, gpointer data)
{
	ClockData *cd = data;
	time_t current_time;
	ComputerClock *cc;

	/* Adjust the padding on the text for small sizes of the panel (so the widget doesn't become bigger than the panel */
	cc = gtk_object_get_user_data(GTK_OBJECT(cd->clockw));
	gtk_container_set_border_width(GTK_CONTAINER(cc->align), ((size < PIXEL_SIZE_SMALL)? 0 : 3 ) );
	
	time(&current_time);
	cd->size = size;
	(*cd->update_func) (cd, current_time);
}

static void
apply_properties_font(gpointer data)
{
	ClockData *cd = data;
	ComputerClock *cc;
	GtkStyle *style;
	GdkFont  *font;

	cc = gtk_object_get_user_data(GTK_OBJECT(cd->clockw));

	if (cd->use_custom_font && cd->custom_font) {
	       /*
                * hacked from gtk tutorial
                * FIXME: things should be freed ?
	        */
                font = gdk_font_load( cd->custom_font);
	        style = gtk_style_copy(gtk_widget_get_style(cc->time));
		gdk_font_unref(style->font);
		style->font = font;
                gdk_font_ref(style->font);
                gtk_widget_set_style( cc->time, style);
        } else {
                style = gtk_widget_get_style( cc->time->parent);
                gtk_widget_set_rc_style( cc->time);
	}
}

GtkWidget *
make_clock_applet(const gchar * goad_id)
{
	ClockData *cd;
	GtkWidget *applet;

	applet = applet_widget_new(goad_id);
	if (!applet) {
		g_warning(_("Can't create applet!\n"));
		return NULL;
	}

	cd = g_new(ClockData, 1);

	gnome_config_push_prefix(APPLET_WIDGET(applet)->privcfgpath);
	cd->hourformat = gnome_config_get_int("clock/hourformat=0");
	/* if on a small screen don't show data by default */
	if(gdk_screen_width()<=800)
		cd->showdate = gnome_config_get_int("clock/showdate=0");
	else
		cd->showdate = gnome_config_get_int("clock/showdate=1");

	cd->unixtime = gnome_config_get_int("clock/unixtime=0");
	/* if on a small screen show tooltip with date by default */
	if(gdk_screen_width()<=800)
		cd->showtooltip = gnome_config_get_int("clock/showtooltip=1");
	else
		cd->showtooltip = gnome_config_get_int("clock/showtooltip=0");
	cd->gmt_time = gnome_config_get_int("clock/gmt_time=0");
	cd->use_custom_fmt = gnome_config_get_int("clock/use_custom_fmt=0");
	cd->custom_fmt = gnome_config_get_string(
                           "clock/custom_fmt=" DEFAULT_CUSTOM_FMT);
	cd->use_custom_font = gnome_config_get_int("clock/use_custom_font=0");
	cd->custom_font = gnome_config_get_string(
                           "clock/custom_font=" DEFAULT_CUSTOM_FONT);
	gnome_config_pop_prefix();

	create_clock_widget(cd, applet);

	apply_properties_font(cd);

	/*we have to bind change_orient before we do applet_widget_add 
	  since we need to get an initial change_orient signal to set our
	  initial oriantation, and we get that during the _add call */
	gtk_signal_connect(GTK_OBJECT(applet), "change_orient",
			   GTK_SIGNAL_FUNC(applet_change_orient),
			   cd);
	/*similiar to the above in semantics*/
	gtk_signal_connect(GTK_OBJECT(applet), "change_pixel_size",
			   GTK_SIGNAL_FUNC(applet_change_pixel_size),
			   cd);

	gtk_widget_show(cd->clockw);
	applet_widget_add(APPLET_WIDGET(applet), cd->clockw);
	gtk_widget_show(applet);

	gtk_signal_connect(GTK_OBJECT(applet), "save_session",
			   GTK_SIGNAL_FUNC(applet_save_session),
			   cd);


	applet_widget_register_stock_callback(APPLET_WIDGET(applet),
					      "properties",
					      GNOME_STOCK_MENU_PROP,
					      _("Properties..."),
					      clock_properties,
					      cd);

	applet_widget_register_stock_callback(APPLET_WIDGET(applet),
					      "help",
					      GNOME_STOCK_PIXMAP_HELP,
					      _("Help"),
					      help_cb,
					      "index.html" );

	applet_widget_register_stock_callback(APPLET_WIDGET(applet),
					      "about",
					      GNOME_STOCK_MENU_ABOUT,
					      _("About..."),
					      clock_about,
					      NULL);
	return applet;
}

static void
apply_properties(GtkWidget * widget, gint button_num, gpointer data)
{
	ClockData *cd = data;
	time_t current_time;
	struct tm *tm;

	cd->hourformat  = cd->prop_hourformat;
	cd->showdate    = cd->prop_showdate;
	cd->unixtime    = cd->prop_unixtime;
	cd->gmt_time    = cd->prop_gmt_time;
	cd->showtooltip = cd->prop_showtooltip;
	cd->use_custom_fmt = cd->prop_use_custom_fmt;
	cd->custom_fmt  = cd->prop_custom_fmt;
	cd->use_custom_font = cd->prop_use_custom_font;
	cd->custom_font  = cd->prop_custom_font;

	apply_properties_font(data);

	applet_widget_queue_resize(APPLET_WIDGET(cd->applet));
	/* Call the clock's update function so that it paints its first state */
	time(&current_time);
	(*cd->update_func) (cd, current_time);
	
	gtk_timeout_remove(cd->timeout);

	/* Install timeout handler */
	if (cd->gmt_time)
		tm = gmtime(&current_time);
	else
		tm = localtime(&current_time);

	if (cd->unixtime)
		cd->timeouttime = 1000;
	else
		cd->timeouttime = 36000-(tm->tm_sec*600);
	cd->timeout = gtk_timeout_add(cd->timeouttime,
				      clock_timeout_callback,
				      cd);		      
	if(!cd->showtooltip || cd->unixtime)
  		applet_widget_set_tooltip(APPLET_WIDGET(cd->applet), "");
				      
/* gtk_widget_queue_resize (cd->clockw);*/
}

static void
close_properties(GtkWidget * w, gpointer data)
{
	ClockData *cd = data;

	cd->props = NULL;
}

static void
set_hour_format_cb(GtkWidget * w, gpointer data)
{
	g_return_if_fail(w != NULL);
	if(GTK_TOGGLE_BUTTON(w)->active) {
		ClockData *cd = gtk_object_get_user_data(GTK_OBJECT(w));
		cd->prop_hourformat = (long)data;
		gnome_property_box_changed (GNOME_PROPERTY_BOX (cd->props));
	}
}

static void
set_show_date_cb(GtkWidget * w, gpointer data)
{
	ClockData *cd = data;

	cd->prop_showdate = GTK_TOGGLE_BUTTON(w)->active;
	gnome_property_box_changed (GNOME_PROPERTY_BOX (cd->props));
}

static void
set_datasensitive_cb(GtkWidget * w, GtkWidget *wid)
{
	gtk_widget_set_sensitive(wid,!(GTK_TOGGLE_BUTTON(w)->active));
}

static void
set_datainsensitive_cb(GtkWidget * w, GtkWidget *wid)
{
	gtk_widget_set_sensitive(wid, (GTK_TOGGLE_BUTTON(w)->active));
}

static void
set_unixtime_cb(GtkWidget * w, gpointer data)
{
	ClockData *cd = data;

	cd->prop_unixtime = GTK_TOGGLE_BUTTON(w)->active;
	gnome_property_box_changed (GNOME_PROPERTY_BOX (cd->props));
}

static void
set_gmt_time_cb(GtkWidget * w, gpointer data)
{
	ClockData *cd = data;

	cd->prop_gmt_time = GTK_TOGGLE_BUTTON(w)->active;
	gnome_property_box_changed (GNOME_PROPERTY_BOX (cd->props));
}

static void
set_show_tooltip_cb(GtkWidget * w, gpointer data)
{
	ClockData *cd = data;

	cd->prop_showtooltip = GTK_TOGGLE_BUTTON(w)->active;
	gnome_property_box_changed (GNOME_PROPERTY_BOX (cd->props));
}

static void
set_custom_fmt_cb(GtkWidget * w, gpointer data)
{
	g_return_if_fail(w != NULL);
	if(GTK_TOGGLE_BUTTON(w)->active) {
		ClockData *cd = gtk_object_get_user_data(GTK_OBJECT(w));
		cd->prop_use_custom_fmt = (long)data;
		gnome_property_box_changed (GNOME_PROPERTY_BOX (cd->props));
	}
}

static void
changed_custom_fmt_cb(GtkWidget * w, gpointer data)
{
	ClockData *cd = data;

	if(cd->prop_custom_fmt) 
                g_free(cd->prop_custom_fmt);

	cd->prop_custom_fmt = g_strdup(gtk_entry_get_text (GTK_ENTRY (w)));
	gnome_property_box_changed (GNOME_PROPERTY_BOX (cd->props));
}

static void
set_custom_font_cb(GtkWidget * w, gpointer data)
{
	ClockData *cd = data;

	cd->prop_use_custom_font = GTK_TOGGLE_BUTTON(w)->active;
	gnome_property_box_changed (GNOME_PROPERTY_BOX (cd->props));
}

static void
changed_custom_font_cb(GtkWidget * w, gpointer data)
{
	ClockData *cd = data;

	char *font;
	GtkWidget *peer;
	if (GNOME_IS_FONT_PICKER(w)){
		font = gnome_font_picker_get_font_name (GNOME_FONT_PICKER(w));
		peer = gtk_object_get_user_data (GTK_OBJECT(w));
		gtk_entry_set_text (GTK_ENTRY(peer), font);
	} else {
		font = gtk_entry_get_text (GTK_ENTRY(w));
		peer = gtk_object_get_user_data (GTK_OBJECT(w));
		gnome_font_picker_set_font_name (GNOME_FONT_PICKER(peer), font);
	        if(cd->prop_custom_font) 
                        g_free(cd->prop_custom_font);
        	cd->prop_custom_font = g_strdup(font);
	        gnome_property_box_changed (GNOME_PROPERTY_BOX (cd->props));
	}
}

/*
 * my understanding of what should be decided/displayed:
 *                     DEFAULT
 * show unix time ?      NO    (if YES nothing else matters)
 * else
 *   use GMT ?           NO
 *   use custom_fmt ?    NO    (if YES only tooltip active below)
 *   else
 *     12hr or 24hr      12hr
 *     date             (NO if small screen, else YES)
 *   tooltip date       (YES if small screen, else NO)
 *
 * I've adjusted the properties page to reflect this structure....
 */

static void
clock_properties(AppletWidget * applet, gpointer data)
{
        GtkWidget *vbox;
        GtkWidget *hbox;
        GtkWidget *label;
	GtkWidget *formatted;
	GtkWidget *unixtime;
        GtkWidget *format_frame;
        GtkWidget *format_vbox;
        GtkWidget *standard;
        GtkWidget *standard_hbox;
        GtkWidget *hour_hbox;
	GtkWidget *twelvehour;
	GtkWidget *twentyfourhour;
	GtkWidget *showdate;
	GtkWidget *use_custom_fmt;
	GtkWidget *custom_fmt;
	GtkWidget *use_custom_font;
	GtkWidget *font_picker;
	GtkWidget *use_gmt_time;
	GtkWidget *showtooltip;

	ClockData *cd = data;

	if(cd->props) {
		gdk_window_raise(cd->props->window);
		return;
	}
	cd->props = gnome_property_box_new();
	gtk_window_set_title (GTK_WINDOW (cd->props),
			      _("Clock properties"));
	gnome_window_icon_set_from_file (GTK_WINDOW (cd->props),
					 GNOME_ICONDIR"/gnome-clock.png");

	vbox = gtk_vbox_new(FALSE, GNOME_PAD_SMALL);

	hbox = gtk_hbox_new(FALSE, GNOME_PAD);
	gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
	gtk_widget_show(hbox);

	label = gtk_label_new(_("Show:"));
	gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
	gtk_widget_show(label);

	formatted = gtk_radio_button_new_with_label(NULL, _("Formatted"));
	gtk_box_pack_start (GTK_BOX(hbox), formatted, FALSE, FALSE, 0);
	gtk_object_set_user_data(GTK_OBJECT(formatted), (gpointer) data);
	gtk_widget_show(formatted);

	unixtime = gtk_radio_button_new_with_label(
                          gtk_radio_button_group(GTK_RADIO_BUTTON(formatted)), 
                                                   _("Unix"));
	gtk_box_pack_start (GTK_BOX(hbox), unixtime, FALSE, FALSE, 0);
	gtk_object_set_user_data(GTK_OBJECT(unixtime), (gpointer) data);
	gtk_widget_show(unixtime);

	label = gtk_label_new(_("Time"));
	gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
	gtk_widget_show(label);

	format_frame = gtk_frame_new(_("Format"));
	gtk_container_set_border_width(GTK_CONTAINER(format_frame), GNOME_PAD);
	gtk_box_pack_start (GTK_BOX(vbox), format_frame, FALSE, FALSE, 0);
	gtk_widget_show(format_frame);

	format_vbox = gtk_vbox_new(FALSE, GNOME_PAD_SMALL);
	gtk_container_add(GTK_CONTAINER(format_frame), format_vbox);
	gtk_widget_show(format_vbox);

	hbox = gtk_hbox_new(FALSE, GNOME_PAD);
	gtk_box_pack_start (GTK_BOX(format_vbox), hbox, FALSE, FALSE, 0);
	gtk_widget_show(hbox);

	standard = gtk_radio_button_new_with_label(NULL, _("Standard"));
	gtk_box_pack_start (GTK_BOX(hbox), standard, FALSE, FALSE, 0);
	gtk_object_set_user_data(GTK_OBJECT(standard), (gpointer) data);
	gtk_widget_show(standard);

	standard_hbox = gtk_hbox_new(FALSE, GNOME_PAD);
	gtk_box_pack_start (GTK_BOX(hbox), standard_hbox, FALSE, FALSE, 0);
	gtk_widget_show(standard_hbox);

	hour_hbox = gtk_hbox_new(FALSE, GNOME_PAD);
	gtk_container_add(GTK_CONTAINER(standard_hbox), hour_hbox);
	gtk_widget_show(hour_hbox);

	twelvehour = gtk_radio_button_new_with_label(NULL, _("12 hour"));
	gtk_box_pack_start (GTK_BOX(hour_hbox), twelvehour, FALSE, FALSE, 0);
	gtk_object_set_user_data(GTK_OBJECT(twelvehour), (gpointer) data);
	gtk_widget_show(twelvehour);

	twentyfourhour = gtk_radio_button_new_with_label(
			 gtk_radio_button_group(GTK_RADIO_BUTTON(twelvehour)),
					        _("24 hour"));

	gtk_box_pack_start (GTK_BOX(hour_hbox), twentyfourhour, 
                                                            FALSE, FALSE, 0);
	gtk_object_set_user_data(GTK_OBJECT(twentyfourhour), (gpointer) data);
	gtk_widget_show(twentyfourhour);

	showdate = gtk_check_button_new_with_label(_("Show date"));
	gtk_box_pack_start_defaults(GTK_BOX(standard_hbox), showdate);
	gtk_widget_show(showdate);

	hbox = gtk_hbox_new(FALSE, GNOME_PAD);
	gtk_box_pack_start (GTK_BOX(format_vbox), hbox, FALSE, FALSE, 0);
	gtk_widget_show(hbox);

	use_custom_fmt  = gtk_radio_button_new_with_label(
			 gtk_radio_button_group(GTK_RADIO_BUTTON(standard)),
					        _("Custom"));

	gtk_box_pack_start (GTK_BOX(hbox), use_custom_fmt, FALSE, FALSE, 0);
	gtk_object_set_user_data(GTK_OBJECT(use_custom_fmt), (gpointer) data);
	gtk_widget_show(use_custom_fmt);

        custom_fmt= gtk_entry_new ();
	gtk_box_pack_start_defaults(GTK_BOX(hbox), custom_fmt);
	gtk_widget_show(custom_fmt);

	hbox = gtk_hbox_new(FALSE, GNOME_PAD);
	gtk_box_pack_start (GTK_BOX(format_vbox), hbox, FALSE, FALSE, 0);
	gtk_widget_show(hbox);

	use_gmt_time = 
                    gtk_check_button_new_with_label(_("Use GMT"));
	gtk_box_pack_start_defaults(GTK_BOX(hbox), use_gmt_time);
	gtk_widget_show(use_gmt_time);
	
	hbox = gtk_hbox_new(FALSE, GNOME_PAD);
	gtk_box_pack_start (GTK_BOX(format_vbox), hbox, FALSE, FALSE, 0);
	gtk_widget_show(hbox);

	showtooltip = 
                    gtk_check_button_new_with_label(_("Show date in tooltip"));
	gtk_box_pack_start_defaults(GTK_BOX(hbox), showtooltip);
	gtk_widget_show(showtooltip);
	
	hbox = gtk_hbox_new(FALSE, GNOME_PAD);
	gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
	gtk_widget_show(hbox);

	use_custom_font = 
                    gtk_check_button_new_with_label(_("Font"));
	gtk_box_pack_start_defaults(GTK_BOX(hbox), use_custom_font);
	gtk_widget_show(use_custom_font);

        cd->font_entry = gtk_entry_new ();

	gtk_box_pack_start_defaults(GTK_BOX(hbox), cd->font_entry);
	gtk_widget_show(cd->font_entry);

        font_picker = gnome_font_picker_new();
        gnome_font_picker_set_mode(GNOME_FONT_PICKER (font_picker),
                                   GNOME_FONT_PICKER_MODE_USER_WIDGET);
        

        label = gtk_label_new (_("Browse..."));
	gtk_widget_show(label);

        gnome_font_picker_uw_set_widget(GNOME_FONT_PICKER(font_picker), 
                                        GTK_WIDGET(label));
	gtk_object_set_user_data(GTK_OBJECT(font_picker), 
                                 GTK_OBJECT(cd->font_entry)); 
	gtk_object_set_user_data(GTK_OBJECT(cd->font_entry), 
                                 GTK_OBJECT(font_picker)); 

	gtk_box_pack_start_defaults(GTK_BOX(hbox), font_picker);
	gtk_widget_show(font_picker);

        /* What is, isn't active, sensitive, etc */

	if (cd->unixtime) {
	        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(unixtime), TRUE);
	        gtk_widget_set_sensitive(format_frame, FALSE);
        } else {
	        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(formatted),TRUE);
	        gtk_widget_set_sensitive(format_frame, TRUE);
	}
	cd->prop_unixtime = cd->unixtime;

        if (cd->hourformat)
	        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(twentyfourhour),
                                                                          TRUE);
        else
	        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(twelvehour),
                                                                          TRUE);
	cd->prop_hourformat = cd->hourformat;

	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(showdate), cd->showdate);
	cd->prop_showdate = cd->showdate;

        if (cd->use_custom_fmt) {
	        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(use_custom_fmt),
					                                 TRUE);
                gtk_widget_set_sensitive(standard_hbox, FALSE); 
                gtk_widget_set_sensitive(custom_fmt, TRUE); 
        } else {
	        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(standard),
					                                 TRUE);
                gtk_widget_set_sensitive(standard_hbox, TRUE); 
                gtk_widget_set_sensitive(custom_fmt, FALSE); 
	}
	cd->prop_use_custom_fmt = cd->use_custom_fmt;

        gtk_entry_set_text (GTK_ENTRY (custom_fmt), cd->custom_fmt ? 
                                          cd->custom_fmt : DEFAULT_CUSTOM_FMT);
	cd->prop_custom_fmt = g_strdup(cd->custom_fmt);

        if (cd->use_custom_font) {
	        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(use_custom_font),
					                                  TRUE);
                gtk_widget_set_sensitive(cd->font_entry, TRUE); 
                gtk_widget_set_sensitive(font_picker, TRUE); 
	} else {
                gtk_widget_set_sensitive(cd->font_entry, FALSE); 
                gtk_widget_set_sensitive(font_picker, FALSE); 
	}
	cd->prop_use_custom_font = cd->use_custom_font;

	if (!cd->custom_font)
	        cd->custom_font = g_strdup( DEFAULT_CUSTOM_FONT);

        gtk_entry_set_text (GTK_ENTRY (cd->font_entry), cd->custom_font ); 
	
	gnome_font_picker_set_font_name(GNOME_FONT_PICKER(font_picker), 
			       gtk_entry_get_text(GTK_ENTRY (cd->font_entry)));

	cd->prop_custom_font = g_strdup(cd->custom_font);

	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(use_gmt_time),
					                      cd->gmt_time);
	cd->prop_gmt_time = cd->gmt_time;

        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(showtooltip),
					                       cd->showtooltip);
	cd->prop_showtooltip = cd->showtooltip;

        /* the primary callbacks for each button */

	gtk_signal_connect(GTK_OBJECT(unixtime),
			   "toggled",
			   (GtkSignalFunc) set_unixtime_cb,
			   data);

	gtk_signal_connect(GTK_OBJECT(standard),
			   "toggled",
			   (GtkSignalFunc) set_custom_fmt_cb,
			   (gpointer) 0);

	gtk_signal_connect(GTK_OBJECT(twelvehour),
			   "toggled",
			   (GtkSignalFunc) set_hour_format_cb,
			   (gpointer) 0);
	gtk_signal_connect(GTK_OBJECT(twentyfourhour),
			   "toggled",
			   (GtkSignalFunc) set_hour_format_cb,
			   (gpointer) 1);
	
	gtk_signal_connect(GTK_OBJECT(showdate),
			   "toggled",
			   (GtkSignalFunc) set_show_date_cb,
			   data);	   

	gtk_signal_connect(GTK_OBJECT(use_custom_fmt),
			   "toggled",
			   (GtkSignalFunc) set_custom_fmt_cb,
			   (gpointer) 1);

        gtk_signal_connect (GTK_OBJECT (custom_fmt), "changed",
                            GTK_SIGNAL_FUNC (changed_custom_fmt_cb), data);

	gtk_signal_connect(GTK_OBJECT(use_custom_font),
			   "toggled",
			   (GtkSignalFunc) set_custom_font_cb,
			   data);

        gtk_signal_connect (GTK_OBJECT (cd->font_entry), "changed",
                            GTK_SIGNAL_FUNC (changed_custom_font_cb), data);

        gtk_signal_connect (GTK_OBJECT (font_picker), "font_set",
                            GTK_SIGNAL_FUNC (changed_custom_font_cb), data);

	gtk_signal_connect(GTK_OBJECT(use_gmt_time),
			   "toggled",
			   (GtkSignalFunc) set_gmt_time_cb,
			   data);	

	gtk_signal_connect(GTK_OBJECT(showtooltip),
			   "toggled",
			   (GtkSignalFunc) set_show_tooltip_cb,
			   data);	

        /* further connections to keep sensitivity set ok */

	gtk_signal_connect(GTK_OBJECT(unixtime), "toggled",
			   (GtkSignalFunc) set_datasensitive_cb,
			   format_frame);

	gtk_signal_connect(GTK_OBJECT(standard), "toggled",
			   (GtkSignalFunc) set_datasensitive_cb,
			   custom_fmt);

	gtk_signal_connect(GTK_OBJECT(use_custom_fmt), "toggled",
			   (GtkSignalFunc) set_datasensitive_cb,
			   standard_hbox);

	gtk_signal_connect(GTK_OBJECT(use_custom_font), "toggled",
			   (GtkSignalFunc) set_datainsensitive_cb,
			   cd->font_entry);

	gtk_signal_connect(GTK_OBJECT(use_custom_font), "toggled",
			   (GtkSignalFunc) set_datainsensitive_cb,
			   font_picker);

	gtk_widget_show(vbox);

	gnome_property_box_append_page(GNOME_PROPERTY_BOX(cd->props), vbox,
				       gtk_label_new(_("Clock")));
	gtk_signal_connect(GTK_OBJECT(cd->props), "apply",
			   GTK_SIGNAL_FUNC(apply_properties), data);
	gtk_signal_connect(GTK_OBJECT(cd->props), "destroy",
			   GTK_SIGNAL_FUNC(close_properties), data);
	gtk_signal_connect(GTK_OBJECT(cd->props), "help",
			   GTK_SIGNAL_FUNC(phelp_cb),
			   "index.html#CLOCK-PREFS");

	gtk_widget_show(cd->props);
}

static void
help_cb (GtkWidget *w, gpointer data)
{
	GnomeHelpMenuEntry help_entry = { "clock_applet" };

	help_entry.path = data;
	gnome_help_display (NULL, &help_entry);
}

static void
phelp_cb (GtkWidget *w, gint tab, gpointer data)
{
	help_cb (w, data);
}

static void
clock_about (AppletWidget *applet, gpointer data)
{
	static GtkWidget   *about     = NULL;
	static const gchar *authors[] =
	{
		"Miguel de Icaza <miguel@kernel.org>",
		"Federico Mena <quartic@gimp.org>",
		"Stuart Parmenter <pavlov@innerx.net>",
		"Mike Capell <Michael.Capell@Cern.Ch>",
	NULL
	};

	if (about != NULL)
	{
		gdk_window_show (about->window);
		gdk_window_raise (about->window);
		return;
	}
	
	about = gnome_about_new (_("Clock Applet"), "1.001",
				 _("(c) 1998 the Free Software Foundation"),
				 authors,
				 _("The clock applet gives your panel a `lightweight' and simple display of the date and time"),
				 GNOME_ICONDIR"/gnome-clock.png");
	gnome_window_icon_set_from_file (GTK_WINDOW (about),
					 GNOME_ICONDIR"/gnome-clock.png");
	gtk_signal_connect (GTK_OBJECT(about), "destroy",
			    GTK_SIGNAL_FUNC(gtk_widget_destroyed), &about);
	gtk_widget_show (about);
}


--- End of file ---




------- Bug moved to this database by debbugs-export@bugzilla.gnome.org 2001-01-27 15:04 -------
This bug was previously known as bug 22405 at http://bugs.gnome.org/
http://bugs.gnome.org/show_bug.cgi?id=22405
Originally filed under the gnome-core product and general component.

Unknown version 1.2.x in product gnome-core. Setting version to the default, "unspecified".
The original reporter (Michael.Capell@Cern.Ch) of this bug does not have an account here.
Reassigning to the exporter, debbugs-export@bugzilla.gnome.org.
Reassigning to the default owner of the component, gnome-core-maint@bugzilla.gnome.org.

Comment 1 George Lebl 2001-02-16 05:48:49 UTC
Yaikes.   Could you try to make a patch next time rather then sending
the whole file.  It's impossible to know what you changed like this.
I will try to figure this out sometime after 1.4 perhaps
Comment 2 Kjartan Maraas 2001-06-19 08:49:13 UTC
Created attachment 659 [details] [review]
new click looks
Comment 3 Kjartan Maraas 2001-06-19 08:49:54 UTC
Attached a diff from the file in here and the current CVS version.
Comment 4 Luis Villa 2002-02-13 06:02:41 UTC
Is this still at all relevant? Please remove the PATCH keyword if the
patch has suffered too much bitrot.
Comment 5 Gediminas Paulauskas 2002-03-09 17:17:38 UTC
the patch is not so good, but the idea is:
1) allow to set custom format of displayed time
2) allow to change font
3) remove internet time
Comment 6 Dave Bordoley [Not Reading Bug Mail] 2002-04-11 11:48:25 UTC
ok well as far as setting a custom font, that should be won't fix,
however, setting a custom time format may be nice i guess. Actually in
my opinion, seem kind of like a waste, but i'll let maintainers decide.
Comment 7 Mark McLoughlin 2002-09-10 23:43:33 UTC
No, this shouldn't be configurable, we should just push for a good
default - see #80675.