📄 xgps.c
字号:
/* $Id: xgps.c 4548 2007-12-13 01:40:06Z esr $ *//* $gpsd: xgps.c 3871 2006-11-13 00:40:00Z esr $ *//* * Copyright (c) 2007 Marc Balmer <marc@msys.ch> * Copyright (c) 2006 Eric S. Raymond * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */#include <sys/types.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <unistd.h>#include <math.h>#include <errno.h>#include <stdbool.h>#include <Xm/Xm.h>#include <Xm/MwmUtil.h>#include <Xm/PushB.h>#include <Xm/Form.h>#include <Xm/RowColumn.h>#include <Xm/Label.h>#include <Xm/TextF.h>#include <Xm/List.h>#include <Xm/DrawingA.h>#include <Xm/Protocols.h>#include <Xm/MainW.h>#include <Xm/Frame.h>#include <Xm/LabelG.h>#include <Xm/ScrolledW.h>#include <Xm/MessageB.h>#include <Xm/Text.h>#include <X11/Shell.h>#include <gpsd_config.h>#include <gps.h>#include "display.h"/* Widget and window sizes. */#define MAX_FONTSIZE 18 /* maximum fontsize we handle*//* height of satellite-data display */#define SATDATA_HEIGHT MAX_FONTSIZE*(MAXCHANNELS+1)#define LEFTSIDE_WIDTH 205 /* width of data-display side */#define SATDIAG_SIZE 400 /* size of satellite diagram */static Widget toplevel, form, left, right;static Widget satellite_list, satellite_diagram;static Widget status_form, status_frame, status;static Widget text_1, text_2, text_3, text_4, text_5;static Widget text_6, text_7, text_8, text_9, text_10;static GC gc;static struct gps_data_t *gpsdata;static time_t timer; /* time of last state change */static int state = 0; /* or MODE_NO_FIX=1, MODE_2D=2, MODE_3D=3 */static XtAppContext app;static XtIntervalId timeout, gps_timeout;static XtInputId gps_input;static enum deg_str_type deg_type = deg_dd;char *server, *device;char *port = DEFAULT_GPSD_PORT;bool jitteropt = false;bool gps_lost;/*@ -nullassign @*/static XrmOptionDescRec options[] = { { "-altunits", "*altunits", XrmoptionSepArg, NULL }, { "-speedunits","*speedunits", XrmoptionSepArg, NULL },};String fallback_resources[] = { NULL} ;/*@ +nullassign @*/struct unit_t { char *legend; double factor;};static struct unit_t speedtable[] = { { "knots", MPS_TO_KNOTS }, { "mph", MPS_TO_MPH }, { "kmh", MPS_TO_KPH },}, *speedunits = speedtable;static struct unit_t alttable[] = { { "feet", METERS_TO_FEET }, { "meters", 1},}, *altunits = alttable;void dlg_callback(Widget dialog, XtPointer client_data, XtPointer call_data);void help_cb(Widget widget, XtPointer client_data, XtPointer call_data);void file_cb(Widget widget, XtPointer client_data, XtPointer call_data);Widget err_dialog(Widget widget, char *s);void handle_gps(XtPointer client_data, XtIntervalId *ignored);static voidquit_cb(void){ exit(0);}/*@ -mustfreefresh -compdef +ignoresigns @*/static Pixelget_pixel(Widget w, char *resource_value){ Colormap colormap; Boolean cstatus; XColor exact, color; colormap = DefaultColormapOfScreen( DefaultScreenOfDisplay(XtDisplay(w))); /*@i@*/cstatus = XAllocNamedColor(XtDisplay(w), colormap, resource_value, &color, &exact); if (cstatus == (Boolean)False) { (void)fprintf(stderr, "Unknown color: %s", resource_value); color.pixel = BlackPixelOfScreen( DefaultScreenOfDisplay(XtDisplay(w))); }; /*@i1@*/return (color.pixel);}static voidbuild_gui(Widget toplevel){ Widget main_w, menubar, widget, sat_frame, sky_frame, gps_frame; Widget gps_form, gps_data, sw; Arg args[100]; XGCValues gcv; Atom delw; int i; XmString string; XmString file, help, about, quit; /*@ -immediatetrans -usedef @*/ /* the root application window */ XtSetArg(args[0], XmNwidth, LEFTSIDE_WIDTH + SATDIAG_SIZE + 26); XtSetArg(args[1], XmNheight, SATDATA_HEIGHT + 14 * MAX_FONTSIZE + 12); /*@ +immediatetrans +usedef @*/ XtSetValues(toplevel, args, 2); /*@ -onlytrans @*/ main_w = XtVaCreateManagedWidget("main_window", xmMainWindowWidgetClass, toplevel, NULL); /* Construct the menubar */ file = XmStringCreateLocalized("File"); help = XmStringCreateLocalized("Help"); menubar = XmVaCreateSimpleMenuBar(main_w, "menubar", XmVaCASCADEBUTTON, file, 'F', XmVaCASCADEBUTTON, help, 'H', NULL); XmStringFree(file); if ((widget = XtNameToWidget(menubar, "button_1"))) XtVaSetValues(menubar, XmNmenuHelpWidget, widget, NULL); quit = XmStringCreateLocalized("Quit"); (void)XmVaCreateSimplePulldownMenu(menubar, "file_menu", 0, file_cb, XmVaPUSHBUTTON, quit, 'Q', NULL, NULL, NULL); XmStringFree(quit); about = XmStringCreateLocalized("About"); (void)XmVaCreateSimplePulldownMenu(menubar, "help_menu", 1, help_cb, XmVaPUSHBUTTON, help, 'H', NULL, NULL, XmVaSEPARATOR, XmVaPUSHBUTTON, about, 'A', NULL, NULL, NULL); XmStringFree(help); XmStringFree(about); XtManageChild(menubar); /* a form to assist with geometry negotiation */ form = XtVaCreateManagedWidget("form", xmFormWidgetClass, main_w, XmNfractionBase, 3, NULL); /* satellite frame */ sat_frame = XtVaCreateWidget("satellite_frame", xmFrameWidgetClass, form, XmNshadowType, XmSHADOW_ETCHED_IN, XmNtopAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 1, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 2, XmNleftAttachment, XmATTACH_FORM, NULL); (void)XtVaCreateManagedWidget("Satellite List", xmLabelGadgetClass, sat_frame, XmNchildType, XmFRAME_TITLE_CHILD, XmNchildVerticalAlignment, XmALIGNMENT_CENTER, NULL); /* the left half of the screen */ left = XtVaCreateManagedWidget("left", xmFormWidgetClass, sat_frame, NULL); /* skyview frame */ sky_frame = XtVaCreateWidget("skyview_frame", xmFrameWidgetClass, form, XmNshadowType, XmSHADOW_ETCHED_IN, XmNtopAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 1, NULL); (void)XtVaCreateManagedWidget("Skyview", xmLabelGadgetClass, sky_frame, XmNchildType, XmFRAME_TITLE_CHILD, XmNchildVerticalAlignment, XmALIGNMENT_CENTER, NULL); /* the right half of the screen */ right = XtVaCreateManagedWidget("right", xmFormWidgetClass, sky_frame, NULL); /* the application status bar */ status_form = XtVaCreateManagedWidget("status_form", xmFormWidgetClass, form, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 2, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, left, XmNfractionBase, 3, NULL); status_frame = XtVaCreateWidget("status_frame", xmFrameWidgetClass, status_form, XmNshadowType, XmSHADOW_ETCHED_IN, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); (void)XtVaCreateManagedWidget("Message Data", xmLabelGadgetClass, status_frame, XmNchildType, XmFRAME_TITLE_CHILD, XmNchildVerticalAlignment, XmALIGNMENT_CENTER, NULL); status = XtVaCreateManagedWidget("status", xmTextFieldWidgetClass, status_form, XmNcursorPositionVisible, False, XmNeditable, False, XmNmarginHeight, 1, XmNhighlightThickness, 0, XmNshadowThickness, 2, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); /* gps information frame */ gps_form = XtVaCreateManagedWidget("gps_form", xmFormWidgetClass, form, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 2, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, status_form, XmNfractionBase, 3, NULL); gps_frame = XtVaCreateWidget("gps_frame", xmFrameWidgetClass, gps_form, XmNshadowType, XmSHADOW_ETCHED_IN, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); (void)XtVaCreateManagedWidget("GPS Data", xmLabelGadgetClass, gps_frame, XmNchildType, XmFRAME_TITLE_CHILD, XmNchildVerticalAlignment, XmALIGNMENT_CENTER, NULL); sw = XtVaCreateManagedWidget("scrolled_w", xmScrolledWindowWidgetClass, gps_frame, XmNscrollingPolicy, XmAUTOMATIC, NULL); gps_data = XtVaCreateWidget("gps_data", xmFormWidgetClass, sw, XmNfractionBase, 30, NULL); /* satellite location and SNR data panel */ satellite_list = XtVaCreateManagedWidget("satellite_list", xmListWidgetClass, left, XmNbackground, get_pixel(toplevel, "snow"), XmNlistSizePolicy, XmCONSTANT, XmNhighlightThickness, 0, XmNlistSpacing, 4, XmNtopAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, NULL); /* the satellite diagram */ satellite_diagram = XtVaCreateManagedWidget("satellite_diagram", xmDrawingAreaWidgetClass, right, XmNbackground, get_pixel(toplevel, "snow"), XmNheight, SATDIAG_SIZE + 24, XmNwidth, SATDIAG_SIZE, XmNtopAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, NULL); gcv.foreground = BlackPixelOfScreen(XtScreen(satellite_diagram)); gc = XCreateGC(XtDisplay(satellite_diagram), RootWindowOfScreen(XtScreen(satellite_diagram)), GCForeground, &gcv); register_canvas(satellite_diagram, gc); XtVaSetValues(satellite_diagram, XmNuserData, gc, NULL); /*@i@*/XtAddCallback(satellite_diagram, XmNexposeCallback, redraw, NULL); /*@i@*/XtAddCallback(satellite_diagram, XmNresizeCallback, resize, NULL); /* the data display */ (void)XtVaCreateManagedWidget("Time", xmLabelGadgetClass, gps_data, XmNalignment, XmALIGNMENT_END, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 0, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 5, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 6, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, NULL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -