From 7335ef29277e014c9918d25da3dc76870c2c64e9 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Fri, 2 Dec 2016 23:51:45 -0500 Subject: [PATCH] wmspaceweather: Add version 1.04 to repository. From ftp://ftp.uk.freebsd.org/pub/OpenBSD/distfiles/wmSpaceWeather-1.04.tar.gz --- wmspaceweather/BUGS | 1 + wmspaceweather/CHANGES | 18 + wmspaceweather/COPYING | 339 +++++++++ wmspaceweather/HINTS | 36 + wmspaceweather/INSTALL | 22 + wmspaceweather/README | 30 + wmspaceweather/wmSpaceWeather/GetKp | 212 ++++++ wmspaceweather/wmSpaceWeather/Makefile | 34 + wmspaceweather/wmSpaceWeather/wmSpaceWeather | Bin 0 -> 28269 bytes .../wmSpaceWeather/wmSpaceWeather.1 | 30 + .../wmSpaceWeather/wmSpaceWeather.c | 680 ++++++++++++++++++ .../wmSpaceWeather/wmSpaceWeather.o | Bin 0 -> 19808 bytes .../wmSpaceWeather/wmSpaceWeather_mask.xbm | 38 + .../wmSpaceWeather/wmSpaceWeather_master.gif | Bin 0 -> 1375 bytes .../wmSpaceWeather/wmSpaceWeather_master.xpm | 119 +++ wmspaceweather/wmgeneral/wmgeneral.c | 366 ++++++++++ wmspaceweather/wmgeneral/wmgeneral.h | 50 ++ wmspaceweather/wmgeneral/wmgeneral.o | Bin 0 -> 7324 bytes 18 files changed, 1975 insertions(+) create mode 100644 wmspaceweather/BUGS create mode 100644 wmspaceweather/CHANGES create mode 100644 wmspaceweather/COPYING create mode 100644 wmspaceweather/HINTS create mode 100644 wmspaceweather/INSTALL create mode 100644 wmspaceweather/README create mode 100755 wmspaceweather/wmSpaceWeather/GetKp create mode 100644 wmspaceweather/wmSpaceWeather/Makefile create mode 100755 wmspaceweather/wmSpaceWeather/wmSpaceWeather create mode 100644 wmspaceweather/wmSpaceWeather/wmSpaceWeather.1 create mode 100644 wmspaceweather/wmSpaceWeather/wmSpaceWeather.c create mode 100644 wmspaceweather/wmSpaceWeather/wmSpaceWeather.o create mode 100644 wmspaceweather/wmSpaceWeather/wmSpaceWeather_mask.xbm create mode 100644 wmspaceweather/wmSpaceWeather/wmSpaceWeather_master.gif create mode 100644 wmspaceweather/wmSpaceWeather/wmSpaceWeather_master.xpm create mode 100644 wmspaceweather/wmgeneral/wmgeneral.c create mode 100644 wmspaceweather/wmgeneral/wmgeneral.h create mode 100644 wmspaceweather/wmgeneral/wmgeneral.o diff --git a/wmspaceweather/BUGS b/wmspaceweather/BUGS new file mode 100644 index 0000000..32f5c37 --- /dev/null +++ b/wmspaceweather/BUGS @@ -0,0 +1 @@ +Please send bug reports to mghenderson@lanl.gov diff --git a/wmspaceweather/CHANGES b/wmspaceweather/CHANGES new file mode 100644 index 0000000..a2d2f71 --- /dev/null +++ b/wmspaceweather/CHANGES @@ -0,0 +1,18 @@ +wmSpaceWeather changes. + +Version Description +------------------------------------------------------------------------- +1.04 - released Feb 18, 1999 + Added double click capability. Double clicking on mouse button 1 sends + URL (defined via ne command line option -url) to netscape. + +1.03 - released Feb 11, 1999 + Changed display a bit. When no data is + available, it now shows nothing (before it would + show false junk...). Modified Perl Script GetKp. + + +1.02 - released Feb 8, 1999 + bug fixes... + +1.0b - released Dec 19, 1998 diff --git a/wmspaceweather/COPYING b/wmspaceweather/COPYING new file mode 100644 index 0000000..a43ea21 --- /dev/null +++ b/wmspaceweather/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/wmspaceweather/HINTS b/wmspaceweather/HINTS new file mode 100644 index 0000000..4aef871 --- /dev/null +++ b/wmspaceweather/HINTS @@ -0,0 +1,36 @@ +Hints for wmSpaceWeather + +Generic. +-------- +wmSpaceWeather version: 1.0b + +usage: wmSpaceWeather [-h] [-display ] + + -d Use alternate display. + -h Display help screen. + + + +WindowMaker. +------------ +In WindowMaker simply drag and drop the wmSpaceWeather App on +the WindowMaker Dock or Clip. + + +Afterstep. +--------- +Afterstep users put the following in their .steprc +"Wharf wmSpaceWeather - MaxSwallow "wmSpaceWeather" wmSpaceWeather &". + +Note: AfterStep's Wharf has a problem with pixmaps that are +larger than 60x60 pixels. Please tell the AfterStep authors +to fix this, this is not our fault, but a Wharf problem! + + +Other window managers. +---------------------- +wmSpaceWeather shows as a 64x64 shaped icon on your desktop under other +window managers. + + + diff --git a/wmspaceweather/INSTALL b/wmspaceweather/INSTALL new file mode 100644 index 0000000..954d519 --- /dev/null +++ b/wmspaceweather/INSTALL @@ -0,0 +1,22 @@ +Installation instructions for wmSpaceWeather. + +Requirements +-------------------------------------------------------------- +wmSpaceWeather requires the Xpm library (which should be available on +most machines with XFree86 installed). + +Installation +-------------------------------------------------------------- +1) gunzip wmSpaceWeather-1.0.tar.gz +1) tar -xvf wmSpaceWeather-1.0.tar +2) cd wmSpaceWeather-1.0/wmSpaceWeather/ +3) make +4) make install (must be root) +5) wmSpaceWeather & (or 'wmSpaceWeather -h' for help, or 'man wmSpaceWeather' for the man page) +6) You need to set the location of perl correctly in GetKp if your perl + is located in a place other than /usr/bin/ + + + + + diff --git a/wmspaceweather/README b/wmspaceweather/README new file mode 100644 index 0000000..29c0327 --- /dev/null +++ b/wmspaceweather/README @@ -0,0 +1,30 @@ +wmSpaceWeather-1.0b release +---------------------- +Author....: Michael G. Henderson + + +Description +----------- +wmSpaceWeather is a space weather monitor + + +Files +----- +README This file. +INSTALL Installation instructions. +HINTS Hints about what you can do with wmSpaceWeather. +BUGS Bug reports +CHANGES Change history. +COPYING GNU General Public License Version 2. + + +Bugs +----- +Send bug reports to mghenderson@lanl.gov + + +Copyright +---------- +wmSpaceWeather is copyright (c) 1998 by Michael G. Henderson and +licensed through the GNU General Public License. Read the +COPYING file for the complete GNU license. diff --git a/wmspaceweather/wmSpaceWeather/GetKp b/wmspaceweather/wmSpaceWeather/GetKp new file mode 100755 index 0000000..27f9274 --- /dev/null +++ b/wmspaceweather/wmSpaceWeather/GetKp @@ -0,0 +1,212 @@ +#!/usr/bin/perl + +# +# A really crappy code to grab last 8 Kp values.... +# + + + require "ctime.pl"; + + + ($Year, $Month, $Day) = &year_month_day(); + + if (-e "/tmp/DGD.txt"){ + unlink("/tmp/DGD.txt"); + } + + if (-e "/tmp/curind.txt"){ + unlink("/tmp/curind.txt"); + } + + + $grabcmd = "cd /tmp; wget --passive-ftp --tries 2 -q ftp://www.sec.noaa.gov/pub/indices/DGD.txt"; + system "$grabcmd"; + + + # + # ensure that there are at least 8 values available... + # + %Kp = (); + $Kp{190001011} = 999; + $Kp{190001012} = 999; + $Kp{190001013} = 999; + $Kp{190001014} = 999; + $Kp{190001015} = 999; + $Kp{190001016} = 999; + $Kp{190001017} = 999; + $Kp{190001018} = 999; + + + open(TmpFile, "/tmp/DGD.txt"); + while (){ + chop; + if ($_ =~ /^\d{4} \d{2} \d{2}\s*\d*/ ){ + + $Date = $_; + + s/^(\d{4}) (\d{2}) (\d{2}).*\s{2,}(.*)/\4/; + s/([ -]{0,1}\d{1,2})([ -]{0,1}\d{1,2})([ -]{0,1}\d{1,2})([ -]{0,1}\d{1,2})([ -]{0,1}\d{1,2})([ -]{0,1}\d{1,2})([ -]{0,1}\d{1,2})([ -]{0,1}\d{1,2})/\1 \2 \3 \4 \5 \6 \7 \8/; + + $Date =~ s/^(\d{4}) (\d{2}) (\d{2}).*\s{2,}(.*)/\1\2\3/; + ($a, $b, $c, $d, $e, $f, $g, $h) = split(/\s{1,}/, $_); + + $TimeTag = $Date*10 + 1; $Kp{$TimeTag} = $a; + $TimeTag = $Date*10 + 2; $Kp{$TimeTag} = $b; + $TimeTag = $Date*10 + 3; $Kp{$TimeTag} = $c; + $TimeTag = $Date*10 + 4; $Kp{$TimeTag} = $d; + $TimeTag = $Date*10 + 5; $Kp{$TimeTag} = $e; + $TimeTag = $Date*10 + 6; $Kp{$TimeTag} = $f; + $TimeTag = $Date*10 + 7; $Kp{$TimeTag} = $g; + $TimeTag = $Date*10 + 8; $Kp{$TimeTag} = $h; + + } + } + close(TmpFile); + + + + # + # Add in very latest stuff + # + $grabcmd = "cd /tmp; wget --passive-ftp --tries 2 -q ftp://www.sec.noaa.gov/pub/latest/curind.txt"; + system "$grabcmd"; + %lmonstr = ( "Jan", 1, "Feb", 2, "Mar", 3, "Apr", 4, "May", 5, "Jun", 6, "Jul", 7, "Aug", 8, "Sep", 9, "Oct", 10, "Nov", 11, "Dec", 12); + +@lval = ($lyear, $lmonstr{$lmon}, $ldom); + open(TmpFile, "/tmp/curind.txt"); + while (){ + chop; + if ($_ =~ /^:Geomagnetic_Values: (\d{4}) (.*) (\d{1,2})/){ + $y = $_; + $ms = $_; + $d = $_; + + $y =~ s/^:Geomagnetic_Values: (\d{4}) (.*) (\d{1,2})/\1/; + $ms =~ s/^:Geomagnetic_Values: (\d{4}) (.*) (\d{1,2})/\2/; + $d =~ s/^:Geomagnetic_Values: (\d{4}) (.*) (\d{1,2})/\3/; + $tDate = $y*10000 + $lmonstr{$ms}*100 + $d; + } + if ($_ =~ /.*\d/) { + $Line = $_; + } + + if ($_ =~ /^\s{1,}[0-9e\.\+\-]{2,}\s{1,}[0-9e\.\+\-]{2,}\s{1,}[0-9e\.\+\-]{2,}\s{1,}[0-9e\.\+\-]{2,}\s{1,}[0-9e\.\+\-]{2,}\s{1,}[BCMX]{1,}[0-9\.]{1,}\s{1,}[0-9-]{1,}/){ + + $FluxLine = $_; + + } + + + + } + + $Line =~ s/.*\s{3,}(.*)/\1/; + ($a, $b, $c, $d, $e, $f, $g, $h) = split(/\s{1,}/, $Line); + if ($tDate > 0) { + $TimeTag = $tDate*10 + 1; $Kp{$TimeTag} = $a; + $TimeTag = $tDate*10 + 2; $Kp{$TimeTag} = $b; + $TimeTag = $tDate*10 + 3; $Kp{$TimeTag} = $c; + $TimeTag = $tDate*10 + 4; $Kp{$TimeTag} = $d; + $TimeTag = $tDate*10 + 5; $Kp{$TimeTag} = $e; + $TimeTag = $tDate*10 + 6; $Kp{$TimeTag} = $f; + $TimeTag = $tDate*10 + 7; $Kp{$TimeTag} = $g; + $TimeTag = $tDate*10 + 8; $Kp{$TimeTag} = $h; + } else { + $Kp{190001011} = 999; + $Kp{190001012} = 999; + $Kp{190001013} = 999; + $Kp{190001014} = 999; + $Kp{190001015} = 999; + $Kp{190001016} = 999; + $Kp{190001017} = 999; + $Kp{190001018} = 999; + } + + + + $n = 0; + %Result = (); + foreach $key (reverse sort keys %Kp ) { + if (($Kp{$key} >= 0)&&($n < 8)){ + $Result{$key} = $Kp{$key}; + ++$n; + } + } + + open(TmpFile, ">/tmp/LatestKp.txt"); + foreach $key (sort keys %Result ) { + if ($Result{$key} > 10) { $Result{$key} = -1; } + printf TmpFile "$key $Result{$key}\n"; + } + + + + + $FluxLine =~ s/^\s*//; + if ($FluxLine =~ /\d/){ + ($E1, $E2, $P1, $P2, $P3, $Xray, $junk) = split(/\s{1,}/, $FluxLine); + + } else { + $E1 = -999; + $E2 = -999; + $P1 = -999; + $P2 = -999; + $P3 = -999; + $Xray = "Z0.0"; + } + + + printf TmpFile "$E1\n"; + printf TmpFile "$E2\n"; + printf TmpFile "$P1\n"; + printf TmpFile "$P2\n"; + printf TmpFile "$P3\n"; + printf TmpFile "$Xray\n"; + close(TmpFile); + + + + + + + + +# +# sort(List); +# +# $Gif = "$List[$#List]"; +# $Latest = "http://swdcdb.kugi.kyoto-u.ac.jp/dstdir/dst1/q/$Gif"; +# +# +# $grabcmd = "/u/mgh/wwwgrab/wwwgrab $Latest /n/tmp/polar/$Gif"; +# system "$grabcmd"; +# +# +# system "convert -crop 0x0 /n/tmp/polar/${Gif} /n/tmp/polar/Dst.rle"; +# system "fant -s .5 .5 -o /n/tmp/polar/Dst2.rle /n/tmp/polar/Dst.rle"; +# system "convert -frame 4x4 -gamma 3 -crop 0x0 -colors 256 /n/tmp/polar/Dst2.rle /n/leadbelly/belly3/PolarNRT/CEPPAD/IPS/LatestDst.gif"; +# +# +# +# +# +# open(TmpFile, ">/n/leadbelly/belly3/PolarNRT/CEPPAD/IPS/LatestDst.txt"); +# printf TmpFile "${Gif}\n"; +# close(TmpFile); +# +# system "touch /n/leadbelly/belly3/PolarNRT/CEPPAD/IPS/LatestDst.txt"; + + +sub year_month_day{ + + local($ldate_string, $ldow, $lmon, $ldom, $ltim, $lyear, %lmonstr, $tzone, @lval); + + $ldate_string = &ctime(time); + ($ldow, $lmon, $ldom, $ltim, $lyear) = split(" ", $ldate_string); + + %lmonstr = ( "Jan", 1, "Feb", 2, "Mar", 3, "Apr", 4, "May", 5, "Jun", 6, "Jul", 7, "Aug", 8, "Sep", 9, "Oct", 10, "Nov", 11, "Dec", 12); + + @lval = ($lyear, $lmonstr{$lmon}, $ldom); + +} + diff --git a/wmspaceweather/wmSpaceWeather/Makefile b/wmspaceweather/wmSpaceWeather/Makefile new file mode 100644 index 0000000..2e543b6 --- /dev/null +++ b/wmspaceweather/wmSpaceWeather/Makefile @@ -0,0 +1,34 @@ +CC = gcc +CFLAGS = -O2 -Wall +INCDIR = -I/usr/X11R6/include/X11 +DESTDIR= /usr/X11R6 +LIBDIR = -L/usr/X11R6/lib +# for linux +LIBS = -lXpm -lX11 -lXext +# for Solaris +# LIBS = -lXpm -lX11 -lXext -lsocket +OBJS = wmSpaceWeather.o \ + ../wmgeneral/wmgeneral.o + + +.c.o: + $(CC) $(COPTS) -D$(shell echo `uname -s`) -c $< -o $*.o $(INCDIR) + + +all: wmSpaceWeather.o wmSpaceWeather + +wmSpaceWeather.o: wmSpaceWeather_master.xpm wmSpaceWeather_mask.xbm +wmSpaceWeather: $(OBJS) + $(CC) $(COPTS) $(SYSTEM) -o wmSpaceWeather $^ $(INCDIR) $(LIBDIR) $(LIBS) + +clean: + for i in $(OBJS) ; do \ + rm -f $$i; \ + done + rm -f wmSpaceWeather + +install:: wmSpaceWeather + install -s -m 0755 wmSpaceWeather $(DESTDIR)/bin + install -m 0755 GetKp $(DESTDIR)/bin + install -m 0644 wmSpaceWeather.1 $(DESTDIR)/man/man1 + diff --git a/wmspaceweather/wmSpaceWeather/wmSpaceWeather b/wmspaceweather/wmSpaceWeather/wmSpaceWeather new file mode 100755 index 0000000000000000000000000000000000000000..79c022acb8148eb6906e4ffab38d4ea8bfe98a47 GIT binary patch literal 28269 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 MlsdKNv;%] +.SH DESCRIPTION +.PP +wmSpaceWeather is a space weather monitor. The monitor shows: 2 relativistic electron +and 3 relativistic proton flux levels at geosyncronous orbit (currently from the NOAA +GOES spacecraft), current Solar Flare X-ray flux, and the last 8 3-hour Kp index values. +.PP +Large fluxes of relativistic (aka `Killer') electrons can cause harmful `deep-dielectric' +charging/discharging events inside satellites. High proton fluxes (`Solar Energetic Proton' or +SEP events) can cause single event upsets in satellite electronics. The Kp index is a measure +of how disturbed the Earth's magnetic field has been over a 3-hour interval. Kp can range from +0-9, where 0 is quiet and 9 is very disturbed. The Kp values shown are the 8 previous values +(i.e. the last 24 hours). If the display is up-to-date, the LED next to the Kp +bars will flash blue. If the display is not up-to-date, the LED will flash orange. +.SH OPTIONS +.TP +.B \-h +Display list of command-line options. +.TP +.B \-display [display] +Use an alternate X Display. +.SH BUGS +Let me know if/when you find any. +.SH AUTHOR +Michael G. Henderson diff --git a/wmspaceweather/wmSpaceWeather/wmSpaceWeather.c b/wmspaceweather/wmSpaceWeather/wmSpaceWeather.c new file mode 100644 index 0000000..19072d9 --- /dev/null +++ b/wmspaceweather/wmSpaceWeather/wmSpaceWeather.c @@ -0,0 +1,680 @@ +/* + * + * wmSpaceWeather-1.04 (C) 1998 Mike Henderson (mghenderson@lanl.gov) + * + * - Its a Space Weather Monitor + * + * + * + * + * 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, 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 (see the file COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA + * + * ToDo: + * + * - The whole NOAA space weather www site is pretty screwed up! I currently have + * to grab data from 2 separate files to get all that I need. But it seems that + * sometimes one of the files shows less than it should. This seems to be related to + * the way they update the 2 separate files... I will have to find some way of + * making that more robust. + * + * + * + * + * + * + * + * + * + * Changes: + * + * Version 1.04 - released Feb 18, 1999 + * Added double click capability. Double clicking on mouse button 1 sends + * URL (defined via ne command line option -url) to netscape. + * + * Version 1.03 - released Feb 11, 1999 + * Changed display a bit. When no data is + * available, it now shows nothing (before it would + * show false junk...). Modified Perl Script GetKp. + * + * + * Version 1.02 - released Feb 8, 1999 + * bug fixes... + * + * Version 1.0b - released Dec 19, 1998 + * + * + */ + + + + + +/* + * Includes + */ +#include +#include +#include +#include +#include +#include +#include +#include "../wmgeneral/wmgeneral.h" +#include "wmSpaceWeather_master.xpm" +#include "wmSpaceWeather_mask.xbm" + + + +/* + * Delay between refreshes (in microseconds) + */ +#define DELAY 10000L +#define WMSPACEWEATHER_VERSION "1.04" + +int GotFirstClick1, GotDoubleClick1; +int GotFirstClick2, GotDoubleClick2; +int GotFirstClick3, GotDoubleClick3; +int DblClkDelay; +char URL[1024]; +int ForceUpdate2; + + +void ParseCMDLine(int argc, char *argv[]); +void pressEvent(XButtonEvent *xev); + + + + + + + + + + +/* + * main + */ +int main(int argc, char *argv[]) { + + +struct tm *Time; +XEvent event; +int i, n, s, k, m, dt1, dt2; +int Year, Month, Day, DayOfMonth, OldDayOfMonth; +int Hours, Mins, Secs, OldSecs, xoff, D[10], xsize; +long CurrentLocalTime; +int height, UpToDate, LEDOn; +double UT, TU, TU2, TU3, T0, gmst, hour24(); + + +double jd(), CurrentJD, LatestAvailJD, tim, DeltaT; +long int TimeTag[8]; +int Kp[8] = { -1, -1, -1, -1, -1, -1, -1, -1 }; +double E1, E2, P1, P2, P3; +char Xray[10], digit[2]; +FILE *fp; + + + + + + + + + + + + /* + * Parse any command line arguments. + */ + ParseCMDLine(argc, argv); + + + + openXwindow(argc, argv, wmSpaceWeather_master, wmSpaceWeather_mask_bits, wmSpaceWeather_mask_width, wmSpaceWeather_mask_height); + + + + + /* + * Loop until we die + */ + n = 32000; + s = 32000; + m = 32000; + dt1 = 32000; + dt2 = 32000; + LEDOn = 0; + DblClkDelay = 32000; + ForceUpdate2 = 1; + while(1) { + + + + + /* + * Keep track of # of seconds + */ + if (m > 100){ + + m = 0; + ++dt1; + ++dt2; + + } else { + + /* + * Increment counter + */ + ++m; + + } + + + + + + /* + * Double Click Delays + * Keep track of click events. If Delay too long, set GotFirstClick's to False. + */ + if (DblClkDelay > 15) { + + DblClkDelay = 0; + GotFirstClick1 = 0; GotDoubleClick1 = 0; + GotFirstClick2 = 0; GotDoubleClick2 = 0; + GotFirstClick3 = 0; GotDoubleClick3 = 0; + + } else { + + ++DblClkDelay; + + } + + + + + + + + + + /* + * Process any pending X events. + */ + while(XPending(display)){ + XNextEvent(display, &event); + switch(event.type){ + case Expose: + RedrawWindow(); + break; + case ButtonPress: + pressEvent(&event.xbutton); + break; + case ButtonRelease: + break; + } + } + + + + + + + /* + * Redraw + */ + RedrawWindow(); + + + + + + + + + + + /* + * Check the Kp file every (approx.) 2 seconds. + * Can significantly reduce this frequency later. But its + * easier to debug this way... + * Do this before trying to download again! The file may be there and it + * may be Up-To-Date! + */ + if (dt2 > 2){ + + dt2 = 0; + + /* + * Compute Current Julian Date + */ + CurrentLocalTime = time(CurrentTime); + Time = gmtime(&CurrentLocalTime); + Year = Time->tm_year+1900; + Month = Time->tm_mon+1; + Day = Time->tm_mday; + Hours = Time->tm_hour; + Mins = Time->tm_min; + Secs = Time->tm_sec; + UT = (double)Hours + (double)Mins/60.0 + (double)Secs/3600.0; + CurrentJD = jd(Year, Month, Day, UT); + + + + /* + * Read in Kp values + */ + if ((fp = fopen("/tmp/LatestKp.txt", "r")) != NULL){ + + for (i=0; i<8; ++i){ + fscanf(fp, "%ld %d", &TimeTag[i], &Kp[i]); + if (Kp[i] < 0) TimeTag[i] = 190001011; + } + fscanf(fp, "%lf", &P1); + fscanf(fp, "%lf", &P2); + fscanf(fp, "%lf", &P3); + fscanf(fp, "%lf", &E1); + fscanf(fp, "%lf", &E2); + fscanf(fp, "%10s", Xray); + fclose(fp); + + } else { + + for (i=0; i<8; ++i) { + Kp[i] = -1; + TimeTag[i] = 190001011; + } + + } + + + + + /* + * Compute Julian Date for latest available Kp + */ + tim = TimeTag[7]; + Year = tim/100000; + tim -= Year*100000; + Month = tim/1000; + tim -= Month*1000; + Day = tim/10; + tim -= Day*10; + UT = tim*3.0; + LatestAvailJD = jd(Year, Month, Day, UT); + + DeltaT = (CurrentJD - LatestAvailJD)*24.0; + UpToDate = (DeltaT <= 3.0) ? 1 : 0; + + if (!UpToDate){ + + /* + * shift data back + */ + k = (int)(DeltaT/3.0); + + if ((k>=0)&&(k<=7)){ + for (i=0; i<8-k; ++i) Kp[i] = Kp[i+k]; + for (i=8-k; i<8; ++i) Kp[i] = -1; + } + + + } + + } + + + + + + + /* + * Update Kp Bars etc... + */ + if (n > 200){ + + n = 0; + + copyXPMArea(5, 67, 47, 20, 5, 39); + + for (i=0; i<8; ++i){ + if ((Kp[i] >= 0)&&(Kp[i] <= 9)){ + height = 2*Kp[i] + 1; + copyXPMArea(53, 86-height+1, 5, height, 5+5*i+i, 58-height+1); + } + } + + /* + * Update Xray display... + */ + if (Xray[0] != 'Z'){ + switch(Xray[0]){ + case 'B': + copyXPMArea(66, 17, 5, 7, 37, 25); + break; + case 'C': + copyXPMArea(72, 17, 5, 7, 37, 25); + break; + case 'M': + copyXPMArea(78, 17, 5, 7, 37, 25); + break; + case 'X': + copyXPMArea(84, 17, 5, 7, 37, 25); + break; + } + digit[0] = Xray[1]; digit[1] = '\0'; + copyXPMArea(atoi(digit)*6+66, 25, 5, 7, 43, 25); + copyXPMArea(127, 30, 3, 3, 49, 30); + digit[0] = Xray[3]; digit[1] = '\0'; + copyXPMArea(atoi(digit)*6+66, 25, 5, 7, 53, 25); + } + + + + + /* + * Update E1 LED... + */ + if ((E1 > 0)&&(E1 < 1e6)) + copyXPMArea(66, 12, 4, 4, 25, 7); + else if ((E1 >= 1e6)&&(E1 < 1e7)) + copyXPMArea(66, 7, 4, 4, 25, 7); + else if (E1 > 1e7) + copyXPMArea(66, 2, 4, 4, 25, 7); + + + /* + * Update E2 LED... + */ + if ((E2 > 0)&&(E2 < 1e3)) + copyXPMArea(66, 12, 4, 4, 31, 7); + else if ((E2 >= 1e3)&&(E2 < 1e4)) + copyXPMArea(66, 7, 4, 4, 31, 7); + else if (E2 > 1e4) + copyXPMArea(66, 2, 4, 4, 31, 7); + + + + /* + * Update P1 LED... + */ + if ((P1 > 0)&&(P1 < 1e2)) + copyXPMArea(66, 12, 4, 4, 22, 16); + else if ((P1 >= 1e2)&&(P1 < 1e3)) + copyXPMArea(66, 7, 4, 4, 22, 16); + else if (P1 > 1e3) + copyXPMArea(66, 2, 4, 4, 22, 16); + + + /* + * Update P2 LED... + */ + if ((P2 > 0)&&(P2 < 0.5e0)) + copyXPMArea(66, 12, 4, 4, 28, 16); + else if ((P2 >= 0.5e0)&&(P2 < 0.5e1)) + copyXPMArea(66, 7, 4, 4, 28, 16); + else if (P2 > 0.5e1) + copyXPMArea(66, 2, 4, 4, 28, 16); + + + /* + * Update P3 LED... + */ + if ((P3 > 0)&&(P3 < 0.3e0)) + copyXPMArea(66, 12, 4, 4, 34, 16); + else if ((P3 >= 0.3e0)&&(P3 < 0.3e1)) + copyXPMArea(66, 7, 4, 4, 34, 16); + else if (P3 > 0.3e1) + copyXPMArea(66, 2, 4, 4, 34, 16); + + + + + + + + + + } else { + + /* + * Increment counter + */ + ++n; + + } + + + + + + /* + * Update the blinking LED which indicates whether or not the + * display is up-to-date + */ + if (s > 20){ + + s = 0; + + if (LEDOn){ + + if (UpToDate) + copyXPMArea(65, 82, 4, 4, 54, 53); + else + copyXPMArea(65, 76, 4, 4, 54, 53); + + LEDOn = 0; + + } else { + + if (UpToDate) + copyXPMArea(60, 82, 4, 4, 54, 53); + else + copyXPMArea(60, 76, 4, 4, 54, 53); + + LEDOn = 1; + + } + } else { + + /* + * Increment counter + */ + ++s; + + } + + + + + + + + + + + /* + * Check every 5 min if the values are not up to date... + */ + if (((!UpToDate)&&(dt1 > 300))||ForceUpdate2){ + + dt1 = 0; + + /* + * Execute Perl script to grab the Latest Kp values + */ + system("GetKp &"); + + ForceUpdate2 = 0; + + } + + + + + /* + * Wait for next update + */ + usleep(DELAY); + + + } + + + +} + + + + + + + + +/* + * ParseCMDLine() + */ +void ParseCMDLine(int argc, char *argv[]) { + + int i; + + for (i = 1; i < argc; i++) { + + if (!strcmp(argv[i], "-display")){ + + ++i; + + } else if ((!strcmp(argv[i], "-url"))||(!strcmp(argv[i], "-u"))){ + + strcpy(URL, argv[++i]); + + } else { + + printf("\nwmSpaceWeather version: %s\n", WMSPACEWEATHER_VERSION); + printf("\nusage: wmSpaceWeather [-h] [-url ]\n\n"); + printf("\t-url \tURL to send to Netscape with Button1 double click.\n\n"); + printf("\t-h\t\tDisplay help screen.\n\n"); + exit(1); + + } + } + +} + + + + + + + + +/* + * Compute the Julian Day number for the given date. + * Julian Date is the number of days since noon of Jan 1 4713 B.C. + */ +double jd(ny, nm, nd, UT) +int ny, nm, nd; +double UT; +{ + double A, B, C, D, JD, MJD, day; + + day = nd + UT/24.0; + + + if ((nm == 1) || (nm == 2)){ + ny = ny - 1; + nm = nm + 12; + } + + if (((double)ny+nm/12.0+day/365.25)>=(1582.0+10.0/12.0+15.0/365.25)){ + A = ((int)(ny / 100.0)); + B = 2.0 - A + (int)(A/4.0); + } + else{ + B = 0.0; + } + if (ny < 0.0){ + C = (int)((365.25*(double)ny) - 0.75); + } + else{ + C = (int)(365.25*(double)ny); + } + + D = (int)(30.6001*(double)(nm+1)); + + + JD = B + C + D + day + 1720994.5; + return(JD); + +} + + + + +/* + * This routine handles button presses. + */ +void pressEvent(XButtonEvent *xev){ + + char Command[512]; + + + DblClkDelay = 0; + if ((xev->button == Button1) && (xev->type == ButtonPress)){ + if (GotFirstClick1) GotDoubleClick1 = 1; + else GotFirstClick1 = 1; + } else if ((xev->button == Button2) && (xev->type == ButtonPress)){ + if (GotFirstClick2) GotDoubleClick2 = 1; + else GotFirstClick2 = 1; + } else if ((xev->button == Button3) && (xev->type == ButtonPress)){ + if (GotFirstClick3) GotDoubleClick3 = 1; + else GotFirstClick3 = 1; + } + + /* + * We got a double click on Mouse Button1 (i.e. the left one) + */ + if (GotDoubleClick1) { + GotFirstClick1 = 0; + GotDoubleClick1 = 0; + sprintf(Command, "netscape -remote 'openURL(%s)' || netscape '%s' &", URL, URL); + system(Command); + } + + + /* + * We got a double click on Mouse Button2 (i.e. the left one) + */ + if (GotDoubleClick2) { + } + + + /* + * We got a double click on Mouse Button3 (i.e. the left one) + */ + if (GotDoubleClick3) { + GotFirstClick3 = 0; + GotDoubleClick3 = 0; + ForceUpdate2 = 1; + } + + + + return; + +} + diff --git a/wmspaceweather/wmSpaceWeather/wmSpaceWeather.o b/wmspaceweather/wmSpaceWeather/wmSpaceWeather.o new file mode 100644 index 0000000000000000000000000000000000000000..b21ad86398496c52296f0400d42ad543fe67133e GIT binary patch literal 19808 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 literal 0 HcmV?d00001 diff --git a/wmspaceweather/wmSpaceWeather/wmSpaceWeather_mask.xbm b/wmspaceweather/wmSpaceWeather/wmSpaceWeather_mask.xbm new file mode 100644 index 0000000..b01c3e5 --- /dev/null +++ b/wmspaceweather/wmSpaceWeather/wmSpaceWeather_mask.xbm @@ -0,0 +1,38 @@ +#define wmSpaceWeather_mask_width 64 +#define wmSpaceWeather_mask_height 64 +static char wmSpaceWeather_mask_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff, + 0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff, + 0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff, + 0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff, + 0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0, + 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f, + 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, + 0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff, + 0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff, + 0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff, + 0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff, + 0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff, + 0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0, + 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f, + 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, + 0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff, + 0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff, + 0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff, + 0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff, + 0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0, + 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f, + 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, + 0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff, + 0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff, + 0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff, + 0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff, + 0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff, + 0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0, + 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}; diff --git a/wmspaceweather/wmSpaceWeather/wmSpaceWeather_master.gif b/wmspaceweather/wmSpaceWeather/wmSpaceWeather_master.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ee154fd43f1aaae5b88807f5aa73540ae8c7fc0 GIT binary patch literal 1375 zcmV-l1)%yzNk%v~VVMA10Q3L=0000O7#JWPA3Qt&ARr(B6mI}WT~7c2PBQ>Hb^ieW z005=jI;Q{s0094Y0ME|=|Nj7(ps1Oe|H#P5W@csp0000000000000000000000000 z000000000000000EC2ui0GR+=000I4U?h%YX`X1RravwHz@YHg zD;kR}L8BoUI-gM3aY{Y48k1#o%O#GwVCfgI)P~Pt5Z5^)q0nWC_l znss*&6Q2ODmZiQjkCB9dbe6Hkw6$@Z5iOs($iLDq!IP^3t**(U+sbduo}g=^)6$Qq z!^Ga}a^U6fz^B&N?DcK#0tyOx@YCn>lu3)p+ev}b*Ih%KW_#V3dG||mPbd5bvWi})Bsa?_T1^f>d&8CyPo<= z@1i%SHqol>$=52@n{mB#LItpp-KKZUnoY~ouiL+Yaa03%7;#ysi>dOxniXs08-6Mu zCYTrPr>mTSem2!f^yoXQ8~JJ3(zPs8agn*d`9c^x;S0Fa%X-HF97EYMoirw+|pnfdUr`vzc7+4#E!n}dtjhz6XV{*kI zwZfHx9li%!Y0+ zo_zLclALH%A!rqVwmImbNE90ABA>0PXcun2$~$R4Zgr>E}v z>aamX3T!RB{z4n=rM50hDzn*go9w5~3Ty4PtWHbqv*Ut>?YG;uYpl20hTCMiL;Y&* zx#H5RZYKlu+phrr{u}TB00&&KzXuC!@W80%t8Wd`-fKv;57VHA0T^Q}K*kz#Y{14G zgPgI*9f$03!}C_WZ;=wykw5}$P^@wc7n^MJ$S3D~bIBtMkiY~l3n25%FGSpO8!rbv zG|?^8jPuSP>-_Z8JZsEG&_bijbkp`8oru<3J6(0uP?JnH)n{A%4cJW6>F3*U$Bif3 zL?deV4qHQf_ueSvZ86_~(>-(GgvaUk;fN=$_~LPS{RZPsyz6ealYdJ_8CyYKgX3;& z*@oumHb^cy1MbdgX*h4ZhH)}!|QwHvtyq5?k?aS zO6SDC&^z$Imo9t~ZH0mW0vjoAJnMQmFhN@YATYu7nlmi^!sH`7zWD(I@WA@(x6l^% z(}NHB^|}iX{TkC(pSaXxo9#dUX)^!-7C=A(CgF3)V;udE*SQ2P4uJnF8w5QzzydBH z2|-&!0Scf$#4Yf10QlL<08oGlY*2F(l%NXHR>1 +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "wmgeneral.h" + + /*****************/ + /* X11 Variables */ +/*****************/ + +Window Root; +int screen; +int x_fd; +int d_depth; +XSizeHints mysizehints; +XWMHints mywmhints; +Pixel back_pix, fore_pix; +char *Geometry = ""; +Window iconwin, win; +GC NormalGC; +XpmIcon wmgen; +Pixmap pixmask; + + /*****************/ + /* Mouse Regions */ +/*****************/ + +typedef struct { + int enable; + int top; + int bottom; + int left; + int right; +} MOUSE_REGION; + +#define MAX_MOUSE_REGION (8) +MOUSE_REGION mouse_region[MAX_MOUSE_REGION]; + + /***********************/ + /* Function Prototypes */ +/***********************/ + +static void GetXPM(XpmIcon *, char **); +static Pixel GetColor(char *); +void RedrawWindow(void); +void AddMouseRegion(int, int, int, int, int); +int CheckMouseRegion(int, int); + +/*******************************************************************************\ +|* read_rc_file *| +\*******************************************************************************/ + +void parse_rcfile(const char *filename, rckeys *keys) { + + char *p; + char temp[128]; + char *tokens = " :\t\n"; + FILE *fp; + int i,key; + + fp = fopen(filename, "r"); + if (fp) { + while (fgets(temp, 128, fp)) { + key = 0; + while (key >= 0 && keys[key].label) { + if ((p = strstr(temp, keys[key].label))) { + p += strlen(keys[key].label); + p += strspn(p, tokens); + if ((i = strcspn(p, "#\n"))) p[i] = 0; + free(*keys[key].var); + *keys[key].var = strdup(p); + key = -1; + } else key++; + } + } + fclose(fp); + } +} + + +/*******************************************************************************\ +|* GetXPM *| +\*******************************************************************************/ + +static void GetXPM(XpmIcon *wmgen, char *pixmap_bytes[]) { + + XWindowAttributes attributes; + int err; + + /* For the colormap */ + XGetWindowAttributes(display, Root, &attributes); + + wmgen->attributes.valuemask |= (XpmReturnPixels | XpmReturnExtensions); + + err = XpmCreatePixmapFromData(display, Root, pixmap_bytes, &(wmgen->pixmap), + &(wmgen->mask), &(wmgen->attributes)); + + if (err != XpmSuccess) { + fprintf(stderr, "Not enough free colorcells.\n"); + exit(1); + } +} + +/*******************************************************************************\ +|* GetColor *| +\*******************************************************************************/ + +static Pixel GetColor(char *name) { + + XColor color; + XWindowAttributes attributes; + + XGetWindowAttributes(display, Root, &attributes); + + color.pixel = 0; + if (!XParseColor(display, attributes.colormap, name, &color)) { + fprintf(stderr, "wm.app: can't parse %s.\n", name); + } else if (!XAllocColor(display, attributes.colormap, &color)) { + fprintf(stderr, "wm.app: can't allocate %s.\n", name); + } + return color.pixel; +} + +/*******************************************************************************\ +|* flush_expose *| +\*******************************************************************************/ + +static int flush_expose(Window w) { + + XEvent dummy; + int i=0; + + while (XCheckTypedWindowEvent(display, w, Expose, &dummy)) + i++; + + return i; +} + +/*******************************************************************************\ +|* RedrawWindow *| +\*******************************************************************************/ + +void RedrawWindow(void) { + + flush_expose(iconwin); + XCopyArea(display, wmgen.pixmap, iconwin, NormalGC, + 0,0, wmgen.attributes.width, wmgen.attributes.height, 0,0); + flush_expose(win); + XCopyArea(display, wmgen.pixmap, win, NormalGC, + 0,0, wmgen.attributes.width, wmgen.attributes.height, 0,0); +} + +/*******************************************************************************\ +|* RedrawWindowXY *| +\*******************************************************************************/ + +void RedrawWindowXY(int x, int y) { + + flush_expose(iconwin); + XCopyArea(display, wmgen.pixmap, iconwin, NormalGC, + x,y, wmgen.attributes.width, wmgen.attributes.height, 0,0); + flush_expose(win); + XCopyArea(display, wmgen.pixmap, win, NormalGC, + x,y, wmgen.attributes.width, wmgen.attributes.height, 0,0); +} + +/*******************************************************************************\ +|* AddMouseRegion *| +\*******************************************************************************/ + +void AddMouseRegion(int index, int left, int top, int right, int bottom) { + + if (index < MAX_MOUSE_REGION) { + mouse_region[index].enable = 1; + mouse_region[index].top = top; + mouse_region[index].left = left; + mouse_region[index].bottom = bottom; + mouse_region[index].right = right; + } +} + +/*******************************************************************************\ +|* CheckMouseRegion *| +\*******************************************************************************/ + +int CheckMouseRegion(int x, int y) { + + int i; + int found; + + found = 0; + + for (i=0; i= mouse_region[i].left && + y <= mouse_region[i].bottom && + y >= mouse_region[i].top) + found = 1; + } + if (!found) return -1; + return (i-1); +} + +/*******************************************************************************\ +|* copyXPMArea *| +\*******************************************************************************/ + +void copyXPMArea(int x, int y, int sx, int sy, int dx, int dy) { + + XCopyArea(display, wmgen.pixmap, wmgen.pixmap, NormalGC, x, y, sx, sy, dx, dy); + +} + +/*******************************************************************************\ +|* copyXBMArea *| +\*******************************************************************************/ + +void copyXBMArea(int x, int y, int sx, int sy, int dx, int dy) { + + XCopyArea(display, wmgen.mask, wmgen.pixmap, NormalGC, x, y, sx, sy, dx, dy); +} + + +/*******************************************************************************\ +|* setMaskXY *| +\*******************************************************************************/ + +void setMaskXY(int x, int y) { + + XShapeCombineMask(display, win, ShapeBounding, x, y, pixmask, ShapeSet); + XShapeCombineMask(display, iconwin, ShapeBounding, x, y, pixmask, ShapeSet); +} + +/*******************************************************************************\ +|* openXwindow *| +\*******************************************************************************/ +void openXwindow(int argc, char *argv[], char *pixmap_bytes[], char *pixmask_bits, int pixmask_width, int pixmask_height) { + + unsigned int borderwidth = 1; + XClassHint classHint; + char *display_name = NULL; + char *wname = argv[0]; + XTextProperty name; + + XGCValues gcv; + unsigned long gcm; + + + int dummy=0; + int i; + + for (i=1; argv[i]; i++) { + if (!strcmp(argv[i], "-display")) + display_name = argv[i+1]; + } + + if (!(display = XOpenDisplay(display_name))) { + fprintf(stderr, "%s: can't open display %s\n", + wname, XDisplayName(display_name)); + exit(1); + } + screen = DefaultScreen(display); + Root = RootWindow(display, screen); + d_depth = DefaultDepth(display, screen); + x_fd = XConnectionNumber(display); + + /* Convert XPM to XImage */ + GetXPM(&wmgen, pixmap_bytes); + + /* Create a window to hold the stuff */ + mysizehints.flags = USSize | USPosition; + mysizehints.x = 0; + mysizehints.y = 0; + + back_pix = GetColor("white"); + fore_pix = GetColor("black"); + + XWMGeometry(display, screen, Geometry, NULL, borderwidth, &mysizehints, + &mysizehints.x, &mysizehints.y,&mysizehints.width,&mysizehints.height, &dummy); + + mysizehints.width = 64; + mysizehints.height = 64; + + win = XCreateSimpleWindow(display, Root, mysizehints.x, mysizehints.y, + mysizehints.width, mysizehints.height, borderwidth, fore_pix, back_pix); + + iconwin = XCreateSimpleWindow(display, win, mysizehints.x, mysizehints.y, + mysizehints.width, mysizehints.height, borderwidth, fore_pix, back_pix); + + /* Activate hints */ + XSetWMNormalHints(display, win, &mysizehints); + classHint.res_name = wname; + classHint.res_class = wname; + XSetClassHint(display, win, &classHint); + + XSelectInput(display, win, ButtonPressMask | ExposureMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask); + XSelectInput(display, iconwin, ButtonPressMask | ExposureMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask); + + if (XStringListToTextProperty(&wname, 1, &name) == 0) { + fprintf(stderr, "%s: can't allocate window name\n", wname); + exit(1); + } + + XSetWMName(display, win, &name); + + /* Create GC for drawing */ + + gcm = GCForeground | GCBackground | GCGraphicsExposures; + gcv.foreground = fore_pix; + gcv.background = back_pix; + gcv.graphics_exposures = 0; + NormalGC = XCreateGC(display, Root, gcm, &gcv); + + /* ONLYSHAPE ON */ + + pixmask = XCreateBitmapFromData(display, win, pixmask_bits, pixmask_width, pixmask_height); + + XShapeCombineMask(display, win, ShapeBounding, 0, 0, pixmask, ShapeSet); + XShapeCombineMask(display, iconwin, ShapeBounding, 0, 0, pixmask, ShapeSet); + + /* ONLYSHAPE OFF */ + + mywmhints.initial_state = WithdrawnState; + mywmhints.icon_window = iconwin; + mywmhints.icon_x = mysizehints.x; + mywmhints.icon_y = mysizehints.y; + mywmhints.window_group = win; + mywmhints.flags = StateHint | IconWindowHint | IconPositionHint | WindowGroupHint; + + XSetWMHints(display, win, &mywmhints); + + XSetCommand(display, win, argv, argc); + XMapWindow(display, win); + +} diff --git a/wmspaceweather/wmgeneral/wmgeneral.h b/wmspaceweather/wmgeneral/wmgeneral.h new file mode 100644 index 0000000..55b37dd --- /dev/null +++ b/wmspaceweather/wmgeneral/wmgeneral.h @@ -0,0 +1,50 @@ +#ifndef WMGENERAL_H_INCLUDED +#define WMGENERAL_H_INCLUDED + + /***********/ + /* Defines */ +/***********/ + +#define MAX_MOUSE_REGION (8) + + /************/ + /* Typedefs */ +/************/ + +typedef struct _rckeys rckeys; + +struct _rckeys { + const char *label; + char **var; +}; + +typedef struct { + Pixmap pixmap; + Pixmap mask; + XpmAttributes attributes; +} XpmIcon; + + /*******************/ + /* Global variable */ +/*******************/ + +Display *display; + + /***********************/ + /* Function Prototypes */ +/***********************/ + +void AddMouseRegion(int index, int left, int top, int right, int bottom); +int CheckMouseRegion(int x, int y); + +void openXwindow(int argc, char *argv[], char **, char *, int, int); +void RedrawWindow(void); +void RedrawWindowXY(int x, int y); + +void copyXPMArea(int, int, int, int, int, int); +void copyXBMArea(int, int, int, int, int, int); +void setMaskXY(int, int); + +void parse_rcfile(const char *, rckeys *); + +#endif diff --git a/wmspaceweather/wmgeneral/wmgeneral.o b/wmspaceweather/wmgeneral/wmgeneral.o new file mode 100644 index 0000000000000000000000000000000000000000..29502e5e850e67719a53b8e8fef54427c89bb4c1 GIT binary patch literal 7324 zcmb_f3vg7`8UA;(ktK!_G^L;@D=(w9DY{8y@Wzrp};awN9DV`YM>zLCa8DGfltm-gCp|x;RXy zXZGIjeE;kG=W)+DyCYD)(&ciAU0hNo=b6avN=viIgc_-oiPB`ey>oak1cjcC(a}+w z$1cGuAMgfGjzH3V#A^&1Jvyt;@hy{gWnq>#MZs7XjC*^wL1Eih8iPH9?U$Uo6IOkN zo&d;17d zdX|ws5|}=!7an8K6&T5zy$t39BeontAdh+JKTc{KGWKPVd(TUHB{XF{B)=`$$_lq9 zU$xe5s3;5?&F^EkjTd{XUqBO*Z>Y?#pW-px*1$kDIy4de9W`@5_3D2{NBd6o<86)s z$JCHEJ^LKl@Ubw_q?FH=~^rE)_4*^eQDaUCX z$^P!`{i0tTyA*L_3~tYVo6GK+arWq8hZ~x^uz}OW#xsG)1c%UFVSYcp&H7nqleA)=`94#nVAGe2-qbi?5OD8 zeoopwLlwr^Q$L1~^WHR4A`~~I$-BB?Qd*yH@ZOH5wnaZqUAZH0A$29Zz1!w}oZ7Qv z0(!tf91V<|x)YP%XJ%jV4638%+J*bw#_=J0&E^9$uo9->sm4=<=i*j|J*OAt??FQ2 zzor`7AKwU+GS;rmEvZ_EGi<4yoz2Hv*)ewx??%W%V1xrv2%KgE@XS{kO~clSMM=Rt zi)dnt6l>$T3i;2xnSOB`wWx8#3>$$n=KCB^uTnO#`Y!jle%Q_z zRP+W;1lwG_SUR?;xjcR5V(LYw&3tU#`Nc%PQW+G?Yg#4lgr?RAJgjhcA#eoYaPW2o z^VVIigg*{$bIyzRi4tbj%FLc(9+r09GFKUoZ3P#$IKTKz&;6WrbE5ZGv&Mw{MF1 zTC?HICZV=%Y?Hz%{TX>if|&4j)Zlk`%E;R%Ot{` zGB;;?rZZZ~r^E<=z_GZlNlPLe*<55c7H4Zb6-{sTrNT+ALS$84-C|$Os>Y`4d<*@z z`WO0d67lCclX|!XsAnyV*)?73(8ZtC5`L=|4eMcxTeX&4PW-7f+V^MEmMD@=Cbg8# zk-4aHC9F7}{LjI%2+v&JKvl7~p=-b=+Ct#V*dzzxgie|MwB!7IT5)b-EMG({I|jL3 z=iC*?+l%WR{TYwGcDyC1Q*Ot*zbH3|$KowReF6ol(2i@=F6<-AN<6H)Nl23uXJcvGOWbEDnOu-m|jDt3(GHmOQ{LZl0wWOulWvcLSgI3~sMhA$KO zo1H9lc05$am14O^-Z%g8*#_hPg))9|3*_Zu9(1;Yqm?p@EN|aGK_d?W-O$elE<#?9 zDSiX+IQVkK0b`|XY;{?pGR)}hO3QvvK?d|=c@k}0hWKkNYQ8xxO%8sagSR+%+`%&r z-r?Ze9ekIA=fRn)mG1|meGdMp!@hV;G5_B<^e;O2YYzTr2Y=VW&pP-dj9WFP)qtGi zcLjKHzOxkH3;h)NV6?`eUjS|w=DWn9Ukcuj_>Vxx_>JI;&_KW98+`*N)9V*3ikS0fkpcdA1_)4^-N?ZW)|?bwBUwS(X5;4uepckn$9{+NRw zaPVJ(vp;k2F#jVCJ-=nUFuxNHjsta*meR7}gg+viB9Vp7IC(PhgckM7Doqas8whng zf~7Ulo{KeW9hr1agEXDg^lYb?XK-^i(h4VO<+&=Yn>0NqIQ{S=Bp@Tpm=GcIWT!0J zo{`o_f)UrI)4JFvbqK9)FwfjtUC+i_+I1}_p-i$atKnD=#ygVX%*t#!xq?S&^IdD2 zb9z+EW}BrolZ~hJR?#}*x`cwfAXwRlYI!G6^}3iA*}T3pqeZPo0$X_4uGOO1@K#GA z@kly_Q{NgOTuQRZaAH-RgzD0n&RS$4R2F-Lz96;HXhXU^r>)gC#nUNCvfiAvh}mSZ zHiAGHUo)0jUvAZNn%)r3ZAQ2ZyP4Z8p>?rv2Hi-u#8Vn|!eI^}0o+MAijibSLTeyf zp)NWhRcXY1MRE}gc1ohnQ7xm#*n?C`i|EL(u|3(MWu>FJH7d!@T>JqohQZ583vNNp zXdUyJ)yzt0L&MmNhpb6h7f)sqni{RpI?PvtHA<_^7?ji{!nqtNx}YV{=3S{wI|-&V zwW&Uy)7Pih<8l9};n9d$E7eehScixkx<`K|(~_oemJE ziu?-b`jp5)BCgT}%BPE*QSyH)IWH{kD?}~_GVU}YE^k*+j>Gv{B9dE5IpPI~i1#_l z5wBJ81o_n>UnNJJZX)75OgZ8_K@PwDnVWuP4HPEzmtz3&=S4 zDBMUn{?#PNVgF?!*3A~mv2MDESf>W%@Y_dRgnOjo{fa+JbT2`_$Pwo|3V%REdruM3&NE8>yuu?2k10G(ME_qQBJK&G`wo$J$mfX+ z5fSfwBI12WM0+m$fgny$I7#8*FxxSRXGCu|8g-9C`eO zh&rejC&zlSdeAl literal 0 HcmV?d00001