⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xgps.c

📁 gpsd, a popular GPS daemon.
💻 C
📖 第 1 页 / 共 3 页
字号:
/* $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 + -