]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
clang-format vfo.c and rx_panadapter.c
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Mon, 1 Jan 2024 11:44:29 +0000 (17:14 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Mon, 1 Jan 2024 11:44:29 +0000 (17:14 +0530)
rx_panadapter.c
vfo.c

index e52aebdeb4f1dbb10632cbde9e68075e9d2df06c..029a1019195e2e8ebb3ec3ff838b5c975dde4a49 100644 (file)
@@ -1,45 +1,45 @@
 /* Copyright (C)
-* 2015 - John Melton, G0ORX/N6LYT
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-*
-*/
+ * 2015 - John Melton, G0ORX/N6LYT
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ */
 
-#include <gtk/gtk.h>
+#include <arpa/inet.h>
 #include <gdk/gdk.h>
+#include <gtk/gtk.h>
 #include <math.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
 #include <semaphore.h>
-#include <arpa/inet.h>
 #include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
 
 #include <wdsp.h>
 
+#include "actions.h"
 #include "agc.h"
 #include "band.h"
 #include "channel.h"
 #include "discovered.h"
+#include "mode.h"
 #include "radio.h"
 #include "receiver.h"
-#include "transmitter.h"
 #include "rx_panadapter.h"
+#include "transmitter.h"
 #include "vfo.h"
-#include "mode.h"
-#include "actions.h"
 #ifdef GPIO
 #include "gpio.h"
 #endif
 
 #define LINE_WIDTH 0.5
 
-//static float panadapter_max=-60.0;
-//static float panadapter_min=-160.0;
+// static float panadapter_max=-60.0;
+// static float panadapter_min=-160.0;
 
 static gfloat filter_left;
 static gfloat filter_right;
 static gfloat cw_frequency;
 
-static gint sequence_error_count=0;
+static gint sequence_error_count = 0;
 
 /* Create a new surface of the appropriate size to store our scribbles */
-static gboolean
-panadapter_configure_event_cb (GtkWidget         *widget,
-            GdkEventConfigure *event,
-            gpointer           data)
-{
-
-  RECEIVER *rx=(RECEIVER *)data;
-
-  int display_width=gtk_widget_get_allocated_width (widget);
-  int display_height=gtk_widget_get_allocated_height (widget);
-
-  if (rx->panadapter_surface)
-    cairo_surface_destroy (rx->panadapter_surface);
-
-  rx->panadapter_surface = gdk_window_create_similar_surface (gtk_widget_get_window (widget),
-                                       CAIRO_CONTENT_COLOR,
-                                       display_width,
-                                       display_height);
-
-  cairo_t *cr=cairo_create(rx->panadapter_surface);
-  cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
-  cairo_paint(cr);
-  cairo_destroy(cr);
-  return TRUE;
+static gboolean panadapter_configure_event_cb(GtkWidget *widget,
+                                              GdkEventConfigure *event,
+                                              gpointer data) {
+
+    RECEIVER *rx = (RECEIVER *)data;
+
+    int display_width = gtk_widget_get_allocated_width(widget);
+    int display_height = gtk_widget_get_allocated_height(widget);
+
+    if (rx->panadapter_surface)
+        cairo_surface_destroy(rx->panadapter_surface);
+
+    rx->panadapter_surface = gdk_window_create_similar_surface(
+        gtk_widget_get_window(widget), CAIRO_CONTENT_COLOR, display_width,
+        display_height);
+
+    cairo_t *cr = cairo_create(rx->panadapter_surface);
+    cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
+    cairo_paint(cr);
+    cairo_destroy(cr);
+    return TRUE;
 }
 
 /* Redraw the screen from the surface. Note that the ::draw
  * signal receives a ready-to-be-used cairo_t that is already
  * clipped to only draw the exposed areas of the widget
  */
-static gboolean
-panadapter_draw_cb (GtkWidget *widget,
- cairo_t   *cr,
- gpointer   data)
-{
-  RECEIVER *rx=(RECEIVER *)data;
-  if(rx->panadapter_surface) {
-    cairo_set_source_surface (cr, rx->panadapter_surface, 0.0, 0.0);
-    cairo_paint (cr);
-  }
-
-  return FALSE;
+static gboolean panadapter_draw_cb(GtkWidget *widget, cairo_t *cr,
+                                   gpointer data) {
+    RECEIVER *rx = (RECEIVER *)data;
+    if (rx->panadapter_surface) {
+        cairo_set_source_surface(cr, rx->panadapter_surface, 0.0, 0.0);
+        cairo_paint(cr);
+    }
+
+    return FALSE;
 }
 
-static gboolean panadapter_button_press_event_cb(GtkWidget *widget, GdkEventButton *event, gpointer data) {
-  return receiver_button_press_event(widget,event,data);
+static gboolean panadapter_button_press_event_cb(GtkWidget *widget,
+                                                 GdkEventButton *event,
+                                                 gpointer data) {
+    return receiver_button_press_event(widget, event, data);
 }
 
 // https://docs.gtk.org/gtk3/input-handling.html
-static gboolean panadapter_touch_event_cb(GtkWidget *widget, GdkEventTouch *event, gpointer data) {
+static gboolean panadapter_touch_event_cb(GtkWidget *widget,
+                                          GdkEventTouch *event, gpointer data) {
     return receiver_touch_event(widget, event, data);
 }
 
-static gboolean panadapter_button_release_event_cb(GtkWidget *widget, GdkEventButton *event, gpointer data) {
-  return receiver_button_release_event(widget,event,data);
+static gboolean panadapter_button_release_event_cb(GtkWidget *widget,
+                                                   GdkEventButton *event,
+                                                   gpointer data) {
+    return receiver_button_release_event(widget, event, data);
 }
 
-static gboolean panadapter_motion_notify_event_cb(GtkWidget *widget, GdkEventMotion *event, gpointer data) {
-  return receiver_motion_notify_event(widget,event,data);
+static gboolean panadapter_motion_notify_event_cb(GtkWidget *widget,
+                                                  GdkEventMotion *event,
+                                                  gpointer data) {
+    return receiver_motion_notify_event(widget, event, data);
 }
 
-static gboolean panadapter_scroll_event_cb(GtkWidget *widget, GdkEventScroll *event, gpointer data) {
-  return receiver_scroll_event(widget,event,data);
+static gboolean panadapter_scroll_event_cb(GtkWidget *widget,
+                                           GdkEventScroll *event,
+                                           gpointer data) {
+    return receiver_scroll_event(widget, event, data);
 }
 
 void rx_panadapter_update(RECEIVER *rx) {
-  int i;
-  int x1,x2;
-  float *samples;
-  char text[64];
-  cairo_text_extents_t extents;
-  long long f;
-  long long divisor=20000;
-  double x=0.0;
-
-  gboolean active=active_receiver==rx;
-
-  int display_width=gtk_widget_get_allocated_width (rx->panadapter);
-  int display_height=gtk_widget_get_allocated_height (rx->panadapter);
-
-  samples=rx->pixel_samples;
-
-  //clear_panadater_surface();
-  cairo_t *cr;
-  cr = cairo_create (rx->panadapter_surface);
-  cairo_set_line_width(cr, LINE_WIDTH);
-  cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
-  cairo_rectangle(cr,0,0,display_width,display_height);
-  cairo_fill(cr);
-  //cairo_paint (cr);
-
-  double HzPerPixel = rx->hz_per_pixel;  // need this many times
-
-  int mode=vfo[rx->id].mode;
-  long long frequency=vfo[rx->id].frequency;
-  int vfoband=vfo[rx->id].band;
-  long long offset = vfo[rx->id].ctun ? vfo[rx->id].offset : 0;
-
-  // In diversity mode, the RX1 frequency tracks the RX0 frequency
-  if (diversity_enabled && rx->id == 1) {
-    frequency=vfo[0].frequency;
-    vfoband=vfo[0].band;
-    mode=vfo[0].mode;
-  }
-
-  BAND *band=band_get_band(vfoband);
-  long long half=(long long)rx->sample_rate/2LL;
-  double vfofreq=((double) rx->pixels * 0.5)-(double)rx->pan;
-
-  //
-  // There are two options here in CW mode, depending on cw_is_on_vfo_freq.
-  //
-  // If true, the CW frequency is the VFO frequency and the center of the spectrum
-  // then is at the VFO frequency plus or minus the sidetone frequency. However we
-  // will keep the center of the PANADAPTER at the VFO frequency and shift the
-  // pixels of the spectrum.
-  //
-  // If false, the center of the spectrum is at the VFO frequency and the TX
-  // frequency is VFO freq +/- sidetone frequency. In this case we mark this
-  // freq by a yellow line.
-  //
-
-  if (cw_is_on_vfo_freq) {
-    if (mode == modeCWU) {
-      frequency -= cw_keyer_sidetone_frequency;
-      vfofreq += (double) cw_keyer_sidetone_frequency / HzPerPixel;
-    } else if (mode == modeCWL) {
-      frequency += cw_keyer_sidetone_frequency;
-      vfofreq -= (double) cw_keyer_sidetone_frequency / HzPerPixel;
+    int i;
+    int x1, x2;
+    float *samples;
+    char text[64];
+    cairo_text_extents_t extents;
+    long long f;
+    long long divisor = 20000;
+    double x = 0.0;
+
+    gboolean active = active_receiver == rx;
+
+    int display_width = gtk_widget_get_allocated_width(rx->panadapter);
+    int display_height = gtk_widget_get_allocated_height(rx->panadapter);
+
+    samples = rx->pixel_samples;
+
+    // clear_panadater_surface();
+    cairo_t *cr;
+    cr = cairo_create(rx->panadapter_surface);
+    cairo_set_line_width(cr, LINE_WIDTH);
+    cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
+    cairo_rectangle(cr, 0, 0, display_width, display_height);
+    cairo_fill(cr);
+    // cairo_paint (cr);
+
+    double HzPerPixel = rx->hz_per_pixel; // need this many times
+
+    int mode = vfo[rx->id].mode;
+    long long frequency = vfo[rx->id].frequency;
+    int vfoband = vfo[rx->id].band;
+    long long offset = vfo[rx->id].ctun ? vfo[rx->id].offset : 0;
+
+    // In diversity mode, the RX1 frequency tracks the RX0 frequency
+    if (diversity_enabled && rx->id == 1) {
+        frequency = vfo[0].frequency;
+        vfoband = vfo[0].band;
+        mode = vfo[0].mode;
+    }
+
+    BAND *band = band_get_band(vfoband);
+    long long half = (long long)rx->sample_rate / 2LL;
+    double vfofreq = ((double)rx->pixels * 0.5) - (double)rx->pan;
+
+    //
+    // There are two options here in CW mode, depending on cw_is_on_vfo_freq.
+    //
+    // If true, the CW frequency is the VFO frequency and the center of the
+    // spectrum then is at the VFO frequency plus or minus the sidetone
+    // frequency. However we will keep the center of the PANADAPTER at the VFO
+    // frequency and shift the pixels of the spectrum.
+    //
+    // If false, the center of the spectrum is at the VFO frequency and the TX
+    // frequency is VFO freq +/- sidetone frequency. In this case we mark this
+    // freq by a yellow line.
+    //
+
+    if (cw_is_on_vfo_freq) {
+        if (mode == modeCWU) {
+            frequency -= cw_keyer_sidetone_frequency;
+            vfofreq += (double)cw_keyer_sidetone_frequency / HzPerPixel;
+        } else if (mode == modeCWL) {
+            frequency += cw_keyer_sidetone_frequency;
+            vfofreq -= (double)cw_keyer_sidetone_frequency / HzPerPixel;
+        }
     }
-  }
-  long long min_display=frequency-half+(long long)((double)rx->pan*HzPerPixel);
-  long long max_display=min_display+(long long)((double)rx->width*HzPerPixel);
-
-  if(vfoband==band60) {
-    for(i=0;i<channel_entries;i++) {
-      long long low_freq=band_channels_60m[i].frequency-(band_channels_60m[i].width/(long long)2);
-      long long hi_freq=band_channels_60m[i].frequency+(band_channels_60m[i].width/(long long)2);
-      x1=(low_freq-min_display)/(long long)HzPerPixel;
-      x2=(hi_freq-min_display)/(long long)HzPerPixel;
-      cairo_set_source_rgb (cr, 0.6, 0.3, 0.3);
-      cairo_rectangle(cr, x1, 0.0, x2-x1, (double)display_height);
-      cairo_fill(cr);
+    long long min_display =
+        frequency - half + (long long)((double)rx->pan * HzPerPixel);
+    long long max_display =
+        min_display + (long long)((double)rx->width * HzPerPixel);
+
+    if (vfoband == band60) {
+        for (i = 0; i < channel_entries; i++) {
+            long long low_freq = band_channels_60m[i].frequency -
+                                 (band_channels_60m[i].width / (long long)2);
+            long long hi_freq = band_channels_60m[i].frequency +
+                                (band_channels_60m[i].width / (long long)2);
+            x1 = (low_freq - min_display) / (long long)HzPerPixel;
+            x2 = (hi_freq - min_display) / (long long)HzPerPixel;
+            cairo_set_source_rgb(cr, 0.6, 0.3, 0.3);
+            cairo_rectangle(cr, x1, 0.0, x2 - x1, (double)display_height);
+            cairo_fill(cr);
+        }
     }
-  }
-
-  // filter
-  cairo_set_source_rgba (cr, 0.25, 0.25, 0.25, 0.75);
-  //filter_left =(double)display_width*0.5 +(((double)rx->filter_low+offset)/HzPerPixel);
-  //filter_right=(double)display_width*0.5 +(((double)rx->filter_high+offset)/HzPerPixel);
-  filter_left =((double)rx->pixels*0.5)-(double)rx->pan +(((double)rx->filter_low+offset)/HzPerPixel);
-  filter_right=((double)rx->pixels*0.5)-(double)rx->pan +(((double)rx->filter_high+offset)/HzPerPixel);
-  cairo_rectangle(cr, filter_left, 0.0, filter_right-filter_left, (double)display_height);
-  cairo_fill(cr);
-
-  //
-  // Draw the "yellow line" indicating the CW frequency when
-  // it is not the VFO freq
-  //
-  if (!cw_is_on_vfo_freq && (mode==modeCWU || mode==modeCWL)) {
-    if(active) {
-      cairo_set_source_rgb (cr, 1.0, 1.0, 0.0);
+
+    // filter
+    cairo_set_source_rgba(cr, 0.25, 0.25, 0.25, 0.75);
+    // filter_left =(double)display_width*0.5
+    // +(((double)rx->filter_low+offset)/HzPerPixel);
+    // filter_right=(double)display_width*0.5
+    // +(((double)rx->filter_high+offset)/HzPerPixel);
+    filter_left = ((double)rx->pixels * 0.5) - (double)rx->pan +
+                  (((double)rx->filter_low + offset) / HzPerPixel);
+    filter_right = ((double)rx->pixels * 0.5) - (double)rx->pan +
+                   (((double)rx->filter_high + offset) / HzPerPixel);
+    cairo_rectangle(cr, filter_left, 0.0, filter_right - filter_left,
+                    (double)display_height);
+    cairo_fill(cr);
+
+    //
+    // Draw the "yellow line" indicating the CW frequency when
+    // it is not the VFO freq
+    //
+    if (!cw_is_on_vfo_freq && (mode == modeCWU || mode == modeCWL)) {
+        if (active) {
+            cairo_set_source_rgb(cr, 1.0, 1.0, 0.0);
+        } else {
+            cairo_set_source_rgb(cr, 0.25, 0.25, 0.0);
+        }
+        cw_frequency = filter_left + ((filter_right - filter_left) / 2.0);
+        cairo_move_to(cr, cw_frequency, 10.0);
+        cairo_line_to(cr, cw_frequency, (double)display_height);
+        cairo_stroke(cr);
+    }
+
+    // plot the levels
+    if (active) {
+        cairo_set_source_rgb(cr, 0.0, 1.0, 1.0);
     } else {
-      cairo_set_source_rgb (cr, 0.25, 0.25, 0.0);
+        cairo_set_source_rgb(cr, 0.0, 0.5, 0.5);
     }
-    cw_frequency=filter_left+((filter_right-filter_left)/2.0);
-    cairo_move_to(cr,cw_frequency,10.0);
-    cairo_line_to(cr,cw_frequency,(double)display_height);
-    cairo_stroke(cr);
-  }
-
-  // plot the levels
-  if(active) {
-    cairo_set_source_rgb (cr, 0.0, 1.0, 1.0);
-  } else {
-    cairo_set_source_rgb (cr, 0.0, 0.5, 0.5);
-  }
-
-  double dbm_per_line=(double)display_height/((double)rx->panadapter_high-(double)rx->panadapter_low);
-  cairo_set_line_width(cr, LINE_WIDTH);
-  cairo_select_font_face(cr, "FreeMono", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
-  cairo_set_font_size(cr, 12);
-  char v[32];
-
-  for(i=rx->panadapter_high;i>=rx->panadapter_low;i--) {
-    int mod=abs(i)%rx->panadapter_step;
-    if(mod==0) {
-      double y = (double)(rx->panadapter_high-i)*dbm_per_line;
-      cairo_move_to(cr,0.0,y);
-      cairo_line_to(cr,(double)display_width,y);
-
-      sprintf(v,"%d dBm",i);
-      cairo_move_to(cr, 1, y);  
-      cairo_show_text(cr, v);
+
+    double dbm_per_line =
+        (double)display_height /
+        ((double)rx->panadapter_high - (double)rx->panadapter_low);
+    cairo_set_line_width(cr, LINE_WIDTH);
+    cairo_select_font_face(cr, "FreeMono", CAIRO_FONT_SLANT_NORMAL,
+                           CAIRO_FONT_WEIGHT_BOLD);
+    cairo_set_font_size(cr, 12);
+    char v[32];
+
+    for (i = rx->panadapter_high; i >= rx->panadapter_low; i--) {
+        int mod = abs(i) % rx->panadapter_step;
+        if (mod == 0) {
+            double y = (double)(rx->panadapter_high - i) * dbm_per_line;
+            cairo_move_to(cr, 0.0, y);
+            cairo_line_to(cr, (double)display_width, y);
+
+            sprintf(v, "%d dBm", i);
+            cairo_move_to(cr, 1, y);
+            cairo_show_text(cr, v);
+        }
     }
-  }
-  cairo_stroke(cr);
+    cairo_stroke(cr);
 
-  // plot frequency markers
-  switch(rx->sample_rate) {
+    // plot frequency markers
+    switch (rx->sample_rate) {
     case 48000:
-      divisor=5000LL;
-      switch(rx->zoom) {
+        divisor = 5000LL;
+        switch (rx->zoom) {
         case 2:
         case 3:
         case 4:
-          divisor=2000LL;
-          break;
+            divisor = 2000LL;
+            break;
         case 5:
         case 6:
         case 7:
         case 8:
-          divisor=1000LL;
-          break;
-      }
-      break;
+            divisor = 1000LL;
+            break;
+        }
+        break;
     case 96000:
     case 100000:
-      divisor=10000LL;
-      switch(rx->zoom) {
+        divisor = 10000LL;
+        switch (rx->zoom) {
         case 2:
         case 3:
         case 4:
-          divisor=5000LL;
-          break;
+            divisor = 5000LL;
+            break;
         case 5:
         case 6:
-          divisor=2000LL;
-          break;
+            divisor = 2000LL;
+            break;
         case 7:
         case 8:
-          divisor=1000LL;
-          break;
-      }
-      break;
+            divisor = 1000LL;
+            break;
+        }
+        break;
     case 192000:
-      divisor=20000LL;
-      switch(rx->zoom) {
+        divisor = 20000LL;
+        switch (rx->zoom) {
         case 2:
         case 3:
-          divisor=10000LL;
-          break;
+            divisor = 10000LL;
+            break;
         case 4:
         case 5:
         case 6:
-          divisor=5000LL;
-          break;
+            divisor = 5000LL;
+            break;
         case 7:
         case 8:
-          divisor=2000LL;
-          break;
-      }
-      break;
+            divisor = 2000LL;
+            break;
+        }
+        break;
     case 384000:
-      divisor=50000LL;
-      switch(rx->zoom) {
+        divisor = 50000LL;
+        switch (rx->zoom) {
         case 2:
         case 3:
-          divisor=25000LL;
-          break;
+            divisor = 25000LL;
+            break;
         case 4:
         case 5:
         case 6:
-          divisor=10000LL;
-          break;
+            divisor = 10000LL;
+            break;
         case 7:
         case 8:
-          divisor=5000LL;
-          break;
-      }
-      break;
+            divisor = 5000LL;
+            break;
+        }
+        break;
     case 768000:
-      divisor=100000LL;
-      switch(rx->zoom) {
+        divisor = 100000LL;
+        switch (rx->zoom) {
         case 2:
         case 3:
-          divisor=50000LL;
-          break;
+            divisor = 50000LL;
+            break;
         case 4:
         case 5:
         case 6:
-          divisor=25000LL;
-          break;
+            divisor = 25000LL;
+            break;
         case 7:
         case 8:
-          divisor=20000LL;
-          break;
-      }
-      break;
+            divisor = 20000LL;
+            break;
+        }
+        break;
     case 1024000:
     case 1536000:
     case 2097152:
-      divisor=200000LL;
-      switch(rx->zoom) {
+        divisor = 200000LL;
+        switch (rx->zoom) {
         case 2:
         case 3:
-          divisor=100000LL;
-          break;
+            divisor = 100000LL;
+            break;
         case 4:
         case 5:
         case 6:
-          divisor=50000LL;
-          break;
+            divisor = 50000LL;
+            break;
         case 7:
         case 8:
-          divisor=20000LL;
-          break;
-      }
-      break;
-  }
-
-  f = ((min_display/divisor)*divisor)+divisor;
-  cairo_select_font_face(cr, "FreeMono",
-                            CAIRO_FONT_SLANT_NORMAL,
-                            CAIRO_FONT_WEIGHT_BOLD);
-  cairo_set_font_size(cr, 12);
-  while(f<max_display) {
-    x=(double)(f-min_display)/HzPerPixel;
-    cairo_move_to(cr,(double)x,0.0);
-    cairo_line_to(cr,(double)x,(double)display_height);
-
-    sprintf(v,"%0lld.%03lld",f/1000000,(f%1000000)/1000);
-    cairo_text_extents(cr, v, &extents);
-    cairo_move_to(cr, x-(extents.width/2.0), 10.0);  
-    cairo_show_text(cr, v);
-    f+=divisor;
-  }
-  cairo_stroke(cr);
-
-  if(vfoband!=band60) {
-    // band edges
-    if(band->frequencyMin!=0LL) {
-      cairo_set_source_rgb (cr, 1.0, 0.0, 0.0);
-      cairo_set_line_width(cr, LINE_WIDTH);
-      if((min_display<band->frequencyMin)&&(max_display>band->frequencyMin)) {
-        i=(band->frequencyMin-min_display)/(long long)HzPerPixel;
-        cairo_move_to(cr,(double)i,0.0);
-        cairo_line_to(cr,(double)i,(double)display_height);
-        cairo_stroke(cr);
-      }
-      if((min_display<band->frequencyMax)&&(max_display>band->frequencyMax)) {
-        i=(band->frequencyMax-min_display)/(long long)HzPerPixel;
-        cairo_move_to(cr,(double)i,0.0);
-        cairo_line_to(cr,(double)i,(double)display_height);
-        cairo_stroke(cr);
-      }
+            divisor = 20000LL;
+            break;
+        }
+        break;
     }
-  }
-            
+
+    f = ((min_display / divisor) * divisor) + divisor;
+    cairo_select_font_face(cr, "FreeMono", CAIRO_FONT_SLANT_NORMAL,
+                           CAIRO_FONT_WEIGHT_BOLD);
+    cairo_set_font_size(cr, 12);
+    while (f < max_display) {
+        x = (double)(f - min_display) / HzPerPixel;
+        cairo_move_to(cr, (double)x, 0.0);
+        cairo_line_to(cr, (double)x, (double)display_height);
+
+        sprintf(v, "%0lld.%03lld", f / 1000000, (f % 1000000) / 1000);
+        cairo_text_extents(cr, v, &extents);
+        cairo_move_to(cr, x - (extents.width / 2.0), 10.0);
+        cairo_show_text(cr, v);
+        f += divisor;
+    }
+    cairo_stroke(cr);
+
+    if (vfoband != band60) {
+        // band edges
+        if (band->frequencyMin != 0LL) {
+            cairo_set_source_rgb(cr, 1.0, 0.0, 0.0);
+            cairo_set_line_width(cr, LINE_WIDTH);
+            if ((min_display < band->frequencyMin) &&
+                (max_display > band->frequencyMin)) {
+                i = (band->frequencyMin - min_display) / (long long)HzPerPixel;
+                cairo_move_to(cr, (double)i, 0.0);
+                cairo_line_to(cr, (double)i, (double)display_height);
+                cairo_stroke(cr);
+            }
+            if ((min_display < band->frequencyMax) &&
+                (max_display > band->frequencyMax)) {
+                i = (band->frequencyMax - min_display) / (long long)HzPerPixel;
+                cairo_move_to(cr, (double)i, 0.0);
+                cairo_line_to(cr, (double)i, (double)display_height);
+                cairo_stroke(cr);
+            }
+        }
+    }
+
 #ifdef CLIENT_SERVER
-  if(clients!=NULL) {
-    cairo_select_font_face(cr, "FreeMono",
-              CAIRO_FONT_SLANT_NORMAL,
-              CAIRO_FONT_WEIGHT_NORMAL);
-    cairo_set_source_rgb (cr, 0.5, 0.5, 0.5);
-    cairo_set_font_size(cr, 22);
-    inet_ntop(AF_INET, &(((struct sockaddr_in *)&clients->address)->sin_addr),text,64);
-    cairo_text_extents(cr, text, &extents);
-    cairo_move_to(cr, ((double)display_width/2.0)-(extents.width/2.0), (double)display_height/2.0);
-    cairo_show_text(cr, text);
-  }
+    if (clients != NULL) {
+        cairo_select_font_face(cr, "FreeMono", CAIRO_FONT_SLANT_NORMAL,
+                               CAIRO_FONT_WEIGHT_NORMAL);
+        cairo_set_source_rgb(cr, 0.5, 0.5, 0.5);
+        cairo_set_font_size(cr, 22);
+        inet_ntop(AF_INET,
+                  &(((struct sockaddr_in *)&clients->address)->sin_addr), text,
+                  64);
+        cairo_text_extents(cr, text, &extents);
+        cairo_move_to(cr, ((double)display_width / 2.0) - (extents.width / 2.0),
+                      (double)display_height / 2.0);
+        cairo_show_text(cr, text);
+    }
 #endif
 
-
-  // agc
-  if(rx->agc!=AGC_OFF) {
-    double knee_y=rx->agc_thresh+(double)adc[rx->adc].attenuation;
-    if (filter_board == ALEX && rx->adc == 0) knee_y += (double)(10*rx->alex_attenuation);
-    knee_y = floor((rx->panadapter_high - knee_y)
-                        * (double) display_height
-                        / (rx->panadapter_high - rx->panadapter_low));
-
-    double hang_y=rx->agc_hang+(double)adc[rx->adc].attenuation;
-    if (filter_board == ALEX && rx->adc == 0) hang_y += (double)(10*rx->alex_attenuation);
-    hang_y = floor((rx->panadapter_high - hang_y)
-                        * (double) display_height
-                        / (rx->panadapter_high - rx->panadapter_low));
-
-    if(rx->agc!=AGC_MEDIUM && rx->agc!=AGC_FAST) {
-      if(active) {
-        cairo_set_source_rgb (cr, 1.0, 1.0, 0.0);
-      } else {
-        cairo_set_source_rgb (cr, 0.5, 0.5, 0.0);
-      }
-      cairo_move_to(cr,40.0,hang_y-8.0);
-      cairo_rectangle(cr, 40, hang_y-8.0,8.0,8.0);
-      cairo_fill(cr);
-      cairo_move_to(cr,40.0,hang_y);
-      cairo_line_to(cr,(double)display_width-40.0,hang_y);
-      cairo_stroke(cr);
-      cairo_move_to(cr,48.0,hang_y);
-      cairo_show_text(cr, "-H");
+    // agc
+    if (rx->agc != AGC_OFF) {
+        double knee_y = rx->agc_thresh + (double)adc[rx->adc].attenuation;
+        if (filter_board == ALEX && rx->adc == 0)
+            knee_y += (double)(10 * rx->alex_attenuation);
+        knee_y = floor((rx->panadapter_high - knee_y) * (double)display_height /
+                       (rx->panadapter_high - rx->panadapter_low));
+
+        double hang_y = rx->agc_hang + (double)adc[rx->adc].attenuation;
+        if (filter_board == ALEX && rx->adc == 0)
+            hang_y += (double)(10 * rx->alex_attenuation);
+        hang_y = floor((rx->panadapter_high - hang_y) * (double)display_height /
+                       (rx->panadapter_high - rx->panadapter_low));
+
+        if (rx->agc != AGC_MEDIUM && rx->agc != AGC_FAST) {
+            if (active) {
+                cairo_set_source_rgb(cr, 1.0, 1.0, 0.0);
+            } else {
+                cairo_set_source_rgb(cr, 0.5, 0.5, 0.0);
+            }
+            cairo_move_to(cr, 40.0, hang_y - 8.0);
+            cairo_rectangle(cr, 40, hang_y - 8.0, 8.0, 8.0);
+            cairo_fill(cr);
+            cairo_move_to(cr, 40.0, hang_y);
+            cairo_line_to(cr, (double)display_width - 40.0, hang_y);
+            cairo_stroke(cr);
+            cairo_move_to(cr, 48.0, hang_y);
+            cairo_show_text(cr, "-H");
+        }
+
+        if (active) {
+            cairo_set_source_rgb(cr, 0.0, 1.0, 0.0);
+        } else {
+            cairo_set_source_rgb(cr, 0.0, 0.5, 0.0);
+        }
+        cairo_move_to(cr, 40.0, knee_y - 8.0);
+        cairo_rectangle(cr, 40, knee_y - 8.0, 8.0, 8.0);
+        cairo_fill(cr);
+        cairo_move_to(cr, 40.0, knee_y);
+        cairo_line_to(cr, (double)display_width - 40.0, knee_y);
+        cairo_stroke(cr);
+        cairo_move_to(cr, 48.0, knee_y);
+        cairo_show_text(cr, "-G");
     }
 
-    if(active) {
-      cairo_set_source_rgb (cr, 0.0, 1.0, 0.0);
+    // cursor
+    if (active) {
+        cairo_set_source_rgb(cr, 1.0, 0.0, 0.0);
     } else {
-      cairo_set_source_rgb (cr, 0.0, 0.5, 0.0);
+        cairo_set_source_rgb(cr, 0.5, 0.0, 0.0);
     }
-    cairo_move_to(cr,40.0,knee_y-8.0);
-    cairo_rectangle(cr, 40, knee_y-8.0,8.0,8.0);
-    cairo_fill(cr);
-    cairo_move_to(cr,40.0,knee_y);
-    cairo_line_to(cr,(double)display_width-40.0,knee_y);
+    cairo_set_line_width(cr, LINE_WIDTH);
+    cairo_move_to(cr, vfofreq + (offset / HzPerPixel), 0.0);
+    cairo_line_to(cr, vfofreq + (offset / HzPerPixel), (double)display_height);
     cairo_stroke(cr);
-    cairo_move_to(cr,48.0,knee_y);
-    cairo_show_text(cr, "-G");
-  }
-
-
-  // cursor
-  if(active) {
-    cairo_set_source_rgb (cr, 1.0, 0.0, 0.0);
-  } else {
-    cairo_set_source_rgb (cr, 0.5, 0.0, 0.0);
-  }
-  cairo_set_line_width(cr, LINE_WIDTH);
-  cairo_move_to(cr,vfofreq+(offset/HzPerPixel),0.0);
-  cairo_line_to(cr,vfofreq+(offset/HzPerPixel),(double)display_height);
-  cairo_stroke(cr);
-
-  // signal
-  double s1,s2;
-
-  int pan=rx->pan;
+
+    // signal
+    double s1, s2;
+
+    int pan = rx->pan;
 #ifdef CLIENT_SERVER
-  if(radio_is_remote) {
-    pan=0;
-  }
+    if (radio_is_remote) {
+        pan = 0;
+    }
 #endif
 
-  samples[pan]=-200.0;
-  samples[display_width-1+pan]=-200.0;
-  if(have_rx_gain) {
-    s1=(double)samples[pan]+rx_gain_calibration-adc[rx->adc].attenuation;
-  } else {
-    s1=(double)samples[pan]+(double)adc[rx->adc].attenuation;
-  }
-  cairo_move_to(cr, 0.0, s1);
-  if (filter_board == ALEX && rx->adc == 0) s1 += (double)(10*rx->alex_attenuation);
-  if (filter_board == CHARLY25) {
-    if (rx->preamp) s1 -= 18.0;
-    if (rx->dither) s1 -= 18.0;
-  }
-
-  s1 = floor((rx->panadapter_high - s1)
-                        * (double) display_height
-                        / (rx->panadapter_high - rx->panadapter_low));
-  cairo_move_to(cr, 0.0, s1);
-  for(i=1;i<display_width;i++) {
-    if(have_rx_gain) {
-      s2=(double)samples[i+pan]+rx_gain_calibration-adc[rx->adc].attenuation;
+    samples[pan] = -200.0;
+    samples[display_width - 1 + pan] = -200.0;
+    if (have_rx_gain) {
+        s1 = (double)samples[pan] + rx_gain_calibration -
+             adc[rx->adc].attenuation;
     } else {
-      s2=(double)samples[i+pan]+(double)adc[rx->adc].attenuation;
+        s1 = (double)samples[pan] + (double)adc[rx->adc].attenuation;
     }
-    if (filter_board == ALEX && rx->adc == 0) s2 += (double)(10*rx->alex_attenuation);
+    cairo_move_to(cr, 0.0, s1);
+    if (filter_board == ALEX && rx->adc == 0)
+        s1 += (double)(10 * rx->alex_attenuation);
     if (filter_board == CHARLY25) {
-      if (rx->preamp) s2 -= 18.0;
-      if (rx->dither) s2 -= 18.0;
-    }
-    s2 = floor((rx->panadapter_high - s2)
-                            * (double) display_height
-                            / (rx->panadapter_high - rx->panadapter_low));
-    cairo_line_to(cr, (double)i, s2);
-  }
-
-  cairo_pattern_t *gradient = NULL;
-  if(display_gradient) {
-    gradient = cairo_pattern_create_linear(0.0, display_height, 0.0, 0.0);
-    // calculate where S9 is
-    double S9=-73;
-    if(vfo[rx->id].frequency>30000000LL) {
-      S9=-93;
+        if (rx->preamp)
+            s1 -= 18.0;
+        if (rx->dither)
+            s1 -= 18.0;
     }
-    S9 = floor((rx->panadapter_high - S9)
-                            * (double) display_height
-                            / (rx->panadapter_high - rx->panadapter_low));
-    S9 = 1.0-(S9/(double)display_height);
-  
-    if(active) {
-      cairo_pattern_add_color_stop_rgb (gradient,0.0,0.0,1.0,0.0); // Green
-      cairo_pattern_add_color_stop_rgb (gradient,S9/3.0,1.0,0.65,0.0); // Orange
-      cairo_pattern_add_color_stop_rgb (gradient,(S9/3.0)*2.0,1.0,1.0,0.0); // Yellow
-      cairo_pattern_add_color_stop_rgb (gradient,S9,1.0,0.0,0.0); // Red
-    } else {
-      cairo_pattern_add_color_stop_rgb (gradient,0.0,0.0,0.5,0.0); // Green
-      cairo_pattern_add_color_stop_rgb (gradient,S9/3.0,0.5,0.325,0.0); // Orange
-      cairo_pattern_add_color_stop_rgb (gradient,(S9/3.0)*2.0,0.5,0.5,0.0); // Yellow
-      cairo_pattern_add_color_stop_rgb (gradient,S9,0.5,0.0,0.0); // Red
+
+    s1 = floor((rx->panadapter_high - s1) * (double)display_height /
+               (rx->panadapter_high - rx->panadapter_low));
+    cairo_move_to(cr, 0.0, s1);
+    for (i = 1; i < display_width; i++) {
+        if (have_rx_gain) {
+            s2 = (double)samples[i + pan] + rx_gain_calibration -
+                 adc[rx->adc].attenuation;
+        } else {
+            s2 = (double)samples[i + pan] + (double)adc[rx->adc].attenuation;
+        }
+        if (filter_board == ALEX && rx->adc == 0)
+            s2 += (double)(10 * rx->alex_attenuation);
+        if (filter_board == CHARLY25) {
+            if (rx->preamp)
+                s2 -= 18.0;
+            if (rx->dither)
+                s2 -= 18.0;
+        }
+        s2 = floor((rx->panadapter_high - s2) * (double)display_height /
+                   (rx->panadapter_high - rx->panadapter_low));
+        cairo_line_to(cr, (double)i, s2);
     }
-    cairo_set_source(cr, gradient);
-  } else {
-    if(active) {
-      cairo_set_source_rgba(cr, 1.0, 1.0, 1.0,0.5);
+
+    cairo_pattern_t *gradient = NULL;
+    if (display_gradient) {
+        gradient = cairo_pattern_create_linear(0.0, display_height, 0.0, 0.0);
+        // calculate where S9 is
+        double S9 = -73;
+        if (vfo[rx->id].frequency > 30000000LL) {
+            S9 = -93;
+        }
+        S9 = floor((rx->panadapter_high - S9) * (double)display_height /
+                   (rx->panadapter_high - rx->panadapter_low));
+        S9 = 1.0 - (S9 / (double)display_height);
+
+        if (active) {
+            cairo_pattern_add_color_stop_rgb(gradient, 0.0, 0.0, 1.0,
+                                             0.0); // Green
+            cairo_pattern_add_color_stop_rgb(gradient, S9 / 3.0, 1.0, 0.65,
+                                             0.0); // Orange
+            cairo_pattern_add_color_stop_rgb(gradient, (S9 / 3.0) * 2.0, 1.0,
+                                             1.0, 0.0); // Yellow
+            cairo_pattern_add_color_stop_rgb(gradient, S9, 1.0, 0.0,
+                                             0.0); // Red
+        } else {
+            cairo_pattern_add_color_stop_rgb(gradient, 0.0, 0.0, 0.5,
+                                             0.0); // Green
+            cairo_pattern_add_color_stop_rgb(gradient, S9 / 3.0, 0.5, 0.325,
+                                             0.0); // Orange
+            cairo_pattern_add_color_stop_rgb(gradient, (S9 / 3.0) * 2.0, 0.5,
+                                             0.5, 0.0); // Yellow
+            cairo_pattern_add_color_stop_rgb(gradient, S9, 0.5, 0.0,
+                                             0.0); // Red
+        }
+        cairo_set_source(cr, gradient);
     } else {
-      cairo_set_source_rgba(cr, 0.5, 0.5, 0.5,0.5);
+        if (active) {
+            cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 0.5);
+        } else {
+            cairo_set_source_rgba(cr, 0.5, 0.5, 0.5, 0.5);
+        }
     }
-  }
-
-  if(display_filled) {
-    cairo_close_path (cr);
-    cairo_fill_preserve (cr);
-  }
-  cairo_set_line_width(cr, LINE_WIDTH);
-  cairo_stroke(cr);
-
-  if(display_gradient) {
-    cairo_pattern_destroy(gradient);
-  }
 
-/*
-#ifdef GPIO
-  if(rx->id==0 && controller==CONTROLLER1) {
-
-    cairo_set_source_rgb(cr,1.0,1.0,0.0);
-    cairo_set_font_size(cr,16);
-    if(ENABLE_E2_ENCODER) {
-      cairo_move_to(cr, display_width-200,70);
-      sprintf(text,"%s (%s)",encoder_string[e2_encoder_action],sw_string[e2_sw_action]);
-      cairo_show_text(cr, text);
+    if (display_filled) {
+        cairo_close_path(cr);
+        cairo_fill_preserve(cr);
     }
+    cairo_set_line_width(cr, LINE_WIDTH);
+    cairo_stroke(cr);
 
-    if(ENABLE_E3_ENCODER) {
-      cairo_move_to(cr, display_width-200,90);
-      sprintf(text,"%s (%s)",encoder_string[e3_encoder_action],sw_string[e3_sw_action]);
-      cairo_show_text(cr, text);
+    if (display_gradient) {
+        cairo_pattern_destroy(gradient);
     }
 
-    if(ENABLE_E4_ENCODER) {
-      cairo_move_to(cr, display_width-200,110);
-      sprintf(text,"%s (%s)",encoder_string[e4_encoder_action],sw_string[e4_sw_action]);
-      cairo_show_text(cr, text);
-    }
-  }
-#endif
-*/
-  if(display_sequence_errors) {
-    if(sequence_errors!=0) {
-      cairo_move_to(cr,100.0,50.0);
-      cairo_set_source_rgb(cr,1.0,0.0,0.0);
-      cairo_set_font_size(cr,12);
-      cairo_show_text(cr, "Sequence Error");
-      sequence_error_count++;
-      // show for 2 second
-      if(sequence_error_count==2*rx->fps) {
-        sequence_errors=0;
-        sequence_error_count=0;
+    /*
+    #ifdef GPIO
+      if(rx->id==0 && controller==CONTROLLER1) {
+
+        cairo_set_source_rgb(cr,1.0,1.0,0.0);
+        cairo_set_font_size(cr,16);
+        if(ENABLE_E2_ENCODER) {
+          cairo_move_to(cr, display_width-200,70);
+          sprintf(text,"%s
+    (%s)",encoder_string[e2_encoder_action],sw_string[e2_sw_action]);
+          cairo_show_text(cr, text);
+        }
+
+        if(ENABLE_E3_ENCODER) {
+          cairo_move_to(cr, display_width-200,90);
+          sprintf(text,"%s
+    (%s)",encoder_string[e3_encoder_action],sw_string[e3_sw_action]);
+          cairo_show_text(cr, text);
+        }
+
+        if(ENABLE_E4_ENCODER) {
+          cairo_move_to(cr, display_width-200,110);
+          sprintf(text,"%s
+    (%s)",encoder_string[e4_encoder_action],sw_string[e4_sw_action]);
+          cairo_show_text(cr, text);
+        }
       }
+    #endif
+    */
+    if (display_sequence_errors) {
+        if (sequence_errors != 0) {
+            cairo_move_to(cr, 100.0, 50.0);
+            cairo_set_source_rgb(cr, 1.0, 0.0, 0.0);
+            cairo_set_font_size(cr, 12);
+            cairo_show_text(cr, "Sequence Error");
+            sequence_error_count++;
+            // show for 2 second
+            if (sequence_error_count == 2 * rx->fps) {
+                sequence_errors = 0;
+                sequence_error_count = 0;
+            }
+        }
     }
-  }
-
-  if(rx->id==0 && protocol==ORIGINAL_PROTOCOL && device==DEVICE_HERMES_LITE2) {
-    cairo_set_source_rgb(cr,1.0,1.0,0.0);
-    cairo_set_font_size(cr,16);
 
-    double t = (3.26 * ((double)average_temperature / 4096.0) - 0.5) / 0.01;
-    sprintf(text,"%0.1fC",t);
-    cairo_move_to(cr, 100.0, 30.0);  
-    cairo_show_text(cr, text);
-
-    double c = (((3.26 * ((double)average_current / 4096.0)) / 50.0) / 0.04 * 1000 * 1270 / 1000);
-    sprintf(text,"%0.0fmA",c);
-    cairo_move_to(cr, 160.0, 30.0);  
-    cairo_show_text(cr, text);
-  }
-
-  cairo_destroy (cr);
-  gtk_widget_queue_draw (rx->panadapter);
+    if (rx->id == 0 && protocol == ORIGINAL_PROTOCOL &&
+        device == DEVICE_HERMES_LITE2) {
+        cairo_set_source_rgb(cr, 1.0, 1.0, 0.0);
+        cairo_set_font_size(cr, 16);
+
+        double t = (3.26 * ((double)average_temperature / 4096.0) - 0.5) / 0.01;
+        sprintf(text, "%0.1fC", t);
+        cairo_move_to(cr, 100.0, 30.0);
+        cairo_show_text(cr, text);
+
+        double c = (((3.26 * ((double)average_current / 4096.0)) / 50.0) /
+                    0.04 * 1000 * 1270 / 1000);
+        sprintf(text, "%0.0fmA", c);
+        cairo_move_to(cr, 160.0, 30.0);
+        cairo_show_text(cr, text);
+    }
 
+    cairo_destroy(cr);
+    gtk_widget_queue_draw(rx->panadapter);
 }
 
-void rx_panadapter_init(RECEIVER *rx, int width,int height) {
-
-  rx->panadapter_surface=NULL;
-  rx->panadapter = gtk_drawing_area_new ();
-  gtk_widget_set_size_request (rx->panadapter, width, height);
-
-  /* Signals used to handle the backing surface */
-  g_signal_connect (rx->panadapter, "draw",
-            G_CALLBACK (panadapter_draw_cb), rx);
-  g_signal_connect (rx->panadapter,"configure-event",
-            G_CALLBACK (panadapter_configure_event_cb), rx);
-
-  /* Event signals */
-  g_signal_connect (rx->panadapter, "motion-notify-event",
-            G_CALLBACK (panadapter_motion_notify_event_cb), rx);
-  g_signal_connect (rx->panadapter, "button-press-event",
-            G_CALLBACK (panadapter_button_press_event_cb), rx);
-  g_signal_connect (rx->panadapter, "button-release-event",
-            G_CALLBACK (panadapter_button_release_event_cb), rx);
-  g_signal_connect(rx->panadapter,"scroll_event",
-            G_CALLBACK(panadapter_scroll_event_cb),rx);
-  g_signal_connect(rx->panadapter, "touch-event",
-                  G_CALLBACK(panadapter_touch_event_cb), rx);
-  /* Ask to receive events the drawing area doesn't normally
-   * subscribe to. In particular, we need to ask for the
-   * button press and motion notify events that want to handle.
-   */
-  gtk_widget_set_events (rx->panadapter, gtk_widget_get_events (rx->panadapter)
-                     | GDK_BUTTON_PRESS_MASK
-                     | GDK_BUTTON_RELEASE_MASK
-                     | GDK_BUTTON1_MOTION_MASK
-                     | GDK_SCROLL_MASK
-                     | GDK_POINTER_MOTION_MASK
-                     | GDK_POINTER_MOTION_HINT_MASK);
-
+void rx_panadapter_init(RECEIVER *rx, int width, int height) {
+
+    rx->panadapter_surface = NULL;
+    rx->panadapter = gtk_drawing_area_new();
+    gtk_widget_set_size_request(rx->panadapter, width, height);
+
+    /* Signals used to handle the backing surface */
+    g_signal_connect(rx->panadapter, "draw", G_CALLBACK(panadapter_draw_cb),
+                     rx);
+    g_signal_connect(rx->panadapter, "configure-event",
+                     G_CALLBACK(panadapter_configure_event_cb), rx);
+
+    /* Event signals */
+    g_signal_connect(rx->panadapter, "motion-notify-event",
+                     G_CALLBACK(panadapter_motion_notify_event_cb), rx);
+    g_signal_connect(rx->panadapter, "button-press-event",
+                     G_CALLBACK(panadapter_button_press_event_cb), rx);
+    g_signal_connect(rx->panadapter, "button-release-event",
+                     G_CALLBACK(panadapter_button_release_event_cb), rx);
+    g_signal_connect(rx->panadapter, "scroll_event",
+                     G_CALLBACK(panadapter_scroll_event_cb), rx);
+    g_signal_connect(rx->panadapter, "touch-event",
+                     G_CALLBACK(panadapter_touch_event_cb), rx);
+    /* Ask to receive events the drawing area doesn't normally
+     * subscribe to. In particular, we need to ask for the
+     * button press and motion notify events that want to handle.
+     */
+    gtk_widget_set_events(rx->panadapter,
+                          gtk_widget_get_events(rx->panadapter) |
+                              GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
+                              GDK_BUTTON1_MOTION_MASK | GDK_SCROLL_MASK |
+                              GDK_POINTER_MOTION_MASK |
+                              GDK_POINTER_MOTION_HINT_MASK);
 }
diff --git a/vfo.c b/vfo.c
index 5174e0346a7d959b9510a3041c6664019b02300a..25f1e49fd4d4855181a9cf7c29d4b4a9c2506013 100644 (file)
--- a/vfo.c
+++ b/vfo.c
@@ -18,6 +18,7 @@
  */
 
 #include <arpa/inet.h>
+#include <gtk/gtk.h>
 #include <ifaddrs.h>
 #include <math.h>
 #include <net/if.h>
 #include <netdb.h>
 #include <netinet/in.h>
 #include <semaphore.h>
+#include <stdbool.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
-#include <stdbool.h>
-#include <gtk/gtk.h>
 
 #include "agc.h"
 #include "band.h"
@@ -53,8 +53,8 @@
 #include "client_server.h"
 #endif
 #include "ext.h"
-#include "screen.h"
 #include "log.h"
+#include "screen.h"
 
 static GtkWidget *parent_window;
 static int my_width;
@@ -147,7 +147,7 @@ void modesettings_restore_state() {
         if (value)
             mode_settings[i].nr = atoi(value);
 
-       sprintf(name, "modeset.%d.nr2", i);
+        sprintf(name, "modeset.%d.nr2", i);
         value = getProperty(name);
         if (value)
             mode_settings[i].nr2 = atoi(value);
@@ -162,7 +162,7 @@ void modesettings_restore_state() {
         if (value)
             mode_settings[i].nr4 = atoi(value);
 
-       sprintf(name, "modeset.%d.nb", i);
+        sprintf(name, "modeset.%d.nb", i);
         value = getProperty(name);
         if (value)
             mode_settings[i].nb = atoi(value);
@@ -172,12 +172,12 @@ void modesettings_restore_state() {
         if (value)
             mode_settings[i].nb2 = atoi(value);
 
-       sprintf(name, "modeset.%d.anf", i);
+        sprintf(name, "modeset.%d.anf", i);
         value = getProperty(name);
         if (value)
             mode_settings[i].anf = atoi(value);
 
-       sprintf(name, "modeset.%d.snb", i);
+        sprintf(name, "modeset.%d.snb", i);
         value = getProperty(name);
         if (value)
             mode_settings[i].snb = atoi(value);
@@ -245,7 +245,7 @@ void vfo_restore_state() {
         vfo[i].ctun = 0;
 
         log_trace("vfo_restore_state: band=%d frequency=%lld", vfo[i].band,
-                vfo[i].frequency);
+                  vfo[i].frequency);
 
         sprintf(name, "vfo.%d.band", i);
         value = getProperty(name);
@@ -601,9 +601,7 @@ void vfo_a_swap_b() {
 /*     return step * steps; */
 /* } */
 
-void vfo_step(int steps) {
-    return vfo_id_step(active_receiver->id, steps);
-}
+void vfo_step(int steps) { return vfo_id_step(active_receiver->id, steps); }
 
 void vfo_id_step(int id, int steps) {
     long long delta;
@@ -617,9 +615,9 @@ void vfo_id_step(int id, int steps) {
             /* long long rx_low = */
             /*     vfo[id].ctun_frequency + hz + active_receiver->filter_low; */
 
-           // convert frequency in terms of steps, then add the given
-           // number of steps in the argument and then convert it
-           // back to frequency.
+            // convert frequency in terms of steps, then add the given
+            // number of steps in the argument and then convert it
+            // back to frequency.
 
             long long rx_low =
                 ((vfo[id].ctun_frequency / step + steps) * step) +
@@ -628,33 +626,37 @@ void vfo_id_step(int id, int steps) {
                 ((vfo[id].ctun_frequency / step + steps) * step) +
                 active_receiver->filter_high;
 
-           long long half = (long long)active_receiver->sample_rate / 2LL;
+            long long half = (long long)active_receiver->sample_rate / 2LL;
 
-           long long min_freq = frequency - half;
+            long long min_freq = frequency - half;
             long long max_freq = frequency + half;
 
-           if (min_freq < 0) {
-               min_freq = 0;
-           }
-           log_info("rx_low = %ld, rx_high = %ld", rx_low, rx_high);
-           log_info("min_freq = %ld, max_freq = %ld", min_freq, max_freq);
+            if (min_freq < 0) {
+                min_freq = 0;
+            }
+            log_info("rx_low = %ld, rx_high = %ld", rx_low, rx_high);
+            log_info("min_freq = %ld, max_freq = %ld", min_freq, max_freq);
             if (rx_low <= min_freq) {
-               // XXX handle ctune beyond the screen limits
-               long long delta_move = min_freq - rx_low;
-               vfo[id].frequency = ((vfo[id].frequency / step + steps) * step) - delta_move;
-
-               log_info("vfo_f = %lld, ctun_f = %lld", vfo[id].frequency, vfo[id].ctun_frequency);
-               receiver_frequency_changed(receiver[id]);
-               g_idle_add(ext_vfo_update, NULL);
+                // XXX handle ctune beyond the screen limits
+                long long delta_move = min_freq - rx_low;
+                vfo[id].frequency =
+                    ((vfo[id].frequency / step + steps) * step) - delta_move;
+
+                log_info("vfo_f = %lld, ctun_f = %lld", vfo[id].frequency,
+                         vfo[id].ctun_frequency);
+                receiver_frequency_changed(receiver[id]);
+                g_idle_add(ext_vfo_update, NULL);
                 return;
             } else if (rx_high >= max_freq) {
-               // XXX: move the background
-               long long delta_move = rx_high - max_freq;
-               vfo[id].frequency = ((vfo[id].frequency / step + steps) * step) + delta_move;
-
-               log_info("vfo_f = %lld, ctun_f = %lld", vfo[id].frequency, vfo[id].ctun_frequency);
-               receiver_frequency_changed(receiver[id]);
-               g_idle_add(ext_vfo_update, NULL);
+                // XXX: move the background
+                long long delta_move = rx_high - max_freq;
+                vfo[id].frequency =
+                    ((vfo[id].frequency / step + steps) * step) + delta_move;
+
+                log_info("vfo_f = %lld, ctun_f = %lld", vfo[id].frequency,
+                         vfo[id].ctun_frequency);
+                receiver_frequency_changed(receiver[id]);
+                g_idle_add(ext_vfo_update, NULL);
                 return;
             }
 
@@ -722,7 +724,7 @@ void vfo_id_move(int id, long long hz, int round) {
 
     if (!locked) {
         if (vfo[id].ctun) {
-           log_trace("vfo_id_move: ctune, vfo changed");
+            log_trace("vfo_id_move: ctune, vfo changed");
             // don't let ctun go beyond end of passband
             long long frequency = vfo[id].frequency;
             long long rx_low =
@@ -734,27 +736,27 @@ void vfo_id_move(int id, long long hz, int round) {
             long long max_freq = frequency + half;
 
             if (rx_low <= min_freq) {
-               // XXX: move the background. how do we move the
-               // background? Set the freq to the new center freq?
-               // i.e. in ctun mode, vfo[id].ctune_frequency is the
-               // vfo freq and around it is where we draw the filter
-               // band limits, but the display is centered around
-               // vfo[id].frequency. But when we want to move the
-               // background, we move the vfo[id].freq by the
-               // required offset and let ctun_freq remain as it is.
-               long long delta_move = min_freq - rx_low;
-               vfo[id].frequency = vfo[id].frequency + hz - delta_move;
-               vfo[id].ctun_frequency = vfo[id].ctun_frequency + hz;
-               receiver_frequency_changed(receiver[id]);
-               g_idle_add(ext_vfo_update, NULL);
+                // XXX: move the background. how do we move the
+                // background? Set the freq to the new center freq?
+                // i.e. in ctun mode, vfo[id].ctune_frequency is the
+                // vfo freq and around it is where we draw the filter
+                // band limits, but the display is centered around
+                // vfo[id].frequency. But when we want to move the
+                // background, we move the vfo[id].freq by the
+                // required offset and let ctun_freq remain as it is.
+                long long delta_move = min_freq - rx_low;
+                vfo[id].frequency = vfo[id].frequency + hz - delta_move;
+                vfo[id].ctun_frequency = vfo[id].ctun_frequency + hz;
+                receiver_frequency_changed(receiver[id]);
+                g_idle_add(ext_vfo_update, NULL);
                 return;
             } else if (rx_high >= max_freq) {
-               // XXX: move the background
-               long long delta_move = rx_high - max_freq;
-               vfo[id].frequency = vfo[id].frequency + hz + delta_move;
-               vfo[id].ctun_frequency = vfo[id].ctun_frequency + hz;
-               receiver_frequency_changed(receiver[id]);
-               g_idle_add(ext_vfo_update, NULL);
+                // XXX: move the background
+                long long delta_move = rx_high - max_freq;
+                vfo[id].frequency = vfo[id].frequency + hz + delta_move;
+                vfo[id].ctun_frequency = vfo[id].ctun_frequency + hz;
+                receiver_frequency_changed(receiver[id]);
+                g_idle_add(ext_vfo_update, NULL);
                 return;
             }
 
@@ -832,7 +834,7 @@ void vfo_move_to(long long hz) {
 
     if (!locked) {
         if (vfo[id].ctun) {
-           log_trace("vfo_move_to: ctune, vfo changed");
+            log_trace("vfo_move_to: ctune, vfo changed");
             delta = vfo[id].ctun_frequency;
             vfo[id].ctun_frequency = f;
             if (vfo[id].mode == modeCWL) {
@@ -1012,48 +1014,47 @@ char **draw_vfo_val_fixed(char *vfo_str, int step) {
 void draw_item(cairo_t *cr, size_t item, uint status) {
     widget_props_t *entry = &default_widget_prop_table[item];
     cairo_move_to(cr, entry->x, entry->y);
-    cairo_set_source_rgb(cr, entry->colours[status].r, entry->colours[status].g, entry->colours[status].b);
+    cairo_set_source_rgb(cr, entry->colours[status].r, entry->colours[status].g,
+                         entry->colours[status].b);
 
     cairo_set_font_size(cr, entry->font_size);
     cairo_show_text(cr, entry->label[status]);
 }
 
 // I am not proud of this code
-int get_nr(RECEIVER *rx)
-{
+int get_nr(RECEIVER *rx) {
     if (rx->nr == 0 && rx->nr2 == 0 && rx->nr3 == 0 && rx->nr4 == 0) {
-       return 0;
+        return 0;
     }
 
     if (rx->nr == 1 && rx->nr2 == 0 && rx->nr3 == 0 && rx->nr4 == 0) {
-       return 1;
+        return 1;
     }
 
     if (rx->nr == 0 && rx->nr2 == 1 && rx->nr3 == 0 && rx->nr4 == 0) {
-       return 2;
+        return 2;
     }
 
     if (rx->nr == 0 && rx->nr2 == 0 && rx->nr3 == 1 && rx->nr4 == 0) {
-       return 3;
+        return 3;
     }
 
     if (rx->nr == 0 && rx->nr2 == 0 && rx->nr3 == 0 && rx->nr4 == 1) {
-       return 4;
+        return 4;
     }
 
     return -1;
 }
 
-int get_nb(RECEIVER *rx)
-{
+int get_nb(RECEIVER *rx) {
     if (rx->nb == 0 && rx->nb2 == 0) {
-       return 0;
+        return 0;
     }
     if (rx->nb == 1 && rx->nb2 == 0) {
-       return 1;
+        return 1;
     }
     if (rx->nb == 0 && rx->nb2 == 1) {
-       return 2;
+        return 2;
     }
 
     return -1;
@@ -1102,12 +1103,13 @@ void vfo_update(void) {
             break;
         }
 
-       widget_props_t *entry;
+        widget_props_t *entry;
 
         // draw mode
-       entry = &default_widget_prop_table[SCR_MODE];
+        entry = &default_widget_prop_table[SCR_MODE];
         cairo_set_font_size(cr, entry->font_size);
-        cairo_set_source_rgb(cr, entry->colours[0].r, entry->colours[0].g, entry->colours[0].b);
+        cairo_set_source_rgb(cr, entry->colours[0].r, entry->colours[0].g,
+                             entry->colours[0].b);
         cairo_move_to(cr, entry->x, entry->y);
         cairo_show_text(cr, temp_text);
 
@@ -1141,7 +1143,7 @@ void vfo_update(void) {
         if (s >= STEPS)
             s = 0;
 
-       entry = &default_widget_prop_table[SCR_VFO_A];
+        entry = &default_widget_prop_table[SCR_VFO_A];
         // draw VFO A
         cairo_select_font_face(cr, "Cantarell", CAIRO_FONT_SLANT_NORMAL,
                                CAIRO_FONT_WEIGHT_NORMAL);
@@ -1160,7 +1162,8 @@ void vfo_update(void) {
             } else if (id == 0) {
                 cairo_set_source_rgb(cr, GREEN_R, GREEN_G, GREEN_B);
             } else {
-                cairo_set_source_rgb(cr, DARK_GREEN_R, DARK_GREEN_G, DARK_GREEN_B);
+                cairo_set_source_rgb(cr, DARK_GREEN_R, DARK_GREEN_G,
+                                     DARK_GREEN_B);
             }
         }
         cairo_move_to(cr, entry->x, entry->y);
@@ -1210,41 +1213,43 @@ void vfo_update(void) {
             }
         }
 
-       // show vfo-b
-       entry = &default_widget_prop_table[SCR_VFO_B];
+        // show vfo-b
+        entry = &default_widget_prop_table[SCR_VFO_B];
         cairo_move_to(cr, entry->x, entry->y);
         cairo_set_font_size(cr, entry->font_size);
         cairo_show_text(cr, temp_text);
 
         // show the currently active VFO.
         sprintf(temp_text, "%c", active_receiver->active_vfo == 0 ? 'A' : 'B');
-       entry = &default_widget_prop_table[SCR_ACTIVE_VFO];
-       cairo_move_to(cr, entry->x, entry->y);
-       cairo_set_source_rgb(cr, entry->colours[1].r, entry->colours[1].g, entry->colours[1].b);
+        entry = &default_widget_prop_table[SCR_ACTIVE_VFO];
+        cairo_move_to(cr, entry->x, entry->y);
+        cairo_set_source_rgb(cr, entry->colours[1].r, entry->colours[1].g,
+                             entry->colours[1].b);
         cairo_set_font_size(cr, entry->font_size);
         cairo_show_text(cr, temp_text);
 
 #ifdef PURESIGNAL
         if (can_transmit) {
-           draw_item(cr, SCR_PS, transmitter->puresignal);
+            draw_item(cr, SCR_PS, transmitter->puresignal);
         }
 #endif
 
-       // RIT
-       entry = &default_widget_prop_table[SCR_RIT];
-       cairo_move_to(cr, entry->x, entry->y);
-       cairo_set_source_rgb(cr, entry->colours[vfo[id].rit_enabled].r, entry->colours[vfo[id].rit_enabled].g, entry->colours[vfo[id].rit_enabled].b);
+        // RIT
+        entry = &default_widget_prop_table[SCR_RIT];
+        cairo_move_to(cr, entry->x, entry->y);
+        cairo_set_source_rgb(cr, entry->colours[vfo[id].rit_enabled].r,
+                             entry->colours[vfo[id].rit_enabled].g,
+                             entry->colours[vfo[id].rit_enabled].b);
         sprintf(temp_text, "RIT: %lld", vfo[id].rit);
         cairo_set_font_size(cr, entry->font_size);
         cairo_show_text(cr, temp_text);
 
         if (can_transmit) {
-           entry = &default_widget_prop_table[SCR_XIT];
-           cairo_move_to(cr, entry->x, entry->y);
-           cairo_set_source_rgb(cr,
-                                entry->colours[transmitter->xit_enabled].r,
-                                entry->colours[transmitter->xit_enabled].g,
-                                entry->colours[transmitter->xit_enabled].b);
+            entry = &default_widget_prop_table[SCR_XIT];
+            cairo_move_to(cr, entry->x, entry->y);
+            cairo_set_source_rgb(cr, entry->colours[transmitter->xit_enabled].r,
+                                 entry->colours[transmitter->xit_enabled].g,
+                                 entry->colours[transmitter->xit_enabled].b);
             sprintf(temp_text, "XIT: %lld", transmitter->xit);
 
             cairo_set_font_size(cr, entry->font_size);
@@ -1254,50 +1259,50 @@ void vfo_update(void) {
         // NB and NB2 are mutually exclusive, therefore
         // they are put to the same place in order to save
         // some space
-       int which_nb = get_nb(active_receiver);
-       if (which_nb < 0) {
-           log_trace("RIGCTL: ERROR in NR determination used for display");
-           which_nb = 0;
-       }
-       draw_item(cr, SCR_NB, which_nb);
-
-       // NR
+        int which_nb = get_nb(active_receiver);
+        if (which_nb < 0) {
+            log_trace("RIGCTL: ERROR in NR determination used for display");
+            which_nb = 0;
+        }
+        draw_item(cr, SCR_NB, which_nb);
+
+        // NR
         // NR, NR2, NR3 and NR4 are mutually exclusive
-       int which_nr = get_nr(active_receiver);
-       if (which_nr < 0) {
-           log_trace("RIGCTL: ERROR in NR determination used for display");
-           which_nr = 0;
-       }
-       draw_item(cr, SCR_NR, which_nr);
+        int which_nr = get_nr(active_receiver);
+        if (which_nr < 0) {
+            log_trace("RIGCTL: ERROR in NR determination used for display");
+            which_nr = 0;
+        }
+        draw_item(cr, SCR_NR, which_nr);
 
-       // anf
-       draw_item(cr, SCR_ANF, active_receiver->anf);
+        // anf
+        draw_item(cr, SCR_ANF, active_receiver->anf);
 
-       // snb
-       draw_item(cr, SCR_SNB, active_receiver->snb);
+        // snb
+        draw_item(cr, SCR_SNB, active_receiver->snb);
 
-       // agc
-       draw_item(cr, SCR_AGC, active_receiver->agc);
+        // agc
+        draw_item(cr, SCR_AGC, active_receiver->agc);
 
 #ifdef MIDI
-       draw_item(cr, SCR_MIDI, midi_enabled);
+        draw_item(cr, SCR_MIDI, midi_enabled);
 #endif
 
         if (can_transmit) {
-           draw_item(cr, SCR_VOX, vox_enabled);
+            draw_item(cr, SCR_VOX, vox_enabled);
         }
 
-       // lock
-       draw_item(cr, SCR_LOCK, locked);
+        // lock
+        draw_item(cr, SCR_LOCK, locked);
 
-       // split
-       draw_item(cr, SCR_SPLIT, split);
+        // split
+        draw_item(cr, SCR_SPLIT, split);
 
-       // Ctun
-       draw_item(cr, SCR_CTUN, vfo[id].ctun);
+        // Ctun
+        draw_item(cr, SCR_CTUN, vfo[id].ctun);
 
-       // dup
-       draw_item(cr, SCR_DUP, duplex);
+        // dup
+        draw_item(cr, SCR_DUP, duplex);
 
         cairo_destroy(cr);
         gtk_widget_queue_draw(vfo_panel);
@@ -1311,13 +1316,13 @@ static gboolean vfo_press_event_cb(GtkWidget *widget, GdkEventButton *event,
     // vfo a and b are drawn at x = 280, so it is the y coordinate
     // that matters.
     if (event->x >= default_widget_prop_table[SCR_VFO_B].x &&
-       event->y <= default_widget_prop_table[SCR_VFO_B].y) {
+        event->y <= default_widget_prop_table[SCR_VFO_B].y) {
         // vfo B
         start_vfo(VFO_B);
         return TRUE;
     } else if (event->x >= default_widget_prop_table[SCR_VFO_A].x &&
-              event->y > default_widget_prop_table[SCR_VFO_B].y &&
-              event->y <= default_widget_prop_table[SCR_VFO_A].y) {
+               event->y > default_widget_prop_table[SCR_VFO_B].y &&
+               event->y <= default_widget_prop_table[SCR_VFO_A].y) {
         // vfo A
         start_vfo(VFO_A);
         return TRUE;