]> err.no Git - mapper/blobdiff - src/gtkgps.c
Add header and cast properly.
[mapper] / src / gtkgps.c
index 4535dee1cfcf037780a3e0e60d2d093e60979278..5302227a3cca0e77e4dc6facac74c9647e57b2d4 100644 (file)
@@ -33,6 +33,7 @@ static void gtk_gps_realize (GtkWidget *widget);
 static void gtk_gps_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
 static void gtk_gps_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
 static void gtk_gps_paint_by_mode(GtkGps *gps);
+static gboolean gtk_gps_refresh_cb(GtkWidget *widget);
 
 G_DEFINE_TYPE(GtkGps, gtk_gps, GTK_TYPE_WIDGET);
 
@@ -68,7 +69,9 @@ static void
 gtk_gps_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
 {
 GtkGps *gps;
+
 g_return_if_fail(GTK_IS_GPS(object));
+
 gps=GTK_GPS(object);
 switch (prop_id) {
        default:
@@ -81,7 +84,9 @@ static void
 gtk_gps_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec   *pspec)
 {
 GtkGps *gps;
+
 g_return_if_fail(GTK_IS_GPS(object));
+
 gps=GTK_GPS(object);
 switch (prop_id) {
        default:
@@ -93,13 +98,13 @@ switch (prop_id) {
 static void
 gtk_gps_init(GtkGps *gps)
 {
-g_printf("%s()\n", __PRETTY_FUNCTION__);
-
-gps->gc1=NULL;
-gps->gc2=NULL;
-gps->gc3=NULL;
-gps->width=400;
+gps->gc_w=NULL;
+gps->gc_s=NULL;
+gps->gc_sf=NULL;
+gps->width=300;
 gps->height=300;
+gps->size=300;
+gps->esid=0;
 }
 
 static gboolean 
@@ -107,7 +112,6 @@ gtk_gps_cb_button_press(GtkWidget * widget, GdkEventButton * event)
 {
 GtkGps *gps;
 
-printf("%s()\n", __PRETTY_FUNCTION__);
 gps=GTK_GPS(widget);
 
 if (event->button==1) {
@@ -121,7 +125,7 @@ if (event->button==1) {
        break;
        }
 }
-gtk_gps_paint_by_mode(gps);
+gtk_widget_queue_draw_area(widget, 0, 0, gps->width, gps->height);
 return FALSE;
 }
 
@@ -135,7 +139,23 @@ gps=gtk_type_new(gtk_gps_get_type ());
 gps->display_mode=display_mode;
 gps->data=data;
 widget=GTK_WIDGET(gps);
-g_signal_connect(G_OBJECT(widget), "button_press_event", G_CALLBACK(gtk_gps_cb_button_press), NULL);
+
+/* Allow switching if mode is combined */
+if (display_mode==GTK_GPS_MODE_COMBINED) {
+       g_signal_connect(G_OBJECT(widget), "button_press_event", G_CALLBACK(gtk_gps_cb_button_press), NULL);
+       display_mode=GTK_GPS_MODE_SKY;
+}
+
+gps->context=gtk_widget_get_pango_context(widget);
+gps->layout=pango_layout_new(gps->context);
+gps->fontdesc=pango_font_description_new();
+pango_font_description_set_family(gps->fontdesc, "Sans Serif");
+pango_font_description_set_size(gps->fontdesc, 10*PANGO_SCALE);
+pango_layout_set_font_description(gps->layout, gps->fontdesc);
+pango_layout_set_alignment(gps->layout, PANGO_ALIGN_CENTER);
+
+gps->esid=g_timeout_add(1000,(GSourceFunc)gtk_gps_refresh_cb, gps);
+
 return GTK_WIDGET(gps);
 }
 
@@ -144,11 +164,10 @@ gtk_gps_finalize(GObject *object)
 {
 GtkGps *gps;
 
-g_printf("%s()\n", __PRETTY_FUNCTION__);
-       
 g_return_if_fail(GTK_IS_GPS(object));
 gps=GTK_GPS(object);
 
+g_source_remove(gps->esid);
 if (GTK_WIDGET(object)->parent && GTK_WIDGET_MAPPED(object)) {
        gtk_widget_unmap(GTK_WIDGET(object));
 }
@@ -161,17 +180,22 @@ gtk_gps_size_request(GtkWidget    *widget, GtkRequisition *requisition)
 {
 GtkGps *gps;
 
-g_printf("%s()\n", __PRETTY_FUNCTION__);
-       
 g_return_if_fail(GTK_IS_GPS(widget));
-g_return_if_fail(requisition != NULL);
+g_return_if_fail(requisition!=NULL);
        
 gps = GTK_GPS (widget);
        
-requisition->width=400;
-requisition->height=300;
-gps->width=400;
-gps->height=300;
+requisition->width=300;
+gps->width=300;
+
+if (gps->display_mode==GTK_GPS_MODE_SKY) {
+       requisition->height=400;
+       gps->height=400;
+} else {
+       requisition->height=200;
+       gps->height=200;        
+}
+gps->size=300;
 }
 
 static void
@@ -179,8 +203,6 @@ gtk_gps_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
 {
 GtkGps *gps;
 
-g_printf("%s()\n", __PRETTY_FUNCTION__);
-
 g_return_if_fail(GTK_IS_GPS(widget));
 g_return_if_fail(allocation!=NULL);
 
@@ -194,9 +216,15 @@ if (GTK_WIDGET_REALIZED (widget)) {
                allocation->width, allocation->height);
 }
 
-
 gps->width=allocation->width;
 gps->height=allocation->height;
+gps->size=MIN(gps->width, gps->height);
+
+gps->fs=gps->size/22;
+BOUND(gps->fs, 10, 24);
+
+pango_font_description_set_size(gps->fontdesc, (gps->fs-3)*PANGO_SCALE);
+pango_layout_set_font_description(gps->layout, gps->fontdesc);
 }
 
 static void 
@@ -207,8 +235,6 @@ GdkColor color;
 GdkWindowAttr attributes;
 gint attributes_mask;
 
-g_printf("%s()\n", __PRETTY_FUNCTION__);
-
 g_return_if_fail (GTK_IS_GPS(widget));
 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
 gps=GTK_GPS(widget);
@@ -231,36 +257,30 @@ widget->style=gtk_style_attach(widget->style, widget->window);
 gdk_window_set_user_data(widget->window, widget);
 gtk_style_set_background(widget->style, widget->window, GTK_STATE_ACTIVE);
 
-gps->context=gtk_widget_get_pango_context(widget);
-gps->layout=pango_layout_new(gps->context);
-gps->fontdesc=pango_font_description_new();
-pango_font_description_set_family(gps->fontdesc, "Sans Serif");
-pango_font_description_set_size(gps->fontdesc, 10*PANGO_SCALE);
-pango_layout_set_font_description(gps->layout, gps->fontdesc);
-pango_layout_set_alignment(gps->layout, PANGO_ALIGN_CENTER);
-
-if (!gps->gc1) {
+/* No fix */
+if (!gps->gc_s) {
        color.red=0;
        color.green=0;
-       color.blue=0;
-       gps->gc1=gdk_gc_new(widget->window);
-       gdk_gc_set_rgb_fg_color(gps->gc1, &color);
+       color.blue=0x1000;
+       gps->gc_s=gdk_gc_new(widget->window);
+       gdk_gc_set_rgb_fg_color(gps->gc_s, &color);
 }
 
-if (!gps->gc2) {
+/* Fix color */
+if (!gps->gc_sf) {
        color.red=0;
-       color.green=0;
-       color.blue=0xffff;
-       gps->gc2=gdk_gc_new(widget->window);
-       gdk_gc_set_rgb_fg_color(gps->gc2, &color);
+       color.green=0xdfff;
+       color.blue=0;
+       gps->gc_sf=gdk_gc_new(widget->window);
+       gdk_gc_set_rgb_fg_color(gps->gc_sf, &color);
 }
 
-if (!gps->gc3) {
+if (!gps->gc_w) {
        color.red=0xffff;
        color.green=0xffff;
        color.blue=0xffff;
-       gps->gc3=gdk_gc_new(widget->window);
-       gdk_gc_set_rgb_fg_color(gps->gc3, &color);
+       gps->gc_w=gdk_gc_new(widget->window);
+       gdk_gc_set_rgb_fg_color(gps->gc_w, &color);
 }
 }
 
@@ -275,8 +295,6 @@ gfloat tmp;
 gchar buffer[16];
 guint line[12]={0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330};
 
-g_printf("%s()\n", __PRETTY_FUNCTION__);
-
 widget=GTK_WIDGET(gps);
 
 g_return_if_fail(gps->data);
@@ -287,30 +305,16 @@ if (!GTK_WIDGET_MAPPED(widget))
 x0=0;
 y0=0;
 
-size=MIN(gps->width, gps->height);
+size=gps->size-PADDING;
 halfsize=size/2;
 if (gps->width>gps->height) {
-       xoffset=x0+(gps->width-gps->height-PADDING)/2;
+       xoffset=x0+(gps->width-gps->height)/2;
        yoffset=y0+5;
 } else {
        xoffset=x0+5;
-       yoffset=y0+(gps->height-gps->width-PADDING)/2;
+       yoffset=y0+(gps->height-gps->width)/2;
 }
 
-if (size<200) {
-       pango_font_description_set_size(gps->fontdesc, 10*PANGO_SCALE);
-       pango_layout_set_font_description(gps->layout, gps->fontdesc);
-} else {
-       pango_font_description_set_size(gps->fontdesc, 12*PANGO_SCALE);
-       pango_layout_set_font_description(gps->layout, gps->fontdesc);
-}
-
-gtk_paint_flat_box (widget->style,
-       widget->window,
-       GTK_STATE_NORMAL, GTK_SHADOW_NONE,
-       NULL, widget, "trough", 0, 0, 
-       gps->width, gps->height);
-
 /* 90 */
 gdk_draw_arc(widget->window,
             widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
@@ -331,20 +335,24 @@ gdk_draw_arc(widget->window,
             xoffset + size / 6 * 2, yoffset + size / 6 * 2,
             size / 6 * 2, size / 6 * 2, 0, 64 * 360);
 
-for (i = 0; i < 6; i++) {
-       /* line */
+for (i = 0; i < 12; i++) {
+       gfloat sint, cost;
+
        tmp = (line[i] * (1.f / 180.f)) * G_PI;
+       sint=sinf(tmp);
+       cost=cosf(tmp);
+       /* line */
        gdk_draw_line(widget->window,
                      widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
-                     xoffset + halfsize + (halfsize - 2) * sinf(tmp),
-                     yoffset + halfsize - (halfsize - 2) * cosf(tmp),
-                     xoffset + halfsize - (halfsize - 2) * sinf(tmp),
-                     yoffset + halfsize + (halfsize - 2) * cosf(tmp));
-}
+                     xoffset + halfsize + (halfsize - 2) * sint,
+                     yoffset + halfsize - (halfsize - 2) * cost,
+                     xoffset + halfsize - (halfsize - 2) * sint,
+                     yoffset + halfsize + (halfsize - 2) * cost);
+
+       /* Skip angle text if there is no space */
+       if (size<100)
+               continue;
 
-for (i = 0; i < 12; i++) {
-       tmp = (line[i] * (1.f / 180.f)) * G_PI;
-       /* azimuth */
        if (line[i] == 0)
                g_snprintf(buffer, 16, "N");
        else
@@ -352,48 +360,49 @@ for (i = 0; i < 12; i++) {
        pango_layout_set_text(gps->layout, buffer, -1);
        pango_layout_get_pixel_size(gps->layout, &x, &y);
        gdk_draw_layout(widget->window, widget->style->fg_gc[GTK_STATE_NORMAL],
-                       (xoffset + halfsize + (halfsize - size / 12) * sinf(tmp)) - x / 2,
-                       (yoffset + halfsize - (halfsize - size / 12) * cosf(tmp)) - y / 2,
+                       (xoffset + halfsize + (halfsize - size / 12) * sint) - x / 2,
+                       (yoffset + halfsize - (halfsize - size / 12) * cost) - y / 2,
                        gps->layout);
+
 }
 
-/* elevation 30 */
-tmp = (30 * (1.f / 180.f)) * G_PI;
-g_snprintf(buffer, 16, "30°");
-pango_layout_set_text(gps->layout, buffer, -1);
-pango_layout_get_pixel_size(gps->layout, &x, &y);
-gdk_draw_layout(widget->window,        widget->style->fg_gc[GTK_STATE_NORMAL],
+if (size>100) {
+       tmp = (30 * (1.f / 180.f)) * G_PI;
+       /* elevation 30 */
+       g_snprintf(buffer, 16, "30°");
+       pango_layout_set_text(gps->layout, buffer, -1);
+       pango_layout_get_pixel_size(gps->layout, &x, &y);
+       gdk_draw_layout(widget->window, widget->style->fg_gc[GTK_STATE_NORMAL],
                (xoffset + halfsize + size / 6 * 2 * sinf(tmp)) - x / 2,
                (yoffset + halfsize - size / 6 * 2 * cosf(tmp)) - y / 2,
                gps->layout);
 
-/* elevation 60 */
-tmp = (30 * (1.f / 180.f)) * G_PI;
-g_snprintf(buffer, 16, "60°");
-pango_layout_set_text(gps->layout, buffer, -1);
-pango_layout_get_pixel_size(gps->layout, &x, &y);
-gdk_draw_layout(widget->window, widget->style->fg_gc[GTK_STATE_NORMAL],
+       /* elevation 60 */
+       g_snprintf(buffer, 16, "60°");
+       pango_layout_set_text(gps->layout, buffer, -1);
+       pango_layout_get_pixel_size(gps->layout, &x, &y);
+       gdk_draw_layout(widget->window, widget->style->fg_gc[GTK_STATE_NORMAL],
                (xoffset + halfsize + size / 6 * sinf(tmp)) - x / 2,
                (yoffset + halfsize - size / 6 * cosf(tmp)) - y / 2, 
                gps->layout);
+}
 
 for (i=0;i<gps->data->satinview;i++) {
        /* Sat used or not */
-       gc=(gps->data->sat[i].fix) ? gps->gc2 : gps->gc1;
+       gc=(gps->data->sat[i].fix==TRUE) ? gps->gc_sf : gps->gc_s;
 
        tmp = (gps->data->sat[i].azimuth * (1.f / 180.f)) * G_PI;
        x = xoffset + halfsize + (90 - gps->data->sat[i].elevation) * halfsize / 90 * sinf(tmp);
        y = yoffset + halfsize - (90 - gps->data->sat[i].elevation) * halfsize / 90 * cosf(tmp);
 
-       gdk_draw_arc(widget->window, gc, TRUE, x - 10, y - 10, 20, 20, 0, 64 * 360);
+       gdk_draw_arc(widget->window, gc, TRUE, x-gps->fs, y-gps->fs, gps->fs+8, gps->fs+8, 0, 64 * 360);
 
        g_snprintf(buffer, 6, "%02d", gps->data->sat[i].prn);
        pango_layout_set_text(gps->layout, buffer, -1);
        pango_layout_get_pixel_size(gps->layout, &x1, &y1);
-       gdk_draw_layout(widget->window, gps->gc3, x - x1 / 2, y - y1 / 2, gps->layout);
+       gdk_draw_layout(widget->window, gps->gc_w, x-gps->fs/2-x1/2+2, y-gps->fs/2-y1/2+2, gps->layout);
 }
 
-g_printf("%s(): return\n", __PRETTY_FUNCTION__);
 return;
 }
 
@@ -406,15 +415,13 @@ guint step, i, snr_height, bymargin, xoffset, yoffset;
 guint x, y, x1, y1;
 gchar tmp[32];
 
-g_printf("%s()\n", __PRETTY_FUNCTION__);
-
 widget=GTK_WIDGET(gps);
 
 if (!GTK_WIDGET_MAPPED(widget))
        return;
 
-xoffset = 0;
-yoffset = 0;
+xoffset=0;
+yoffset=0;
 
 /* Bootom margin - 12% */
 bymargin = gps->height * 0.88f;
@@ -429,49 +436,49 @@ gdk_draw_line(widget->window,
              xoffset + 5, yoffset + bymargin - 1,
              xoffset + gps->width - 10 - 2, yoffset + bymargin - 1);
 
-if (gps->data->satinview > 0) {
-       /* Left margin - 5pix, Right margin - 5pix */
-       step = (gps->width - 10) / gps->data->satinview;
-
-       for (i = 0; i < gps->data->satinview; i++) {
-               /* Sat used or not */
-               gc=(gps->data->sat[i].fix) ? gps->gc1 : gps->gc2;
-
-               x = 5 + i * step;
-               snr_height = gps->data->sat[i].snr * gps->height * 0.78f / 100;
-               y = gps->height * 0.1f + (gps->height * 0.78f - snr_height);
-
-               /* draw sat rectangle... */
-               gdk_draw_rectangle(widget->window,
-                                  gc, TRUE,
-                                  xoffset + x,
-                                  yoffset + y, step - 2, snr_height);
-
-               if (gps->data->sat[i].snr > 0) {
-                       /* ...snr.. */
-                       g_snprintf(tmp, 32, "%02d", gps->data->sat[i].snr);
-                       pango_layout_set_text(gps->layout, tmp, 2);
-                       pango_layout_get_pixel_size(gps->layout, &x1, &y1);
-                       gdk_draw_layout(widget->window,
-                                       widget->style->fg_gc[GTK_STATE_NORMAL],
-                                       xoffset + x + ((step - 2) - x1) / 2,
-                                               yoffset + y - 15,
-                                               gps->layout);
-               }
-
-               /* ...and sat number */
-               g_snprintf(tmp, 32, "%02d", gps->data->sat[i].prn);
+if (gps->data->satinview==0)
+       return;
+
+/* Left margin - 5pix, Right margin - 5pix */
+step = (gps->width - 10) / gps->data->satinview;
+
+for (i=0;i<gps->data->satinview;i++) {
+       /* Sat used or not */
+       gc=(gps->data->sat[i].fix) ? gps->gc_sf : gps->gc_s;
+
+       x = 5 + i * step;
+       snr_height = gps->data->sat[i].snr * gps->height * 0.78f / 100;
+       y = gps->height * 0.1f + (gps->height * 0.78f - snr_height);
+
+       /* draw sat rectangle... */
+       gdk_draw_rectangle(widget->window,
+                          gc, TRUE,
+                          xoffset + x,
+                          yoffset + y, step - 2, snr_height);
+
+       if (gps->data->sat[i].snr>0) {
+               /* ...snr.. */
+               g_snprintf(tmp, 32, "%02d", gps->data->sat[i].snr);
                pango_layout_set_text(gps->layout, tmp, 2);
                pango_layout_get_pixel_size(gps->layout, &x1, &y1);
                gdk_draw_layout(widget->window,
                                widget->style->fg_gc[GTK_STATE_NORMAL],
                                xoffset + x + ((step - 2) - x1) / 2,
-                               yoffset + bymargin + 1,
+                               yoffset + y - 15,
                                gps->layout);
        }
+
+       /* ...and sat number */
+       g_snprintf(tmp, 32, "%02d", gps->data->sat[i].prn);
+       pango_layout_set_text(gps->layout, tmp, 2);
+       pango_layout_get_pixel_size(gps->layout, &x1, &y1);
+       gdk_draw_layout(widget->window,
+                       widget->style->fg_gc[GTK_STATE_NORMAL],
+                       xoffset + x + ((step - 2) - x1) / 2,
+                       yoffset + bymargin + 1,
+                       gps->layout);
 }
 
-return;
 }
 
 static void
@@ -490,6 +497,21 @@ switch (gps->display_mode) {
 }
 }
 
+static gboolean
+gtk_gps_refresh_cb(GtkWidget *widget)
+{
+GtkGps *gps;
+
+g_return_val_if_fail(GTK_IS_GPS(widget), FALSE);
+
+if ((GTK_WIDGET_MAPPED(widget)==FALSE) || (GTK_WIDGET_VISIBLE(widget)==FALSE))
+       return TRUE;
+
+gps=GTK_GPS(widget);
+gtk_widget_queue_draw_area(widget, 0, 0, gps->width, gps->height);
+return TRUE;
+}
+
 static gboolean
 gtk_gps_expose(GtkWidget *widget, GdkEventExpose *event)
 {
@@ -511,5 +533,5 @@ GtkGps *gps;
 g_return_if_fail(GTK_IS_GPS(widget));
 
 gps=GTK_GPS(widget);
-gtk_gps_paint_by_mode(gps);
+gtk_widget_queue_draw_area(widget, 0, 0, gps->width, gps->height);
 }