diff options
author | James Meyer <james.meyer@operamail.com> | 2010-10-23 18:17:40 (GMT) |
---|---|---|
committer | James Meyer <james.meyer@operamail.com> | 2010-10-23 18:19:39 (GMT) |
commit | adbcf19958300e9b6598990184c8815b945ba0ee (patch) | |
tree | f4283c850ac0ac202c17e78a637ee7ca8147621b /abs/core-testing/LinHES-timezone/linhes_timezone.c | |
parent | 61a68250df10d29b624650948484898334ff22d0 (diff) | |
download | linhes_pkgbuild-adbcf19958300e9b6598990184c8815b945ba0ee.zip linhes_pkgbuild-adbcf19958300e9b6598990184c8815b945ba0ee.tar.gz linhes_pkgbuild-adbcf19958300e9b6598990184c8815b945ba0ee.tar.bz2 |
Removed old core and extra from repo. Renamed -testing to core/extra. This will setup the base for the testing branch.
Diffstat (limited to 'abs/core-testing/LinHES-timezone/linhes_timezone.c')
-rw-r--r-- | abs/core-testing/LinHES-timezone/linhes_timezone.c | 1120 |
1 files changed, 0 insertions, 1120 deletions
diff --git a/abs/core-testing/LinHES-timezone/linhes_timezone.c b/abs/core-testing/LinHES-timezone/linhes_timezone.c deleted file mode 100644 index d7a56d2..0000000 --- a/abs/core-testing/LinHES-timezone/linhes_timezone.c +++ /dev/null @@ -1,1120 +0,0 @@ -#include <stdio.h> -#include <math.h> -#include <stdlib.h> -#include <stdio.h> -#define _GNU_SOURCE -#include <string.h> -#include <strings.h> -#include <X11/Xlib.h> -#include <X11/Intrinsic.h> -#include <X11/IntrinsicI.h> -#include <lirc/lirc_client.h> -#include <pthread.h> - -#include "timezone_map.h" - -Display *display; -Window window; -GC gc; -int screen; -int selected_zone; -int selected_place; -Pixmap pixmap; -XColor ocean; -XColor land[8]; -XColor border; -XColor selected_border; -XColor selected_land; -XColor name_colour; -XColor location_dot; -XColor lat_lon; -XColor tux_yellow; -Dimension screen_width = 1920; -Dimension screen_height = 1080; -Dimension width = 1920; -Dimension height = 1080; -Position x = 0; -Position y = 0; -XFontStruct *font; -XPoint xpoints[1000]; -int radius; -double aspect_correction = 1; - -double target_lat; -double target_lon; - -double displayed_lat; -double displayed_lon; - -double lon_rotate[2] = {1, 0}; -double lat_rotate[2] = {1, 0}; - -double acceleration = 0.01; -char input_keys[200]; - -int guessing_timezone = FALSE; -time_t guess_timeout = 0; -int guess_failed = FALSE; -time_t guess_failed_timeout = 0; -int show_information = FALSE; -int info_displayed = 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; - vect_type v3; - - v2.x = v->x * lon_rotate[0] + v->y * lon_rotate[1]; - v2.y = v->x * -1.0 * lon_rotate[1] + v->y * lon_rotate[0]; - v2.z = v->z; - - v3.x = v2.x * lat_rotate[0] + v2.z * lat_rotate[1]; - v3.y = v2.y * radius; - v3.z = v2.x * -1.0 * lat_rotate[1] + v2.z * lat_rotate[0]; - - - // If the point is behind the face of the globe, project it to the edge. - if (v3.x < 0) - { - p->x = width /2 + radius * sin (atan2 (v3.y,v3.z)) * aspect_correction; - p->y = height/2 - radius * cos (atan2 (v3.y,v3.z)); - } - else - { - p->x = width /2 + lrint (v3.y) * aspect_correction; - p->y = height/2 - lrint (v3.z); - } - - // Return a value indicating if it is on the front of the world. - return (v3.x >= 0); -} - -void draw_zone ( - Drawable d, - int zone, - int fill, - int selected) -{ - int boundary = 0; - int num_points = 0; - int all_on_back = 1; - - if (selected && fill) - XSetForeground (display, gc, selected_land.pixel); - - while (boundary < zone_data[zone].num_boundary_points) - { - if (zone_data[zone].boundary_points[boundary].x < -9) - { - - if ((num_points > 1) && !all_on_back) - { - if (fill) - { - if (!selected) - { - if (zone == NUM_ZONES - 1) - { - if (boundary < 380) - XSetForeground (display, gc, WhitePixel (display, screen)); - else if (boundary < 470) - XSetForeground (display, gc, tux_yellow.pixel); - else if (boundary < 1120) - XSetForeground (display, gc, BlackPixel (display, screen)); - else - XSetForeground (display, gc, WhitePixel (display, screen)); - } - else - { - XSetForeground (display, gc, - land[boundary % XtNumber (land)].pixel); - } - } - - XFillPolygon ( - display, d, gc, - xpoints, - num_points, Complex, CoordModeOrigin); - } - else - XDrawLines ( - display, d, gc, - xpoints, - num_points, CoordModeOrigin); - } - - boundary++; - num_points = 0; - all_on_back = 1; - } - else - { - if (translate_point (&zone_data[zone].boundary_points[boundary], - &xpoints[num_points])) - all_on_back = 0; - - num_points++; - boundary++; - } - } -} - -void draw_string (int x, int y, const char*s, unsigned long colour) -{ - XSetForeground (display, gc, BlackPixel (display, screen)); - for (int x_pos = x - 3; x_pos <= x + 3; x_pos++) - for (int y_pos = y - 3; y_pos <= y + 3; y_pos++) - XDrawString (display, pixmap, gc, x_pos, y_pos, s, strlen (s)); - - XSetForeground (display, gc, colour); - XDrawString (display, pixmap, gc, x, y, s, strlen (s)); -} - -void draw_point (XPoint p, char *s) -{ - int text_width; - - int dot_size = ceil (sqrt (height) / 6.0); - - if (s) - dot_size += 2; - - XSetForeground (display, gc, - s ? WhitePixel (display, screen) : location_dot.pixel); - XFillRectangle (display, pixmap, gc, - p.x - dot_size / 2, p.y - dot_size / 2, dot_size, dot_size); - - XSetForeground (display, gc, BlackPixel (display, screen)); - XSetLineAttributes (display, gc, 2, LineSolid, CapRound, JoinRound); - XDrawRectangle (display, pixmap, gc, - p.x - dot_size / 2, p.y - dot_size / 2, dot_size, dot_size); - - if (s) - { - int text_x; - int text_y; - - text_width = XTextWidth (font, s, strlen (s)); - - if (p.x + text_width + 30 > width) - { - text_x = p.x - text_width - 6; - text_y = p.y + 10; - } - else - { - text_x = p.x + 6; - text_y = p.y + 10; - } - - draw_string (text_x, text_y, s, name_colour.pixel); - } -} - -void redraw_map () -{ - XPoint selected_point; - char selected_name[100]; - - lon_rotate[0] = cos (displayed_lon); - lon_rotate[1] = sin (displayed_lon); - - lat_rotate[1] = cos (displayed_lat) * radius; - lat_rotate[0] = sin (displayed_lat) * radius; - - /* Draw the map into the pixmap. */ - - XSetForeground (display, gc, BlackPixel (display, screen)); - XFillRectangle (display, pixmap, gc, 0, 0, width, height); - - XSetForeground (display, gc, ocean.pixel); - XFillArc (display, pixmap, gc, - width / 2 - radius * aspect_correction, height / 2 - radius, - radius * 2 * aspect_correction, radius * 2, 0, 360 * 64); - - XSetForeground (display, gc, lat_lon.pixel); - XSetLineAttributes (display, gc, 2, LineSolid, CapRound, JoinRound); - - for (int lon = 0; lon < 24; lon++) - for (int lat = 0; lat < 12 * 3; lat++) - { - XPoint line[2]; - vect_type v; - v.x = cos (lon * 15 * M_PI / 180) * cos ((90 - lat * 5) * M_PI / 180); - v.y = sin (lon * 15 * M_PI / 180) * cos ((90 - lat * 5) * M_PI / 180); - v.z = sin ((90 - lat * 5) / 180.0 * M_PI); - line[0] = line[1]; - if (translate_point (&v, &line[1]) && (lat > 0)) - XDrawLines (display, pixmap, gc, line, 2, CoordModeOrigin); - } - - for (int lat = 0; lat < 12; lat++) - for (int lon = 0; lon <= 24 * 3; lon++) - { - XPoint line[2]; - vect_type v; - v.x = cos (lon * 5 * M_PI / 180) * cos ((90 - lat * 15) * M_PI / 180); - v.y = sin (lon * 5 * M_PI / 180) * cos ((90 - lat * 15) * M_PI / 180); - v.z = sin ((90 - lat * 15) / 180.0 * M_PI); - line[0] = line[1]; - if (translate_point (&v, &line[1]) && (lon > 0)) - XDrawLines (display, pixmap, gc, line, 2, CoordModeOrigin); - } - - for (int zone = 0; zone < NUM_ZONES; zone++) - draw_zone (pixmap, zone, 1, 0); - - XSetLineAttributes (display, gc, 2, LineSolid, CapRound, JoinRound); - XSetForeground (display, gc, border.pixel); - for (int zone = 0; zone < NUM_ZONES - 1; zone++) - draw_zone (pixmap, zone, 0, 0); - - if (show_information) - { - info_displayed = TRUE; - char *s[4] = {"Left/Right: Change Offset", - "Up/Down: Change Location", - "Enter: Select Location", - "Esc: Abort"}; - int num = XtNumber(s); - for (int i = 0; i < num; i++) - { - int text_width = XTextWidth (font, s[i], strlen (s[i])); - draw_string (width/2 - text_width/2, - height/2 + (-2 + i) * (font->ascent + font->descent), - s[i], name_colour.pixel); - } - } - else if (guessing_timezone || (info_displayed = FALSE)) - { - 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 if (guess_failed) - { - char *s = "Unable to Guess Timezone"; - char *s2 = "Please Select Timezone Manually"; - int text_width = XTextWidth (font, s, strlen (s)); - draw_string (width/2 - text_width/2, height/2, s, name_colour.pixel); - text_width = XTextWidth (font, s2, strlen (s2)); - draw_string (width/2 - text_width/2, - height/2 + font->ascent + font->descent, - s2, name_colour.pixel); - } - else - { - 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++) - { - XPoint point; - - translate_point (&zone_data[selected_zone].place_info[place].v, &point); - - draw_point (point, NULL); - - 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); - - { - char zone_offset[100]; - sprintf (zone_offset, "UTC%s", zone_data[selected_zone].offset); - draw_string ( - ((width * 0.95 - XTextWidth (font, "UTC+88", strlen ("UTC+88"))) + - ((width / 2) + radius / sqrt (2))) / 2, - ((lrint (height * 0.05) + font->ascent) + - (height / 2 - radius / sqrt (2))) / 2, - zone_offset, name_colour.pixel); - } - } - - if (!guessing_timezone && !guess_failed) - { - const char *title = "Select Your Time Zone"; - const char *help = "Help = i"; - - draw_string (width / 2 - XTextWidth (font, title, strlen (title)) / 2, - ((lrint (height * 0.05) + font->ascent) + - (height / 2 - radius / sqrt (2))) / 2, - title, WhitePixel (display,screen)); - - draw_string (width * 0.05, height * 0.95 - font->descent - font->ascent, - help, name_colour.pixel); - } - - XCopyArea (display, pixmap, window, gc, 0, 0, width, height, 0, 0); -} - -int nearest_z (double near_z) -{ - double min_delta = - fabs (near_z - zone_data[selected_zone].place_info[0].v.z); - int min_delta_place = 0; - - for (int place = 1; place < zone_data[selected_zone].num_places; place++) - { - double delta = - fabs (near_z - zone_data[selected_zone].place_info[place].v.z); - - if (delta < min_delta) - { - min_delta_place = place; - min_delta = delta; - } - } - - return min_delta_place; -} - -void handle_key (char key) -{ - double selected_z; - - selected_z = zone_data[selected_zone].place_info[selected_place].v.z; - - if (show_information) - { - show_information = FALSE; - return; - } - - switch (key) - { - case 'U': - select_place ((selected_place + - zone_data[selected_zone].num_places - 1) % - zone_data[selected_zone].num_places); - break; - - case 'D': - select_place ((selected_place + 1) % - zone_data[selected_zone].num_places); - break; - - case 'L': - selected_zone = (selected_zone + NUM_ZONES - 1) % NUM_ZONES; - select_place (nearest_z (selected_z)); - break; - - case 'R': - selected_zone = (selected_zone + 1) % NUM_ZONES; - select_place (nearest_z (selected_z)); - break; - - case 'I': - show_information = !show_information; - break; - - case 'X': - printf ("%s\n", zone_data[selected_zone].place_info[selected_place].zonename); - exit (0); - - case 'E': - exit(1); - } -} - -void handle_event (XEvent *xevent) -{ - switch (xevent->type) - { - case Expose: - redraw_map (); - break; - - case KeyPress: - switch (XLookupKeysym (&xevent->xkey, 0)) - { - case XK_Up: - handle_key ('U'); - break; - - case XK_Down: - handle_key ('D'); - break; - - case XK_Left: - handle_key ('L'); - break; - - case XK_Right: - handle_key ('R'); - break; - - case XK_Return: - handle_key ('X'); - break; - - case XK_Escape: - handle_key ('E'); - break; - - case XK_I: - case XK_i: - handle_key ('I'); - break; - } - - break; - } -} - -Bool event_predicate (Display *display, XEvent *xevent, XPointer unused) -{ - return (xevent->type == KeyPress) || (xevent->type == Expose); -} - -void next_view () -{ - static double step_size = 0.01; - double error_total; - double lat_error = target_lat - displayed_lat; - double lon_error = target_lon - displayed_lon; - - if (guessing_timezone) - { - displayed_lon += 1 / 180.0 * M_PI; - } - else - { - 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 - { - 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; - - displayed_lat += step_size * (lat_error / error_total); - displayed_lon += step_size * (lon_error / error_total); - } - } -} - -void *lirc_thread (void *unused) -{ - int lirc_fd; - struct lirc_config *lirc_config; - char *lirc_code; - - if ((lirc_fd = lirc_init ("mythtv",0)) == -1) - fprintf (stderr,"Error initialising lirc\n"); - else - { - int readc_status; - - if (readc_status = lirc_readconfig (NULL, &lirc_config, NULL)) - { - fprintf (stderr,"Error loading lirc config file %d %p\n", readc_status, lirc_config); - } - } - - while ((lirc_nextcode (&lirc_code) == 0) && (lirc_code != NULL)) - { - char *action; - - while ((lirc_code2char (lirc_config, lirc_code, &action) == 0) && - (action != NULL)) - { - if (strcasecmp (action, "down") == 0) - strcat (input_keys, "D"); - - if (strcasecmp (action, "up") == 0) - strcat (input_keys, "U"); - - if (strcasecmp (action, "left") == 0) - strcat (input_keys, "L"); - - if (strcasecmp (action, "right") == 0) - strcat (input_keys, "R"); - - if (strcasecmp (action, "return") == 0) - strcat (input_keys, "X"); - - if (strcasecmp (action, "Esc") == 0) - strcat (input_keys, "E"); - } - - free (lirc_code); - lirc_code = NULL; - } -} - -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 \" <td value=\\\"-34.993\\\"\" ;" - "echo Longitude ; " - "echo \" <td value=\\\"138.6\\\"\" ;" - "echo TimeZone ; " - "echo \" <td value=\\\"+09:30\\\"\""; - } - else - { - timezone_info_command = - "wget http://www.geobytes.com/IpLocator.htm -O - 2> /dev/null |" - "grep \"^ <td \" |" - "grep -i -E -A1 \"Latitude|Longitude|TimeZone\" | grep -v \"^--$\""; - } - - guess_data = popen (timezone_info_command, "r"); - - if (!guess_data) - { - fprintf (stderr, "error parsing web page for timezone guess\n"); - if (guessing_timezone) - { - guessing_timezone = FALSE; - guess_failed = TRUE; - guess_failed_timeout = time (NULL) + 3; - } - return NULL; - } - - while (fgets (line_in, sizeof (line_in), guess_data)) - { - // Look for the entries in the guess data and then the next line - // will hold the value. - - if (strcasestr (line_in, "latitude")) - { - get_value (guess_data, line_in, sizeof (line_in)); - sscanf (line_in, "%lf", &guess_latitude); - } - else if (strcasestr (line_in, "longitude")) - { - get_value (guess_data, line_in, sizeof (line_in)); - sscanf (line_in, "%lf", &guess_longitude); - } - else if (strcasestr (line_in, "timezone")) - { - get_value (guess_data, line_in, sizeof (line_in)); - - // The geobytes timezone data is of the form "+09:30" whereas the - // map timezone data is of the form "+6" or "+9.5". Convert - // to the map timezone data format so we can find the timezone. - - if (strcmp (&line_in[3], ":30") == 0) - sprintf (&line_in[3], ".5"); - else - line_in[3] = 0; - - if (line_in[1] == '0') - memmove (&line_in[1], &line_in[2], strlen (&line_in[2]) + 1); - - strncpy (guess_zone, line_in, sizeof (guess_zone)); - } - } - - pclose (guess_data); - - if ((guess_latitude != invalid) && - (guess_longitude != invalid) && - guess_zone[0] != 0) - { - int zone; - - fprintf (stderr, "guessed lat lon %f %f %s\n", - guess_latitude, guess_longitude, guess_zone); - - // Look for the guessed zone in the zone_data structure. - for (zone = 0; zone < NUM_ZONES; zone++) - { - if (strcmp (guess_zone, zone_data[zone].offset) == 0) - break; - } - - if (zone == NUM_ZONES) - { - fprintf (stderr, "couldnt find zone %s\n", guess_zone); - if (guessing_timezone) - { - guessing_timezone = FALSE; - guess_failed = TRUE; - guess_failed_timeout = time (NULL) + 3; - } - } - else - { - double x,y,z; - double min_dist_squared; - int closest_place; - - // Look for the location in the zone nearest to the guess lat/lon. - - // Convert the guessed lat/lon to x,y,z. - - guess_latitude *= M_PI / 180.0; - guess_longitude *= M_PI / 180.0; - - x = cos (guess_longitude) * cos (guess_latitude); - y = sin (guess_longitude) * cos (guess_latitude); - z = sin (guess_latitude); - - min_dist_squared = - pow (x - zone_data[zone].place_info[0].v.x, 2) + - pow (y - zone_data[zone].place_info[0].v.y, 2) + - pow (z - zone_data[zone].place_info[0].v.z, 2); - closest_place = 0; - - for (int place = 1; place < zone_data[zone].num_places; place++) - { - double dist_squared; - - dist_squared = - pow (x - zone_data[zone].place_info[place].v.x, 2) + - pow (y - zone_data[zone].place_info[place].v.y, 2) + - pow (z - zone_data[zone].place_info[place].v.z, 2); - - if (dist_squared < min_dist_squared) - { - closest_place = place; - min_dist_squared = dist_squared; - } - } - - fprintf (stderr, "Guess=%s %s\n", - zone_data[zone].place_info[closest_place].zonename, - zone_data[zone].offset); - - selected_zone = zone; - select_place (closest_place); - } - } - else - { - if (guessing_timezone) - { - guessing_timezone = FALSE; - guess_failed = TRUE; - guess_failed_timeout = time (NULL) + 3; - } - } - - guessing_timezone = FALSE; - return NULL; -} - -void remove_titlebar_and_borders () -{ - XClassHint* classHint; - char* appname; - appname="look fo rme"; - XStoreName (display, window, appname); - - /* Set the name and class hints for the window manager to use. */ - - classHint = XAllocClassHint (); - if (classHint) - { - classHint->res_name = appname; - classHint->res_class = "MoonRoot"; - } - - XSetClassHint (display, window, classHint); - XFree (classHint); - - typedef struct - { - CARD32 flags; - CARD32 functions; - CARD32 decorations; - INT32 input_mode; - CARD32 status; - } MotifWmHints, MwmHints; - - #define MWM_HINTS_DECORATIONS (1L << 1) - - - Atom XA_MOTIF_WM_HINTS = XInternAtom (display, "_MOTIF_WM_HINTS", False); - MotifWmHints mwm_hints; - - mwm_hints.flags = MWM_HINTS_DECORATIONS; - mwm_hints.decorations = 0; - - XChangeProperty ( - display, window, - XA_MOTIF_WM_HINTS, XA_MOTIF_WM_HINTS, - 32, PropModeReplace, - (char *) &mwm_hints, 5); -} - -void set_window_position (int x, int y) -{ - XSizeHints hints; - - hints.flags = USPosition | PPosition; - hints.x = x; - hints.y = y; - - XSetWMNormalHints(display, window, &hints); -} - -int main (int argc, char *argv[]) -{ - XEvent xevent; - Colormap cmap; - XColor color, colorrgb; - pthread_t tid; - int opt; - int arg_width = -1; - int arg_height = -1; - char arg_zone[100] = {0}; - - if (getenv ("ACCEL")) - acceleration = atof (getenv ("ACCEL")); - - while ((opt = getopt (argc, argv, "z:w:h:a:")) != -1) - { - switch (opt) - { - case 'z': - strncpy (arg_zone, optarg, sizeof (arg_zone) - 1); - - if (strcasecmp (arg_zone, "guess") == 0) - { - guessing_timezone = TRUE; - arg_zone[0]=0; - } - - break; - - case 'w': - arg_width = atoi (optarg); - break; - - case 'h': - arg_height = atoi (optarg); - break; - - case 'a': - acceleration = atof (optarg); - break; - - case '?': - printf ("usage: %s [-a accelleration] [-z timezone] " - "[-w width] [-h height]\n" - "e.g. linhes_timezone -w 1920 -h 1090 -z Australia/Adelaide\n" - "specify a timezone of 'guess' to determine the initial " - "timezone from\n" - "your ip address using geocache.\n", - argv[0]); - exit (0); - break; - } - } - - pthread_create (&tid, NULL, lirc_thread, NULL); - - /* Connect to the X server. */ - - display = XOpenDisplay (""); - - if (display == NULL) - { - fprintf (stderr, "cannot connect to server\n"); - exit (EXIT_FAILURE); - } - - /* Get default screen. */ - - screen = DefaultScreen (display); - screen_width = XWidthOfScreen (DefaultScreenOfDisplay (display)); - screen_height = XHeightOfScreen (DefaultScreenOfDisplay (display)); - - if ((arg_width <= 0) && (arg_height > 0)) - arg_width == arg_height; - - if (arg_width > 0) - { - width = arg_width; - - if (arg_height <= 0) - height = width; - else - height = arg_height; - - x = (screen_width - width) / 2; - y = (screen_height - height) / 2; - } - else - { - width = screen_width; - height = screen_height; - x = 0; - y = 0; - } - - if (width < height) - radius = width; - else - radius = height; - - radius = 0.96 * radius / 2; - - if ((screen_height == 0) || - (XWidthMMOfScreen (DefaultScreenOfDisplay (display)) == 0)) - aspect_correction = 1; - else - aspect_correction = - sqrt (screen_width * - XHeightMMOfScreen (DefaultScreenOfDisplay (display)) * 1.0 / - screen_height / - XWidthMMOfScreen (DefaultScreenOfDisplay (display))); - - // Protect against very wierd aspect corrections from bogus - // screen dimensions. - if ((aspect_correction < 0.5) || (aspect_correction > 2)) - aspect_correction = 1; - - window = XCreateSimpleWindow (display, - DefaultRootWindow(display), x, y, width, height, 0, - land[0].pixel, ocean.pixel); - - remove_titlebar_and_borders (); - set_window_position (x, y); - - if (!window) - { - fprintf (stderr, "cannot open window\n"); - exit (EXIT_FAILURE); - } - - /* set graphics context of rectangle to red */ - gc= XCreateGC (display, window, 0, 0); - cmap = DefaultColormap (display, screen); - - // Load the font. - - font = XLoadQueryFont (display, (width > 800) ? - "-*-lucida-bold-r-*-*-34-*-*-*-*-*-*-*" : - "-*-lucida-bold-r-*-*-20-*-*-*-*-*-*-*"); - if (!font) - fprintf (stderr,"error loading font\n"); - - XSetFont (display, gc, font->fid); - - pixmap = - XCreatePixmap (display, window, width, height, - DefaultDepth (display, DefaultScreen (display))); - - ocean.flags = DoRed | DoGreen | DoBlue; - ocean.red = 40 * 256; - ocean.green = 41 * 256; - ocean.blue = 72 * 256; - if (XAllocColor (display, cmap, &ocean) == 0) - printf ("Cant allocate color\n"); - - lat_lon.flags = DoRed | DoGreen | DoBlue; - lat_lon.red = 0 * 256; - lat_lon.green = 0 * 256; - lat_lon.blue = 86 * 256; - if (XAllocColor (display, cmap, &lat_lon) == 0) - printf ("Cant allocate color\n"); - - tux_yellow.flags = DoRed | DoGreen | DoBlue; - tux_yellow.red = 248 * 256; - tux_yellow.green = 191 * 256; - tux_yellow.blue = 17 * 256; - if (XAllocColor (display, cmap, &tux_yellow) == 0) - printf ("Cant allocate color\n"); - - for (int land_col = 0; land_col < XtNumber (land); land_col++) - { - land[land_col].flags = DoRed | DoGreen | DoBlue; - land[land_col].red = (120 + 9 * land_col) * 256; - land[land_col].green = (40 + 3 * land_col) * 256; - land[land_col].blue = 0 * 256; - if (XAllocColor (display, cmap, &land[land_col]) == 0) - printf ("Cant allocate color\n"); - } - - selected_land.flags = DoRed | DoGreen | DoBlue; - selected_land.red = 3 * 256; - selected_land.green = 40 * 256; - selected_land.blue = 13 * 256; - if (XAllocColor (display, cmap, &selected_land) == 0) - printf ("Cant allocate color\n"); - - border.flags = DoRed | DoGreen | DoBlue; - border.red = 0 * 256; - border.green = 0 * 256; - border.blue = 0 * 256; - if (XAllocColor (display, cmap, &border) == 0) - printf ("Cant allocate color\n"); - - selected_border.flags = DoRed | DoGreen | DoBlue; - selected_border.red = 80 * 256; - selected_border.green = 255 * 256; - selected_border.blue = 80 * 256; - if (XAllocColor (display, cmap, &selected_border) == 0) - printf ("Cant allocate color\n"); - - name_colour.flags = DoRed | DoGreen | DoBlue; - name_colour.red = 255 * 256; - name_colour.green = 255 * 256; - name_colour.blue = 0 * 256; - if (XAllocColor (display, cmap, &name_colour) == 0) - printf ("Cant allocate color\n"); - - location_dot.flags = DoRed | DoGreen | DoBlue; - location_dot.red = 255 * 256; - location_dot.green = 55 * 256; - location_dot.blue = 200 * 256; - if (XAllocColor (display, cmap, &location_dot) == 0) - printf ("Cant allocate color\n"); - - // Find the selected timezone (or LA if a timezone was not selected) and - // make that the selected zone and place. - - default_zone (arg_zone); - - if (guessing_timezone) - { - pthread_create (&tid, NULL, timezone_guess, NULL); - guess_timeout = time (NULL) + 10; - displayed_lat = M_PI/2; - displayed_lon = 0; - } - else - { - displayed_lat = target_lat; - displayed_lon = target_lon; - } - - /* ask for exposure event and keyboard events */ - XSelectInput(display, window, KeymapNotify | ExposureMask); - - /* pop this window up on the screen */ - XMapRaised (display, window); - - redraw_map (); - - while (1) - { - if (guessing_timezone && (time (NULL) > guess_timeout)) - { - guessing_timezone = FALSE; - guess_failed_timeout = time (NULL) + 3; - guess_failed = TRUE; - } - - if ((displayed_lat != target_lat) || (displayed_lon != target_lon) || - guessing_timezone || guess_failed || - (info_displayed ^ show_information)) - { - if (guess_failed && (time (NULL) > guess_failed_timeout)) - { - guess_failed = FALSE; - } - - next_view (); - redraw_map (); - } - else - { - usleep (1000); - } - - while (strlen (input_keys)) - { - handle_key (input_keys[0]); - memmove (&input_keys[0], &input_keys[1], strlen (input_keys)); - } - - // If there is an event pending, go on to process it. - - if (XCheckIfEvent (display, &xevent, event_predicate, NULL)) - handle_event (&xevent); - } - - return 0; -} |