From abae5612155504ff82912331e9a586dafcab41f4 Mon Sep 17 00:00:00 2001 From: Unconfigured Date: Thu, 9 Jul 2009 14:13:40 +0930 Subject: LinHES-timezone: Add -z guess option to auto-detect timezone from IP addr --- abs/core-testing/LinHES-timezone/PKGBUILD | 4 +- abs/core-testing/LinHES-timezone/linhes_timezone.c | 364 +++++++++++++++++---- 2 files changed, 295 insertions(+), 73 deletions(-) diff --git a/abs/core-testing/LinHES-timezone/PKGBUILD b/abs/core-testing/LinHES-timezone/PKGBUILD index ffad3a9..0b0d2ad 100644 --- a/abs/core-testing/LinHES-timezone/PKGBUILD +++ b/abs/core-testing/LinHES-timezone/PKGBUILD @@ -2,7 +2,7 @@ # Maintainer: Greg Frost pkgname=LinHES-timezone pkgver=1 -pkgrel=5 +pkgrel=6 pkgdesc="GUI timezone selector used by LinHES-config." arch=i686 depends=() @@ -27,4 +27,4 @@ md5sums=('53976e51e938c555f84b43c933339051' '0d9e51af5f650dd329edce4531c42a58' 'c01e2335603d8395004e32bae9060fde' 'b20bd68272644f607fbfe7d50e7be42a' - 'b35602b7330c32a472223b22d95a1d6c') + '448ffca8f38b2dcd989e599ff2057399') diff --git a/abs/core-testing/LinHES-timezone/linhes_timezone.c b/abs/core-testing/LinHES-timezone/linhes_timezone.c index 024560f..ff75549 100644 --- a/abs/core-testing/LinHES-timezone/linhes_timezone.c +++ b/abs/core-testing/LinHES-timezone/linhes_timezone.c @@ -2,6 +2,8 @@ #include #include #include +#define _GNU_SOURCE +#include #include #include #include @@ -49,6 +51,41 @@ double lat_rotate[2] = {1, 0}; double acceleration = 0.01; char input_keys[200]; +int guessing_timezone = FALSE; + +void select_place (int place) +{ + target_lon = atan2 (zone_data[selected_zone].place_info[place].v.y, + zone_data[selected_zone].place_info[place].v.x); + target_lat = acos (zone_data[selected_zone].place_info[place].v.z /2); + + selected_place = place; +} + +void default_zone (char *arg_zone) +{ + int found_zone = FALSE; + + for (int zone = 0; zone < NUM_ZONES; zone++) + { + for (int place = 0; place < zone_data[zone].num_places; place++) + { + if (strstr (zone_data[zone].place_info[place].zonename, + arg_zone[0] ? arg_zone : "Los_Angeles")) + { + selected_zone = zone; + select_place (place); + found_zone = TRUE; + } + } + } + + if (!found_zone) + { + default_zone (""); + } +} + int translate_point (vect_type *v, XPoint *p) { vect_type v2; @@ -259,53 +296,53 @@ void redraw_map () for (int zone = 0; zone < NUM_ZONES - 1; zone++) draw_zone (pixmap, zone, 0, 0); - draw_zone (pixmap, selected_zone, 1, 1); - XSetForeground (display, gc, selected_border.pixel); - draw_zone (pixmap, selected_zone, 0, 1); - - for (int place = 0; place < zone_data[selected_zone].num_places; place++) + if (guessing_timezone) { - XPoint point; + char *s = "Guessing Timezone"; + int text_width = XTextWidth (font, s, strlen (s)); + draw_string (width/2 - text_width/2, height/2, s, name_colour.pixel); + } + else + { + draw_zone (pixmap, selected_zone, 1, 1); + XSetForeground (display, gc, selected_border.pixel); + draw_zone (pixmap, selected_zone, 0, 1); - translate_point (&zone_data[selected_zone].place_info[place].v, &point); + for (int place = 0; place < zone_data[selected_zone].num_places; place++) + { + XPoint point; + + translate_point (&zone_data[selected_zone].place_info[place].v, &point); - draw_point (point, NULL); + draw_point (point, NULL); - if (place == selected_place) - { - char *underscore; - selected_point = point; - strcpy (selected_name, strchr (zone_data[selected_zone].place_info[place].zonename, '/') + 1); - while (underscore = strchr (selected_name, '_')) - underscore[0] = ' '; + if ((place == selected_place) && (!guessing_timezone)) + { + char *underscore; + selected_point = point; + strcpy (selected_name, strchr (zone_data[selected_zone].place_info[place].zonename, '/') + 1); + while (underscore = strchr (selected_name, '_')) + underscore[0] = ' '; + } } - } - draw_point (selected_point, selected_name); + draw_point (selected_point, selected_name); - { - char zone_offset[100]; - sprintf (zone_offset, "UTC%s", zone_data[selected_zone].offset); - draw_string ( - ((width * 0.95 - XTextWidth (font, zone_offset, strlen (zone_offset))) + - ((width / 2) + radius / sqrt (2))) / 2, - ((lrint (height * 0.05) + font->ascent) + - (height / 2 - radius / sqrt (2))) / 2, - zone_offset, name_colour.pixel); + { + char zone_offset[100]; + sprintf (zone_offset, "UTC%s", zone_data[selected_zone].offset); + draw_string ( + ((width * 0.95 - XTextWidth (font, zone_offset, strlen (zone_offset))) + + ((width / 2) + radius / sqrt (2))) / 2, + ((lrint (height * 0.05) + font->ascent) + + (height / 2 - radius / sqrt (2))) / 2, + zone_offset, name_colour.pixel); + } } XCopyArea (display, pixmap, window, gc, 0, 0, width, height, 0, 0); } -void select_place (int place) -{ - target_lon = atan2 (zone_data[selected_zone].place_info[place].v.y, - zone_data[selected_zone].place_info[place].v.x); - target_lat = acos (zone_data[selected_zone].place_info[place].v.z /2); - - selected_place = place; -} - int nearest_z (double near_z) { double min_delta = @@ -417,31 +454,37 @@ void next_view () double lat_error = target_lat - displayed_lat; double lon_error = target_lon - displayed_lon; - lat_error = atan2 (sin (lat_error), cos( lat_error)); - lon_error = atan2 (sin (lon_error), cos (lon_error)); - - error_total = sqrt (lat_error * lat_error + lon_error * lon_error); - - if (error_total < acceleration) + if (guessing_timezone) { - displayed_lat = target_lat; - displayed_lon = target_lon; + displayed_lon += 1 / 180.0 * M_PI; } else { - if (error_total > (step_size + acceleration) * - (step_size + acceleration) / acceleration / 2) - step_size += acceleration; + lat_error = atan2 (sin (lat_error), cos( lat_error)); + lon_error = atan2 (sin (lon_error), cos (lon_error)); + + error_total = sqrt (lat_error * lat_error + lon_error * lon_error); + + if (error_total < acceleration) + { + displayed_lat = target_lat; + displayed_lon = target_lon; + } else - step_size -= acceleration; + { + if (error_total > (step_size + acceleration) * + (step_size + acceleration) / acceleration / 2) + step_size += acceleration; + else + step_size -= acceleration; - if (step_size < acceleration) - step_size = acceleration; + if (step_size < acceleration) + step_size = acceleration; - displayed_lat += step_size * (lat_error / error_total); - displayed_lon += step_size * (lon_error / error_total); + displayed_lat += step_size * (lat_error / error_total); + displayed_lon += step_size * (lon_error / error_total); + } } - } void *lirc_thread (void *unused) @@ -493,6 +536,176 @@ void *lirc_thread (void *unused) } } +void get_value (FILE *input, char*output, int out_len) +{ + const char *value_pattern = "value=\""; + char *value; + + output[0] = 0; + fgets (output, out_len, input); + + if (value = strcasestr (output, value_pattern)) + { + memmove (output, value + strlen (value_pattern), + strlen (value + strlen (value_pattern)) + 1); + } + + if (value = strchr (output, '"')) + value[0] = 0; +} + +void *timezone_guess (void *unused) +{ + const double invalid = 99999; + FILE *guess_data; + char line_in[1000]; + double guess_latitude = invalid; + double guess_longitude = invalid; + char guess_zone[1000] = {0}; + char *timezone_info_command; + + if (getenv ("FAKE_GEOBYTES")) + { + timezone_info_command = + "sleep 2 ; " + "echo Latitude ; " + "echo \" /dev/null |" + "grep \"^