r3326 - in trunk/src/target/OM-2007.2/applications/openmoko-worldclock2: . data src
chris at sita.openmoko.org
chris at sita.openmoko.org
Thu Nov 1 19:35:45 CET 2007
Author: chris
Date: 2007-11-01 19:35:44 +0100 (Thu, 01 Nov 2007)
New Revision: 3326
Added:
trunk/src/target/OM-2007.2/applications/openmoko-worldclock2/data/openmoko-worldclock.desktop
Modified:
trunk/src/target/OM-2007.2/applications/openmoko-worldclock2/ChangeLog
trunk/src/target/OM-2007.2/applications/openmoko-worldclock2/data/Makefile.am
trunk/src/target/OM-2007.2/applications/openmoko-worldclock2/src/worldclock-main.c
Log:
* src/worldclock-main.c: (set_time), (close_clicked_cb),
(tzset_clicked_cb), (clock_idle), (remove_clock_idle_notify),
(map_enter_notify_cb), (map_leave_notify_cb),
(map_button_release_event_cb), (main):
Add setting of timezone, clicking on cities, showing sunrise/sunset
info, showing of times in other cities, etc.
Add .desktop file also
Modified: trunk/src/target/OM-2007.2/applications/openmoko-worldclock2/ChangeLog
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-worldclock2/ChangeLog 2007-11-01 17:09:23 UTC (rev 3325)
+++ trunk/src/target/OM-2007.2/applications/openmoko-worldclock2/ChangeLog 2007-11-01 18:35:44 UTC (rev 3326)
@@ -1,5 +1,14 @@
2007-11-01 Chris Lord <chris at openedhand.com>
+ * src/worldclock-main.c: (set_time), (close_clicked_cb),
+ (tzset_clicked_cb), (clock_idle), (remove_clock_idle_notify),
+ (map_enter_notify_cb), (map_leave_notify_cb),
+ (map_button_release_event_cb), (main):
+ Add setting of timezone, clicking on cities, showing sunrise/sunset
+ info, showing of times in other cities, etc.
+
+2007-11-01 Chris Lord <chris at openedhand.com>
+
* src/worldclock-main.c: (map_button_press_event_cb), (main):
Use a static map and add code to find the nearest timezone to where the
user clicks
Modified: trunk/src/target/OM-2007.2/applications/openmoko-worldclock2/data/Makefile.am
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-worldclock2/data/Makefile.am 2007-11-01 17:09:23 UTC (rev 3325)
+++ trunk/src/target/OM-2007.2/applications/openmoko-worldclock2/data/Makefile.am 2007-11-01 18:35:44 UTC (rev 3326)
@@ -1,3 +1,7 @@
+
+desktopdir = $(datadir)/applications
+desktop_DATA = openmoko-worldclock.desktop
+
resdir = $(pkgdatadir)
res_DATA =
Added: trunk/src/target/OM-2007.2/applications/openmoko-worldclock2/data/openmoko-worldclock.desktop
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-worldclock2/data/openmoko-worldclock.desktop 2007-11-01 17:09:23 UTC (rev 3325)
+++ trunk/src/target/OM-2007.2/applications/openmoko-worldclock2/data/openmoko-worldclock.desktop 2007-11-01 18:35:44 UTC (rev 3326)
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=World Clock
+Comment=See the time across the world
+Exec=openmoko-worldclock
+Icon=openmoko-worldclock
+Terminal=false
+Type=Application
+Categories=GTK;Utility;
+SingleInstance=true
+StartupNotify=true
Modified: trunk/src/target/OM-2007.2/applications/openmoko-worldclock2/src/worldclock-main.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-worldclock2/src/worldclock-main.c 2007-11-01 17:09:23 UTC (rev 3325)
+++ trunk/src/target/OM-2007.2/applications/openmoko-worldclock2/src/worldclock-main.c 2007-11-01 18:35:44 UTC (rev 3326)
@@ -30,8 +30,6 @@
#define GCONF_POKY_INTERFACE_PREFIX "/desktop/poky/interface"
#define GCONF_POKY_DIGITAL "/digital_clock"
-static gchar *location;
-
typedef struct {
GtkWidget *window;
GtkWidget *map;
@@ -44,6 +42,8 @@
gchar *location;
gdouble zoom_level;
+
+ gboolean map_entered;
} WorldClockData;
static inline GtkToolItem *
@@ -191,11 +191,14 @@
static gboolean
set_time (GtkWidget *map)
{
+ gchar *location;
JanaTime *time;
+ location = jana_ecal_utils_guess_location ();
time = jana_ecal_utils_time_now (location);
jana_gtk_world_map_set_time (JANA_GTK_WORLD_MAP (map), time);
g_object_unref (time);
+ g_free (location);
return TRUE;
}
@@ -265,14 +268,65 @@
}
}
+static void
+close_clicked_cb (GtkButton *button)
+{
+ GtkWidget *window = gtk_widget_get_toplevel (GTK_WIDGET (button));
+ gtk_widget_destroy (window);
+}
+
+static void
+tzset_clicked_cb (GtkButton *button, WorldClockZoneData *data)
+{
+ gconf_client_set_string (gconf_client_get_default (),
+ JANA_ECAL_LOCATION_KEY, data->tzname, NULL);
+ close_clicked_cb (button);
+}
+
static gboolean
-map_button_press_event_cb (JanaGtkWorldMap *map, GdkEventButton *event,
+clock_idle (JanaGtkClock *clock)
+{
+ JanaTime *time = jana_gtk_clock_get_time (clock);
+
+ jana_time_set_seconds (time, jana_time_get_seconds (time) + 1);
+ jana_gtk_clock_set_time (clock, time);
+ g_object_unref (time);
+
+ return TRUE;
+}
+
+static void
+remove_clock_idle_notify (gpointer data, GObject *clock)
+{
+ g_source_remove_by_user_data (clock);
+}
+
+static gboolean
+map_enter_notify_cb (GtkWidget *widget, GdkEventCrossing *event,
+ WorldClockData *data)
+{
+ data->map_entered = TRUE;
+ return FALSE;
+}
+
+static gboolean
+map_leave_notify_cb (GtkWidget *widget, GdkEventCrossing *event,
+ WorldClockData *data)
+{
+ data->map_entered = FALSE;
+ return FALSE;
+}
+
+static gboolean
+map_button_release_event_cb (JanaGtkWorldMap *map, GdkEventButton *event,
WorldClockData *data)
{
GList *markers, *m;
gdouble lat, lon, old_distance;
JanaGtkWorldMapMarker *marker;
+ if (!data->map_entered) return FALSE;
+
jana_gtk_world_map_get_latlon (map, event->x, event->y, &lat, &lon);
markers = jana_gtk_world_map_get_markers (map);
@@ -290,11 +344,152 @@
old_distance = distance;
}
}
-
- if (marker) {
+
+ /* FIXME: Seven is a completely arbitrary number.. */
+ if (marker && (old_distance < 7)) {
+ GtkWidget *window, *vbox, *hbox, *label, *clock, *button,
+ *frame;
+ gchar *string, *image_name, *path;
+ gdouble daylight_hours;
+ JanaTime *time;
+
WorldClockZoneData *tzdata = (WorldClockZoneData *)
g_object_get_data (G_OBJECT (marker), "zone");
- g_debug ("Nearest location: %s", tzdata->name);
+
+ /* Create window, set parent and set undecorated */
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_transient_for (GTK_WINDOW (window),
+ GTK_WINDOW (data->window));
+ gtk_window_set_decorated (GTK_WINDOW (window), FALSE);
+ gtk_window_set_modal (GTK_WINDOW (window), TRUE);
+ gtk_window_set_type_hint (GTK_WINDOW (window),
+ GDK_WINDOW_TYPE_HINT_DIALOG);
+ gtk_window_set_position (GTK_WINDOW (window),
+ GTK_WIN_POS_CENTER_ON_PARENT);
+
+ /* Create border for undecorated window */
+ frame = gtk_frame_new (NULL);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
+
+ /* Create contents */
+ vbox = gtk_vbox_new (FALSE, 6);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
+
+ /* Header label */
+ label = gtk_label_new (NULL);
+ gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
+ string = g_strconcat ("<big><b>", tzdata->name,
+ "</b></big>", NULL);
+ gtk_label_set_markup (GTK_LABEL (label), string);
+ g_free (string);
+ gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
+
+ /* Possible image */
+ image_name = g_strdelimit (g_utf8_strdown (
+ tzdata->country, -1), " '", '_');
+ path = g_strconcat (PKGDATADIR G_DIR_SEPARATOR_S,
+ image_name, ".svg", NULL);
+ g_free (image_name);
+ if (g_file_test (path, G_FILE_TEST_EXISTS)) {
+ GtkWidget *image = gtk_image_new_from_file (path);
+ gtk_box_pack_start (GTK_BOX (vbox),
+ image, FALSE, TRUE, 0);
+ }
+ g_free (path);
+
+ /* Clock */
+ clock = jana_gtk_clock_new ();
+ /* Note, we use this time below, so don't unref here */
+ time = jana_ecal_utils_time_now (tzdata->tzname);
+ jana_gtk_clock_set_time (JANA_GTK_CLOCK (clock), time);
+ jana_gtk_clock_set_digital (JANA_GTK_CLOCK (clock),
+ gconf_client_get_bool (gconf_client_get_default (),
+ GCONF_POKY_INTERFACE_PREFIX GCONF_POKY_DIGITAL, NULL));
+ jana_gtk_clock_set_show_seconds (JANA_GTK_CLOCK (clock), TRUE);
+#if GLIB_CHECK_VERSION(2,14,0)
+ g_timeout_add_seconds (1, (GSourceFunc)clock_idle, clock);
+#else
+ g_timeout_add (1000, (GSourceFunc)clock_idle, clock);
+#endif
+ g_object_weak_ref (G_OBJECT (clock), remove_clock_idle_notify,
+ NULL);
+ gtk_widget_set_size_request (clock,
+ (data->window->allocation.width * 2)/3,
+ (data->window->allocation.width * 2)/6);
+ gtk_box_pack_start (GTK_BOX (vbox), clock, FALSE, TRUE, 0);
+
+ /* Country label */
+ hbox = gtk_hbox_new (FALSE, 6);
+ label = gtk_label_new (NULL);
+ gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
+ gtk_label_set_markup (GTK_LABEL (label), "<b>Country:</b>");
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ label = gtk_label_new (tzdata->country);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+ gtk_box_pack_end (GTK_BOX (hbox), label, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+
+ daylight_hours = jana_utils_time_daylight_hours (
+ tzdata->lat, jana_utils_time_day_of_year (time));
+
+ /* Sunrise label */
+ hbox = gtk_hbox_new (FALSE, 6);
+ label = gtk_label_new (NULL);
+ gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
+ gtk_label_set_markup (GTK_LABEL (label), "<b>Sunrise:</b>");
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ jana_time_set_hours (time, (gint)(12.0-daylight_hours/2.0));
+ jana_time_set_minutes (time, (gint)
+ ((12.0-daylight_hours/2.0)*60.0)%60);
+ string = g_strdup_printf ("%d:%02d",
+ jana_time_get_hours (time),
+ jana_time_get_minutes (time));
+ label = gtk_label_new (string);
+ g_free (string);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+ gtk_box_pack_end (GTK_BOX (hbox), label, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+
+ /* Sunset label */
+ hbox = gtk_hbox_new (FALSE, 6);
+ label = gtk_label_new (NULL);
+ gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
+ gtk_label_set_markup (GTK_LABEL (label), "<b>Sunset:</b>");
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ jana_time_set_hours (time, (gint)(12.0+daylight_hours/2.0));
+ jana_time_set_minutes (time, (gint)
+ ((12.0+daylight_hours/2.0)*60.0)%60);
+ string = g_strdup_printf ("%d:%02d",
+ jana_time_get_hours (time),
+ jana_time_get_minutes (time));
+ label = gtk_label_new (string);
+ g_free (string);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+ gtk_box_pack_end (GTK_BOX (hbox), label, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+
+ /* Unref the time created earlier */
+ g_object_unref (time);
+
+ /* Set/close buttons */
+ hbox = gtk_hbox_new (FALSE, 0);
+ button = gtk_button_new_from_stock (GTK_STOCK_HOME);
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (tzset_clicked_cb), tzdata);
+ gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
+ button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (close_clicked_cb), NULL);
+ gtk_box_pack_end (GTK_BOX (hbox), button, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+
+ /* Pack and show widgets */
+ gtk_container_add (GTK_CONTAINER (window), frame);
+ gtk_container_add (GTK_CONTAINER (frame), vbox);
+ gtk_widget_show_all (window);
+
+ /* Display window */
+ gtk_widget_show (window);
}
g_list_free (markers);
@@ -350,9 +545,14 @@
jana_gtk_world_map_set_height (JANA_GTK_WORLD_MAP (data.map), 1024);
jana_gtk_world_map_set_static (JANA_GTK_WORLD_MAP (data.map), TRUE);
add_marks (&data);
- gtk_widget_add_events (GTK_WIDGET (data.map), GDK_BUTTON_PRESS_MASK);
- g_signal_connect (data.map, "button-press-event",
- G_CALLBACK (map_button_press_event_cb), NULL);
+ gtk_widget_add_events (GTK_WIDGET (data.map),
+ GDK_BUTTON_RELEASE_MASK);
+ g_signal_connect (data.map, "enter-notify-event",
+ G_CALLBACK (map_enter_notify_cb), &data);
+ g_signal_connect (data.map, "leave-notify-event",
+ G_CALLBACK (map_leave_notify_cb), &data);
+ g_signal_connect (data.map, "button-release-event",
+ G_CALLBACK (map_button_release_event_cb), &data);
data.map_aspect = gtk_aspect_frame_new (NULL, 0.5, 0.5, 2.0, FALSE);
gtk_frame_set_shadow_type (GTK_FRAME (
@@ -407,7 +607,6 @@
#endif
gtk_window_set_default_size (GTK_WINDOW (data.window), 480, 600);
- location = jana_ecal_utils_guess_location ();
id = g_timeout_add (1000 * 60 * 10, (GSourceFunc)set_time, data.map);
set_time (data.map);
@@ -418,7 +617,6 @@
gtk_main ();
g_source_remove (id);
- g_free (location);
return 0;
}
More information about the commitlog
mailing list