]> git.webhop.me Git - tuxwetter.git/commitdiff
* initial commit
authorsvenhoefer <svenhoefer@svenhoefer.com>
Tue, 14 Aug 2012 20:14:22 +0000 (22:14 +0200)
committersvenhoefer <svenhoefer@svenhoefer.com>
Tue, 14 Aug 2012 20:14:22 +0000 (22:14 +0200)
40 files changed:
bmps.c [new file with mode: 0644]
bmps.h [new file with mode: 0644]
build.sh [new file with mode: 0644]
color.h [new file with mode: 0644]
convert.list [new file with mode: 0644]
fb_display.c [new file with mode: 0644]
fb_display.h [new file with mode: 0644]
gfx.c [new file with mode: 0644]
gfx.h [new file with mode: 0644]
gif.c [new file with mode: 0644]
gif.h [new file with mode: 0644]
gifdecomp.c [new file with mode: 0644]
gifdecomp.h [new file with mode: 0644]
globals.h [new file with mode: 0644]
http.c [new file with mode: 0644]
http.h [new file with mode: 0644]
io.c [new file with mode: 0644]
io.h [new file with mode: 0644]
jpeg.c [new file with mode: 0644]
jpeg.h [new file with mode: 0644]
parser.c [new file with mode: 0644]
parser.h [new file with mode: 0644]
php.c [new file with mode: 0644]
php.h [new file with mode: 0644]
plugins.mk.example [new file with mode: 0644]
pngw.c [new file with mode: 0644]
pngw.h [new file with mode: 0644]
readme.txt [new file with mode: 0644]
resize.c [new file with mode: 0644]
resize.h [new file with mode: 0644]
startbild.jpg [new file with mode: 0644]
starter.c [new file with mode: 0644]
text.c [new file with mode: 0644]
text.h [new file with mode: 0644]
translator [new file with mode: 0755]
tuxwetter.c [new file with mode: 0644]
tuxwetter.cfg [new file with mode: 0644]
tuxwetter.conf [new file with mode: 0755]
tuxwetter.h [new file with mode: 0644]
tuxwetter.mcfg [new file with mode: 0644]

diff --git a/bmps.c b/bmps.c
new file mode 100644 (file)
index 0000000..290d4a1
--- /dev/null
+++ b/bmps.c
@@ -0,0 +1,219 @@
+/*
+ * $Id: bmps.c,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $
+ *
+ * tuxwetter - d-box2 linux project
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "bmps.h"
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <dbox/lcd-ks0713.h>
+#include <string.h>
+#include "bmps.h"
+
+
+//***************** bmp_show.c **********************
+
+#define swap32bits(i) (i>>24) | (i<<24) | ((i>>8) & 0x00f0) | ((i<<8) & 0x0f00)
+#define swap16bits(i) (i>>8) | (i<<8)
+
+int lcd_fd=-1;
+lcd_packed_buffer s;
+
+int bmp2lcd (char *bildfile) 
+{
+       char bild2lcd [50];
+       char filename[50];
+       char bmpfile[50];
+       
+       int intbild;
+       
+       if (strstr(bildfile,"tuxwettr.bmp")==NULL)
+       {
+               if (bildfile[0] == 45) 
+               {
+                       sprintf (filename,"na.bmp");
+               }
+               else
+               {
+                       intbild=atoi(bildfile);
+                       sprintf(filename,"%d.bmp",intbild);
+               }
+       }
+       else
+       {
+               strcpy(filename,bildfile);
+       }
+
+       sprintf(bmpfile,"/share/tuxbox/tuxwetter/%s",filename);
+       
+       FILE *fbmp;
+
+       struct bmp_header bh;
+       struct bmp_color *colors;
+       long int line_size, bmpline_size, image_size;
+       unsigned char *image;
+
+       lcd_raw_buffer raw;
+       int mode;
+
+       if ((fbmp = fopen(bmpfile, "r"))==NULL) {
+               perror("fopen(BMP_FILE)");
+               return(2);
+       }
+       if (fread(&bh, 1, sizeof(bh), fbmp)!=sizeof(bh)) {
+               perror("fread(BMP_HEADER)");
+               return(3);
+       }
+       if ((bh._B!='B')||(bh._M!='M')) {
+               fprintf(stderr, "Bad Magic (not a BMP file).\n");
+               return(4);
+       }
+
+       #if 1
+       bh.file_size = swap32bits(bh.file_size);
+       bh.width = swap32bits(bh.width);
+       bh.height = swap32bits(bh.height);
+       bh.bit_count = swap16bits(bh.bit_count);
+       #endif
+
+       // 4 * 2^bit_count
+       colors = malloc(4<<bh.bit_count);
+       if (fread(colors, 1, 4<<bh.bit_count, fbmp)!=4<<bh.bit_count) {
+               perror("fread(BMP_COLORS)");
+               return(5);
+       }
+
+       // image
+       line_size = (bh.width*bh.bit_count / 8);
+       bmpline_size = (line_size + 3) & ~3;
+       image_size = bmpline_size*bh.height;
+
+       image = malloc(image_size);
+       if (fread(image, 1, image_size, fbmp)!=image_size) {
+               perror("fread(BMP_IMAGE)");
+               return(6);
+       }
+       fclose(fbmp);
+       
+       if ((bh.width != 120) || (bh.height != 64))
+               printf("WARNING: Not 120x64 pixels - result unpredictable.\n");
+       if (bh.compression != 0)
+               printf("WARNING: Image is compressed - result unpredictable.\n");
+
+       bmp2raw(bh, image, raw);
+       raw2packed(raw, s);
+
+       if(lcd_fd < 0)
+       {
+               if ((lcd_fd = open("/dev/dbox/lcd0",O_RDWR)) < 0) 
+               {
+                       perror("open(/dev/dbox/lcd0)");
+                       return(1);
+               }
+               mode = LCD_MODE_BIN;
+               if (ioctl(lcd_fd,LCD_IOCTL_ASC_MODE,&mode) < 0) 
+               {
+                       perror("init(LCD_MODE_BIN)");
+                       close(lcd_fd);
+                       return(1);
+               }
+        }
+       write(lcd_fd, &s, LCD_BUFFER_SIZE);
+
+       return 0;
+}
+void clear_lcd(void)
+{
+       if(lcd_fd)
+       {
+               close(lcd_fd);  
+               lcd_fd=-1;
+       }
+}
+
+//************** bmp.c **********************
+
+
+int bmp2raw(struct bmp_header bh, unsigned char *bmp, lcd_raw_buffer raw) {
+       int x, y, ofs, linesize;
+       linesize = ((bh.width*bh.bit_count / 8) + 3) & ~3;
+       switch (bh.bit_count) {
+       case 1:
+               for (y=0; y<64; y++) { for (x=0; x<120; x++) {
+                       ofs = (bh.height - 1 - y)*linesize + (x>>3);
+                       raw[y][x] = 255*((bmp[ofs]>>(7-(x&7)))&1);
+               } }
+               break;
+       case 4:
+               for (y=0; y<64; y++) { for (x=0; x<60; x++) {
+                       ofs = (bh.height - 1 - y)*linesize + x;
+                       raw[y][x*2] = bmp[ofs] >> 4;
+                       raw[y][x*2+1] = bmp[ofs] & 0x0F;
+               } }
+               break;
+       default:
+               return -1;
+       }
+       return 0;
+}
+
+
+//***************** raw.c ******************
+
+
+
+void packed2raw(lcd_packed_buffer source, lcd_raw_buffer dest) {
+       int x, y, pix;
+       for (y=0; y<64; y++) {
+               for (x=0; x<120; x++) {
+                       pix = (source[y>>3][x] >> (y&7)) & 1;
+                       dest[y][x] = pix*255;
+               }
+       }
+}
+void raw2packed(lcd_raw_buffer source, lcd_packed_buffer dest) {
+       int x, y, y_sub, pix;
+
+       for (y=0; y<8; y++) {
+               for (x=0; x<120; x++) {
+                       pix = 0;
+                       for (y_sub=7; y_sub>=0; y_sub--) {
+                               pix = pix<<1;
+                               if (source[y*8+y_sub][x]) pix++;
+                       }
+                       dest[y][x] = pix;
+               }
+       }
+}
+
+void raw2raw4bit(lcd_raw_buffer source, lcd_raw4bit_buffer dest) {
+       int x, y;
+
+       for (y=0; y<64; y++) {
+               for (x=0; x<60; x++) {
+                       dest[y][x] = ((source[y][x*2]<<4) & 0xf0) +
+                                    (source[y][x*2+1] & 0x0f);
+               }
+       }
+}
diff --git a/bmps.h b/bmps.h
new file mode 100644 (file)
index 0000000..cc4e2fc
--- /dev/null
+++ b/bmps.h
@@ -0,0 +1,89 @@
+/*
+ * $Id: bmps.h,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $
+ *
+ * tuxwetter - d-box2 linux project
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+
+
+//****************************** bmp2lcd *****************************
+
+#ifndef __BMP2LCD__
+#define __BMP2LCD__
+
+int bmp2lcd (char *); 
+void clear_lcd(void);
+#endif // __BMP2LCD__
+
+
+//******************************** raw.h ******************************
+
+#ifndef __raw__
+#define __raw__
+
+struct raw_header {
+       short int width;
+       short int height;
+       unsigned char trans;
+}__attribute((packed));
+
+typedef unsigned char lcd_raw_buffer[64][120];
+typedef unsigned char lcd_packed_buffer[8][120];
+typedef unsigned char lcd_raw4bit_buffer[64][60];
+
+void packed2raw(lcd_packed_buffer, lcd_raw_buffer);
+void raw2packed(lcd_raw_buffer, lcd_packed_buffer);
+void raw2raw4bit(lcd_raw_buffer, lcd_raw4bit_buffer);
+
+#endif // __raw__
+
+//******************************** bmp.h ******************************
+
+#ifndef __bmp__
+#define __bmp__
+
+struct bmp_header {
+       unsigned char _B;       // = 'B'
+       unsigned char _M;       // = 'M'
+       long int file_size;     // file size
+       long int reserved;      // = 0
+       long int data_offset;   // start of raw data
+       // bitmap info header starts here
+       long int header_size;   // = 40
+       long int width;         // = 120
+       long int height;        // = 64
+       short int planes;       // = 1
+       short int bit_count;    // 1..24
+       long int compression;   // = 0
+       long int image_size;    // 120*64*bitcount/8
+       long int x_ppm;         // X pixels/meter
+       long int y_ppm;         // Y pixels/meter
+       long int colors_used;   // 
+       long int colors_vip;    // important colors (all=0)
+}__attribute((packed));
+
+struct bmp_color {
+       unsigned char r, g, b, reserved;
+}__attribute((packed));
+
+int bmp2raw(struct bmp_header bh, unsigned char *bmp, lcd_raw_buffer raw);
+
+#endif // __bmp__
+
+
+
diff --git a/build.sh b/build.sh
new file mode 100644 (file)
index 0000000..023da09
--- /dev/null
+++ b/build.sh
@@ -0,0 +1 @@
+arm-cx2450x-linux-gnueabi-gcc -g -o tuxwetter tuxwetter.c gfx.c io.c text.c parser.c php.c http.c jpeg.c fb_display.c resize.c pngw.c gif.c -L$PREFIX/lib -I$PREFIX/include -I$PREFIX/include/freetype2 -I$PREFIX/include/freetype2 -O2 -lfreetype -lz -ljpeg  -lpng -lungif gifdecomp.c
diff --git a/color.h b/color.h
new file mode 100644 (file)
index 0000000..6ab843b
--- /dev/null
+++ b/color.h
@@ -0,0 +1,71 @@
+/*
+       Neutrino-GUI  -   DBoxII-Project
+
+       Copyright (C) 2001 Steffen Hehn 'McClean'
+       Homepage: http://dbox.cyberphoria.org/
+
+       Kommentar:
+
+       Diese GUI wurde von Grund auf neu programmiert und sollte nun vom
+       Aufbau und auch den Ausbaumoeglichkeiten gut aussehen. Neutrino basiert
+       auf der Client-Server Idee, diese GUI ist also von der direkten DBox-
+       Steuerung getrennt. Diese wird dann von Daemons uebernommen.
+
+
+       License: GPL
+
+       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.
+*/
+
+
+#ifndef __color__
+#define __color__
+
+#define COL_MAXFREE                    254-8*7 - 1
+#define COL_INFOBAR_SHADOW             254-8*7
+#define COL_INFOBAR                    254-8*6
+#define COL_MENUHEAD                   254-8*5
+#define COL_MENUCONTENT                        254-8*4
+#define COL_MENUCONTENTDARK            254-8*3
+#define COL_MENUCONTENTSELECTED                254-8*2
+#define COL_MENUCONTENTINACTIVE                254-8*1
+
+#define COL_BACKGROUND                         255
+
+#define COL_INFOBAR_SHADOW_PLUS_0       (COL_INFOBAR_SHADOW + 0)
+#define COL_INFOBAR_SHADOW_PLUS_1       (COL_INFOBAR_SHADOW + 1)
+#define COL_INFOBAR_PLUS_0              (COL_INFOBAR + 0)
+#define COL_INFOBAR_PLUS_1              (COL_INFOBAR + 1)
+#define COL_INFOBAR_PLUS_3              (COL_INFOBAR + 3)
+#define COL_INFOBAR_PLUS_7              (COL_INFOBAR + 7)
+#define COL_MENUHEAD_PLUS_0             (COL_MENUHEAD + 0)
+#define COL_MENUCONTENT_PLUS_0          (COL_MENUCONTENT + 0)
+#define COL_MENUCONTENT_PLUS_1          (COL_MENUCONTENT + 1)
+#define COL_MENUCONTENT_PLUS_2          (COL_MENUCONTENT + 2)
+#define COL_MENUCONTENT_PLUS_3          (COL_MENUCONTENT + 3)
+#define COL_MENUCONTENT_PLUS_4          (COL_MENUCONTENT + 4)
+#define COL_MENUCONTENT_PLUS_5          (COL_MENUCONTENT + 5)
+#define COL_MENUCONTENT_PLUS_6          (COL_MENUCONTENT + 6)
+#define COL_MENUCONTENT_PLUS_7          (COL_MENUCONTENT + 7)
+#define COL_MENUCONTENTDARK_PLUS_0      (COL_MENUCONTENTDARK + 0)
+#define COL_MENUCONTENTDARK_PLUS_2      (COL_MENUCONTENTDARK + 2)
+#define COL_MENUCONTENTSELECTED_PLUS_0  (COL_MENUCONTENTSELECTED + 0)
+#define COL_MENUCONTENTSELECTED_PLUS_2  (COL_MENUCONTENTSELECTED + 2)
+#define COL_MENUCONTENTINACTIVE_PLUS_0  (COL_MENUCONTENTINACTIVE + 0)
+#define COL_BACKGROUND_PLUS_0           (COL_BACKGROUND + 0)
+
+enum { COL_WHITE=0x60, COL_RED, COL_GREEN, COL_BLUE, COL_YELLOW, COL_BLACK };
+
+#endif
diff --git a/convert.list b/convert.list
new file mode 100644 (file)
index 0000000..dc2b878
--- /dev/null
@@ -0,0 +1,179 @@
+BLIZZARD|Schneesturm
+BLOWING SNOW|Schneeverwehungen
+CLEAR/SUNNY|sonnig und klar
+CLOUDY |wolkig
+FOG|Nebel
+FREEZING DRIZZLE|gefrierender Nieselregen
+FREEZING FOG|gefrierender Nebel
+HEAVY FREEZING DRIZZLE|starker gefrierender Nieselregen
+HEAVY RAIN|starker Regen
+HEAVY SNOW|starker Schneefall
+ICE PELLETS|Hagel
+LIGHT DRIZZLE|leichter Nieselregen
+LIGHT FREEZING RAIN|leichter gefrierender Regen
+LIGHT RAIN SHOWER|leichter Regenschauer
+LIGHT RAIN|leichter Regen
+LIGHT SHOWERS OF ICE PELLETS|leichter Hagel
+LIGHT SLEET SHOWERS|leichter Graupelschauer
+LIGHT SLEET|leichter Graupel
+LIGHT SNOW SHOWERS|leichter Schneeschauer
+LIGHT SNOW|leichter Schneefall
+MIST|Dunst
+MODERATE OR HEAVY FREEZING RAIN|mäßig gefrierender Regen
+MODERATE OR HEAVY RAIN IN AREA WITH THUNDER|mäßiger Regen/vereinzelt Gewitter
+MODERATE OR HEAVY RAIN SHOWER|mäßiger Regenschauer
+MODERATE OR HEAVY SHOWERS OF ICE PELLETS|mäßiger Hagel
+MODERATE OR HEAVY SLEET SHOWERS|mäßiger Graupelschauer
+MODERATE OR HEAVY SLEET|mäßiger Graupel
+MODERATE OR HEAVY SNOW IN AREA WITH THUNDER|mäßiger Schneefall/vereinzelt Gewitter
+MODERATE OR HEAVY SNOW SHOWERS|mäßige Schneeschauer
+MODERATE RAIN AT TIMES|vereinzelt mäßiger Regen
+MODERATE RAIN|mäßiger Regen
+MODERATE SNOW|mäßiger Schnee
+OVERCAST |bedeckt
+PARTLY CLOUDY |teilweise bewölkt
+PATCHY FREEZING DRIZZLE NEARBY|ungleichmäßiger gefrierender Nieselregen
+PATCHY HEAVY SNOW|ungleichmäßiger schwerer Schneefall
+PATCHY LIGHT DRIZZLE|ungleichmäßiger leichter Nieselregen
+PATCHY LIGHT RAIN IN AREA WITH THUNDER|ungleichmäßiger leichter Regen/vereinzelt Gewitter
+PATCHY LIGHT RAIN|ungleichmäßiger leichter Regen
+PATCHY LIGHT SNOW IN AREA WITH THUNDER|ungleichmäßiger leichter Schneefall/vereinzelt Gewitter
+PATCHY LIGHT SNOW|ungleichmäßiger leichter Schneefall
+PATCHY MODERATE SNOW|ungleichmäßiger mäßiger Schneefall
+PATCHY RAIN NEARBY|vereinzelt ungleichmäßiger Regen
+PATCHY SLEET NEARBY|vereinzelt ungleichmäßiger Graupel
+PATCHY SNOW NEARBY|vereinzelt ungleichmäßiger Schneefall
+SUNNY|sonnig
+THUNDERY OUTBREAKS IN NEARBY|vereinzelt Gewitter
+TORRENTIAL RAIN SHOWER|heftiger Regenschauer
+#
+E|Ost
+ENE|OstNordOst
+ESE|OstSüdOst
+N|Nord
+NE|NordOst
+NNE|NordNordOst
+NNW|NordNordWest
+NW|NordWest
+S|Süd
+SE|SüdOst
+SSE|SüdSüdOst
+SSW|SüdSüdWest
+SW|SüdWest
+W|West
+WNW|WestNordWest
+WSW|WestSüdWest
+#
+MONDAY|Montag
+TUESDAY|Dienstag
+WEDNESDAY|Mittwoch
+THURSDAY|Donnerstag
+FRIDAY|Freitag
+SATURDAY|Samstag
+SUNDAY|Sonntag
+#
+MONDAY_SIG|Mo
+TUESDAY_SIG|Di
+WEDNESDAY_SIG|Mi
+THURSDAY_SIG|Do
+FRIDAY_SIG|Fr
+SATURDAY_SIG|Sa
+SUNDAY_SIG|So
+#
+#Lokalisierung der Bildschirmanzeige
+#
+Januar|
+Februar|
+März|
+April|
+Mai|
+Juni|
+Juli|
+August|
+September|
+Oktober|
+November|
+Dezember|
+#
+Aktuelle Anzeige schließen|
+Aktuelle Uhrzeit:|
+Aktuelles Wetter|
+Aktuelles Wetter|
+Animation wiederholen|
+Bedingung:|
+beim Download|
+Bild|
+Bitte warten|
+Bitte warten|
+Breitengrad:|
+CS-Tuxwetter beenden|
+Datei kann nicht angezeigt werden.|
+Direktanwahl Funktionen 1-4|
+Direktanwahl Funktionen 5-10|
+eine Seite vorblättern|
+eine Seite zurückblättern|
+Farbtasten Rot, Grün, Gelb, Blau|
+fehlende Übersetzungen anzeigen|
+Fehlende Übersetzungen|
+Fehler|
+Fehlliste löschen|
+Fernsicht:|
+Formatfehler der URL in der tuxwetter.conf|
+gefühlt:|
+Heute|
+Hoch|
+Höchste Temperatur:|
+Höchstwerte|
+Home|
+Kein Eintrag|
+Keine Daten vom Wetterserver erhalten!|
+Keine fehlenden Übersetzungen|
+Längengrad:|
+Links (bei mehrseitigen Menüs)|
+Links (in Bildanzeige)|
+Luftdruck:|
+Luftfeuchtigkeit:|
+Menüpunkt ausführen|
+Menü-Taste (im Hauptmenü)|
+mit|
+Mondphase:|
+nächsten Eintrag anzeigen|
+nächster Menüeintrag|
+Nachtwerte|
+neu downloaden (für WebCams)|
+Nicht unterstütztes Dateiformat|
+OK/Home|
+OK|
+Ortszeit:|
+Rechts (bei Ani-GIF's)|
+Rechts (bei mehrseitigen Menüs)|
+Regenrisiko:|
+Rot (in fehlenden Übersetzungen)|
+Runter|
+Sonnenaufgang:|
+Sonnenuntergang:|
+Standby-Taste|
+Standort:|
+Steuertasten in Daten- und Grafikanzeige|
+Steuertasten in den Menüs|
+Tageswerte|
+Taupunkt:|
+Temperatur:|
+Tiefste Temperatur:|
+Tiefstwerte|
+Trend für die kommende Woche|
+Uhr|
+Ungültige Daten aus tuxwetter.conf|
+UV-Index:|
+von|
+vorherigen Eintrag anzeigen|
+vorheriger Menüeintrag|
+Vorschau für|
+Wetterdaten für|
+Wind:|
+windstill|
+Wochentrend anzeigen|
+Wochentrend|
+Zeitpunkt der Messung:|
+Zifferntasten 1-6|
+zurück zum vorigen Menü|
diff --git a/fb_display.c b/fb_display.c
new file mode 100644 (file)
index 0000000..4129986
--- /dev/null
@@ -0,0 +1,499 @@
+/*
+ * $Id: fb_display.c,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $
+ *
+ * tuxwetter - d-box2 linux project
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+//#include "config.h"
+#include <string.h>
+#include <stdio.h>
+#ifdef HAVE_DBOX_HARDWARE
+#include <dbox/fb.h>
+#endif
+#include "tuxwetter.h"
+#include "parser.h"
+//#include "bmps.h"
+#include "text.h"
+#include "io.h"
+#include "gfx.h"
+#include "fb_display.h"
+
+#define FB_DEVICE      "/dev/fb/0"
+
+/* Public Use Functions:
+ *
+ * extern void fb_display(unsigned char *rgbbuff,
+ *     int x_size, int y_size,
+ *     int x_pan, int y_pan,
+ *     int x_offs, int y_offs);
+ *
+ * extern void getCurrentRes(int *x,int *y);
+ *
+ */
+
+//static unsigned short rd[] = {0xFF<<8, 0x00<<8, 0x00<<8, 0x00<<8, 0xFF<<8, 0x00<<8, 0xFF<<8, 0xFF<<8};
+//static unsigned short gn[] = {0xFF<<8, 0x80<<8, 0x00<<8, 0x80<<8, 0xC0<<8, 0xFF<<8, 0xFF<<8, 0x00<<8};
+//static unsigned short bl[] = {0xFF<<8, 0xFF<<8, 0x80<<8, 0xFF<<8, 0x00<<8, 0x00<<8, 0x00<<8, 0x00<<8};
+//static unsigned short tr[] = {0x0000,  0x0A00,  0x0A00,  0x0000,  0x0000,  0x0000,  0x0000,  0x0000 };
+//static struct fb_cmap map_back = {0, 256, red_b, green_b, blue_b, NULL};
+// static unsigned short red_b[256], green_b[256], blue_b[256];
+
+static unsigned short red[256], green[256], blue[256], transp[256];
+static struct fb_cmap map332 = {0, 256, red, green, blue, NULL};
+extern int fbd; // Framebuffer device
+extern unsigned char *lfb;
+extern unsigned int alpha;
+static int gbpp, gccp, gmode_on=0;
+static struct fb_fix_screeninfo fix;
+//static struct fb_cmap colormap = {1, 8, rd, gn, bl, tr};
+
+typedef struct pixelformat{
+       char *name;
+       struct fb_bitfield red;
+       struct fb_bitfield green;
+       struct fb_bitfield blue;
+       struct fb_bitfield transp;
+       char bpp;
+       char pixenum;
+       }spix;
+
+
+const struct pixelformat gpix = {
+           .name = "RGB565",           // RGB565
+               .bpp = 16, .pixenum = 2,
+               .red =   { .offset = 11, .length=5, .msb_right =0 },
+               .green = { .offset = 5,  .length=6, .msb_right =0 },
+               .blue =  { .offset = 0,  .length=5, .msb_right =0 },
+               .transp= { .offset = 0,  .length=0, .msb_right =0 },
+       };
+
+int openFB(const char *name);
+void getFixScreenInfo(struct fb_fix_screeninfo *fix);
+int set332map(void);
+void blit2FB(void *fbbuff,
+       unsigned int pic_xs, unsigned int pic_ys,
+       unsigned int scr_xs, unsigned int scr_ys,
+       unsigned int xp, unsigned int yp,
+       unsigned int xoffs, unsigned int yoffs,
+       int cpp, int setpal);
+
+inline unsigned short make16color(unsigned long r, unsigned long g, 
+                                                                                        unsigned long b, unsigned long rl, 
+                                                                                        unsigned long ro, unsigned long gl, 
+                                                                                        unsigned long go, unsigned long bl, 
+                                                                                        unsigned long bo, unsigned long tl, 
+                                                                                        unsigned long to);
+
+int fb_set_gmode(int gmode)
+{
+    struct fb_var_screeninfo var;
+
+       if(ioctl(fb, FBIOGET_VSCREENINFO, &var) == -1)
+       {
+               printf("fb_display <FBIOGET_VSCREENINFO failed>\n");
+               return -1;
+       }
+
+       struct fb_fix_screeninfo fix;
+
+       if (ioctl(fb, FBIOGET_FSCREENINFO, &fix)<0) {
+               perror("FBIOGET_FSCREENINFO");
+               return -1;
+       }
+
+//     memset(lfb, 0, stride * yRes);
+        if (ioctl(fb, FBIOBLANK, FB_BLANK_UNBLANK) < 0) {
+                printf("screen unblanking failed\n");
+        }
+
+       gmode_on=gmode;
+       return 0;
+}
+
+
+void fb_display(unsigned char *rgbbuff, int x_size, int y_size, int x_pan, int y_pan, int x_offs, int y_offs, int clearflag, int setpal)
+{
+    struct fb_var_screeninfo var;
+    unsigned short *fbbuff = NULL;
+    int bp = 0;
+    if(rgbbuff==NULL)
+                return;
+
+       if(ioctl(fb, FBIOGET_FSCREENINFO, &fix) == -1)
+       {
+               printf("fb_display <FBIOGET_FSCREENINFO failed>\n");
+               return;
+       }
+
+       if(ioctl(fb, FBIOGET_VSCREENINFO, &var) == -1)
+       {
+               printf("fb_display <FBIOGET_VSCREENINFO failed>\n");
+               return;
+       }
+
+    /* correct panning */
+    if(x_pan > x_size - (int)var.xres) x_pan = 0;
+    if(y_pan > y_size - (int)var.yres) y_pan = 0;
+    /* correct offset */
+    if(x_offs + x_size > (int)var.xres) x_offs = 0;
+    if(y_offs + y_size > (int)var.yres) y_offs = 0;
+    
+    /* blit buffer 2 fb */
+    fbbuff = (unsigned short *) convertRGB2FB(rgbbuff, x_size * y_size, var.bits_per_pixel, &bp);
+    if(fbbuff==NULL)
+                return;
+        /* ClearFB if image is smaller */
+   if(clearflag)
+       clearFB(0,0,var.bits_per_pixel, bp);
+    blit2FB(fbbuff, x_size, y_size, var.xres, var.yres, x_pan, y_pan, x_offs, y_offs, bp, setpal);
+    free(fbbuff);
+    gbpp=bp;
+    gccp=var.bits_per_pixel;
+}
+
+void getCurrentRes(int *x, int *y)
+{
+    struct fb_var_screeninfo tvar;
+    ioctl(fb, FBIOGET_VSCREENINFO, &tvar);
+    *x = tvar.xres;
+    *y = tvar.yres;
+}
+
+void make332map(struct fb_cmap *map)
+{
+        unsigned short rd[] = {0xFF<<8, 0x00<<8, 0xFF<<8, 0x00<<8, 0xFF<<8, 0x00<<8, 0xFF<<8, 0x00<<8, 
+                                          0xFF<<8, 0x00<<8, 0x00<<8, 0x00<<8, 0xFF<<8, 0x00<<8, 0xFF<<8, 0xFF<<8};
+        unsigned short gn[] = {0xFF<<8, 0x80<<8, 0xFF<<8, 0x00<<8, 0xFF<<8, 0x00<<8, 0xC0<<8, 0x00<<8, 
+                                          0xFF<<8, 0x80<<8, 0x00<<8, 0x80<<8, 0xC0<<8, 0xFF<<8, 0xFF<<8, 0x00<<8};
+        unsigned short bl[] = {0xFF<<8, 0xFF<<8, 0xFF<<8, 0x80<<8, 0xFF<<8, 0x80<<8, 0x00<<8, 0x80<<8, 
+                                          0xFF<<8, 0xFF<<8, 0x00<<8, 0xFF<<8, 0x00<<8, 0x00<<8, 0x00<<8, 0x00<<8};
+        unsigned short tr[] = {0x0000,  0x0A00,  0x0000,  0x0A00,  0x0000,  0x0A00,  0x0000,  0x0000, 
+                                          0x0000,  0x0A00,  0xFFFF,  0x0000,  0x0000,  0x0000,  0x0000,  0x0000 };
+
+       int rs, gs, bs, i;
+       int r = 8, g = 8, b = 4;
+
+       map->red = red;
+       map->green = green;
+       map->blue = blue;
+       map->transp = transp;
+
+       rs = 256 / (r - 1);
+       gs = 256 / (g - 1);
+       bs = 256 / (b - 1);
+       
+       for (i = 0; i < 256; i++) {
+               map->red[i]   = (rs * ((i / (g * b)) % r)) * 255;
+               map->green[i] = (gs * ((i / b) % g)) * 255;
+               map->blue[i]  = (bs * ((i) % b)) * 255;
+               map->transp[i]  = 0x0000;
+       }
+
+       // set system-colors
+       for (i = 0; i < 16; i++) {
+               map->red[i]   = rd[i];
+               map->green[i] = gn[i];
+               map->blue[i]  = bl[i];
+               map->transp[i] = tr[i];
+       }
+
+}
+
+int set332map(void)
+{
+    make332map(&map332);
+       return ioctl(fb, FBIOPUTCMAP, &map332);
+}
+
+void blit2FB(void *fbbuff,
+       unsigned int pic_xs, unsigned int pic_ys,
+       unsigned int scr_xs, unsigned int scr_ys,
+       unsigned int xp, unsigned int yp,
+       unsigned int xoffs, unsigned int yoffs,
+       int cpp, int setpal)
+{
+    int i, xc, yc;
+    unsigned char *cp; unsigned short *sp; unsigned int *ip;
+    ip = (unsigned int *) fbbuff;
+    sp = (unsigned short *) ip;
+    cp = (unsigned char *) sp;
+
+    xc = (pic_xs > scr_xs) ? scr_xs : pic_xs;
+    yc = (pic_ys > scr_ys) ? scr_ys : pic_ys;
+
+    unsigned int stride = fix.line_length;
+
+        switch(cpp){
+               case 1:
+               if(setpal)
+               {
+                       set332map();
+               }
+           for(i = 0; i < yc; i++){
+                        memcpy(lfb+(i+yoffs)*stride+xoffs*cpp,cp + (i+yp)*pic_xs+xp,xc*cpp);
+                }
+                break;
+                case 2:
+                        for(i = 0; i < yc; i++){
+                                memcpy(lfb+(i+yoffs)*stride+xoffs*cpp,sp + (i+yp)*pic_xs+xp, xc*cpp);
+                        }
+                        break;
+                case 4:
+                        for(i = 0; i < yc; i++){
+                                memcpy(lfb+(i+yoffs)*stride+xoffs*cpp,ip + (i+yp)*pic_xs+xp, xc*cpp);
+                        }
+                        break;
+        }
+}
+
+
+void clearFB(int cfx, int cfy, int bpp, int cpp)
+{
+int x,y;
+
+       if(cfx<=0 || cfy<=0)
+       {
+               getCurrentRes(&x,&y);
+       }
+       else
+       {
+               x=cfx;
+               y=cfy;
+       }
+       
+    unsigned int stride = fix.line_length;
+       
+       switch(cpp){
+               case 2:
+                       {
+                               unsigned long rl, ro, gl, go, bl, bo, tl, to;
+                               unsigned int i;
+                               struct fb_var_screeninfo tvar;
+                               ioctl(fb, FBIOGET_VSCREENINFO, &tvar);
+                               rl = tvar.red.length;
+                               ro = tvar.red.offset;
+                               gl = tvar.green.length;
+                               go = tvar.green.offset;
+                               bl = tvar.blue.length;
+                               bo = tvar.blue.offset;
+                               tl = tvar.transp.length;
+                               to = tvar.transp.offset;
+                               short black=make16color(0,0,0, rl, ro, gl, go, bl, bo, tl, to);
+                               unsigned short *s_fbbuff = (unsigned short *) malloc(y*stride/2 * sizeof(unsigned short));
+                               if(s_fbbuff==NULL)
+                               {
+                                       printf("Error: malloc\n");
+                                       return;
+                               }
+
+                               for(i = 0; i < y*stride/2; i++)
+                                  s_fbbuff[i] = black;
+                               memcpy(lfb, s_fbbuff, y*stride);
+                               free(s_fbbuff);
+                       }
+                       break;
+               case 4:
+                       {
+                       unsigned int  col = 0xFF000000;
+                       unsigned int  * dest = (unsigned int  *) lfb;
+                       unsigned int i;
+                       for(i = 0; i < stride*y/4; i ++)
+                               dest[i] = col;
+                       }
+                       break;
+
+               default:
+                       memset(lfb, 0, stride*y);
+       }
+
+}
+
+void closeFB(void)
+{
+       clearFB(0, 0, gbpp, gccp);
+}
+
+inline unsigned char make8color(unsigned char r, unsigned char g, unsigned char b)
+{
+    return (
+       (((r >> 5) & 7) << 5) |
+       (((g >> 5) & 7) << 2) |
+        ((b >> 6) & 3)       );
+}
+
+inline unsigned short make15color(unsigned char r, unsigned char g, unsigned char b)
+{
+    return ( 
+       (((b >> 3) & 31) << 10) |
+       (((g >> 3) & 31) << 5)  |
+        ((r >> 3) & 31)        );
+}
+
+inline unsigned short make16color(unsigned long r, unsigned long g, unsigned long b, 
+                                   unsigned long rl, unsigned long ro, 
+                                   unsigned long gl, unsigned long go, 
+                                   unsigned long bl, unsigned long bo, 
+                                   unsigned long tl, unsigned long to)
+{
+    return (
+//              ((0xFF >> (8 - tl)) << to) |
+           ((r    >> (8 - rl)) << ro) |
+           ((g    >> (8 - gl)) << go) |
+           ((b    >> (8 - bl)) << bo));
+}
+
+void* convertRGB2FB(unsigned char *rgbbuff, unsigned long count, int bpp, int *cpp)
+{
+    unsigned long i;
+    void *fbbuff = NULL;
+    unsigned char *c_fbbuff;
+    unsigned short *s_fbbuff;
+    unsigned int *i_fbbuff;
+    unsigned long rl, ro, gl, go, bl, bo, tl, to;
+    
+       struct fb_var_screeninfo tvar;
+    ioctl(fb, FBIOGET_VSCREENINFO, &tvar);
+    rl = tvar.red.length;
+    ro = tvar.red.offset;
+    gl = tvar.green.length;
+    go = tvar.green.offset;
+    bl = tvar.blue.length;
+    bo = tvar.blue.offset;
+    tl = tvar.transp.length;
+    to = tvar.transp.offset;
+        
+        switch(bpp)
+    {
+       case 8:
+           *cpp = 1;
+           c_fbbuff = (unsigned char *) malloc(count * sizeof(unsigned char));
+                if(c_fbbuff==NULL)
+                {
+                        printf("Error: malloc\n");
+                        return NULL;
+                }
+           for(i = 0; i < count; i++)
+               c_fbbuff[i] = make8color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]);
+           fbbuff = (void *) c_fbbuff;
+           break;
+       case 15:
+           *cpp = 2;
+           s_fbbuff = (unsigned short *) malloc(count * sizeof(unsigned short));
+                if(s_fbbuff==NULL)
+                {
+                        printf("Error: malloc\n");
+                        return NULL;
+                }
+           for(i = 0; i < count ; i++)
+               s_fbbuff[i] = make15color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]);
+           fbbuff = (void *) s_fbbuff;
+           break;
+       case 16:
+           *cpp = 2;
+           s_fbbuff = (unsigned short *) malloc(count * sizeof(unsigned short));
+                if(s_fbbuff==NULL)
+                {
+                        printf("Error: malloc\n");
+                        return NULL;
+                }
+           for(i = 0; i < count ; i++)
+                        s_fbbuff[i]=make16color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2], rl, ro, gl, go, bl, bo, tl, to);
+                fbbuff = (void *) s_fbbuff;
+           break;
+       case 24:
+       case 32:
+           *cpp = 4;
+           i_fbbuff = (unsigned int *) malloc(count * sizeof(unsigned int));
+                if(i_fbbuff==NULL)
+                {
+                        printf("Error: malloc\n");
+                        return NULL;
+                }
+           for(i = 0; i < count ; i++)
+               i_fbbuff[i] = (/*transp*/0xFF << 24) | ((rgbbuff[i*3] << 16) & 0xFF0000) | ((rgbbuff[i*3+1] << 8) & 0xFF00) | (rgbbuff[i*3+2] & 0xFF);
+
+           fbbuff = (void *) i_fbbuff;
+           break;
+       default:
+           fprintf(stderr, "Unsupported video mode! You've got: %dbpp\n", bpp);
+           exit(1);
+    }
+    return fbbuff;
+}
+
+
+
+
+int showBusy(int sx, int sy, int width, char r, char g, char b)
+{
+       unsigned char rgb_buffer[3];
+       unsigned char* fb_buffer;
+       unsigned char* m_busy_buffer=NULL;
+       unsigned char* busy_buffer_wrk;
+       int cpp;
+       struct fb_fix_screeninfo fix;
+       if(ioctl(fb, FBIOGET_FSCREENINFO, &fix) == -1)
+       {
+               printf("fb_display <FBIOGET_FSCREENINFO failed>\n");
+               return -1;
+       }
+       
+       struct fb_var_screeninfo var;
+       if(ioctl(fb, FBIOGET_VSCREENINFO, &var) == -1)
+       {
+               printf("fb_display <FBIOGET_VSCREENINFO failed>\n");
+               return -1;
+       }
+       var.bits_per_pixel = gpix.bpp;
+
+       rgb_buffer[0]=r;
+       rgb_buffer[1]=g;
+       rgb_buffer[2]=b;
+
+       fb_buffer = (unsigned char*) convertRGB2FB(rgb_buffer, 1, var.bits_per_pixel, &cpp);
+       if(fb_buffer==NULL)
+       {
+               printf("Error: malloc\n");
+               return -1;
+       }
+       if(m_busy_buffer!=NULL)
+       {
+               free(m_busy_buffer);
+               m_busy_buffer=NULL;
+       }
+       m_busy_buffer = (unsigned char*) malloc(width*width*cpp);
+       if(m_busy_buffer==NULL)
+       {
+               printf("Error: malloc\n");
+               return -1;
+       }
+       busy_buffer_wrk = m_busy_buffer;
+       unsigned int stride = fix_screeninfo.line_length*2;
+
+       int y=0, x=0;
+       for(y=sy ; y < sy+width; y++)
+       {
+               for(x=sx ; x< sx+width; x++)
+               {
+                       memcpy(busy_buffer_wrk, lfb + y * stride + x*cpp, cpp);
+                       busy_buffer_wrk+=cpp;
+                       memcpy(lfb + y * stride + x*cpp, fb_buffer, cpp);
+               }
+       }
+return 0;
+}
diff --git a/fb_display.h b/fb_display.h
new file mode 100644 (file)
index 0000000..b29b3d6
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * $Id: fb_display.h,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $
+ *
+ * tuxwetter - d-box2 linux project
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+#ifndef __pictureviewer_fbdisplay__
+#define __pictureviewer_fbdisplay__
+void* convertRGB2FB(unsigned char *rgbbuff, unsigned long count, int bpp, int *cpp);
+void fb_display(unsigned char *rgbbuff, int x_size, int y_size, int x_pan, int y_pan, int x_offs, int y_offs, int clearflag, int  transp);
+int fb_set_gmode(int gmode);
+void getCurrentRes(int *x,int *y);
+void clearFB(int cfx, int cfy, int bpp, int cpp);
+void closeFB(void);
+
+int showBusy(int sx, int sy, int width, char r, char g, char b);
+
+
+#endif
diff --git a/gfx.c b/gfx.c
new file mode 100644 (file)
index 0000000..3f40c34
--- /dev/null
+++ b/gfx.c
@@ -0,0 +1,291 @@
+//getline needed #define _GNU_SOURCE
+#define _GNU_SOURCE
+
+#include "tuxwetter.h"
+#include "gfx.h"
+
+typedef struct { unsigned char width_lo; unsigned char width_hi; unsigned char height_lo; unsigned char height_hi;     unsigned char transp; } IconHeader;
+
+char circle[] =
+{
+       0,0,0,0,0,1,1,0,0,0,0,0,
+       0,0,0,1,1,1,1,1,1,0,0,0,
+       0,0,1,1,1,1,1,1,1,1,0,0,
+       0,1,1,1,1,1,1,1,1,1,1,0,
+       0,1,1,1,1,1,1,1,1,1,1,0,
+       1,1,1,1,1,1,1,1,1,1,1,1,
+       1,1,1,1,1,1,1,1,1,1,1,1,
+       0,1,1,1,1,1,1,1,1,1,1,0,
+       0,1,1,1,1,1,1,1,1,1,1,0,
+       0,0,1,1,1,1,1,1,1,1,0,0,
+       0,0,0,1,1,1,1,1,1,0,0,0,
+       0,0,0,0,0,1,1,0,0,0,0,0
+};
+
+void Center_Screen(int wx, int wy, int *csx, int *csy)
+{
+       *csx = ((ex-sx) - wx)/2;
+       *csy = ((ey-sy) - wy)/2;
+}
+
+/******************************************************************************
+ * RenderBox
+ ******************************************************************************/
+void RenderBox(int rsx, int rsy, int rex, int rey, int rad, int col)
+{
+       int F,R=rad,ssx=sx+rsx,ssy=sy+rsy,dxx=rex,dyy=rey,rx,ry,wx,wy,count;
+
+       unsigned char *pos=(lbb+(ssx<<2)+fix_screeninfo.line_length*ssy);
+       unsigned char *pos0, *pos1, *pos2, *pos3, *i;
+       unsigned char pix[4]={bl[col],gn[col],rd[col],tr[col]};
+
+       if (dxx<0)
+       {
+               printf("[shellexec] RenderBox called with dx < 0 (%d)\n", dxx);
+               dxx=0;
+       }
+
+       if(R)
+       {
+               if(--dyy<=0)
+               {
+                       dyy=1;
+               }
+
+               if(R==1 || R>(dxx/2) || R>(dyy/2))
+               {
+                       R=dxx/10;
+                       F=dyy/10;
+                       if(R>F)
+                       {
+                               if(R>(dyy/3))
+                               {
+                                       R=dyy/3;
+                               }
+                       }
+                       else
+                       {
+                               R=F;
+                               if(R>(dxx/3))
+                               {
+                                       R=dxx/3;
+                               }
+                       }
+               }
+               ssx=0;
+               ssy=R;
+               F=1-R;
+
+               rx=R-ssx;
+               ry=R-ssy;
+
+               pos0=pos+((dyy-ry)*fix_screeninfo.line_length);
+               pos1=pos+(ry*fix_screeninfo.line_length);
+               pos2=pos+(rx*fix_screeninfo.line_length);
+               pos3=pos+((dyy-rx)*fix_screeninfo.line_length);
+               while (ssx <= ssy)
+               {
+                       rx=R-ssx;
+                       ry=R-ssy;
+                       wx=rx<<1;
+                       wy=ry<<1;
+
+                       for(i=pos0+(rx<<2); i<pos0+((rx+dxx-wx)<<2);i+=4)
+                               memcpy(i, pix, 4);
+                       for(i=pos1+(rx<<2); i<pos1+((rx+dxx-wx)<<2);i+=4)
+                               memcpy(i, pix, 4);
+                       for(i=pos2+(ry<<2); i<pos2+((ry+dxx-wy)<<2);i+=4)
+                               memcpy(i, pix, 4);
+                       for(i=pos3+(ry<<2); i<pos3+((ry+dxx-wy)<<2);i+=4)
+                               memcpy(i, pix, 4);
+
+                       ssx++;
+                       pos2-=fix_screeninfo.line_length;
+                       pos3+=fix_screeninfo.line_length;
+                       if (F<0)
+                       {
+                               F+=(ssx<<1)-1;
+                       }
+                       else
+                       {
+                               F+=((ssx-ssy)<<1);
+                               ssy--;
+                               pos0-=fix_screeninfo.line_length;
+                               pos1+=fix_screeninfo.line_length;
+                       }
+               }
+               pos+=R*fix_screeninfo.line_length;
+       }
+
+       for (count=R; count<(dyy-R); count++)
+       {
+               for(i=pos; i<pos+(dxx<<2);i+=4)
+                       memcpy(i, pix, 4);
+               pos+=fix_screeninfo.line_length;
+       }
+}
+
+/******************************************************************************
+ * RenderCircle
+ ******************************************************************************/
+
+void RenderCircle(int sx, int sy, int col)
+{
+       int x, y;
+       unsigned char pix[4]={bl[col],gn[col],rd[col],tr[col]};
+       //render
+
+               for(y = 0; y < 12; y++)
+               {
+                       for(x = 0; x < 12; x++) if(circle[x + y*12]) memcpy(lbb + (startx + sx + x)*4 + fix_screeninfo.line_length*(starty + sy + y), pix, 4);
+               }
+}
+
+#if 0
+/******************************************************************************
+ * PaintIcon
+ ******************************************************************************/
+void PaintIcon(char *filename, int x, int y, unsigned char offset)
+{
+       IconHeader iheader;
+       unsigned int  width, height,count,count2;
+       unsigned char pixbuf[768],*pixpos,compressed,pix1,pix2;
+       unsigned char * d = (lbb+(startx+x)+var_screeninfo.xres*(starty+y));
+       unsigned char * d2;
+       int fd;
+
+       fd = open(filename, O_RDONLY);
+
+       if (fd == -1)
+       {
+               printf("shellexec <unable to load icon: %s>\n", filename);
+               return;
+       }
+
+       read(fd, &iheader, sizeof(IconHeader));
+
+       width  = (iheader.width_hi  << 8) | iheader.width_lo;
+       height = (iheader.height_hi << 8) | iheader.height_lo;
+
+
+       for (count=0; count<height; count ++ )
+       {
+               read(fd, &pixbuf, width >> 1 );
+               pixpos = (unsigned char*) &pixbuf;
+               d2 = d;
+               for (count2=0; count2<width >> 1; count2 ++ )
+               {
+                       compressed = *pixpos;
+                       pix1 = (compressed & 0xf0) >> 4;
+                       pix2 = (compressed & 0x0f);
+
+                       if (pix1 != iheader.transp)
+                       {
+                               *d2=pix1 + offset;
+                       }
+                       d2++;
+                       if (pix2 != iheader.transp)
+                       {
+                               *d2=pix2 + offset;
+                       }
+                       d2++;
+                       pixpos++;
+               }
+               d += var_screeninfo.xres;
+       }
+       close(fd);
+       return;
+}
+#endif
+/******************************************************************************
+ * RenderLine
+ ******************************************************************************/
+
+void RenderLine( int xa, int ya, int xb, int yb, unsigned char col )
+{
+       int dx;
+       int     dy;
+       int     x;
+       int     y;
+       int     End;
+       int     step;
+       unsigned char pix[4]={bl[col],gn[col],rd[col],tr[col]};
+
+       dx = abs (xa - xb);
+       dy = abs (ya - yb);
+       
+       if ( dx > dy )
+       {
+               int     p = 2 * dy - dx;
+               int     twoDy = 2 * dy;
+               int     twoDyDx = 2 * (dy-dx);
+
+               if ( xa > xb )
+               {
+                       x = xb;
+                       y = yb;
+                       End = xa;
+                       step = ya < yb ? -1 : 1;
+               }
+               else
+               {
+                       x = xa;
+                       y = ya;
+                       End = xb;
+                       step = yb < ya ? -1 : 1;
+               }
+
+               memcpy(lbb + (startx+x)*4 + fix_screeninfo.line_length*(y+starty), pix, sizeof(pix));
+
+               while( x < End )
+               {
+                       x++;
+                       if ( p < 0 )
+                               p += twoDy;
+                       else
+                       {
+                               y += step;
+                               p += twoDyDx;
+                       }
+                       memcpy(lbb + (startx+x)*4 + fix_screeninfo.line_length*(y+starty), pix, sizeof(pix));
+               }
+       }
+       else
+       {
+               int     p = 2 * dx - dy;
+               int     twoDx = 2 * dx;
+               int     twoDxDy = 2 * (dx-dy);
+
+               if ( ya > yb )
+               {
+                       x = xb;
+                       y = yb;
+                       End = ya;
+                       step = xa < xb ? -1 : 1;
+               }
+               else
+               {
+                       x = xa;
+                       y = ya;
+                       End = yb;
+                       step = xb < xa ? -1 : 1;
+               }
+
+               memcpy(lbb + (startx+x)*4 + fix_screeninfo.line_length*(y+starty), pix, sizeof(pix));
+
+               while( y < End )
+               {
+                       y++;
+                       if ( p < 0 )
+                               p += twoDx;
+                       else
+                       {
+                               x += step;
+                               p += twoDxDy;
+                       }
+                       memcpy(lbb + (startx+x)*4 + fix_screeninfo.line_length*(y+starty), pix, sizeof(pix));
+               }
+       }
+}
+
+
diff --git a/gfx.h b/gfx.h
new file mode 100644 (file)
index 0000000..64ada4b
--- /dev/null
+++ b/gfx.h
@@ -0,0 +1,11 @@
+#ifndef __GFX_H__
+
+#define __GFX_H__
+
+void Center_Screen(int wx, int wy, int *csx, int *csy);
+void RenderBox(int sx, int sy, int ex, int ey, int mode, int color);
+//void PaintIcon(char *filename, int x, int y, unsigned char offset);
+void RenderLine( int xa, int ya, int xb, int yb, unsigned char farbe );
+void RenderCircle(int sx, int sy, int col);
+
+#endif
diff --git a/gif.c b/gif.c
new file mode 100644 (file)
index 0000000..a93da78
--- /dev/null
+++ b/gif.c
@@ -0,0 +1,178 @@
+/*
+ * $Id: gif.c,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $
+ *
+ * tuxwetter - d-box2 linux project
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <jpeglib.h>
+#include <setjmp.h>
+#include <gif_lib.h>
+#include <signal.h>
+
+#define FH_ERROR_OK 0
+#define FH_ERROR_FILE 1                /* read/access error */
+#define FH_ERROR_FORMAT 2      /* file format error */
+#define FH_ERROR_MALLOC 3      /* error during malloc */
+#define min(a,b) ((a) < (b) ? (a) : (b))
+#define gflush return(FH_ERROR_FILE);
+#define grflush { DGifCloseFile(gft); return(FH_ERROR_FORMAT); }
+#define mgrflush { free(lb); free(slb); DGifCloseFile(gft); return(FH_ERROR_FORMAT); }
+#define agflush return(FH_ERROR_FORMAT);
+#define agrflush { DGifCloseFile(gft); return(FH_ERROR_FORMAT); }
+
+int fh_gif_id(const char *name)
+{
+       int fd;
+       char id[4];
+       fd=open(name,O_RDONLY); if(fd==-1) return(0);
+       read(fd,id,4);
+       close(fd);
+       if(id[0]=='G' && id[1]=='I' && id[2]=='F') return(1);
+       return(0);
+}
+
+inline void m_rend_gif_decodecolormap(unsigned char *cmb,unsigned char *rgbb,ColorMapObject *cm,int s,int l)
+{
+       GifColorType *cmentry;
+       int i;
+       for(i=0;i<l;i++)
+       {
+               cmentry=&cm->Colors[cmb[i]];
+               *(rgbb++)=cmentry->Red;
+               *(rgbb++)=cmentry->Green;
+               *(rgbb++)=cmentry->Blue;
+       }
+}
+int fh_gif_load(const char *name,unsigned char *buffer,int x,int y)
+{
+       int px,py,i,ibxs;
+       int j;
+       unsigned char *fbptr;
+       unsigned char *lb;
+       unsigned char *slb;
+       GifFileType *gft;
+       GifByteType *extension;
+       int extcode;
+       GifRecordType rt;
+       ColorMapObject *cmap;
+       int cmaps;
+
+       gft=DGifOpenFileName(name);
+       if(gft==NULL) gflush;
+       do
+       {
+               if(DGifGetRecordType(gft,&rt) == GIF_ERROR) grflush;
+               switch(rt)
+               {
+                       case IMAGE_DESC_RECORD_TYPE:
+
+                               if(DGifGetImageDesc(gft)==GIF_ERROR) grflush;
+                               px=gft->Image.Width;
+                               py=gft->Image.Height;
+                               lb=(unsigned char*)malloc(px*3);
+                               slb=(unsigned char*) malloc(px);
+                               if(lb!=NULL && slb!=NULL)
+                               {
+                                       cmap=(gft->Image.ColorMap ? gft->Image.ColorMap : gft->SColorMap);
+                                       cmaps=cmap->ColorCount;
+
+                                       ibxs=ibxs*3;
+                                       fbptr=buffer;
+                                       if(!(gft->Image.Interlace))
+                                       {
+                                               for(i=0;i<py;i++,fbptr+=px*3)
+                                               {
+                                                       if(DGifGetLine(gft,slb,px)==GIF_ERROR)  mgrflush;
+                                                       m_rend_gif_decodecolormap(slb,lb,cmap,cmaps,px);
+                                                       memcpy(fbptr,lb,px*3);
+                                               }
+                                       }
+                                       else
+                                       {
+                                               for(j=0;j<4;j++)
+                                               {
+                                                       fbptr=buffer;
+                                                       for(i=0;i<py;i++,fbptr+=px*3)
+                                                       {
+                                                               if(DGifGetLine(gft,slb,px)==GIF_ERROR)  mgrflush;
+                                                               m_rend_gif_decodecolormap(slb,lb,cmap,cmaps,px);
+                                                               memcpy(fbptr,lb,px*3);
+                                                       }
+                                               }
+                                       }
+                               }
+                               if(lb) free(lb);
+                               if(slb) free(slb);
+                               break;
+                       case EXTENSION_RECORD_TYPE:
+                               if(DGifGetExtension(gft,&extcode,&extension)==GIF_ERROR)        grflush;
+                               while(extension!=NULL)
+                                       if(DGifGetExtensionNext(gft,&extension)==GIF_ERROR) grflush;
+                               break;
+                       default:
+                               break;
+               }  
+       }
+       while( rt!= TERMINATE_RECORD_TYPE );
+       DGifCloseFile(gft);
+       return(FH_ERROR_OK);
+}
+int fh_gif_getsize(const char *name,int *x,int *y, int wanted_width, int wanted_height)
+{
+       int px,py;
+       GifFileType *gft;
+       GifByteType *extension;
+       int extcode;
+       GifRecordType rt;
+
+       gft=DGifOpenFileName(name);
+       if(gft==NULL) gflush;
+       do
+       {
+               if(DGifGetRecordType(gft,&rt) == GIF_ERROR) grflush;
+               switch(rt)
+               {
+                       case IMAGE_DESC_RECORD_TYPE:
+
+                               if(DGifGetImageDesc(gft)==GIF_ERROR) grflush;
+                               px=gft->Image.Width;
+                               py=gft->Image.Height;
+                               *x=px; *y=py;
+                               DGifCloseFile(gft);
+                               return(FH_ERROR_OK);
+                               break;
+                       case EXTENSION_RECORD_TYPE:
+                               if(DGifGetExtension(gft,&extcode,&extension)==GIF_ERROR)        grflush;
+                               while(extension!=NULL)
+                                       if(DGifGetExtensionNext(gft,&extension)==GIF_ERROR) grflush;
+                               break;
+                       default:
+                               break;
+               }  
+       }
+       while( rt!= TERMINATE_RECORD_TYPE );
+       DGifCloseFile(gft);
+       return(FH_ERROR_FORMAT);
+}
diff --git a/gif.h b/gif.h
new file mode 100644 (file)
index 0000000..ff9bf02
--- /dev/null
+++ b/gif.h
@@ -0,0 +1,29 @@
+/*
+ * $Id: gif.h,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $
+ *
+ * tuxwetter - d-box2 linux project
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+#ifndef __GIF_H__
+#define __GIF_H__
+
+int fh_gif_id(const char *name);
+int fh_gif_load(const char *name,unsigned char *buffer,int x,int y);
+int fh_gif_getsize(const char *name,int *x,int *y, int wanted_width, int wanted_height);
+
+#endif
diff --git a/gifdecomp.c b/gifdecomp.c
new file mode 100644 (file)
index 0000000..4e81e18
--- /dev/null
@@ -0,0 +1,316 @@
+/*
+ * $Id: gifdecomp.c,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $
+ *
+ * tuxwetter - d-box2 linux project
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+#define HAVE_VARARGS_H
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <string.h>
+#include "gif_lib.h"
+#include "gifdecomp.h"
+
+#define PROGRAM_NAME   "GifDecomp"
+#define GIF_ASM_NAME   "Tuxwetter"
+#define COMMENT_GIF_ASM    "New-Tuxwetter-Team"
+#define SQR(x)     ((x) * (x))
+
+static int
+   ImageNum = 0,
+    InterlacedFlag = FALSE,
+    InterlacedOffset[] = { 0, 4, 2, 1 }, /* The way Interlaced image should. */
+    InterlacedJumps[] = { 8, 8, 4, 2 };    /* be read - offsets and jumps... */
+
+int LoadImage(GifFileType *GifFile, GifRowType **ImageBuffer);
+int DumpImage(GifFileType *GifFile, GifRowType *ImageBuffer);
+
+
+void xremove(char *fname);
+
+/******************************************************************************
+* Perform the disassembly operation - take one input files into few output.   *
+******************************************************************************/
+int gifdecomp(char *InFileName, char *OutFileName)
+{
+int i;
+
+    GifRowType *ImageBuffer;
+    char TempGifName[80];
+    sprintf (TempGifName,"/tmp/tempgif.gif");
+    int        ExtCode, CodeSize, FileNum = 0, FileEmpty;
+    GifRecordType RecordType;
+    char CrntFileName[80];
+    char tempout[80];
+    GifByteType *Extension, *CodeBlock;
+    GifFileType *GifFileIn = NULL, *GifFileOut = NULL;
+    for(i=0; i<32; i++)
+    {
+       sprintf(tempout,"%s%02d.gif",OutFileName,i);
+       xremove(tempout);
+    }
+    xremove(TempGifName);
+    /* Open input file: */
+    if (InFileName != NULL) 
+    {  
+       if ((GifFileIn = DGifOpenFileName(InFileName)) == NULL)
+               QuitGifError(GifFileIn, GifFileOut);
+    }
+    if ((GifFileIn = DGifOpenFileName(InFileName)) != NULL)
+    {
+               if ((GifFileOut = EGifOpenFileName(TempGifName, TRUE)) == NULL)
+               QuitGifError(GifFileIn, GifFileOut);
+   
+    
+               if (EGifPutScreenDesc(GifFileOut,
+               GifFileIn->SWidth, GifFileIn->SHeight,
+               GifFileIn->SColorResolution, GifFileIn->SBackGroundColor,
+               GifFileIn->SColorMap) == GIF_ERROR)
+               QuitGifError(GifFileIn, GifFileOut);
+
+               /* Scan the content of the GIF file and load the image(s) in: */
+               do {
+               if (DGifGetRecordType(GifFileIn, &RecordType) == GIF_ERROR)
+               QuitGifError(GifFileIn, GifFileOut);
+
+               switch (RecordType) {
+               case IMAGE_DESC_RECORD_TYPE:
+                       if (DGifGetImageDesc(GifFileIn) == GIF_ERROR)
+                           QuitGifError(GifFileIn, GifFileOut);
+
+                       /* Put the image descriptor to out file: */
+                       if (EGifPutImageDesc(GifFileOut,
+                           GifFileIn->Image.Left, GifFileIn->Image.Top,
+                           GifFileIn->Image.Width, GifFileIn->Image.Height,
+                           InterlacedFlag,
+                           GifFileIn->Image.ColorMap) == GIF_ERROR)
+                           QuitGifError(GifFileIn, GifFileOut);
+
+                       /* Load the image (either Interlaced or not), and dump it as */
+                       /* defined in GifFileOut->Image.Interlaced.                  */
+                       if (LoadImage(GifFileIn, &ImageBuffer) == GIF_ERROR)
+                           QuitGifError(GifFileIn, GifFileOut);
+                       if (DumpImage(GifFileOut, ImageBuffer) == GIF_ERROR)
+                           QuitGifError(GifFileIn, GifFileOut);
+                       break;
+                   case EXTENSION_RECORD_TYPE:
+                       /* Skip any extension blocks in file: */
+                       if (DGifGetExtension(GifFileIn, &ExtCode, &Extension) == GIF_ERROR)
+                           QuitGifError(GifFileIn, GifFileOut);
+                       if (EGifPutExtension(GifFileOut, ExtCode, Extension[0],
+                                                       Extension) == GIF_ERROR)
+                           QuitGifError(GifFileIn, GifFileOut);
+
+                       /* No support to more than one extension blocks, so discard: */
+                       while (Extension != NULL) {
+                           if (DGifGetExtensionNext(GifFileIn, &Extension) == GIF_ERROR)
+                               QuitGifError(GifFileIn, GifFileOut);
+                       }
+                       break;
+                   case TERMINATE_RECORD_TYPE:
+                       break;
+                   default:                /* Should be traps by DGifGetRecordType. */
+                       break;
+               }
+        }
+         while (RecordType != TERMINATE_RECORD_TYPE);
+
+         if (DGifCloseFile(GifFileIn) == GIF_ERROR)
+               QuitGifError(GifFileIn, GifFileOut);
+         if (EGifCloseFile(GifFileOut) == GIF_ERROR)
+               QuitGifError(GifFileIn, GifFileOut);
+               
+       if ((GifFileIn = DGifOpenFileName(TempGifName)) == NULL)
+       QuitGifError(GifFileIn, GifFileOut);
+
+    
+                /* Scan the content of GIF file and dump image(s) to seperate file(s): */
+               do {
+               sprintf(CrntFileName, "%s%02d.gif", OutFileName, FileNum++);
+               if ((GifFileOut = EGifOpenFileName(CrntFileName, TRUE)) == NULL)
+                   QuitGifError(GifFileIn, GifFileOut);
+               FileEmpty = TRUE;
+
+               /* And dump out its exactly same screen information: */
+               if (EGifPutScreenDesc(GifFileOut,
+                   GifFileIn->SWidth, GifFileIn->SHeight,
+                   GifFileIn->SColorResolution, GifFileIn->SBackGroundColor,
+                   GifFileIn->SColorMap) == GIF_ERROR)
+                   QuitGifError(GifFileIn, GifFileOut);
+
+               do {
+                       if (DGifGetRecordType(GifFileIn, &RecordType) == GIF_ERROR)
+                           QuitGifError(GifFileIn, GifFileOut);
+
+                       switch (RecordType) {
+                       case IMAGE_DESC_RECORD_TYPE:
+                       FileEmpty = FALSE;
+                       if (DGifGetImageDesc(GifFileIn) == GIF_ERROR)
+                           QuitGifError(GifFileIn, GifFileOut);
+                          /* Put same image descriptor to out file: */
+                       if (EGifPutImageDesc(GifFileOut,
+                           GifFileIn->Image.Left, GifFileIn->Image.Top,
+                           GifFileIn->Image.Width, GifFileIn->Image.Height,
+                           GifFileIn->Image.Interlace,
+                           GifFileIn->Image.ColorMap) == GIF_ERROR)
+                           QuitGifError(GifFileIn, GifFileOut);
+
+                           /* Now read image itself in decoded form as we dont      */
+                           /* really care what is there, and this is much faster.   */
+                       if (DGifGetCode(GifFileIn, &CodeSize, &CodeBlock) == GIF_ERROR
+                          || EGifPutCode(GifFileOut, CodeSize, CodeBlock) == GIF_ERROR)
+                          QuitGifError(GifFileIn, GifFileOut);
+                       while (CodeBlock != NULL)
+                               if (DGifGetCodeNext(GifFileIn, &CodeBlock) == GIF_ERROR ||
+                                   EGifPutCodeNext(GifFileOut, CodeBlock) == GIF_ERROR)
+                                   QuitGifError(GifFileIn, GifFileOut);
+                       break;
+                       case EXTENSION_RECORD_TYPE:
+                               FileEmpty = FALSE;
+                               /* Skip any extension blocks in file: */
+                               if (DGifGetExtension(GifFileIn, &ExtCode, &Extension)
+                                   == GIF_ERROR)
+                                   QuitGifError(GifFileIn, GifFileOut);
+                               if (EGifPutExtension(GifFileOut, ExtCode, Extension[0],
+                                                       Extension) == GIF_ERROR)
+                                   QuitGifError(GifFileIn, GifFileOut);
+
+                               /* No support to more than one extension blocks, discard.*/
+                               while (Extension != NULL)
+                               if (DGifGetExtensionNext(GifFileIn, &Extension)
+                                == GIF_ERROR)
+                                QuitGifError(GifFileIn, GifFileOut);
+                               break;
+                       case TERMINATE_RECORD_TYPE:
+                       break;
+                       default:            /* Should be traps by DGifGetRecordType. */
+                       break;
+               }
+               }
+               while (RecordType != IMAGE_DESC_RECORD_TYPE &&
+                      RecordType != TERMINATE_RECORD_TYPE);
+
+               if (EGifCloseFile(GifFileOut) == GIF_ERROR)
+                   QuitGifError(GifFileIn, GifFileOut);
+               if (FileEmpty) {
+                 /* Might happen on last file - delete it if so: */
+                   unlink(CrntFileName);
+               }
+        }
+       while (RecordType != TERMINATE_RECORD_TYPE);
+
+       if (DGifCloseFile(GifFileIn) == GIF_ERROR)
+               QuitGifError(GifFileIn, GifFileOut);
+       FileNum=FileNum-1; 
+       }
+return FileNum;
+}
+
+/******************************************************************************
+* Close both input and output file (if open), and exit.                              *
+******************************************************************************/
+void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut)
+{
+    PrintGifError();
+    if (GifFileIn != NULL) DGifCloseFile(GifFileIn);
+    if (GifFileOut != NULL) EGifCloseFile(GifFileOut);
+//    exit(EXIT_FAILURE);
+}
+
+
+int LoadImage(GifFileType *GifFile, GifRowType **ImageBufferPtr)
+{
+    int Size, i, j, Count;
+    GifRowType *ImageBuffer;
+
+    /* Allocate the image as vector of column of rows. We cannt allocate     */
+    /* the all screen at once, as this broken minded CPU can allocate up to  */
+    /* 64k at a time and our image can be bigger than that:                 */
+    if ((ImageBuffer = (GifRowType *)
+       malloc(GifFile->Image.Height * sizeof(GifRowType *))) == NULL)
+           GIF_EXIT("Failed to allocate memory required, aborted.");
+
+    Size = GifFile->Image.Width * sizeof(GifPixelType);/* One row size in bytes.*/
+    for (i = 0; i < GifFile->Image.Height; i++) {
+       /* Allocate the rows: */
+       if ((ImageBuffer[i] = (GifRowType) malloc(Size)) == NULL)
+           GIF_EXIT("Failed to allocate memory required, aborted.");
+    }
+
+    *ImageBufferPtr = ImageBuffer;
+
+    GifQprintf("\n%s: Image %d at (%d, %d) [%dx%d]:     ",
+       PROGRAM_NAME, ++ImageNum, GifFile->Image.Left, GifFile->Image.Top,
+                                GifFile->Image.Width, GifFile->Image.Height);
+    if (GifFile->Image.Interlace) {
+       /* Need to perform 4 passes on the images: */
+       for (Count = i = 0; i < 4; i++)
+           for (j = InterlacedOffset[i]; j < GifFile->Image.Height;
+                                                j += InterlacedJumps[i]) {
+//             GifQprintf("\b\b\b\b%-4d", Count++);
+               if (DGifGetLine(GifFile, ImageBuffer[j], GifFile->Image.Width)
+                   == GIF_ERROR) return GIF_ERROR;
+           }
+    }
+    else {
+       for (i = 0; i < GifFile->Image.Height; i++) {
+//         GifQprintf("\b\b\b\b%-4d", i);
+           if (DGifGetLine(GifFile, ImageBuffer[i], GifFile->Image.Width)
+               == GIF_ERROR) return GIF_ERROR;
+       }
+    }
+
+    return GIF_OK;
+}
+
+/******************************************************************************
+* Routine to dump image out. The given Image buffer should always hold the    *
+* image sequencially. Image will be dumped according to IInterlaced flag in   *
+* GifFile structure. Once dumped, the memory holding the image is freed.      *
+* Return GIF_OK if succesful, GIF_ERROR otherwise.                           *
+******************************************************************************/
+int DumpImage(GifFileType *GifFile, GifRowType *ImageBuffer)
+{
+    int i, j, Count;
+
+    if (GifFile->Image.Interlace) {
+       /* Need to perform 4 passes on the images: */
+       for (Count = GifFile->Image.Height, i = 0; i < 4; i++)
+           for (j = InterlacedOffset[i]; j < GifFile->Image.Height;
+                                                j += InterlacedJumps[i]) {
+//             GifQprintf("\b\b\b\b%-4d", Count--);
+               if (EGifPutLine(GifFile, ImageBuffer[j], GifFile->Image.Width)
+                   == GIF_ERROR) return GIF_ERROR;
+           }
+    }
+    else {
+       for (Count = GifFile->Image.Height, i = 0; i < GifFile->Image.Height; i++) {
+//         GifQprintf("\b\b\b\b%-4d", Count--);
+           if (EGifPutLine(GifFile, ImageBuffer[i], GifFile->Image.Width)
+               == GIF_ERROR) return GIF_ERROR;
+       }
+    }
+
+    /* Free the m emory used for this image: */
+    for (i = 0; i < GifFile->Image.Height; i++) free((char *) ImageBuffer[i]);
+    free((char *) ImageBuffer);
+
+    return GIF_OK;
+}
diff --git a/gifdecomp.h b/gifdecomp.h
new file mode 100644 (file)
index 0000000..edc4262
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * $Id: gifdecomp.h,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $
+ *
+ * tuxwetter - d-box2 linux project
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+#include "gif_lib.h"
+
+#ifndef __GIFDECOMP_H__
+
+#define __GIFDECOMP_H__
+
+int gifdecomp(char *InFileName, char *OutFileName);
+void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut);
+
+#endif
diff --git a/globals.h b/globals.h
new file mode 100644 (file)
index 0000000..6e18b35
--- /dev/null
+++ b/globals.h
@@ -0,0 +1,138 @@
+#ifndef __GLOBALS_H__
+#define __GLOBALS_H__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <getopt.h>
+#include <netdb.h>
+#include <paths.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <time.h>
+#include <string.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <ft2build.h>
+#include <sys/ioctl.h>
+#include <linux/fb.h>
+#ifndef HAVE_DREAMBOX_HARDWARE
+#include <linux/input.h>
+#endif
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/un.h>
+#include <sys/param.h>
+#include <sys/mman.h>
+#include FT_FREETYPE_H
+#include FT_CACHE_H
+#include FT_CACHE_SMALL_BITMAPS_H
+#include "text.h"
+#include "io.h"
+#include "gfx.h"
+
+#define P_VERSION              "1.36"
+#define MAX_ENTRYS             32
+#define CK_INTERVALL   30
+#define STATFILE "/var/etc/logcsd.stat"
+#define SCKFILE "/tmp/logcsd.socket"
+#define PIDFILE "/tmp/logcsd.pid"
+#define ECMFILE "/tmp/ecm.info"
+
+#define        RC_0            0x00
+#define        RC_1            0x01
+#define        RC_2            0x02
+#define        RC_3            0x03
+#define        RC_4            0x04
+#define        RC_5            0x05
+#define        RC_6            0x06
+#define        RC_7            0x07
+#define        RC_8            0x08
+#define        RC_9            0x09
+#define        RC_RIGHT        0x0A
+#define        RC_LEFT         0x0B
+#define        RC_UP           0x0C
+#define        RC_DOWN         0x0D
+#define        RC_OK           0x0E
+#define        RC_MUTE         0x0F
+#define        RC_STANDBY      0x10
+#define        RC_GREEN        0x11
+#define        RC_YELLOW       0x12
+#define        RC_RED          0x13
+#define        RC_BLUE         0x14
+#define        RC_PLUS         0x15
+#define        RC_MINUS        0x16
+#define        RC_HELP         0x17
+#define        RC_DBOX         0x18
+#define        RC_HOME         0x1F
+
+FILE *fd_pid;
+int pid;
+
+typedef struct {unsigned char  used;
+                               unsigned char   user[32];
+                               unsigned char   pwd[32];
+                               unsigned char   ip[16];
+                               int                             newip;
+                               int                             connection;
+                               int                             cmd;
+                               char                    prov[12];
+                               char                    serv[5];
+                               int                             cok;
+                               int                             active;
+                               time_t                  ltime;
+                               time_t                  atime;
+                               time_t                  stime;
+                               time_t                  ctime;
+                               double                  rtime;
+                               } ENTRY, *PENTRY;
+
+typedef struct {ENTRY                  entrys[MAX_ENTRYS];
+                               } LOG;                                  
+
+extern unsigned char FONT[64];
+extern char camdversion[16];
+extern char dversion[16];
+
+enum {LEFT, CENTER, RIGHT};
+enum {SMALL, MED, BIG};
+
+FT_Error               error;
+FT_Library             library;
+FTC_Manager            manager;
+FTC_SBitCache          cache;
+FTC_SBit               sbit;
+#if FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 0
+FTC_Image_Desc         desc;
+#else
+FTC_ImageTypeRec       desc;
+#endif
+FT_Face                        face;
+FT_UInt                        prev_glyphindex;
+FT_Bool                        use_kerning;
+
+//devs
+
+int fb, rc;
+
+//framebuffer stuff
+
+enum {FILL, GRID};
+enum {EMPTY, CMCST, CMCS, CMCT, CMC, CMCIT, CMCI, CMHT, CMH, WHITE, BLUE0, TRANSP, BLUE2, ORANGE, GREEN, YELLOW, RED};
+
+extern unsigned char *lfb, *lbb;
+extern unsigned char *proxyadress, *proxyuserpwd;
+
+struct fb_fix_screeninfo fix_screeninfo;
+struct fb_var_screeninfo var_screeninfo;
+
+//int startx, starty, sx, ex, sy, ey;
+
+#define FB_DEVICE      "/dev/fb/0"
+
+#define MAXSLOTS               4
+
+#endif
diff --git a/http.c b/http.c
new file mode 100644 (file)
index 0000000..32197fc
--- /dev/null
+++ b/http.c
@@ -0,0 +1,169 @@
+/*
+ * http.c - TuxBox Weather Plugin / HTTP-Interface
+ *
+ * Copyright (C) 2004 SnowHead <SnowHead@keywelt-board.com>
+ *                    Worschter
+ *
+ * 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.
+ *
+ * $Id: http.c,v 1.01 2004/09/30 00:29 SnowHead $
+ */
+
+#include <curl/curl.h>
+//#include <curl/types.h> /* new for v7 */
+#include <curl/easy.h> /* new for v7 */
+#include <ctype.h>
+//#include "lcd.h"
+#include "tuxwetter.h"
+
+
+double spdsize[3]={100000.0,16000.0,8000.0};
+int speed=0;
+
+int show_progress( void *clientp, double dltotal, double dlnow, double ultotal, double ulnow )
+{
+#if 0
+       char prstr[50];
+       
+       if(dltotal<spdsize[speed])
+       {
+               return 0;
+       }
+       
+       LCD_draw_rectangle (7,7,111,17, LCD_PIXEL_ON,LCD_PIXEL_OFF);
+       LCD_draw_fill_rect (7,7,(int)((dlnow/dltotal)*111.0),17,LCD_PIXEL_ON);
+       sprintf(prstr,"%d%%",(int)(dlnow*100.0/dltotal));
+       LCD_draw_Istring(45, 9, prstr);
+       LCD_update();
+#endif
+       return 0;
+}
+
+int HTTP_downloadFile(char *URL, char *downloadTarget, int showprogress, int tmo, int ctimo, int repeats)
+{
+       CURL *curl;
+       CURLcode res=-1;
+       char *pt1,*pt2,*pt3=NULL,*tstr=NULL,*surl=URL,myself[25];
+       FILE *headerfile,*netfile;
+       int i=strlen(URL),y;
+
+       for(y=0; y<4; y++) // change HTTP to lower case
+               URL[y]=tolower(URL[y]);
+
+       while(i)
+       {
+               if(URL[i] <= ' ')
+               {
+                       URL[i]=0;
+               }
+               --i;
+       }
+       headerfile = fopen(downloadTarget, "w");
+       if (!headerfile)
+               return res;
+       curl = curl_easy_init();
+       if(curl)
+       {
+               pt1=strstr(URL,"localhost");
+               if(!pt1)
+               {
+                       pt1=strstr(URL,"127.0.0.1");
+               }
+               if(pt1)
+               {
+                       if((pt2=strchr(pt1,'/'))!=NULL)
+                       {
+                               if((tstr=malloc(strlen(URL)+20))!=NULL)
+                               {
+                                       if((netfile=fopen("/etc/network/interfaces","r"))!=NULL)
+                                       {
+                                               i=0;
+                                               while(fgets(tstr, strlen(URL), netfile) && !i)
+                                               {
+                                                       if((pt3=strstr(tstr,"address"))!=NULL)
+                                                       {
+                                                               strcpy(myself,pt3+8);
+                                                               myself[strlen(myself)-1]=0;
+                                                               i=1;
+                                                       }
+                                               }
+                                               if(pt3 && i)
+                                               {
+                                                       *pt1=0;
+                                                       sprintf(tstr,"%s%s%s",URL,myself,pt2);
+                                                       surl=tstr;
+                                               }
+                                               fclose(netfile);
+                                       }
+                               }
+                       }
+               }
+               speed=tmo;
+               while(res && repeats--)
+               {
+                       curl_easy_setopt(curl, CURLOPT_URL, surl);
+                       curl_easy_setopt(curl, CURLOPT_FILE, headerfile);
+                       curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, show_progress);
+                       curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, show_progress);
+                       curl_easy_setopt(curl, CURLOPT_NOPROGRESS, (showprogress)?0:1);
+//                     curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
+                       curl_easy_setopt(curl, CURLOPT_USERAGENT, "neutrino/httpdownloader");
+                       curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, (ctimo)?ctimo:(30+tmo*45));
+                       curl_easy_setopt(curl, CURLOPT_TIMEOUT, (tmo+1)*60);
+                       curl_easy_setopt(curl, CURLOPT_FAILONERROR, 0);
+                       if(proxyadress && strstr(URL,"//127.0.0.1/")==NULL && strstr(URL,"//localhost/")==NULL)
+                       {
+                               curl_easy_setopt(curl, CURLOPT_PROXY, proxyadress);
+                               curl_easy_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
+                       }
+                       else
+                       {
+                               curl_easy_setopt(curl, CURLOPT_PROXY, 0);
+                       }
+                       if(proxyuserpwd && strstr(URL,"//127.0.0.1/")==NULL && strstr(URL,"//localhost/")==NULL)
+                       {
+                               curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, proxyuserpwd);
+                       }
+
+                       res = curl_easy_perform(curl);
+                       if(res==CURLE_PARTIAL_FILE)
+                       {
+                               res=CURLE_OK;
+                       }
+               }
+               curl_easy_cleanup(curl);
+       }
+       if(tstr)
+       {
+               free(tstr);
+       }
+       if (headerfile)
+       {
+               fflush(headerfile);
+               fclose(headerfile);
+       }
+       if(res)
+       {
+               remove(downloadTarget);
+       }
+#if 0
+       if(showprogress)
+       {
+               LCD_draw_fill_rect (6,6,112,18,LCD_PIXEL_OFF);
+               LCD_update();
+       }
+#endif
+       return res;
+}
diff --git a/http.h b/http.h
new file mode 100644 (file)
index 0000000..b66a486
--- /dev/null
+++ b/http.h
@@ -0,0 +1,6 @@
+#ifndef __HTTP_H__
+#define __HTTP_H__
+
+int HTTP_downloadFile(char *URL, char *downloadTarget, int showprogress, int tmo, int ctmo, int repeats);
+
+#endif
diff --git a/io.c b/io.c
new file mode 100644 (file)
index 0000000..e9ac70f
--- /dev/null
+++ b/io.c
@@ -0,0 +1,77 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <errno.h>
+#include <locale.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <time.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <linux/fb.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <sys/dir.h>
+#include <sys/stat.h>
+#include <linux/input.h>
+
+#include "io.h"
+#include "tuxwetter.h"
+#define RC_DEVICE      "/dev/input/nevis_ir"
+
+extern int instance;
+struct input_event ev;
+static unsigned short rccode=-1;
+static int rc;
+
+int InitRC(void)
+{
+       rc = open(RC_DEVICE, O_RDONLY);
+       if(rc == -1)
+       {
+               perror("msgbox <open remote control>");
+               exit(1);
+       }
+       fcntl(rc, F_SETFL, O_NONBLOCK | O_SYNC);
+       while(RCKeyPressed());
+       return 1;
+}
+
+int CloseRC(void)
+{
+       while(RCKeyPressed());
+       close(rc);
+       return 1;
+}
+
+int RCKeyPressed(void)
+{
+       if(read(rc, &ev, sizeof(ev)) == sizeof(ev))
+       {
+               if(ev.value)
+               {
+                       rccode=ev.code;
+                       return 1;
+               }
+       }
+       rccode = -1;
+       return 0;
+}
+
+
+int GetRCCode(void)
+{
+       int rv;
+       
+       if(!RCKeyPressed() || (get_instance()>instance))
+       {
+               return -1;
+       }
+       rv=rccode;
+       while(RCKeyPressed());
+       
+       return rv;
+}
+
+
diff --git a/io.h b/io.h
new file mode 100644 (file)
index 0000000..1619ae7
--- /dev/null
+++ b/io.h
@@ -0,0 +1,12 @@
+#ifndef __IO_H__
+
+#define __IO_H__
+
+#define RC_DEVICE      "/dev/input/nevis_ir"
+
+int InitRC(void);
+int CloseRC(void);
+int RCKeyPressed(void);
+int GetRCCode(void);
+
+#endif
diff --git a/jpeg.c b/jpeg.c
new file mode 100644 (file)
index 0000000..8d32e75
--- /dev/null
+++ b/jpeg.c
@@ -0,0 +1,184 @@
+/*
+ * $Id: jpeg.c,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $
+ *
+ * tuxwetter - d-box2 linux project
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <jpeglib.h>
+#include <setjmp.h>
+#include <string.h>
+#include <stdlib.h>
+
+#define FH_ERROR_OK 0
+#define FH_ERROR_FILE 1                /* read/access error */
+#define FH_ERROR_FORMAT 2      /* file format error */
+#define FH_ERROR_MALLOC 3      /* error during malloc */
+
+struct r_jpeg_error_mgr
+{
+       struct jpeg_error_mgr pub;
+       jmp_buf envbuffer;
+};
+
+
+int fh_jpeg_id(const char *name)
+{
+//     dbout("fh_jpeg_id {\n");
+       int fd;
+       unsigned char id[10];
+       fd=open(name,O_RDONLY); if(fd==-1) return(0);
+       read(fd,id,10);
+       close(fd);
+//      dbout("fh_jpeg_id }\n");
+       if(id[6]=='J' && id[7]=='F' && id[8]=='I' && id[9]=='F')        return(1);
+       if(id[0]==0xff && id[1]==0xd8 && id[2]==0xff) return(1);
+       return(0);
+}
+
+
+void jpeg_cb_error_exit(j_common_ptr cinfo)
+{
+//     dbout("jpeg_cd_error_exit {\n");
+       struct r_jpeg_error_mgr *mptr;
+       mptr=(struct r_jpeg_error_mgr*) cinfo->err;
+       (*cinfo->err->output_message) (cinfo);
+       longjmp(mptr->envbuffer,1);
+//      dbout("jpeg_cd_error_exit }\n");
+}
+
+int fh_jpeg_load(const char *filename,unsigned char *buffer,int x,int y)
+{
+//     dbout("fh_jpeg_load (%d/%d) {\n",x,y);
+       struct jpeg_decompress_struct cinfo;
+       struct jpeg_decompress_struct *ciptr;
+       struct r_jpeg_error_mgr emgr;
+       unsigned char *bp;
+       int px,py,c;
+       FILE *fh;
+       JSAMPLE *lb;
+
+       ciptr=&cinfo;
+       if(!(fh=fopen(filename,"rb"))) return(FH_ERROR_FILE);
+       ciptr->err=jpeg_std_error(&emgr.pub);
+       emgr.pub.error_exit=jpeg_cb_error_exit;
+       if(setjmp(emgr.envbuffer)==1)
+       {
+               // FATAL ERROR - Free the object and return...
+               jpeg_destroy_decompress(ciptr);
+               fclose(fh);
+//     dbout("fh_jpeg_load } - FATAL ERROR\n");
+               return(FH_ERROR_FORMAT);
+       }
+
+       jpeg_create_decompress(ciptr);
+       jpeg_stdio_src(ciptr,fh);
+       jpeg_read_header(ciptr,TRUE);
+       ciptr->out_color_space=JCS_RGB;
+       if(x==(int)ciptr->image_width)
+               ciptr->scale_denom=1;
+       else if(abs(x*2 - ciptr->image_width) < 2)
+               ciptr->scale_denom=2;
+       else if(abs(x*4 - ciptr->image_width) < 4)
+               ciptr->scale_denom=4;
+       else if(abs(x*8 - ciptr->image_width) < 8)
+               ciptr->scale_denom=8;
+       else
+               ciptr->scale_denom=1;
+
+       jpeg_start_decompress(ciptr);
+
+       px=ciptr->output_width; py=ciptr->output_height;
+       c=ciptr->output_components;
+
+
+       if(c==3)
+       {
+               lb=(JSAMPLE*)(*ciptr->mem->alloc_small)((j_common_ptr) ciptr,JPOOL_PERMANENT,c*px);
+               bp=buffer;
+               while(ciptr->output_scanline < ciptr->output_height)
+               {
+                       jpeg_read_scanlines(ciptr, &lb, 1);
+                       memcpy(bp,lb,px*c);
+                       bp+=px*c;
+               }                 
+
+       }
+       jpeg_finish_decompress(ciptr);
+       jpeg_destroy_decompress(ciptr);
+       fclose(fh);
+//      dbout("fh_jpeg_load }\n");
+       return(FH_ERROR_OK);
+}
+
+int fh_jpeg_getsize(const char *filename,int *x,int *y, int wanted_width, int wanted_height)
+{
+//     dbout("fh_jpeg_getsize {\n");
+       struct jpeg_decompress_struct cinfo;
+       struct jpeg_decompress_struct *ciptr;
+       struct r_jpeg_error_mgr emgr;
+
+       int px,py,c;
+       FILE *fh;
+       
+       ciptr=&cinfo;
+       if(!(fh=fopen(filename,"rb"))) return(FH_ERROR_FILE);
+
+       ciptr->err=jpeg_std_error(&emgr.pub);
+       emgr.pub.error_exit=jpeg_cb_error_exit;
+       if(setjmp(emgr.envbuffer)==1)
+       {
+               // FATAL ERROR - Free the object and return...
+               jpeg_destroy_decompress(ciptr);
+               fclose(fh);
+//     dbout("fh_jpeg_getsize } - FATAL ERROR\n");
+               return(FH_ERROR_FORMAT);
+       }
+
+       jpeg_create_decompress(ciptr);
+       jpeg_stdio_src(ciptr,fh);
+       jpeg_read_header(ciptr,TRUE);
+       ciptr->out_color_space=JCS_RGB;
+       // should be more flexible...
+       if((int)ciptr->image_width/8 >= wanted_width ||
+      (int)ciptr->image_height/8 >= wanted_height)
+               ciptr->scale_denom=8;
+       else if((int)ciptr->image_width/4 >= wanted_width ||
+      (int)ciptr->image_height/4 >= wanted_height)
+               ciptr->scale_denom=4;
+       else if((int)ciptr->image_width/2 >= wanted_width ||
+           (int)ciptr->image_height/2 >= wanted_height)
+               ciptr->scale_denom=2;
+       else
+               ciptr->scale_denom=1;
+
+       jpeg_start_decompress(ciptr);
+       px=ciptr->output_width; py=ciptr->output_height;
+       c=ciptr->output_components;
+       *x=px; *y=py;
+//     jpeg_finish_decompress(ciptr);
+       jpeg_destroy_decompress(ciptr);
+       fclose(fh);
+//      dbout("fh_jpeg_getsize }\n");
+       return(FH_ERROR_OK);
+}
+
diff --git a/jpeg.h b/jpeg.h
new file mode 100644 (file)
index 0000000..f207a4c
--- /dev/null
+++ b/jpeg.h
@@ -0,0 +1,28 @@
+/*
+ * $Id: jpeg.h,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $
+ *
+ * tuxwetter - d-box2 linux project
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+#ifndef __JPG_H__
+#define __JPG_H__
+
+int fh_jpeg_load(const char *filename,unsigned char *buffer,int x,int y);
+int fh_jpeg_getsize(const char *filename,int *x,int *y, int wanted_width, int wanted_height);
+
+#endif
diff --git a/parser.c b/parser.c
new file mode 100644 (file)
index 0000000..cb9b938
--- /dev/null
+++ b/parser.c
@@ -0,0 +1,570 @@
+/* 
+*********************************************************************************************
+********************************** New Tuxwetter XML-File_parser ****************************
+*********************************************************************************************
+*/
+//getline needed #define _GNU_SOURCE
+#define _GNU_SOURCE
+#include <ctype.h>
+
+#include <curl/curl.h>
+#include <strings.h>
+#include "tuxwetter.h"
+#include "parser.h"
+#include "http.h"
+
+/*
+Interne Variablen Bitte nicht direkt aufrufen!!!
+*/
+#ifdef WWEATHER
+#      define MAXITEM  200
+#      define MAXMEM   300
+#else
+#      define MAXITEM  1000
+#      define MAXMEM   50
+#endif
+char   data            [MAXITEM][MAXMEM];
+char   conveng         [500][40]; 
+char   convger         [500][40];
+int    prev_count =    0;
+char    null[2]=       {0,0};
+int    ptc=            0;
+int    t_actday=       0;
+int    t_actmonth=     0;
+int    t_actyear=      0;
+const char mnames[12][10]={"Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"};
+char prstrans[512];
+
+//**************************************** Preview Counter ********************************
+
+extern char CONVERT_LIST[];
+extern void TrimString(char *strg);
+
+void prs_check_missing(char *entry)
+{
+char rstr[512];
+int found=0;
+FILE *fh;
+
+       if((fh=fopen(MISS_FILE,"r"))!=NULL)
+       {
+               while(!feof(fh)&&!found)
+               {
+                       if(fgets(rstr,500,fh))
+                       {
+                               TrimString(rstr);
+                               if(!strcmp(rstr,entry))
+                               {
+                                       found=1;
+                               }
+                       }
+               }
+               fclose(fh);
+       }
+       if(!found)
+       {
+               if((fh=fopen(MISS_FILE,"a"))!=NULL)
+               {
+                       fprintf(fh,"%s\n",entry);
+                       fclose(fh);
+               }
+       }
+}
+
+char  *prs_translate(char *trans, char *tfile)
+{
+char *sptr;
+int i,found=0;
+FILE *fh;
+
+       if((fh=fopen(tfile,"r"))!=NULL)
+       {
+               while(!found && fgets(prstrans,511,fh))
+               {
+                       TrimString(prstrans);
+                       if(strstr(prstrans,trans)==prstrans)
+                       {
+                               sptr=prstrans+strlen(trans);
+                               if(*sptr=='|')
+                               {
+                                       ++sptr;
+                                       i=strlen(sptr);
+                                       memmove(prstrans,sptr,i+1);
+                                       found=1;
+                               }
+                       }
+               }
+               fclose(fh);
+       }
+       if(found && strlen(prstrans))
+       {       
+               if(!strcmp(prstrans,"---"))
+               {
+                       *prstrans=0;
+               }
+               return prstrans;
+       }
+       return trans;
+}
+
+int prs_get_prev_count (void)
+{
+       return prev_count;
+}
+
+int prs_get_day (int i, char *out, int metric)
+{
+       int ret=1, set=(PRE_DAY+(i*PRE_STEP)), z=0, intdaynum=0, monthtemp=0;
+       char day[15], tstr[128];
+       char *pt1, *pt2;
+
+       *out=0;
+       if((pt1=strstr(data[set],"T=\""))!=NULL)
+       {
+               pt1+=3;
+               if((pt2=strstr(pt1,"\""))!=NULL)
+               {
+                       strncpy(day,pt1,pt2-pt1);
+                       day[pt2-pt1]=0;
+               
+                       for(z=0;z<=ptc;z++)
+                       {
+                               if (strcasecmp(day,conveng[z])==0) strcpy (day,convger[z]);
+                       }
+                       
+                       pt2++;
+                       if((pt1=strstr(pt2,"DT=\""))!=NULL)
+                       {
+                               pt1+=4;
+                               if((pt2=strstr(pt1," "))!=NULL)
+                               {
+                                       pt2++;
+                                       if(sscanf(pt2,"%d",&intdaynum)==1)
+                                       {
+                                               monthtemp=t_actmonth;
+                                               if (intdaynum < t_actday) 
+                                               {
+                                                       if((++monthtemp)>12)
+                                                       {
+                                                       monthtemp =1;
+                                                       }
+                                               }
+                                               sprintf(tstr,"%s",prs_translate((char*)day,CONVERT_LIST));
+                                               if(metric)
+                                               {
+                                                       sprintf (out,"%s,  %02d. %s", tstr, intdaynum, prs_translate((char*)mnames[monthtemp-1],CONVERT_LIST));
+                                               }
+                                               else
+                                               {
+                                                       sprintf (out,"%s, %s %02d. ", tstr, prs_translate((char*)mnames[monthtemp-1],CONVERT_LIST),intdaynum);
+                                               }
+                                               ret=0;
+                                       }
+                               }
+                       }
+               }
+       }
+return ret;
+}
+
+int prs_get_val (int i, int what, int nacht, char *out)
+{
+int z;
+
+       strcpy(out,data[(what & ~TRANSLATION)+(i*PRE_STEP)+(nacht*NIGHT_STEP)]);
+       if(what & TRANSLATION)
+       {
+               for(z=0;z<=ptc;z++)
+               {
+                       if (strcasecmp(out,conveng[z])==0)
+                       {
+                               strcpy (out,convger[z]);
+                               return 0;
+                       }
+               }
+               if(sscanf(out,"%d",&z)!=1)
+               {
+                       prs_check_missing(out);
+               }
+       }
+       return (strlen(out)==0);
+}
+
+int prs_get_dbl (int i, int what, int nacht, char *out)
+{
+int ret=1;
+double tv;
+       
+       *out=0;
+       if(sscanf(data[(what & ~TRANSLATION)+(i*PRE_STEP)+(nacht*NIGHT_STEP)], "%lf", &tv)==1)
+       {
+               sprintf(out, "%05.2lf", tv);
+               ret=0;
+       }
+       return ret;
+}
+
+int prs_get_time(int i, int what, char *out, int metric)
+{
+int hh,mm,ret=1;
+
+       *out=0;
+       if(sscanf(data[(what & ~TRANSLATION)+(i*PRE_STEP)],"%d:%d",&hh,&mm)==2)
+       {
+               if(metric)
+               {
+                       if(hh<12)
+                       {
+                               if(strstr(data[(what & ~TRANSLATION)+(i*PRE_STEP)],"PM")!=NULL)
+                               {
+                                       hh+=12;
+                               }
+                       }
+                       else
+                       {
+                               if(strstr(data[(what & ~TRANSLATION)+(i*PRE_STEP)],"AM")!=NULL)
+                               {
+                                       hh=0;
+                               }
+                       }
+                       sprintf(out,"%02d:%02d",hh,mm);
+               }
+               else
+               {
+                       sprintf(out,"%02d:%02d %s",hh,mm,(strstr(data[(what & ~TRANSLATION)+(i*PRE_STEP)],"PM")!=NULL)?"PM":"AM");
+               }
+               ret=0;
+       }
+       return ret;
+}
+
+int prs_get_dtime(int i, int what, char *out, int metric)
+{
+int hh,mm,ret=1;
+
+       *out=0;
+       if(sscanf(data[(what & ~TRANSLATION)+(i*PRE_STEP)],"%d/%d/%d %d:%d",&t_actmonth,&t_actday,&t_actyear,&hh,&mm)==5)
+       {
+               if(metric)
+               {
+                       if((hh<12)&&(strstr(data[(what & ~TRANSLATION)+(i*PRE_STEP)],"PM")!=NULL))
+                       {
+                               hh+=12;
+                       }
+                       sprintf(out,"%02d.%02d.%04d %02d:%02d",t_actday,t_actmonth,t_actyear+2000,hh,mm);
+               }
+               else
+               {
+                       sprintf(out,"%04d/%02d/%02d %02d:%02d %s",t_actyear+2000,t_actmonth,t_actday,hh,mm,(strstr(data[(what & ~TRANSLATION)+(i*PRE_STEP)],"PM")!=NULL)?"PM":"AM");
+               }
+               ret=0;
+       }
+       return ret;
+}
+
+int prs_get_dwday(int i, int what, char *out)
+{
+       int ret=1;
+       char *wday[] = {"SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY","???"};
+
+       struct tm ts;
+
+       *out=0;
+
+       if(sscanf(data[(what & ~TRANSLATION)+(i*PRE_STEP)],"%d-%d-%d",&t_actyear,&t_actmonth,&t_actday)==3)
+       {
+               ts.tm_year = t_actyear - 1900;
+               ts.tm_mon  = t_actmonth - 1;
+               ts.tm_mday = t_actday;
+
+               ts.tm_hour = 0;
+               ts.tm_min  = 0;
+               ts.tm_sec  = 1;
+               ts.tm_isdst = -1;
+
+               if ( mktime(&ts) == -1 )
+                       ts.tm_wday = 7;
+
+               sprintf(out,"%s", wday[ts.tm_wday]);
+               ret=0;
+       }
+       return ret;
+}
+
+//**************************************** Parser ****************************************
+
+//*** XML File ***
+
+int parser(char *citycode, char *trans, int metric, int inet, int ctmo)
+{
+       int  rec=0, flag=0;
+       int cc=0, bc=1, exit_ind=-1;
+       char gettemp;
+       FILE *wxfile=NULL;
+       char url[250];
+       char debug[505];
+       
+#ifdef WWEATHER
+       extern char key[];
+       int d_flag=0;   //data flag ">DATA<"
+       int D_flag=0;   //data flag "[DATA]"
+       int l_flag=0;   //do not change to upper case (URL)
+#else
+       int day_data=PRE_DAY;
+       int previews=9;
+       extern char par[], key[];
+#endif
+       memset(data,0,MAXITEM*MAXMEM /* 1000*50 */);
+       memset(conveng,0,500*40); 
+       memset(convger,0,500*40);
+       prev_count=0;
+       memset(null,0,2);
+       ptc=0;
+       t_actday=0;
+       t_actmonth=0;
+
+#ifdef WWEATHER
+/*     sprintf (url,"wget -q -O /tmp/tuxwettr.tmp \"http://free.worldweatheronline.com/feed/weather.ashx?q=%s&format=xml&num_of_days=5&includeLocation=yes&key=%s\"",citycode,key);
+       exit_ind=system(url);
+       sleep(1);
+*/
+       sprintf (url,"http://free.worldweatheronline.com/feed/weather.ashx?q=%s&format=xml&num_of_days=5&includeLocation=yes&key=%s",citycode,key);
+       exit_ind=HTTP_downloadFile(url, "/tmp/tuxwettr.tmp", 0, inet, ctmo, 3);
+
+       if(exit_ind != 0)
+       {
+               printf("Tuxwetter <Download data from server failed. Errorcode: %d>\n",exit_ind);
+               exit_ind=-1;
+               return exit_ind;
+       }
+
+       exit_ind=-1;
+
+       if ((wxfile = fopen("/tmp/tuxwettr.tmp","r"))==NULL)
+       {
+               printf("Tuxwetter <Missing tuxwettr.tmp File>\n");
+               return exit_ind;
+       }
+       else
+       {
+               fgets(debug,50,wxfile);
+               //printf("%s\n",debug);
+               if((debug[45] != 'r')||(debug[46] != 'e')||(debug[47] != 'q'))
+               {
+                       fclose(wxfile);
+                       return exit_ind;
+                }
+               else 
+               {
+                       // starting position forcast
+                       bc = NA; 
+                       strcpy(data[bc],"N/A");
+                       bc++;
+
+                       fseek(wxfile, 0L, SEEK_SET);
+                       while (!feof(wxfile))
+                       {
+                               gettemp=fgetc(wxfile);
+                               if (gettemp == '<' || gettemp == ']') rec = 0;
+                               if (gettemp == ':') l_flag = 1;
+                               if (rec == 1)
+                               {
+                                       if(!l_flag)
+                                               data[bc][cc] = toupper(gettemp);
+                                       else
+                                               data[bc][cc] = gettemp;
+                                       cc++;
+                                       d_flag=1;
+                                       if(cc == MAXMEM-1) rec = 0;
+                               }
+                               if (gettemp == '>' || gettemp == '[') rec = 1;
+                               if (gettemp == '[' && !D_flag)
+                               {
+                                       rec = 0;
+                                       D_flag = 1;
+                               }
+                               if ((gettemp == '<' || gettemp == ']') && d_flag)
+                               {
+                                       data[bc][cc] = '\0';
+                                       bc++;
+                                       cc = 0;
+                                       rec = 0;
+                                       d_flag = 0;
+                                       D_flag = 0;
+                                       l_flag = 0;
+                               }
+                       }
+               }
+       }
+       fclose(wxfile);
+       cc=0;
+
+       exit_ind=1;
+#else
+       sprintf (url,"wget -q -O /tmp/tuxwettr.tmp http://xoap.weather.com/weather/local/%s?unit=%c\\&dayf=%d\\&cc=*\\&prod=xoap\\&link=xoap\\&par=%s\\&key=%s",citycode,(metric)?'m':'u',previews,par,key);
+       exit_ind=system(url);
+
+       sleep(1);
+       if(exit_ind != 0)
+       {
+               printf("Tuxwetter <Download data from server failed. Errorcode: %d>\n",exit_ind);
+               exit_ind=-1;
+               return exit_ind;
+       }
+       exit_ind=-1;
+       system("sed -i /'prmo'/,/'\\/lnks'/d /tmp/tuxwettr.tmp");
+       if ((wxfile = fopen("/tmp/tuxwettr.tmp","r"))==NULL)
+       {
+               printf("Tuxwetter <Missing tuxwettr.tmp File>\n");
+               return exit_ind;
+       }
+       else
+       {
+       bc=1;
+               fgets(debug,500,wxfile);
+//             printf("%s",debug);
+               fgets(debug,5,wxfile);
+//             printf("%s",debug);
+               if((debug[0] != 60)||(debug[1] != 33)||(debug[2] != 45)||(debug[3] != 45))
+               {
+                       fclose(wxfile);
+                       return exit_ind;
+               }
+               else {
+               fclose(wxfile);
+               wxfile = fopen("/tmp/tuxwettr.tmp","r");
+               while (!feof(wxfile))
+               {
+                       gettemp=fgetc(wxfile);
+                       if ((gettemp >=97) && (gettemp <=122)) gettemp = gettemp -32;
+                       if (gettemp == 13) gettemp=0; 
+                       if (bc == day_data)
+                       {
+                               
+                               if (gettemp == 62) 
+                               {
+                                       rec = 0;
+                               }
+                               if (rec == 1)
+                               {
+                                       data[bc][cc] = gettemp;
+                                       cc++;
+                               }
+                               if (gettemp == 60) rec = 1;
+                               if (gettemp == 13) data[bc][cc+1] =0;
+                               if (gettemp == 10) 
+                               {
+                                       bc++;
+                                       cc = 0;
+                               int prs_get_dwday(int i, int what, char *out)
+{
+       int ret=1;
+       char *wday[] = {"SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY","???"};
+
+       struct tm ts;
+
+       *out=0;
+
+       if(sscanf(data[(what & ~TRANSLATION)+(i*PRE_STEP)],"%d-%d-%d",&t_actyear,&t_actmonth,&t_actday)==3)
+       {
+               ts.tm_year = t_actyear - 1900;
+               ts.tm_mon  = t_actmonth - 1;
+               ts.tm_mday = t_actday;
+
+               ts.tm_hour = 0;
+               ts.tm_min  = 0;
+               ts.tm_sec  = 1;
+               ts.tm_isdst = -1;
+
+               if ( mktime(&ts) == -1 )
+                       ts.tm_wday = 7;
+
+               sprintf(out,"%s", wday[ts.tm_wday]);
+               ret=0;
+       }
+       return ret;
+}      rec = 0;
+                                       flag=1;
+                                       prev_count++;
+                               }
+                       }
+                       else
+                       {
+                               if (gettemp == 60) rec = 0;
+                               if (rec == 1)
+                               {
+                                       data[bc][cc] = gettemp;
+                                       cc++;
+                               }
+                               if (gettemp == 62) rec = 1;
+                               if (gettemp == 13) data[bc][cc] =0;
+                               if (gettemp == 10) 
+                               {
+                                       bc++;
+                                       cc = 0;
+                                       rec = 0;
+                               }
+                       }
+                       if ((flag==1) && (gettemp == 0))
+                       {
+                               day_data=day_data+PRE_STEP;
+                               flag=0;
+                       }
+               }
+               }
+               fclose(wxfile);
+       }
+       if (prev_count > 0) prev_count=prev_count-1;
+       if (prev_count > 0) prev_count=prev_count-1;
+       cc=0;
+
+       exit_ind=1;
+#endif
+//*** Übersetzungs File ***
+       
+       if ((wxfile = fopen(trans,"r"))==NULL)
+       {
+               printf("Tuxwetter <File %s not found.>\n",trans);
+               return exit_ind;
+       }
+       else
+       {
+               while (!feof(wxfile))
+               {
+                       gettemp=fgetc(wxfile);
+                       if (gettemp == 10)
+                       {
+                               cc=0;
+                               ptc++;
+                               flag=0;
+                       }
+                       else
+                       {
+                               if (gettemp == 124)
+                               {
+                                       cc=0;
+                                       flag=2;
+                               }
+                               if (gettemp == 13) gettemp = 0;
+                               if (flag==0) 
+                               {
+                                       if ((gettemp >=97) && (gettemp <=122)) gettemp = gettemp -32;
+                                       conveng[ptc][cc]=gettemp;
+                               }
+                               if (flag==1) convger[ptc][cc]=gettemp;
+                               cc++;
+                               if (flag == 2) 
+                               {
+                                       flag--;
+                                       cc=0;
+                               }
+                       }
+               }
+               fclose(wxfile);
+       }
+       prs_get_dtime (0, ACT_UPTIME, debug, metric);
+
+return 0;
+}
+
+
diff --git a/parser.h b/parser.h
new file mode 100644 (file)
index 0000000..64a1753
--- /dev/null
+++ b/parser.h
@@ -0,0 +1,116 @@
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+
+#ifndef __wxparser__
+#define __wxparser__
+
+#define TRANSLATION 0x8000
+
+#ifdef WWEATHER
+#      define NA               0
+#      define PRE_STEP         14
+#      define NIGHT_STEP       13
+
+       // atual Values
+#      define ACT_CITY         2
+#      define ACT_OBST         3
+#      define ACT_LAT          6
+#      define ACT_LON          7
+#      define ACT_UPTIME       10
+#      define ACT_TEMP         11
+#      define ACT_ICON         14
+#      define ACT_COND         15 | TRANSLATION
+#      define ACT_WSPEED       17
+#      define ACT_WINDD        19 | TRANSLATION
+#      define ACT_PRECIPMM     20
+#      define ACT_HMID         21
+#      define ACT_VIS          22
+#      define ACT_PRESS        23
+#      define ACT_CLOUDC       24
+#      define ACT_SUNR         NA
+#      define ACT_SUNS         NA
+#      define ACT_FTEMP        NA
+#      define ACT_PRTEND       NA
+#      define ACT_UVIND        NA
+#      define ACT_UVTEXT       NA
+#      define ACT_DEWP         NA
+#      define ACT_MOON         NA
+
+       // Preview Values
+#      define PRE_DAY          25
+#      define PRE_TEMPH        26
+#      define PRE_TEMPL        28
+#      define PRE_WSPEED       31
+#      define PRE_WINDD        32 | TRANSLATION
+#      define PRE_ICON         36
+#      define PRE_COND         37 | TRANSLATION
+#      define PRE_PRECIPMM     38
+#      define PRE_SUNR         NA
+#      define PRE_SUNS         NA
+#      define PRE_BT           NA
+#      define PRE_PPCP         NA
+#      define PRE_HMID         NA
+#else
+#      define PRE_STEP         32
+#      define NIGHT_STEP       13
+
+       // atual Values
+#      define ACT_CITY         16
+#      define ACT_TIME         17
+#      define ACT_LAT          18
+#      define ACT_LON          12
+#      define ACT_SUNR         4
+#      define ACT_SUNS         21
+#      define ACT_UPTIME       25
+#      define ACT_OBST         26
+#      define ACT_TEMP         27
+#      define ACT_FTEMP        28
+#      define ACT_COND         29 | TRANSLATION
+#      define ACT_ICON         30
+#      define ACT_PRESS        32
+#      define ACT_PRTEND       33 | TRANSLATION
+#      define ACT_WSPEED       36
+#      define ACT_WINDD        39 | TRANSLATION
+#      define ACT_HMID         41
+#      define ACT_VIS          42 | TRANSLATION
+#      define ACT_UVIND        44
+#      define ACT_UVTEXT       45 | TRANSLATION
+#      define ACT_DEWP         47
+#      define ACT_MOON         50 | TRANSLATION
+
+       // Preview Values
+#      define PRE_DAY          55
+#      define PRE_TEMPH        56
+#      define PRE_TEMPL        57
+#      define PRE_SUNR         58
+#      define PRE_SUNS         59
+#      define PRE_ICON         61
+#      define PRE_COND         62 | TRANSLATION
+#      define PRE_WSPEED       64
+#      define PRE_WINDD        67 | TRANSLATION
+#      define PRE_BT           69
+#      define PRE_PPCP         70
+#      define PRE_HMID         71
+#endif
+
+int  parser            (char *,char *, int, int, int);
+int  prs_get_prev_count        (void);
+/*void prs_get_act_int (int what, char *out);
+void prs_get_act_loc (int what, char *out);
+void prs_get_act_dbl (int what, char *out);
+void prs_get_act_time(int what, char *out);
+void prs_get_act_dtime(int what, char *out);
+*/
+int  prs_get_day       (int, char *, int);
+int  prs_get_val (int i, int what, int nacht, char *out);
+int  prs_get_dbl (int i, int what, int nacht, char *out);
+int  prs_get_time(int i, int what, char *out, int metric);
+int  prs_get_dtime(int i, int what, char *out, int metric);
+int  prs_get_dwday(int i, int what, char *out);
+char *prs_translate(char *trans, char *tfile);
+
+#endif // __wxparser__
+
diff --git a/php.c b/php.c
new file mode 100644 (file)
index 0000000..a5649f4
--- /dev/null
+++ b/php.c
@@ -0,0 +1,173 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include "text.h"
+#include "tuxwetter.h"
+
+#define FH_ERROR_OK 0
+#define FH_ERROR_FILE 1                /* read/access error */
+#define FH_ERROR_FORMAT 2      /* file format error */
+#define FH_ERROR_MALLOC 3      /* error during malloc */
+
+int fh_php_trans(const char *name, int sx, int sy, int dy, int cs, int line, int highlite, int *cut, int *x, int *y, int plain, int plot)
+{
+char tstr[BUFSIZE],rstr[BUFSIZE],*tptr,*xptr,cc,br3flag=0;
+int loop=1, j, first, aline=0, fx=sx, fy=sy, slen, deg=0;
+FILE *fh;
+
+       if(!(fh=fopen(name,"rb")))      return(FH_ERROR_FILE);
+
+       first=(line==0);
+       *x=0;
+       *y=0;
+       sy+=dy;
+       while((loop>0) && (fgets(tstr, sizeof(tstr), fh)))
+       {
+               tptr=tstr+strlen(tstr);
+               while((tptr>=tstr) && (*tptr<=32))
+               {
+                       *tptr=0;
+                       --tptr;
+               }
+
+               if(((tptr=strstr(tstr,"<br>"))!=NULL) || ((tptr=strstr(tstr,"<h3>"))!=NULL))
+               {
+                       tptr+=4;
+                       if((xptr=strstr(tstr,"</h3>"))!=NULL)
+                       {
+                               *xptr=0;
+                               br3flag=1;
+                       }
+                       if((*tptr=='=') || (strncmp(tptr,"<br>",4)==0))
+                       {
+                               if(aline>=line)
+                               {
+                                       first=1;
+                               }
+                       }
+                       else
+                       {
+                               if(aline++>=line)
+                               {
+                                       j=0;
+                                       while(*tptr)
+                                       {
+                                               if(plain || (*tptr != '&'))
+                                               {
+                                                       rstr[j++]=*tptr;
+                                                       tptr++;
+                                               }
+                                               else
+                                               {
+                                                       if((*(tptr+1)!='#') && (strstr(tptr,"uml;")!=(tptr+2)) && (strstr(tptr,"nbsp;")!=(tptr+1)) && (strstr(tptr,"gt;")!=(tptr+1)) && (strstr(tptr,"lt;")!=(tptr+1)) && (strstr(tptr,"quot;")!=(tptr+1)) && (strstr(tptr,"zlig;")!=(tptr+2)))
+                                                       {
+                                                               rstr[j++]=*tptr++;
+                                                       }
+                                                       else
+                                                       {
+                                                               tptr++;
+                                                               cc=' ';
+                                                               switch (*tptr)
+                                                               {
+                                                                       case 'a': cc='ä'; break;
+                                                                       case 'A': cc='Ä'; break;
+                                                                       case 'o': cc='ö'; break;
+                                                                       case 'O': cc='Ö'; break;
+                                                                       case 'u': cc='ü'; break;
+                                                                       case 'U': cc='Ü'; break;
+                                                                       case 's': cc='ß'; break;
+                                                                       case 'q':
+                                                                       case 'Q': cc='"'; break;
+                                                                       case 'l':
+                                                                       case 'g': cc=0;   break;
+                                                                       case '#': 
+                                                                               if(sscanf(tptr+1,"%3d",&deg)==1)
+                                                                               {
+                                                                                       cc=deg;
+                                                                               }
+                                                                               break;
+                                                               }
+                                                               if(cc)
+                                                               {
+                                                                       rstr[j++]=cc;
+                                                               }
+                                                               if((tptr=strchr(tptr,';'))==NULL)
+                                                               {
+                                                                       printf("Tuxwetter <Parser Error in PHP>\n");
+                                                                       fclose(fh);
+                                                                       return -1;
+                                                               }
+                                                               else
+                                                               {
+                                                                       ++tptr;
+                                                               }
+                                                       }
+                                               }
+                                       }
+                                       if((loop>0) && (sy<(fy+420)))
+                                       {
+                                               rstr[j]=0;
+                                               if(plot)
+                                               {
+                                                       if(!br3flag)
+                                                       {
+                                                               RenderString(rstr, sx, sy, 619, LEFT, cs, (first && highlite)?GREEN:CMCT);
+                                                       }
+                                                       else
+                                                       {
+                                                               RenderString(rstr, sx, fx+250, 619, CENTER, FSIZE_BIG, CMCT);
+                                                       }
+                                                       if(strlen(rstr))
+                                                       {
+                                                               first=0;
+                                                       }
+                                                       sy+=dy;
+                                               }
+                                               else
+                                               {
+                                                       if(strlen(rstr))
+                                                       {
+                                                               slen=GetStringLen(sx, rstr, FSIZE_MED);
+                                                               if(slen>*x)
+                                                               {
+                                                                       *x=slen;
+                                                               }
+                                                       }
+                                                       *y=*y+1;
+                                               }
+                                       }
+                               }
+                               if(plot)
+                               {
+                                       *cut=(sy>=(fy+420));
+                                       if(line)
+                                       {
+                                               RenderString("<<", fx, fy, sx, LEFT, FSIZE_MED, CMHT);
+                                       }
+                                       if(*cut)
+                                       {
+                                               RenderString(">>", fx, sy, sx, LEFT, FSIZE_MED, CMHT);
+                                       }
+                               }
+                       }
+               }
+       }
+       fclose(fh);
+       return(FH_ERROR_OK);
+}
+
+int fh_php_load(const char *name, int sx, int sy, int dy, int cs, int line, int highlite, int plain, int *cut)
+{
+       int dummy;
+       
+       return fh_php_trans(name, sx, sy, dy, cs, line, highlite, cut, &dummy, &dummy, plain, 1);
+}
+
+
+int fh_php_getsize(const char *name, int plain, int *x, int *y)
+{
+       int dummy;
+       
+       return fh_php_trans(name, 0, 0, 0, 0, 0, 0, &dummy, x, y, plain, 0);
+}
diff --git a/php.h b/php.h
new file mode 100644 (file)
index 0000000..a5e0030
--- /dev/null
+++ b/php.h
@@ -0,0 +1,7 @@
+#ifndef __PHP_H__
+#define __PHP_H__
+
+int fh_php_load(const char *name, int sx, int sy, int dy, int cs, int line, int highlite, int plain, int *cut);
+int fh_php_getsize(const char *filename, int plain, int *x,int *y);
+
+#endif
diff --git a/plugins.mk.example b/plugins.mk.example
new file mode 100644 (file)
index 0000000..a0d87a5
--- /dev/null
@@ -0,0 +1,25 @@
+# $(SOURCE) = Path to your tuxwetter sources
+# e.g. SOURCE = $(BASE_DIR)/archive-sources
+
+# Some useful variables
+LIBPLUG = $(TARGETPREFIX)/lib/tuxbox/plugins
+VARCONF = $(TARGETPREFIX)/var/tuxbox/config
+BIN    = $(TARGETPREFIX)/bin
+
+tuxwetter: $(LIBPLUG)/tuxwetter.so $(BIN)/tuxwetter
+$(BIN)/tuxwetter:
+       mkdir -p $(BIN) && \
+       mkdir -p $(LIBPLUG)/ && \
+       mkdir -p $(VARCONF)/tuxwetter/ && \
+       pushd $(SOURCE)/tuxwetter && \
+       $(TARGET)-gcc -Wall $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include/freetype2 -lfreetype -lz -DWWEATHER -lcurl -ljpeg -lpng -lungif gifdecomp.c -o $@ tuxwetter.c gfx.c io.c text.c parser.c php.c http.c jpeg.c fb_display.c resize.c pngw.c gif.c && \
+       cp -f tuxwetter.cfg $(LIBPLUG)/tuxwetter.cfg && \
+       cp -f tuxwetter.conf $(VARCONF)/tuxwetter/ && \
+       cp -f tuxwetter.mcfg $(VARCONF)/tuxwetter/ && \
+       cp -f startbild.jpg $(VARCONF)/tuxwetter/ && \
+       cp -f convert.list $(VARCONF)/tuxwetter/
+
+$(LIBPLUG)/tuxwetter.so:
+       mkdir -p $(LIBPLUG) && \
+       pushd $(SOURCE)/tuxwetter && \
+       $(TARGET)-gcc $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(SOURCE_DIR)/neutrino-hd/src -g -o $@ starter.c
diff --git a/pngw.c b/pngw.c
new file mode 100644 (file)
index 0000000..cd65f64
--- /dev/null
+++ b/pngw.c
@@ -0,0 +1,176 @@
+/*
+ * $Id: pngw.c,v 1.2 2011/02/27 14:56:10 rhabarber1848 Exp $
+ *
+ * tuxwetter - d-box2 linux project
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+//#include "config.h"
+#include <png.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include "tuxwetter.h"
+
+#define FH_ERROR_OK 0
+#define FH_ERROR_FILE 1                /* read/access error */
+#define FH_ERROR_FORMAT 2      /* file format error */
+#define FH_ERROR_MALLOC 3      /* error during malloc */
+#define PNG_BYTES_TO_CHECK 4
+#define min(x,y) ((x) < (y) ? (x) : (y))
+
+int fh_png_id(const char *name)
+{
+       int fd;
+       char id[4];
+       fd=open(name,O_RDONLY); if(fd==-1) return(0);
+       read(fd,id,4);
+       close(fd);
+       if(id[1]=='P' && id[2]=='N' && id[3]=='G') return(1);
+       return(0);
+}
+
+
+int fh_png_load(const char *name,unsigned char *buffer,int x,int y)
+{
+       static const png_color_16 my_background = {0, 0, 0, 0, 0};
+
+       png_structp png_ptr;
+       png_infop info_ptr;
+       png_uint_32 width, height;
+       unsigned int i;
+       int bit_depth, color_type, interlace_type;
+       int number_passes,pass;
+       png_byte * fbptr;
+       FILE     * fh;
+
+       if(!(fh=fopen(name,"rb")))      return(FH_ERROR_FILE);
+
+       png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL);
+       if(png_ptr == NULL) return(FH_ERROR_FORMAT);
+       info_ptr = png_create_info_struct(png_ptr);
+       if(info_ptr == NULL)
+       {
+               png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
+               fclose(fh); return(FH_ERROR_FORMAT);
+       }
+
+#if (PNG_LIBPNG_VER < 10500)
+       if(setjmp(png_ptr->jmpbuf))
+#else
+       if(setjmp(png_jmpbuf(png_ptr)))
+#endif
+       {
+               png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
+               fclose(fh); return(FH_ERROR_FORMAT);
+       }
+
+       png_init_io(png_ptr,fh);
+
+       png_read_info(png_ptr, info_ptr);
+       png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,&interlace_type, NULL, NULL);
+
+       if (color_type == PNG_COLOR_TYPE_PALETTE)
+       {
+               png_set_palette_to_rgb(png_ptr);
+               png_set_background(png_ptr, (png_color_16*)&my_background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
+               /* other possibility for png_set_background: use png_get_bKGD */
+       }
+
+       if (color_type == PNG_COLOR_TYPE_GRAY        ||
+           color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+       {
+               png_set_gray_to_rgb(png_ptr);
+               png_set_background(png_ptr, (png_color_16*)&my_background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
+       }
+
+       if (color_type & PNG_COLOR_MASK_ALPHA)
+               png_set_strip_alpha(png_ptr);
+
+       if (bit_depth < 8)
+               png_set_packing(png_ptr);
+
+       if (bit_depth == 16)
+               png_set_strip_16(png_ptr);
+
+/* on Intel PC ?:
+   if (bit_depth == 16)
+   png_set_swap(png_ptr);
+*/
+
+       number_passes = png_set_interlace_handling(png_ptr);
+       png_read_update_info(png_ptr,info_ptr);
+
+       if (width * 3 != png_get_rowbytes(png_ptr, info_ptr))
+       {
+               printf("[png.cpp]: Error processing %s - please report (including image).\n", name);
+               return(FH_ERROR_FORMAT);
+       }
+
+       for(pass = 0; pass < number_passes; pass++)
+       {
+               fbptr = (png_byte *)buffer;
+               for (i = 0; i < height; i++, fbptr += width * 3)
+               {
+                       png_read_row(png_ptr, fbptr, NULL);
+               }
+       }
+       png_read_end(png_ptr, info_ptr);
+       png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
+       fclose(fh);
+       return(FH_ERROR_OK);
+}
+int fh_png_getsize(const char *name,int *x,int *y, int wanted_width, int wanted_height)
+{
+       png_structp png_ptr;
+       png_infop info_ptr;
+       png_uint_32 width, height;
+       int bit_depth, color_type, interlace_type;
+       FILE *fh;
+
+       if(!(fh=fopen(name,"rb")))      return(FH_ERROR_FILE);
+
+       png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL);
+       if(png_ptr == NULL) return(FH_ERROR_FORMAT);
+       info_ptr = png_create_info_struct(png_ptr);
+       if(info_ptr == NULL)
+       {
+               png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
+               fclose(fh); return(FH_ERROR_FORMAT);
+       }
+
+#if (PNG_LIBPNG_VER < 10500)
+       if(setjmp(png_ptr->jmpbuf))
+#else
+       if(setjmp(png_jmpbuf(png_ptr)))
+#endif
+       {
+               png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
+               fclose(fh); return(FH_ERROR_FORMAT);
+       }
+
+       png_init_io(png_ptr,fh);
+       png_read_info(png_ptr, info_ptr);
+       png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,&interlace_type, NULL, NULL);
+       png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
+       *x=width;
+       *y=height;
+       fclose(fh);
+       return(FH_ERROR_OK);
+}
+
diff --git a/pngw.h b/pngw.h
new file mode 100644 (file)
index 0000000..4137d99
--- /dev/null
+++ b/pngw.h
@@ -0,0 +1,28 @@
+/*
+ * $Id: pngw.h,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $
+ *
+ * tuxwetter - d-box2 linux project
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+#ifndef __PNGW_H__
+#define __PNGW_H__
+
+int fh_png_load(const char *filename,unsigned char *buffer,int x,int y);
+int fh_png_getsize(const char *filename,int *x,int *y, int wanted_width, int wanted_height);
+
+#endif
diff --git a/readme.txt b/readme.txt
new file mode 100644 (file)
index 0000000..41cf1aa
--- /dev/null
@@ -0,0 +1,475 @@
+####################################################################################
+####                 New-Tuxwetter Version 3.54
+####            Aktuelle Wetterinfos und Wettervorhersage
+####                    Bugreport und Anregungen im Board:
+####       http://www.dbox2-tuning.net/forum/viewforum.php?f=27&start=0
+####      Das New-Tuxwetter-Team: SnowHead, Worschter, Seddi, Sanguiniker
+####################################################################################
+
+ACHTUNG: Bei allen Versionen die älter als die Version 2.30 sind, funktionieren auf-
+grund einer Formatumstellung des Wetterservers die Vorschauen nicht mehr!!
+
+Vorraussetzung:
+---------------
+
+Die Vorraussetzung für die korrekte Funktion des New-Tuxwetter-Plugins, ist eine
+funktionierende Internetverbindung. Diese kann entweder über einen Router oder über 
+einen PC mit ICS (Internet Connection Sharing = Internetverbindungsfreigabe) erfolgen. 
+Laufen schon andere Plugins mit Internetanbindung (z.B. Tuxmail, Newsticker etc.),
+sollte das Wetterplugin normalerweise ebenfalls funktionieren.
+Nutzer eine Proxservers können diesen dem Plugin mit folgenden Einträgen in der Datei
+tuxwetter.conf bekanntmachen
+
+ ProxyAdressPort=ProxyAdresse:ProxyPort
+ ProxyUserPwd=Username:Passwort
+
+ Beispiel:
+ ProxyAdressPort=192.168.0.128:8080
+ ProxyUserPwd=username1:passwort1
+
+Die einzigen Einstellungen müssen in der "tuxwetter.conf" vorgenommen werden.
+
+Mit dem Parameter 
+
+ SplashScreen=1
+
+legt man fest, daß der Startbildschirm angezeigt werden soll. Mit dem Parameter 0 ent-
+fällt der Startbildschirm. Geschlossen wird der Startbildschirm mit der OK-Taste.
+Defaulteinstellung ist 1
+
+
+Mit dem Parameter
+
+ ShowIcons=1
+
+kann ausgewählt werden, ob in den Textanzeigen der Wetterdaten zusätzlich die aktuellen
+Wettersymbole eingeblendet werden sollen. Da diese Symbole wegen ihrer Größe vom Server
+heruntergeladen werden, empfiehlt es sich, bei langsamen Internetverbindungen diese Funk-
+tion mit dem Wert 0 zu deaktivieren
+Defaulteinstellung ist 0
+
+Ob die Einheiten metrisch oder nichtmetrisch angezeigt werden, legt der Parameter
+  
+ Metric=1
+  
+fest. Mit der Defaulteinstellung "1" werden Einheiten, Zeiten und Datum metrisch 
+dargestellt.
+
+
+Der Parameter
+
+ InetConnection=ISDN
+
+teilt dem Plugin mit, daß der Internetzugang per ISDN erfolgt. Statt ISDN kann auch ANALOG
+eingetragen werden. Für DSL ist kein Eintrag notwendig (default). Anhand dieses Parameters
+werden beim Download von Dateien die Timeouts für Verbindungsaufnahme und Gesamtdownload-
+Zeit sowie die Dateigröße berechnet, ab welcher der Fortschrittsbalken im LCD angezeigt wird.
+
+Wer viele Web-Cams auf Home-PC's einbindet, kann mit dem Parameter
+
+  ConnectTimeout=nn
+  
+die Timeoutzeit für eine Verbindungsaufnahme zusätzlich noch einmal spezifizieren, um bei
+abgeschalteten PC's nicht zu lange auf eine Fehlermeldung warten zu müssen. nn gibt die
+Anzahl in Sekunden an, welche maximal bis zum Etablieren der Verbindung gewartet werden
+soll. Da New-Tuxwetter bei nicht erfolgter Verbindung einen zweiten Verbindungsversuch un-
+ternimmt, ist die Wartezeit bis zur Fehlermeldung also nn*2 Sekunden.
+
+
+Wer einen eigenen Account bei weather.com hat, kann seine eigenen Zugangsdaten verwenden,
+falls der public-Zugang wegen zu häufigem Aufruf mal deaktiviert werden sollte:
+
+ParterID=dddddddddd
+LicenseKey=hhhhhhhhhhhhhhhh
+
+Registrieren kann man sich hier: http://www.weather.com/services/xmloap.html
+
+Die bis hier beschriebenen Parameter können auch separat in einer Datei "tuxwetter.mcfg" ge-
+halten werden, um eine schnelle Konfiguration durch das Flexible Menü-Plugin "Shellexec" zu
+ermöglichen. Existiert eine Datei "/var/plugins/tuxwet/tuxwetter.mcfg", haben die Einträge
+in dieser Datei Vorrang vor den Einträgen in der tuxwetter.conf.
+
+
+Nun sind die Städte einzutragen, für welche man die Wetterabfrage auswählen können möchte. 
+Die Stadtnamen und deren Codes sind in der beiliegenden Datei "Ortscodes.txt" gelistet.
+
+Der Eintrag für die Städte erfolgt in der Form: 
+    Stadt=Stadtname_für_TV_Anzeige,Stadtcode
+z.B.:
+    Stadt=Mönchengladbach,GMXX0086
+
+Wer seine gewünschte Stadt nicht in der Datei findet, kann man im Browser eingeben: 
+http://xoap.weather.com/search/search?where=StadtName
+
+Bsp:
+http://xoap.weather.com/search/search?where=dresden
+
+Antwort:
+ <?xml version="1.0" encoding="ISO-8859-1" ?> 
+- <!-- This document is intended only for use by authorized licensees of The Weather Channel...
+  --> 
+- <search ver="2.0">
+  <loc id="GMXX0025" type="1">Dresden, Germany</loc> 
+  <loc id="USKS0157" type="1">Dresden, KS</loc> 
+  <loc id="USME0110" type="1">Dresden, ME</loc> 
+  <loc id="USNY0396" type="1">Dresden, NY</loc> 
+  <loc id="USOH0268" type="1">Dresden, OH</loc> 
+  <loc id="USTN0146" type="1">Dresden, TN</loc> 
+  </search>
+
+Der Stadtcode für Dresden wäre demnach GMXX0025. Wird keine Stadt zurückgegeben, sind für die
+angefragte Stadt keine Wetterdaten verfügbar. Dann muß man auf eine Stadt in der Umgebung aus-
+weichen.
+
+Eine weitere Möglichkeit Städtecodes zu finden ist, auf der Seite
+
+http://de.weather.com/search/search?where=deutschland&what=WeatherCity
+
+eine der aufgeführten Städte zu wählen (nicht über die Suche!!!)
+Die Adressleiste des aufgerufenen Fensters enthält den Stadtcode der benötigt wird.
+Es werden nur Städte mit dem Code GMXX0001 bis GMXX0280 unterstützt.
+Ist die gewünschte Stadt nicht in dem Bereich, so steht auf der Seite direkt unter
+dem Ort die Stadt Wetterstation von der die Daten kommen (z.B. wie Stuttgart).
+Dann sucht euch dafür den Stadtcode, denn die Daten sind identisch.
+
+Der Aufbau der Menüs erfolgt über die Einträge "MENU=" als Anfangskennung und "ENDMENU" als
+Endekennung. Diese können beliebig tief verschachtelt und auch mit normalen Einträgen gemischt
+werden. Im einfachsten Fall könnte "MENU=New Tuxwetter" am Anfang und "ENDMENU" am Ende der
+Liste stehen. Mindestens eine Menüebene ist zwingend notwendig. Innerhalb einer aktuellen Me-
+nüseite aufrufbaren Untermenüs sind in der Anzeige durch ein vorangestelltes ">" gekennzeichnet.
+Zur optischen Trennung der Einträge kann vor den "Anzeigetext im Menü" ein "*" gesetzt werden.
+Unterhalb eines solchen Eintrages wird ein Trennstrich im Menü gezogen.
+Um die Darstellung der Namen der Menüeinträge ansprechender gestalten zu können, werden Farb-
+steuerzeichen im übergebenen Text unterstützt. Allen Steuerzeichen gemeinsam ist der Beginn 
+mit dem Zeichen "~". Dieses kommt im normalen Text nicht vor und leitet daher immer einen Farb-
+befehl ein. Folgende Farben werden unterstützt:
+
+  ~R    nachfolgenden Text rot darstellen, gilt bis zum Textende oder einem neuen Farbbefehl
+  ~G    nachfolgenden Text grün darstellen, gilt bis zum Textende oder einem neuen Farbbefehl
+  ~B    nachfolgenden Text blau darstellen, gilt bis zum Textende oder einem neuen Farbbefehl
+  ~Y    nachfolgenden Text gelb darstellen, gilt bis zum Textende oder einem neuen Farbbefehl
+  ~S    nachfolgenden Text in Standardfarbe darstellen
+
+Das Menü kann um die Anzeige zusätzlicher, selbst auswählbarer JPG-, PNG- und GIF-Bilder aus 
+dem Internet erweitert werden. Dazu muß die vollständige URL des anzuzeigenden Bildes bekannt 
+sein. Um dieses Bild mit in das Funktionsmenü aufzunehmen, ist folgendes in die tuxwetter.conf ein-
+zutragen (vor und hinter dem Komma darf kein Leerzeichenstehen!):
+
+ PICTURE=Anzeigetext im Menü,vollständige URL
+
+Der Text zwischen "=" und "," wird im Funktionsmenü zur Auswahl angezeigt, die URL muß nicht er-
+läutert werden. Beispiel:
+
+ PICTURE=Temperaturen aktuell,http://image.de.weather.com/web/maps/de_DE/temperature/current/germany_temp_curr_720_de.jpg
+
+Ist aus der Bildadresse kein Bildtyp erkennbar, muß dieser zusätzlich mit angegeben werden. Das er-
+folgt durch Voranstellen von |JPG|, |GIF| oder |PNG| vor die Bildadresse. Beispiel:
+
+ PICTURE=Stauwarnung Hessen,|GIF|http://www.swr3.de/info/verkehr/verkehr_images.php?img=M05
+Da man auch Webcams anzeigen kann, welche ihr Bild in bestimmten Abständen aufrischen, kann
+man New-Tuxwetter auch anweisen, das angezeigte Bild in einem vorgebbaren Intervall selbst-
+ständig neu zu laden, ohne daß eine Taste gedrückt werden muß. Dazu ist eine Erweiterung des
+oben beschriebenen Bildtyps um die Zahlenangabe des Updateintervalls in Sekunden erforderlich.
+Der Bildtyp muß in diesem Fall also zwingend angegeben werden. Das folgende Beispiel frischt
+das angezeigte Bild aller 30 Sekunden auf:
+
+ PICTURE=Empuria-Brava,|JPG30|http://www.empuriabrava.tv/tresor/strapro.jpg
+
+Manche Images haben in ihrer URL eine eindeutige Zeitangabe. Um diese Bilder auch ansehen zu 
+können bietet Tuxwetter die Möglichkeit Platzhalter einzusetzen die zum Zeitpunkt des Aufrufs 
+durch aktuelle Zeit und Datum ersetzt werden. Weiter besteht die Möglichkeit, mittels Operato-
+ren die Zeit zu beeinflussen, um zum Beispiel gewisse Update-Zyklen exakt treffen zu können. 
+Ausserdem besteht die Auswahl zwischen MESZ/MEZ und UTC.
+
+Das generelle Format eines Platzhalters besteht aus dem Startzeichen "|", optionalen Operatoren,
+einem optionalen Offset und den Formatzeichen: |[LNR][[-]1..99999]Format
+
+Formatzeichen
+
+D : Tag
+M : Monat
+Y : Jahr
+h : Stunde
+m : Minute
+s : Sekunde
+
+Die Anzahl der Formatzeichen bestimmt die Anzahl der Stellen mit der die Formatzeichen ersetzt 
+werden. Beispiel:
+
+"D"   liefert bei Tag 1-9 eine einstellige Ausgabe "1" ... "9" wird die Zahl zweistellig wird 
+      auch die Ausgabe zweistellig.
+
+"DD"  liefert bei Tag 1-9 die Ausgabe "01" ... "09" ab dann normal weiter.
+"DDD" liefert eben generell eine dreistellige Ausgabe "001" ... "031"
+usw.
+
+Eine Ausnahme bildet hier das Jahr. Es wird ausser bei vierstelliger Eingabe immer die Zahl ohne 
+das Jahrtausend liefern (Beispiel 2004)
+
+"Y"     = "4"
+"YY"    = "04"
+"YYY"   = "004"
+"YYYY"  = "2004" ! Nur hier wird das Jahrtausend mit ausgegeben!
+"YYYYY" = "00004"
+
+Operatoren:
+
+"L" : Local Time (bewirkt, daß die lokale Zeit (also MEZ oder MESZ) als Zeitbasis verwendet wird.
+      Ohne diesen Operator wird UTC verwendet. Dieser Operator muß nur einmal vorkommen und wirkt
+      dann auf alle Zeitangaben
+"R" : gefolgt von einer Zahl rundet den zugehörigen Platzhalter auf die Zahl oder deren Vielfaches.
+"N" : gefolgt von einer Zahl bewirkt den Abzug der Zahl von dem zugehörigen Platzhalter ohne daß 
+      diese ausgegeben wird. Ist zum Beispiel notwendig, wenn anschließend noch gerundet werden soll.
+"15": gemeint ist eine beliebige Zahl die dann vom zugehörigen Platzhalter abgezogen wird. Alle abzu-
+      ziehenden Werte in der gesamten Adresse werden zunächst gemeinsam von der aktuellen Zeit abgezo-
+      gen und erst dann wird mit der Ersetzung begonnen. So kann zum Beispiel der Abzug von zwei Mi-
+      nuten, wenn es eine Minute nach der vollen Stunde ist, auch die Stunde verringern. Das gilt für
+      alle Zeitwerte. WIrd hier eine negative Zahl (Bsp. -15) angegeben, wird diese Zeit zur aktuellen
+      Zeit addiert, um Bilder mit einem Zeitstempel, welcher der aktuellen Zeit vorauselt, anzeigen zu
+      können.
+      
+Da das ganze doch etwas trocken ist, mal ein paar Beispiele:
+
+Wir nehmen an, es ist der 02.01.2005 um 03:16:25 MESZ
+
+|YYYY|MM|DD|hh|mm|ss                                20050102011625  // Stunde = 01 (UTC)
+|LYYYY|MM|DD|hh|mm|ss                               20050102031625  // Stunde = 03 (MESZ)
+|YYYY|MM|2DD|2hh                                    2004123023      // 2 Tage und 2 Stunden abgezogen
+|1hh|R15mm                                          0015            // 1 h abgezogen, Runden auf 15 min
+|1hh|N15m|R15mm                                     0000            // 1h 15 min "  , " (sichere Lösung)
+|L1hh|N15m|R15mm                                    0200            //  " aber MESZ
+
+
+Praxis: (ein viertelstündlich aktualisiertes Bild, Datum: 13.10.2004 21:16:00 MESZ)
+
+http://www.wetteronline.de/daten/radar/dwdd/|YYYY/|MM/|DD|hh|R15mm.gif  ergibt
+http://www.wetteronline.de/daten/radar/dwdd/2004/10/131915.gif
+
+Das könnte knapp werden, da um 21:16 das Bild von 21:15 bestimmt noch nicht geuppt wurde, und würde der
+Aufruf um 21:15 erfolgen, hätte der Server gar keinen Vorlauf mehr. Sicherer ist es daher, noch eine
+viertel Stunde abzuziehen und dann erst zu runden:
+
+http://www.wetteronline.de/daten/radar/dwdd/|YYYY/|MM/|DD|hh|N15m|R15mm.gif  ergibt
+http://www.wetteronline.de/daten/radar/dwdd/2004/10/131900.gif
+
+Dieses Beispiel könnt Ihr direkt verwenden.
+
+Für Bildadressen, die sich nicht über Zeitfunktionen berechnen lassen, gibt es die Möglichkeit, diese
+Adresse aus dem Quelltext der HTML-Seite extrahieren zu lassen. Dazu ist im Quelltext nach dem Bild-
+namen zu suchen. Die Textstücke, die den Namen des Bildes vorn (Grenze_vorn) und hinten (Grenze_hinten)
+einschließen, sollten nun bekannt sein. Um die Bildadresse ermitteln zu lassen, ist ein Eintrag in der
+Form:
+
+ PICHTML=Anzeigetext im Menü,URL_der_HTML_Seite|Grenze_vorn|Grenze_hinten
+
+Beispiel:
+HTML-Quelltext:
+ ....
+ </map>
+
+ <img src="http://212.224.23.107/images/index0000046169.png"width="550" height="500" name="Karte" usemap="#Karte" border="0"/>
+ </div>
+     </td>
+    </tr>
+ ....
+
+Eintrag in der tuxwetter.conf:
+
+ PICHTML=Unwetter-Warnungen,http://www.unwetterzentrale.de/uwz/index.html|<img src="|" width="550" height="500" name="Karte" usemap="#Karte" border="0"/>
+
+
+Achtung!! Es koennen nur JPG- und bestimmte Typen von PNG- und GIF-Bildern dargestellt werden. Da-
+bei sind jedoch auch animierte GIFs möglich, deren Einzelbilder automatisch nacheinender angezeigt 
+werden.
+
+Werden auf Internetseiten interessante Texte angezeigt, kann man sich die in begrenztem Umfang auch auf dem
+Bildschirm darstellen lassen. Dazu gibt es den Typ TXTHTML. In der Syntax gleich aufgebaut wie PICHTML stellt
+diese Typ den zwischen den Begrenzern gefundenen Text auf dem Bildschirm dar. Dazu werden alle HTML-Tags ent-
+fernt und, wenn nötig Zeilenumbrüche für die Formatierung eingefügt.
+
+
+ TXTHTML=Anzeigetext im Menü,URL_der_HTML_Seite|Grenze_vorn|Grenze_hinten
+
+Beispiel-Eintrag in der tuxwetter.conf:
+
+ TXTHTML=Waldbrandwarnung,http://www.zamg.ac.at/dyn/warnungen/waldb.htm|<!-- Waldbrandindex gif -->|  Uhr</font> 
+Werden in den zu analysierenden HTML-Seiten die Links auf Bilder oder andere Seiten relativ dargestellt (also
+ohne Angabe einer Serveradresse), wird davon ausgegangen, daß die Links auf das Root-Verzeichnis des Servers
+verweisen. Liegen die Links nicht im Root sondern im selben Verzeichnis wie die HTML-Seite, ist der Eintrag
+für diese Seite mit der Adresse "httpabs://.." einzutragen.
+Beispiel:
+Adresse:
+
+  http://www.mtit.at/verkehrsbilder/scripts/getlastpicture.asp?cam=61
+
+liefert als Quelltext:
+
+  ...
+  <tr>
+  <td><img src="mmobjholen.asp?id=129125&time=23.01.2005 17:00:03" width="320" height="240" border="0"></td>
+  </tr>
+  ...
+
+Dabei würde das Script "mmobjholen" in "http//www.mtit.at/" erwartet werden. Es liegt jedoch in 
+"http://www.mtit.at/verkehrsbilder/scripts/". Daher muß der Eintrag in der Config-Datei lauten:
+
+  PICHTML=Auhof,|JPG|httpabs://www.mtit.at/verkehrsbilder/scripts/getlastpicture.asp?cam=61|<td><img src="|" width="320" height="240" border="0"></td>
+
+Internetseiten oder auch Dateien auf Netzwerkfreigaben im reinen Textformat lassen sich mit dem Plugin eben-
+falls darstellen. Dazu gibt es den Typ TXTPLAIN. Mit diesem Eintrag wird eine reine Textseite heruntergeladen
+und angezeigt.
+
+ TXTPLAIN=Anzeigetext im Menü,URL_der_Text_Seite
+
+
+Die Wetterwarnungen des deutschen Wetterdienstes können auf separaten Textseiten dargestellt werden.
+Um an die aktuellen gewünschten Adressen (URL's) für die Wetterwarnungsdaten zu kommenen, folgenderma-
+ßen vorgehen.
+http://www.wettergefahren.de/de/WundK/Warnungen/index.htm aufrufen. Dort auf das gewünschte Bundesland klicken,
+z.B. Baden-Württemberg.
+Dann regionaler Warnlagebericht anklicken, dann im folgenden Fenster auf Datei->Eigenschaften klicken.
+Im Fenster Eigenschaften die Url herauskopieren. Diese Url dann mit einem Unix fähigen Editor z.B.
+Ultraedit in die tuxwetter.conf einfügen. In der gleichen Zeile davor hinschreiben
+TEXTPAGE=Warnlage Baden-Württemberg,
+Das gewünschte Ergebnis sollte so aussehen.
+
+TEXTPAGE=Warnlage Baden-Württemberg,http://www.wettergefahren.de/de/WundK/Warnungen/zeige.php?WL=SU00  
+
+Um an die Wetterwarnungen für den Landkreis zu kommen, den Landkreis auf der Wetterwarnungskarte
+des Bundeslandes anklicken. Ich möchte dies hier am Beispiel Reutlingen erklären. Ihr klickt in der
+Wetterwarnungskarte von Baden-Württemberg auf den Landkreis Reutlingen. Dann im folgenden Fenster auf
+Datei->Eigenschaften klicken. Im Fenster Eigenschaften die Url herauskopieren. Diese Url dann mit einem
+Unix fähigen Editor z.B. Ultraedit in die tuxwetter.conf einfügen. In der gleichen Zeile davor hinschreiben
+TEXTPAGE=Warnstatus Reutlingen,
+Das gewünschte Ergebnis sollte so aussehen.
+
+TEXTPAGE=Warnstatus Reutlingen,http://www.wettergefahren.de/de/WundK/Warnungen/zeige.php?ID=RT#O
+
+Sollen bestimmte Programme oder Scripte aufgerufen werden, kann der Eintrag "EXECUTE=" verwendet
+werden. Er führt den eingetragenen Text auf der Kommandozeile aus. Die Syntx ist:
+
+ EXECUTE=Anzeigename im Menü,auszuführendes Kommando
+Beispiel:
+
+ EXECUTE=Box neu starten,reboot
+
+Zu den Tasten:
+
+Bei Anzeige eines Bildes kann mittels der Hoch-/Runter-Tasten zum nächsten oder vorhergehenden Bild 
+gewechselt werden, ohne erst über das Menü zu gehen. Um trotzdem darüber zu informieren, welches
+Bild gerade angezeigt wird, wird der Menüname des Bildes zusätzlich noch auf dem LCD-Display der Box
+angezeigt. Geschlossen wird die Grafik-Anzeige mit der OK-Taste.
+Ein animiertes GIF kann nach seinem Ablauf mi der Rechts-Taste erneut gestartet werden, ohne daß es 
+erst noch mal aus dem Internet geladen wird. Die Links-Taste führt zum erneuten Download des letzten
+Bildes. Das ist vor allem für das Betrachten von WebCam-Bildern vorgesehen.
+Während des Ladens und Konvertierens von Bildern wird in der linken oberen Bildschirmecke das vom 
+Pictureviewer her bekannte "Busy-Symbol", ein kleines rotes Rechteck eingeblendet, um darauf hinzu-
+weisen, daß die Box beschäftigt ist.
+Bei längeren Warnmeldungen (erkennbar am Zeichen ">>" in der linken unteren Ecke") kann mit der Rechts-
+Taste um 5 Zeilen vor- und mit der Links-Taste um 5 Zeilen zurückgescrollt werden.
+
+Bei Bildern größer 100 kB, wird in der 1.Zeile des LCD-Displays der Dbox ein Ladefortschrittsbalken
+angezeigt. Darunter wird der Name des Bilds eingeblendet. Es konnte aber kein korrekter Zeilenumbruch
+implementiert werden, da das Wetterplugin sonst zu groß geworden wäre. (Die Box ist ja kein Duden :-).)
+
+Nach Anpassung der tuxwetter.conf und Neustart der Box steht das Plugin unter dem Menü der blauen 
+Taste als "Wettervorhersage" zur Verfügung.
+
+Wem die auf dem LCD-Display angezeigten Wettersymbole zu spartanisch sind, kann die Datei
+bmps.tar.Z aus dem Ordner "alternative LCD-Symbole" ins Verzeichnis /var/plugins/tuxwet
+kopieren (die alte Datei überschreiben). das ist, wie so Vieles, immer eine Geschmacksfrage.
+
+Zur Bedienung: Die Menüs werden über die Home-Taste, die Wetter- und Grafik-Anzeigen sowohl über die
+HOME- als auch über die OK-Taste geschlossen. Auch innerhalb der Datenanzeigen kann mittels der Hoch-
+/Runter-Tasten zum jeweils vorhergehenden oder folgenden Eintrag gewechselt werden.
+Zum vorhergenden Menü gelangt man mit der HOME-Taste. Die Standby-Taste beendet das Programm aus
+allen Menüebenen heraus.
+
+Eine Hilfebildschirm, welcher alle Tasten und deren Funktionen beschreibt, kann mit der Taste "?" 
+aufgerufen werden. Auch die aktuelle Programmversion wird in der Titelzeile angezeigt. Dieser 
+Hilfebildschirm wird auch mit der OK-Taste wieder geschlossen.
+
+Da bei einigen Images das Problem auftrat, daß bei längerer Nutzung des Plugins die Uhrzeit nachging,
+da der Prozessor aufgrund der Auslastung nicht mehr in der Lage war, die Berechnung der Uhrzeit wei-
+terzuführen, liegt im Ordner "optionale Zeitkorrektur" ein Programm namens "swisstime". Diese Programm
+holt sich von einem Schweizer Atomzeit-Server die aktuelle Zeit und setzt damit die Uhr der DBox.
+Dieses Programm ist bei Bedarf in den Ordner /var/plugins/tuxwet/ zu kopieren, und mit den Rechten 755
+zu versehen. Das Plugin erkennt, ob dieses Programm vorhanden ist, und ruft es dann beim Beenden des
+Plugins auf. Somit wird die Uhrzeit wieder korrigiert. Wer keine Probleme mit einer nachgehenden Uhr
+hat (das ist vom Image abhängig), benötigt dieses Programm nicht.
+
+Die Datei convert.list dient der Übersetzung der englischen Texte vom Wetterserver in deutsche Texte.
+Sollten da mal irgendwelche komischen Anzeigen bei der Wettervorsage stehen, postet bitte ins
+Forum, damit die fehlerhaften Anzeigen korrigiert werden können.
+Fehlende Übersetzungen werden in einer Liste gesammelt, welche aus dem Hauptmenü mit der DBox-Taste
+angezeigt werden kann. Das erleichtert die Meldung solcher Übersetzungen im Board. Soll die Fehler-
+liste (nach Korrektut der convert.list) gelöscht werden, kann das mit der roten Taste erfolgen, während
+die Fehlerliste angezeigt wird.
+Ab der Version 3.00 dient die Datei convert.list gleichzeitig der Lokalisierung aller angezeigten
+Texte. Im unteren Teil befinden sich dafür die originalen deutschen Meldungen, gefolgt von dem Zeichen
+"|". Unmittelbar danach kann man eintragen, was statt dieses Textes angezeigt werden soll. Das kann
+sowohl eine Fremdsprache sein als auch eine deutsche Meldung, welche Euch besser als die originale
+gefällt. Dabei aber bitte beachten, daß der neue Text bei den Meldungen für die Datenanzeige nicht länger 
+als der in der Anzeige zur Verfügung stehende Platz werden sollte, da sonst die Formatierung der An-
+zeige darunter leiden würde. Steht kein neuer Text hinter dem "|", wird der Originaltext verwendet.
+
+Wer sich eine so große tuxwetter.conf zusammengestellt hat, daß Schwierigkeiten mit dem Platz auf der
+Box auftauchen, kann die tuxwetter.conf auch auf den PC auslagern und mit dem Plugin über ein vorher
+gemountetes Verzeichnis darauf zugreifen. Dazu kann tuxwetter sowohl aus der tuxwetter.so als auch von 
+der Kommandozeile aus mit einem Parameter für die zu verwendende Konfigurationsdatei aufgerufen werden. 
+Der abweichende Pfad zur Config-Datei kann in der tuxwetter.so mit einem Hex-Editor ab Adresse 1E35H 
+eingetragen werden. Ist zum Beispiel das Verzeichnis /mnt/configs/ gemountet, und auf diesem befindet
+sich eine tuxwetter.conf auf dem PC, wird in der tuxwetter.so ab Adresse 1E35H die Zeichenfolge 
+
+  /mnt/configs/tuxwetter.conf
+  
+eingetragen, oder das Plugin so über die Kommandozeile (z.B. aus dem FlexMenü) aufgerufen:
+
+  /var/plugins/tuxwet/tuxwetter /mnt/configs/tuxwetter.conf
+  
+Wird kein Kommandozeilenparameter angegeben oder wurde die als Kommandozeilenparameter angegebene Config
+nicht gefunden (Verzeichnis nicht gemountet), verwendet das Plugin die Datei 
+
+  /var/plugins/tuxwet/tuxwetter.conf.
+  
+Wird New-Tuxwetter zusätzlich mit einem Aktionseintrag als Kommandozeilenparameter aufgerufen, so führt
+es die entsprechende Aktion sofort aus, und beendet sich wieder, wenn die Aktion abgeschlossen wurde.
+Somit kann New-Tuxwetter nun auch als aus Scripten heraus aufrufbarer Bildbetrachter oder Textviewer
+verwendet werden.
+Beispiel:
+
+  /var/plugins/tuxwet/tuxwetter 'PICTURE=Teletarif Bild,http://www.teltarif.de/db/blitz.gif?preis=1&ziel=Ortsgespr~ach,Fern,Mobilfunk&ve=1&blank=1&019x=0&width=249&height=200'
+
+zeigt sofort die aktuellen Telefontarife auf dem Bildschirm an, und beendet sich nach Schließen des Bildes.
+Folgende Aktionen können als Kommandozeilenparameter verwendet werden: PICTURE, PICHTML, TXTHTML,TEXTPAGE,
+TXTPLAIN und EXECUTE. Der Kommandozeilenparameter ist unbedingt in einfache Hochkommasn einzuschließen,
+um die Kommandozeile komplett einschließlich Leerzeichen in den ersten Parameter übergeben zu können. Da
+die Kommandozeile keine Umlaute und Sonderzeichen übergeben kann, sind, wie im Beispiel, die Sonderzeichen
+durch eine vorangestellte Tilde zu kennzeichnen. Folgende Sonderzeichen werden unterstützt:
+
+  ~a    ä
+  ~o    ö
+  ~u    ü
+  ~A    Ä
+  ~O    Ö
+  ~U    Ü
+  ~z    ß
+  ~d    ° (degree)
+
+Um die Version von New-Tuxwetter über die Kommadozeile abzufragen, wird tuxwetter mit dem Parameter -v oder
+--Version aufgerufen. In diesem Fall gibt Tuxwetter nur seine Version auf die Konsole aus und beendet sich
+anschließend selbst.
+
+Zur Konfiguration des Plugins über das Flexible Menü-Plugin (FlexMenü) befindet sich ein Unterordner mit
+dem in die shellexec.conf einzufügenden Abschnitt, ein zugehöriges Script (twops, benötigt die Rechte 755)
+und die zusätzlich erforderliche Config-Datei tuxwetter.mcf im Verzeichnis "Konfiguration über FlexMenü".
+Thx to MailMan für die Erstellung der FlexMenü-Konfiguration.
+
+
+Also, viel Spaß und viel Erfolg
+
+Das New-Tuxwetter-Team
+SnowHead, Worschter, Seddi und Sanguiniker
diff --git a/resize.c b/resize.c
new file mode 100644 (file)
index 0000000..8815623
--- /dev/null
+++ b/resize.c
@@ -0,0 +1,92 @@
+/*
+ * $Id: resize.c,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $
+ *
+ * tuxwetter - d-box2 linux project
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+unsigned char * simple_resize(unsigned char * orgin,int ox,int oy,int dx,int dy)
+{
+//   dbout("simple_resize{\n");
+       unsigned char *cr,*p,*l;
+       int i,j,k,ip;
+       cr=(unsigned char*) malloc(dx*dy*3); 
+       if(cr==NULL)
+       {
+               printf("Error: malloc\n");
+//      dbout("simple_resize}\n");
+               return(orgin);
+       }
+       l=cr;
+
+       for(j=0;j<dy;j++,l+=dx*3)
+       {
+               p=orgin+(j*oy/dy*ox*3);
+               for(i=0,k=0;i<dx;i++,k+=3)
+               {
+                       ip=i*ox/dx*3;
+                       l[k]=p[ip];
+                       l[k+1]=p[ip+1];
+                       l[k+2]=p[ip+2];
+               }
+       }
+       free(orgin);
+//   dbout("simple_resize}\n");
+       return(cr);
+}
+
+unsigned char * color_average_resize(unsigned char * orgin,int ox,int oy,int dx,int dy)
+{
+//   dbout("color_average_resize{\n");
+       unsigned char *cr,*p,*q;
+       int i,j,k,l,xa,xb,ya,yb;
+       int sq,r,g,b;
+       cr=(unsigned char*) malloc(dx*dy*3); 
+       if(cr==NULL)
+       {
+               printf("Error: malloc\n");
+//      dbout("color_average_resize}\n");
+               return(orgin);
+       }
+       p=cr;
+
+       for(j=0;j<dy;j++)
+       {
+               for(i=0;i<dx;i++,p+=3)
+               {
+                       xa=i*ox/dx;
+                       ya=j*oy/dy;
+                       xb=(i+1)*ox/dx; if(xb>=ox)      xb=ox-1;
+                       yb=(j+1)*oy/dy; if(yb>=oy)      yb=oy-1;
+                       for(l=ya,r=0,g=0,b=0,sq=0;l<=yb;l++)
+                       {
+                               q=orgin+((l*ox+xa)*3);
+                               for(k=xa;k<=xb;k++,q+=3,sq++)
+                               {
+                                       r+=q[0]; g+=q[1]; b+=q[2];
+                               }
+                       }
+                       p[0]=r/sq; p[1]=g/sq; p[2]=b/sq;
+               }
+       }
+       free(orgin);
+//   dbout("color_average_resize}\n");
+       return(cr);
+}
diff --git a/resize.h b/resize.h
new file mode 100644 (file)
index 0000000..57785f7
--- /dev/null
+++ b/resize.h
@@ -0,0 +1,28 @@
+/*
+ * $Id: resize.h,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $
+ *
+ * tuxwetter - d-box2 linux project
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+#ifndef __RESIZE_H__
+#define __RESIZE_H__
+
+unsigned char * simple_resize(unsigned char * orgin,int ox,int oy,int dx,int dy);
+unsigned char * color_average_resize(unsigned char * orgin,int ox,int oy,int dx,int dy);
+
+#endif
diff --git a/startbild.jpg b/startbild.jpg
new file mode 100644 (file)
index 0000000..bcda64f
Binary files /dev/null and b/startbild.jpg differ
diff --git a/starter.c b/starter.c
new file mode 100644 (file)
index 0000000..767c1ba
--- /dev/null
+++ b/starter.c
@@ -0,0 +1,53 @@
+/*
+ * $Id$
+ *
+ * tuxwetter - d-box2 linux project
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <plugin.h>
+#define SCRIPT "tuxwetter"
+
+int main()
+{
+        int ret, pid, status;
+        pid=fork();
+        if (pid == -1) {
+                fprintf(stderr, "[%s.so] fork\n", SCRIPT);
+                return;
+        } else
+        if (pid == 0) {
+                fprintf(stderr, "[%s.so] forked, executing %s\n", SCRIPT, SCRIPT);
+                for (ret=3 ; ret < 255; ret++)
+                       close (ret);
+                        ret = system(SCRIPT);
+                        if (ret)
+                                fprintf(stderr, "[%s.so] script return code: %d (%m)\n", SCRIPT, ret);
+                        else
+                                fprintf(stderr, "[%s.so] script return code: %d\n", SCRIPT, ret);
+                _exit(ret);
+       }
+        fprintf(stderr, "[%s.so] parent, waiting for child with pid %d...\n", SCRIPT, pid);
+        waitpid(pid, &status, 0);
+        fprintf(stderr, "[%s.so] parent, waitpid() returned..\n", SCRIPT);
+        if (WIFEXITED(status))
+                fprintf(stderr, "[%s.so] child returned with status %d\n", SCRIPT, WEXITSTATUS(status));
+} 
diff --git a/text.c b/text.c
new file mode 100644 (file)
index 0000000..7c9ddcb
--- /dev/null
+++ b/text.c
@@ -0,0 +1,369 @@
+#include "text.h"
+#include "gfx.h"
+#include "io.h"
+
+int FSIZE_BIG=28;
+int FSIZE_MED=24;
+int FSIZE_SMALL=20;
+int FSIZE_VSMALL=16;
+int TABULATOR=72;
+unsigned sc[8]={'a','o','u','A','O','U','z','d'}, tc[8]={'ä','ö','ü','Ä','Ö','Ü','ß','°'};
+
+/******************************************************************************
+ * MyFaceRequester
+ ******************************************************************************/
+
+FT_Error MyFaceRequester(FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face *aface)
+{
+       FT_Error result;
+
+       result = FT_New_Face(library, face_id, 0, aface);
+
+       if(result) printf("msgbox <Font \"%s\" failed>\n", (char*)face_id);
+
+       return result;
+}
+
+/******************************************************************************
+ * RenderChar
+ ******************************************************************************/
+
+int RenderChar(FT_ULong currentchar, int sx, int sy, int ex, int color)
+{
+//     unsigned char pix[4]={oldcmap.red[col],oldcmap.green[col],oldcmap.blue[col],oldcmap.transp[col]};
+//     unsigned char pix[4]={0x80,0x80,0x80,0x80};
+       unsigned char pix[4]={bl[color],gn[color],rd[color],tr[color]};
+       int row, pitch, bit, x = 0, y = 0;
+       FT_UInt glyphindex;
+       FT_Vector kerning;
+       FT_Error error;
+
+       currentchar=currentchar & 0xFF;
+
+       //load char
+
+               if(!(glyphindex = FT_Get_Char_Index(face, (int)currentchar)))
+               {
+//                     printf("msgbox <FT_Get_Char_Index for Char \"%c\" failed\n", (int)currentchar);
+                       return 0;
+               }
+
+
+               if((error = FTC_SBitCache_Lookup(cache, &desc, glyphindex, &sbit, NULL)))
+               {
+//                     printf("msgbox <FTC_SBitCache_Lookup for Char \"%c\" failed with Errorcode 0x%.2X>\n", (int)currentchar, error);
+                       return 0;
+               }
+
+// no kerning used
+/*
+               if(use_kerning)
+               {
+                       FT_Get_Kerning(face, prev_glyphindex, glyphindex, ft_kerning_default, &kerning);
+
+                       prev_glyphindex = glyphindex;
+                       kerning.x >>= 6;
+               }
+               else
+*/
+                       kerning.x = 0;
+
+       //render char
+
+               if(color != -1) /* don't render char, return charwidth only */
+               {
+                       if(sx + sbit->xadvance >= ex) return -1; /* limit to maxwidth */
+
+                       for(row = 0; row < sbit->height; row++)
+                       {
+                               for(pitch = 0; pitch < sbit->pitch; pitch++)
+                               {
+                                       for(bit = 7; bit >= 0; bit--)
+                                       {
+                                               if(pitch*8 + 7-bit >= sbit->width) break; /* render needed bits only */
+
+                                               if((sbit->buffer[row * sbit->pitch + pitch]) & 1<<bit) memcpy(lbb + (startx + sx + sbit->left + kerning.x + x)*4 + fix_screeninfo.line_length*(starty + sy - sbit->top + y),pix,4);
+
+                                               x++;
+                                       }
+                               }
+
+                               x = 0;
+                               y++;
+                       }
+
+               }
+
+       //return charwidth
+
+               return sbit->xadvance + kerning.x;
+}
+
+/******************************************************************************
+ * GetStringLen
+ ******************************************************************************/
+
+int GetStringLen(int sx, char *string, int size)
+{
+int i, found;
+int stringlen = 0;
+
+       //reset kerning
+
+               prev_glyphindex = 0;
+
+       //calc len
+
+               if(size)
+               {
+                       desc.width = desc.height = size;
+               }
+               
+               while(*string != '\0')
+               {
+                       if(*string != '~')
+                       {
+                               stringlen += RenderChar(*string, -1, -1, -1, -1);
+                       }
+                       else
+                       {
+                               string++;
+                               if(*string=='t')
+                               {
+                                       stringlen=desc.width+TABULATOR*((int)(stringlen/TABULATOR)+1);
+                               }
+                               else
+                               {
+                                       if(*string=='T')
+                                       {
+                                               if(sscanf(string+1,"%4d",&i)==1)
+                                               {
+                                                       string+=4;
+                                                       stringlen=i-sx;
+                                               }
+                                       }
+                                       else
+                                       {
+                                               found=0;
+                                               for(i=0; i<sizeof(sc) && !found; i++)
+                                               {
+                                                       if(*string==sc[i])
+                                                       {
+                                                               stringlen += RenderChar(tc[i], -1, -1, -1, -1);
+                                                               found=1;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+                       string++;
+               }
+
+       return stringlen;
+}
+
+
+void CatchTabs(char *text)
+{
+       int i;
+       char *tptr=text;
+       
+       while((tptr=strstr(tptr,"~T"))!=NULL)
+       {
+               *(++tptr)='t';
+               for(i=0; i<4; i++)
+               {
+                       if(*(++tptr))
+                       {
+                               *tptr=' ';
+                       }
+               }
+       }
+}
+
+/******************************************************************************
+ * RenderString
+ ******************************************************************************/
+
+int RenderString(char *string, int sx, int sy, int maxwidth, int layout, int size, int color)
+{
+       int stringlen, ex, charwidth,i,found;
+       char rstr[BUFSIZE], *rptr=rstr, rc;
+       int varcolor=color;
+
+       //set size
+       
+               strcpy(rstr,string);
+
+               desc.width = desc.height = size;
+               TABULATOR=3*size;
+       //set alignment
+
+               stringlen = GetStringLen(sx, rstr, size);
+
+               if(layout != LEFT)
+               {
+                       switch(layout)
+                       {
+                               case CENTER:    if(stringlen < maxwidth) sx += (maxwidth - stringlen)/2;
+                                               break;
+
+                               case RIGHT:     if(stringlen < maxwidth) sx += maxwidth - stringlen;
+                       }
+               }
+
+       //reset kerning
+
+               prev_glyphindex = 0;
+
+       //render string
+
+               ex = sx + maxwidth;
+
+               while(*rptr != '\0')
+               {
+                       if(*rptr=='~')
+                       {
+                               ++rptr;
+                               rc=*rptr;
+                               found=0;
+                               for(i=0; i<sizeof(sc) && !found; i++)
+                               {
+                                       if(rc==sc[i])
+                                       {
+                                               rc=tc[i];
+                                               found=1;
+                                       }
+                               }
+                               if(found)
+                               {
+                                       if((charwidth = RenderChar(rc, sx, sy, ex, varcolor)) == -1) return sx; /* string > maxwidth */
+                                       sx += charwidth;
+                               }
+                               else
+                               {
+                                       switch(*rptr)
+                                       {
+                                               case 'R': varcolor=RED; break;
+                                               case 'G': varcolor=GREEN; break;
+                                               case 'Y': varcolor=YELLOW; break;
+                                               case 'B': varcolor=BLUE0; break;
+                                               case 'S': varcolor=color; break;
+                                               case 't':                               
+                                                       sx=TABULATOR*((int)(sx/TABULATOR)+1);
+                                                       break;
+                                               case 'T':
+                                                       if(sscanf(rptr+1,"%4d",&i)==1)
+                                                       {
+                                                               rptr+=4;
+                                                               sx=i;
+                                                       }
+                                               break;
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               if (*rptr==0xC3)
+                               {
+                                       ++rptr;
+                                       switch(*rptr)
+                                       {
+                                       case 0x84: *rptr='Ä'; break;
+                                       case 0x96: *rptr='Ö'; break;
+                                       case 0x9C: *rptr='Ü'; break;
+                                       case 0xA4: *rptr='ä'; break;
+                                       case 0xB6: *rptr='ö'; break;
+                                       case 0xBC: *rptr='ü'; break;
+                                       case 0x9F: *rptr='ß'; break;
+                                       default  : *rptr='.'; break;
+                                       }
+                               }
+                               if((charwidth = RenderChar(*rptr, sx, sy, ex, varcolor)) == -1) return sx; /* string > maxwidth */
+                               sx += charwidth;
+                       }
+                       rptr++;
+               }
+       return stringlen;
+}
+
+/******************************************************************************
+ * ShowMessage
+ ******************************************************************************/
+
+void ShowMessage(char *message, int wait)
+{
+       extern int radius;
+       int mxw=400, myw=120+40*wait, mhw=30;
+       int msx,msy;
+       char *tdptr;
+
+       Center_Screen(mxw, myw, &msx, &msy);
+
+       //layout
+
+               RenderBox(msx, msy, mxw, myw, radius, CMH);
+               RenderBox(msx+2, msy+2, mxw-4, myw-4, radius, CMC);
+               RenderBox(msx, msy, mxw, mhw, radius, CMH);
+
+       //message
+
+               tdptr=strdup("Tuxwetter Info");
+               RenderString(tdptr, msx+2, msy+(mhw-4), mxw-4, CENTER, FSIZE_MED, CMHT);
+               free(tdptr);
+               tdptr=strdup(message);
+               RenderString(tdptr, msx+2, msy+mhw+((myw-mhw)/2)-FSIZE_MED/2+(!wait*15), mxw-4, CENTER, FSIZE_MED, CMCT);
+               free(tdptr);
+
+               if(wait)
+               {
+                       RenderBox(msx+mxw/2-25, msy+myw-45, 50, FSIZE_SMALL*3/2, radius, CMCS);
+                       RenderString("OK", msx+mxw/2-26, msy+myw-42+FSIZE_SMALL, 50, CENTER, FSIZE_SMALL, CMCT);
+               }
+               memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres);
+
+               while(wait && (GetRCCode() != KEY_OK));
+
+
+}
+
+void TranslateString(char *src)
+{
+int i,found;
+char rc,*rptr=src,*tptr=src;
+
+       while(*rptr != '\0')
+       {
+               if(*rptr=='~')
+               {
+                       ++rptr;
+                       rc=*rptr;
+                       found=0;
+                       for(i=0; i<sizeof(sc) && !found; i++)
+                       {
+                               if(rc==sc[i])
+                               {
+                                       rc=tc[i];
+                                       found=1;
+                               }
+                       }
+                       if(found)
+                       {
+                               *tptr=rc;
+                       }
+                       else
+                       {
+                               *tptr='~';
+                               tptr++;
+                               *tptr=*rptr;
+                       }
+               }
+               else
+               {
+                       *tptr=*rptr;
+               }
+               tptr++;
+               rptr++;
+       }
+       *tptr=0;
+}
diff --git a/text.h b/text.h
new file mode 100644 (file)
index 0000000..0ee43ed
--- /dev/null
+++ b/text.h
@@ -0,0 +1,14 @@
+#ifndef __TEXT_H__
+
+#define __TEXT_H__
+
+#include "tuxwetter.h"
+
+FT_Error MyFaceRequester(FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face *aface);
+int RenderString(char *string, int sx, int sy, int maxwidth, int layout, int size, int color);
+int GetStringLen(int sx, char *string, int size);
+void CatchTabs(char *text);
+void ShowMessage(char *message, int wait);
+void TranslateString(char *src);
+
+#endif
diff --git a/translator b/translator
new file mode 100755 (executable)
index 0000000..74fcc76
--- /dev/null
@@ -0,0 +1,90 @@
+#!/bin/sh
+#-------------------------------------------------------------------
+# Translator Skript 
+#
+# 
+# translator.sh
+#
+# englisch,franzoesisch Übersetzung mit pda.leo.org
+#
+# V1.1
+#
+# Original von SnowHead
+#
+# Geaendert von barabas
+#
+# V1.2  die Uebersetzung kann nun auch mehrere Worte umfassen
+#
+# Danke an Seddi und zombi
+#
+# V1.3  Anpassung an geaendertes Seitenformat von leo
+#
+#-------------------------------------------------------------------
+
+# URL zur Ausgabedatei
+url=http://localhost/../../../../tmp/pdaleo.html
+
+# Abfrage Sprache waehlen 
+# echo=0 also Rueckgabewert erster Button 1 , zweiter Button 2 , dritter Button 3 
+msgbox title="Leo-~Ubersetzer" msg="~cBitte Sprache ausw~ahlen." select="Abbruch,Deutsch<->Englisch,Deutsch<->Franz~osisch" default=2 timeout=20
+lng=$?
+
+if [ $lng -gt 1 ] ; then
+  
+      case "$lng" in
+      2) lang="ende"
+         ask="englisches/deutsches"
+         ;;
+      3) lang="frde"
+         ask="franz~osisches/deutsches"
+         ;;
+      esac
+    
+     suche="_"
+
+     until [ ! "$suche" ]; do
+     
+          suche=`input t='Zu ~ubersetzendes '$ask' Wort eingeben:' l='@@@@@@@@@@@@@@@@@@@@@@@@@' k=1 d="$suche"`
+          if [ "$suche" ] ; then
+            
+            # bei mehreren Wörtern Leerzeichen durch + ersetzen
+            # und Suchbegriff für TXTHTML aendern
+            # einzelnes Wort -> Treffer
+            # mehrere Worte  -> Uebereinstimmungen
+            
+            if [ `echo $suche | grep -c " "` -gt 0 ]
+            then
+#              leosuche="`echo $suche | sed 's/ /+/g'`"
+              startstring="bereinstimmungen"
+            else
+#              leosuche=$suche
+              startstring="Unmittelbare Treffer"
+            fi
+                       leosuche=`echo $suche | sed "s/' '/'+'/g;s/~A/Ä/g;s/~O/Ö/g;s/~U/Ü/g;s/~a/ä/g;s/~o/ö/g;s/~u/ü/g;s/~s/ß/g"`
+
+            # http://pda.leo.org/?lp=ende&lang=de&searchLoc=0&cmpType=relaxed&relink=on&sectHdr=on&spellToler=std&search=das+Haus
+             
+            wget -O /tmp/pdaleo.tmp 'http://pda.leo.org/?lp='$lang'&lang=de&searchLoc=0&cmpType=relaxed&relink=on&sectHdr=on&spellToler=std&search='$leosuche
+            sed 's/&nbsp;//g
+                 s/<\/td>/\n/g
+                 s/<\n\n>/\n/g
+                 s/<B>/~G/g
+                 s/<\/B>/~S/g
+                 s/\&reg;//g
+                                s/Ã\84/Ä/g
+                                s/Ã\96/Ö/g
+                                s/Ã\9c/Ü/g
+                            s/ä/ä/g
+                                s/ö/ö/g
+                                s/ü/ü/g
+                                s/Ã\9f/ß/g' /tmp/pdaleo.tmp > /tmp/pdaleo.html
+
+#                      suche=`echo $suche | sed "s/Ã\84/Ä/g;s/Ã\96/Ö/g;s/Ã\9c/Ü/g;s/ä/ä/g;s/ö/ö/g;s/ü/ü/g;s/Ã\9f/ß/g;s/Â//g;s/â\80\93/---/g;s/é/é/g;s/ó/ó/g"`
+            /var/plugins/tuxwet/tuxwetter "TXTHTML=~Ubersetzung f~ur ~G$suche,$url|$startstring|table>"
+            
+            rm /tmp/pdaleo.*
+          fi
+          
+     done
+
+fi
\ No newline at end of file
diff --git a/tuxwetter.c b/tuxwetter.c
new file mode 100644 (file)
index 0000000..19a390b
--- /dev/null
@@ -0,0 +1,3598 @@
+/*
+ * tuxwetter.c - TuxBox Weather Plugin
+ *
+ * Copyright (C) 2004 SnowHead <SnowHead@keywelt-board.com>
+ *                    Worschter
+ *
+ * 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.
+ *
+ * $Id: tuxwetter.c,v 3.18 2010/06/18 20:00 SnowHead $
+ */
+
+//getline needed #define _GNU_SOURCE
+#define _GNU_SOURCE
+
+#include <ctype.h>
+#include <string.h>
+#include <stdio.h>
+#include <signal.h>
+#include <time.h>
+//#include <linux/delay.h>
+#include "tuxwetter.h"
+#include "parser.h"
+#include "text.h"
+#include "io.h"
+#include "gfx.h"
+#include "php.h"
+#include "http.h"
+#include "jpeg.h"
+#include "pngw.h"
+#include "gif.h"
+#include "fb_display.h"
+#include "resize.h"
+#include "gifdecomp.h"
+
+#define P_VERSION "3.03"
+
+#ifndef HAVE_DREAMBOX_HARDWARE
+char CONVERT_LIST[]="/var/tuxbox/config/tuxwetter/convert.list";
+#define CFG_FILE       "/var/tuxbox/config/tuxwetter/tuxwetter.conf"
+#define MCF_FILE       "/var/tuxbox/config/tuxwetter/tuxwetter.mcfg"
+#define TIME_FILE      "/var/tuxbox/config/tuxwetter/swisstime"
+//#define MISS_FILE    "/var/tuxbox/config/tuxwetter/missing_translations.txt"
+#else
+char CONVERT_LIST[]="/var/bin/tuxwet/convert.list";
+#define CFG_FILE       "/var/bin/tuxwet/tuxwetter.conf"
+#define MCF_FILE       "/var/bin/tuxwet/tuxwetter.mcfg"
+#define TIME_FILE      "/var/bin/tuxwet/swisstime"
+#define MISS_FILE      "/var/bin/tuxwet/missing_translations.txt"
+#endif
+#define NCF_FILE       "/var/tuxbox/config/neutrino.conf"
+#define ECF_FILE       "/var/tuxbox/config/enigma/config"
+#define BMP_FILE       "tuxwettr.bmp"
+#define JPG_FILE       "/tmp/picture.jpg"
+#define GIF_FILE       "/tmp/picture.gif"
+#define GIF_MFILE      "/tmp/gpic"
+#define PNG_FILE       "/tmp/picture.png"
+#define PHP_FILE       "/tmp/php.htm"
+#define TMP_FILE       "/tmp/tuxwettr.tmp"
+#define ICON_FILE      "/tmp/icon.gif"
+#define TRANS_FILE     "/tmp/picture.html"
+static char TCF_FILE[128]="";
+
+#define LIST_STEP      10
+#define MAX_FUNCS  7
+#define LCD_CPL        12
+#define LCD_RDIST      10
+
+// Forward defines
+int pic_on_data(char *name, int xstart, int ystart, int xsize, int ysize, int wait, int single, int center, int rahmen);
+char par[32]="1005530704", key[32]="a9c95f7636ad307b";
+void TrimString(char *strg);
+
+// Color table stuff
+static char menucoltxt[][25]={"Content_Selected_Text","Content_Selected","Content_Text","Content","Content_inactive_Text","Content_inactive","Head_Text","Head"};
+//static char spres[][5]={"","_crt","_lcd"};
+
+//#define FONT "/usr/share/fonts/md_khmurabi_10.ttf"
+#define FONT2 "/share/fonts/pakenham.ttf"
+// if font is not in usual place, we look here:
+#define FONT "/share/fonts/neutrino.ttf"
+
+//                                         CMCST,  CMCS,   CMCT,   CMC,    CMCIT,  CMCI,   CMHT,   CMH
+//                                         WHITE,  BLUE0,  TRANSP, CMS,    ORANGE, GREEN,  YELLOW, RED
+//                                         CMCP0,  CMCP1,  CMCP2,  CMCP3
+unsigned char bl[] = { 0x00,   0x00,   0xFF,   0x80,   0xFF,   0x80,   0x00,   0x80,
+                                               0xFF,   0xFF,   0x00,   0xFF,   0x00,   0x00,   0x00,   0x00,
+                                               0x00,   0x00,   0x00,   0x00};
+unsigned char gn[] = { 0x00,   0x00,   0xFF,   0x00,   0xFF,   0x00,   0xC0,   0x00,
+                                               0xFF,   0x80,   0x00,   0x80,   0xC0,   0xFF,   0xFF,   0x00,
+                                               0x00,   0x00,   0x00,   0x00};
+unsigned char rd[] = { 0x00,   0x00,   0xFF,   0x00,   0xFF,   0x00,   0xFF,   0x00,
+                                               0xFF,   0x00,   0x00,   0x00,   0xFF,   0x00,   0xFF,   0xFF,
+                                               0x00,   0x00,   0x00,   0x00};
+unsigned char tr[] = { 0xFF,   0xFF,   0xFF,   0xA0,   0xFF,   0x80,   0xFF,   0xFF,
+                                               0xFF,   0xFF,   0x00,   0xFF,   0xFF,   0xFF,   0xFF,   0xFF,
+                                               0x00,   0x00,   0x00,   0x00};
+
+// Menu structure stuff
+enum {TYP_MENU, TYP_CITY, TYP_PICTURE, TYP_PICHTML, TYP_TXTHTML, TYP_TEXTPAGE, TYP_TXTPLAIN, TYP_EXECUTE, TYP_ENDMENU, TYP_WEATH};
+static char TYPESTR[TYP_WEATH+1][10]={"MENU=","Stadt=","PICTURE=","PICHTML=","TXTHTML=","TEXTPAGE=","TXTPLAIN=","EXECUTE=","ENDMENU"};
+enum {PTYP_ASK, PTYP_JPG, PTYP_GIF, PTYP_PNG};
+static char PTYPESTR[PTYP_PNG+1][5]={"","JPG","GIF","PNG"};
+char *cmdline=NULL;
+char *line_buffer=NULL;
+
+typedef struct {char *entry; int headerpos; int type; int pictype; int repeat; int underline; int absolute;} LISTENTRY;
+typedef LISTENTRY *PLISTENTRY;
+typedef PLISTENTRY     *LIST;
+typedef struct {int num_headers; int act_header; int max_header; char **headertxt; int *headerlevels; int *lastheaderentrys; int num_entrys; int act_entry; int max_entrys; LIST list;} MENU;
+
+MENU menu;
+MENU funcs;
+
+int Check_Config(void);
+int Clear_List(MENU *m, int mode);
+int Get_Selection(MENU *m);
+int AddListEntry(MENU *m, char *line, int pos);
+int Get_Menu();
+void ShowInfo(MENU *m);
+
+// Misc
+char NOMEM[]="Tuxwetter <Out of memory>\n";
+unsigned char *lfb = 0, *lbb = 0;
+int intype=0, show_icons=0, gmodeon=0, ctmo=0, metric=1, loadalways=0, radius=0;
+char city_code[30] = "";
+char city_name[50] = "";
+unsigned int alpha=0x0202;
+int show_splash=0;
+char lastpicture[BUFSIZE]="";
+char nstr[BUFSIZE]="";
+char *trstr;
+char *htmstr;
+unsigned char *proxyadress=NULL, *proxyuserpwd=NULL;
+char INST_FILE[]="/tmp/rc.locked";
+char LCDL_FILE[]="/tmp/lcd.locked";
+int instance=0;
+
+int get_instance(void)
+{
+FILE *fh;
+int rval=0;
+
+       if((fh=fopen(INST_FILE,"r"))!=NULL)
+       {
+               rval=fgetc(fh);
+               fclose(fh);
+       }
+       return rval;
+}
+
+void put_instance(int pval)
+{
+FILE *fh;
+
+       if(pval)
+       {
+               if((fh=fopen(INST_FILE,"w"))!=NULL)
+               {
+                       fputc(pval,fh);
+                       fclose(fh);
+               }
+               if(pval==1)
+               {
+                       if((fh=fopen(LCDL_FILE,"w"))!=NULL)
+                       {
+                               fputc(0,fh);
+                               fclose(fh);
+                       }
+               }
+       }
+       else
+       {
+               remove(INST_FILE);
+               remove(LCDL_FILE);
+       }
+}
+
+static void quit_signal(int sig)
+{
+       put_instance(get_instance()-1);
+       printf("tuxwetter Version %s killed\n",P_VERSION);
+       exit(1);
+}
+
+void xremove(char *fname)
+{
+FILE *fh;
+
+       if((fh=fopen(fname,"r"))!=NULL)
+               {
+               fclose(fh);
+               remove(fname);
+               }
+}
+
+int Read_Neutrino_Cfg(char *entry)
+{
+FILE *nfh;
+char tstr [512], *cfptr=NULL;
+int rv=-1,styp=0;
+
+       if((((nfh=fopen(NCF_FILE,"r"))!=NULL)&&(styp=1)) || ((((nfh=fopen(ECF_FILE,"r"))!=NULL))&&(styp=2)))
+       {
+               tstr[0]=0;
+
+               while((!feof(nfh)) && ((strstr(tstr,entry)==NULL) || ((cfptr=strchr(tstr,'='))==NULL)))
+               {
+                       fgets(tstr,500,nfh);
+               }
+               if(!feof(nfh) && cfptr)
+               {
+                       ++cfptr;
+                       if(styp==1)
+                       {
+                               if(sscanf(cfptr,"%d",&rv)!=1)
+                               {
+                                       if(strstr(cfptr,"true")!=NULL)
+                                               rv=1;
+                                       else if(strstr(cfptr,"false")!=NULL)
+                                               rv=0;
+                                       else
+                                               rv=-1;
+                               }
+                       }
+                       if(styp==2)
+                       {
+                               if(sscanf(cfptr,"%x",&rv)!=1)
+                               {
+                                       rv=-1;
+                               }
+                       }
+//                     printf("%s\n%s=%s -> %d\n",tstr,entry,cfptr,rv);
+               }
+               fclose(nfh);
+       }
+       return rv;
+}
+
+/******************************************************************************
+ * ReadConf (0=fail, 1=done)
+ ******************************************************************************/
+
+int ReadConf(char *iscmd)
+{
+       FILE *fd_conf;
+       char *cptr;
+
+       //open config
+
+       if((!strlen(TCF_FILE)) ||  (strlen(TCF_FILE) && !(fd_conf = fopen(TCF_FILE, "r"))))
+       {
+               if(!(fd_conf = fopen(CFG_FILE, "r")))
+               {
+                       if(iscmd==NULL)
+                       {
+                               printf("Tuxwetter <unable to open Config-File>\n");
+                               return 0;
+                       }
+               }
+               else
+               {
+                       strcpy(TCF_FILE,CFG_FILE);
+               }
+       }
+       if(fd_conf)
+       {
+               fclose(fd_conf);
+       }
+       if(!(fd_conf = fopen(MCF_FILE, "r")))
+       {
+               fd_conf = fopen(TCF_FILE, "r");
+       }
+
+       while(fgets(line_buffer, BUFSIZE, fd_conf))
+       {
+               TrimString(line_buffer);
+
+               if((line_buffer[0]) && (line_buffer[0]!='#') && (!isspace(line_buffer[0])) && ((cptr=strchr(line_buffer,'='))!=NULL))
+               {
+                       if(strstr(line_buffer,"SplashScreen") == line_buffer)
+                               {
+                                       sscanf(cptr+1,"%d",&show_splash);
+                               }
+                       if(strstr(line_buffer,"ShowIcons") == line_buffer)
+                               {
+                                       sscanf(cptr+1,"%d",&show_icons);
+                               }
+                       if(strstr(line_buffer,"ProxyAdressPort") == line_buffer)
+                               {
+                                       proxyadress=strdup(cptr+1);
+                               }
+                       if(strstr(line_buffer,"ProxyUserPwd") == line_buffer)
+                               {
+                                       proxyuserpwd=strdup(cptr+1);
+                               }
+                       if(strstr(line_buffer,"ConnectTimeout") == line_buffer)
+                               {
+                                       sscanf(cptr+1,"%d",&ctmo);
+                               }
+                       if(strstr(line_buffer,"Metric") == line_buffer)
+                               {
+                                       sscanf(cptr+1,"%d",&metric);
+                               }
+                       if(strstr(line_buffer,"LoadAlways") == line_buffer)
+                               {
+                                       sscanf(cptr+1,"%d",&loadalways);
+                               }
+                       if(strstr(line_buffer,"PartnerID") == line_buffer)
+                               {
+                                       strncpy(par,cptr+1,sizeof(par)-1);
+                               }
+                       if(strstr(line_buffer,"LicenseKey") == line_buffer)
+                               {
+                                       strncpy(key,cptr+1,sizeof(key)-1);
+                               }
+                       if(strstr(line_buffer,"InetConnection") == line_buffer)
+                               {
+                                       if(strstr(cptr+1,"ISDN")!=NULL)
+                                               {
+                                                       intype=1;
+                                               }
+                                       if(strstr(cptr+1,"ANALOG")!=NULL)
+                                               {
+                                                       intype=2;
+                                               }
+                               }
+
+/*                     if(strstr(line_buffer,"FONT=") == line_buffer)
+                       {
+                               strcpy(FONT,strchr(line_buffer,'=')+1);
+                       }
+                       if(strstr(line_buffer,"FONTSIZE=") == line_buffer)
+                       {
+                               sscanf(strchr(line_buffer,'=')+1,"%d",&FSIZE_MED);
+                               FSIZE_FSIZE_BIG=(FSIZE_MED*4)/3;
+                               FSIZE_SMALL=(FSIZE_MED*4)/5;
+                       }
+*/
+               }
+       }
+
+       return 1;
+}
+
+int Transform_Entry(char *src, char *trg)
+{
+int type=0,tret=-1,fcnt,fpos,tval,ferr,tsub;   
+int noprint,rndval,loctime=0;
+char /*pstr[512],nstr[512],dstr[50],*/fstr[5],*cptr,*tptr,*aptr;
+time_t stime;
+struct tm *tltime;
+
+       type=0;
+       tsub=0;
+       *trg=0;
+       if((cptr=strchr(src,','))==NULL)
+       {
+               return tret;
+       }
+       cptr++;
+       aptr=strchr(cptr,'|');
+       if(aptr)
+       {
+               while(aptr && ((aptr=strchr(aptr,'|'))!=NULL))
+               {
+                       ++aptr;
+                       rndval=0;
+                       if(*aptr=='L')
+                       {
+                               ++aptr;
+                               loctime=1;
+                       }
+                       if(*aptr=='R')
+                       {
+                               ++aptr;
+                               rndval=1;
+                       }
+                       if(*aptr=='N')
+                       {
+                               ++aptr;
+                       }
+                       if(sscanf(aptr,"%d",&tval)==1)
+                       {
+                               while((aptr<(cptr+strlen(cptr))) && (*aptr=='-' || ((*aptr>='0') && (*aptr<='9'))))
+                               { 
+                                       ++aptr;
+                               }
+                               if(!rndval)
+                               {
+                                       switch(*aptr)
+                                       {
+                                               case 'Y': tsub+=tval*365*24*3600; break;
+                                               case 'M': tsub+=tval*31*24*3600; break;
+                                               case 'D': tsub+=tval*24*3600; break;
+                                               case 'h': tsub+=tval*3600; break;
+                                               case 'm': tsub+=tval*60; break;
+                                               case 's': tsub+=tval; break;
+                                       }
+                               }
+                       }
+               }
+               time(&stime);   
+               stime-=tsub;
+               if(loctime)
+               {
+                       tltime=localtime(&stime);
+               }
+               else
+               {
+                       tltime=gmtime(&stime);
+               }       
+//             strncpy(nstr,src,cptr-src);
+//             ++cptr;
+               fpos=0;
+               ferr=0;
+               tval=0;
+               while(*cptr>' ' && !ferr)
+               {
+                       if(*cptr=='|')
+                       {
+                               noprint=0;
+                               rndval=0;
+                               ++cptr;
+                               if(*cptr=='L')
+                               {
+                                       ++cptr;
+                               }
+                               if(*cptr=='N')
+                               {
+                                       noprint=1;
+                                       ++cptr;
+                               }
+                               if(*cptr=='R')
+                               {
+                                       ++cptr;
+                                       sscanf(cptr,"%d",&rndval);
+                                       rndval=abs(rndval);
+                               }
+                               while(*cptr && ((*cptr=='-') || ((*cptr>='0') && (*cptr<='9'))))
+                               {
+                                       cptr++;
+                               }
+                               tptr=cptr+1;
+                               fcnt=1;
+                               while(*tptr && (*tptr==*cptr))
+                               {
+                                       fcnt++;
+                                       tptr++;
+                               }
+                               sprintf(fstr,"%%0%dd",fcnt);
+                               switch(*cptr)
+                               {
+                                       case 'Y':
+                                               if(fcnt==4)
+                                               {
+                                                       tval=1900+tltime->tm_year;
+                                               }
+                                               else
+                                               {
+                                                       tval=tltime->tm_year-100;
+                                               }
+                                               break;
+                                                                       
+                                       case 'M':
+                                               tval=tltime->tm_mon+1;
+                                               break;
+                                                               
+                                       case 'D':
+                                               tval=tltime->tm_mday;
+                                               break;
+                                                                               
+                                       case 'h':
+                                               tval=tltime->tm_hour;
+                                               break;
+                                                                               
+                                       case 'm':
+                                               tval=tltime->tm_min;
+                                               break;
+                                                                               
+                                       case 's':
+                                               tval=tltime->tm_sec;
+                                               break;
+                                                                               
+                                       default:
+                                               ferr=1;
+                                               break;
+                               }
+                               if(!ferr && !noprint)
+                               {
+                                       if(rndval)
+                                       {
+                                               tval=((int)(tval/rndval))*rndval;
+                                       }
+                                       sprintf(trg+fpos,fstr,tval);
+                                       fpos+=fcnt;
+                               }
+                               cptr=tptr;
+                       }
+                       else
+                       {
+                               *(trg+(fpos++))=*cptr;
+                               ++cptr;
+                       }
+               }
+               *(trg+fpos)=0;
+               tret=ferr;
+       }
+       else
+       {
+               ferr=0;
+               tret=0;
+               strcpy(trg,cptr);
+               strcpy(nstr,src);
+               if((cptr=strchr(nstr,','))!=NULL)
+               {
+                       *cptr=0;
+               }
+       }
+       return tret;
+}
+
+
+void TrimString(char *strg)
+{
+char *pt1=strg, *pt2=strg;
+
+       while(*pt2 && *pt2<=' ')
+       {
+               ++pt2;
+       }
+       if(pt1 != pt2)
+       {
+               do
+               {
+                       *pt1=*pt2;
+                       ++pt1;
+                       ++pt2;
+               }
+               while(*pt2);
+               *pt1=0;
+       }
+       while(strlen(strg) && strg[strlen(strg)-1]<=' ')
+       {
+               strg[strlen(strg)-1]=0;
+       }
+}
+
+
+int Check_Config(void)
+{
+int rv=-1, level=0;
+char *pt1;
+FILE *fh;
+
+       if((fh=fopen(TCF_FILE,"r"))!=NULL)
+       {
+               while(fgets(line_buffer, BUFSIZE, fh))
+               {
+                       TrimString(line_buffer);
+                       if(strstr(line_buffer,TYPESTR[TYP_MENU])==line_buffer)
+                       {
+                               if(menu.num_headers>=menu.max_header)
+                               {
+                                       if((menu.headertxt=realloc(menu.headertxt,(menu.max_header+LIST_STEP)*sizeof(char*)))==NULL)
+                                       {
+                                               printf(NOMEM);
+                                               Clear_List(&menu,0);
+                                               return rv;
+                                       }
+                                       memset(&menu.headertxt[menu.max_header],0,LIST_STEP*sizeof(char*));
+                                       if((menu.headerlevels=realloc(menu.headerlevels,(menu.max_header+LIST_STEP)*sizeof(int)))==NULL)
+                                       {
+                                               printf(NOMEM);
+                                               Clear_List(&menu,0);
+                                               return rv;
+                                       }
+                                       if((menu.lastheaderentrys=realloc(menu.lastheaderentrys,(menu.max_header+LIST_STEP)*sizeof(int)))==NULL)
+                                       {
+                                               printf(NOMEM);
+                                               Clear_List(&menu,0);
+                                               return rv;
+                                       }
+                               menu.max_header+=LIST_STEP;
+                               }
+                               pt1=strchr(line_buffer,'=');
+                               if(*(++pt1)=='*')
+                               {
+                                       ++pt1;
+                               }
+                               if(menu.headertxt[menu.num_headers])
+                               {
+                                       free(menu.headertxt[menu.num_headers]);
+                                       menu.headertxt[menu.num_headers]=NULL;
+                               }
+                               menu.headerlevels[menu.num_headers]=level++;
+                               menu.headertxt[menu.num_headers++]=strdup(pt1);
+                       }
+                       else
+                       {
+                               if(strstr(line_buffer,TYPESTR[TYP_ENDMENU])==line_buffer)
+                               {
+                               --level;
+                               }
+                       }
+               }
+               rv=0;
+               fclose(fh);
+       }
+       return rv;
+}
+
+int Clear_List(MENU *m, int mode)
+{
+int i;
+PLISTENTRY entr;
+
+       if(m->max_entrys)
+       {
+               for(i=0; i<m->num_entrys; i++)
+               {
+                       if(m->list[i]->entry) free(m->list[i]->entry);
+                       free(m->list[i]);
+               }
+               m->num_entrys=0;
+               m->max_entrys=0;
+               m->list=NULL;
+       }
+       switch(mode)
+       {
+               case 0: return 0;
+               
+               case 1:
+       
+                       if((m->list=calloc(LIST_STEP,sizeof(PLISTENTRY)))==NULL)
+                       {
+                               printf(NOMEM);
+                               return -1;
+                       }
+
+                       for(i=0; i<LIST_STEP; i++)
+                       {
+                               if((entr=calloc(1,sizeof(LISTENTRY)))==NULL)
+                                       {
+                                       printf(NOMEM);
+                                       Clear_List(m,0);
+                                       return -1;
+                                       }
+                               m->list[i]=entr;
+                       }
+                       m->max_entrys=LIST_STEP;
+                       break;
+                       
+               case -1:
+                       if(m->num_headers && m->headertxt)
+                       {
+                               for(i=0; i<m->num_headers; i++)
+                               {
+                                       free(m->headertxt[i]);
+                               }
+                               m->num_headers=0;
+                               m->list=NULL;
+                       }
+                       if(m->headertxt)
+                       {
+                               free(m->headertxt);
+                               m->headertxt=NULL;
+                       }
+                       break;
+       }
+       return 0;
+}
+
+int Get_Selection(MENU *m)
+{
+int rv=1,rccode, mloop=1;
+//int lrow,lpos;
+//char dstr[128];
+char *lcptr = NULL, *lcstr= NULL, *lcdptr = NULL;
+//     LCD_Init();
+       do{
+               rccode=-1;
+               ShowInfo(m);
+               if(m->list[m->act_entry]->entry)
+               {
+                       sprintf(trstr,"%s%s",(m->list[m->act_entry]->type==TYP_MENU)?"> ":"",m->list[m->act_entry]->entry);
+                       if((lcptr=strchr(trstr,','))!=NULL)
+                       {
+                               *lcptr=0;
+                       }
+               }
+               else
+               {
+                       sprintf(trstr,"%s",prs_translate("Kein Eintrag",CONVERT_LIST));
+               }
+               lcstr=strdup(trstr);
+               lcptr=lcdptr=lcstr;
+               while(*lcptr)
+               {
+                       if(*lcptr=='~')
+                       {
+                               ++lcptr;
+                               if(*lcptr)
+                               {
+                                       ++lcptr;
+                               }
+                       }
+                       *(lcdptr++)=*(lcptr++);
+               }
+#if 0
+               *lcptr=0;
+               LCD_Clear();
+               LCD_draw_rectangle (0,0,119,59, LCD_PIXEL_ON,LCD_PIXEL_OFF);
+               LCD_draw_rectangle (3,3,116,56, LCD_PIXEL_ON,LCD_PIXEL_OFF);
+               lpos=strlen(lcstr);
+               lrow=0;
+               while(lpos>0)
+               {
+                       strncpy(dstr,lcstr+LCD_CPL*lrow,LCD_CPL);
+                       dstr[LCD_CPL]=0;
+                       lpos-=LCD_CPL;
+                       LCD_draw_string(13, (lrow+2)*LCD_RDIST, dstr);
+                       lrow++;
+               }
+               LCD_update();
+#endif
+               switch((rccode = GetRCCode()))
+               {
+                       case KEY_RED:
+                               m->act_entry=(m->act_entry/10)*10;
+                               rv=1;
+                               mloop=0;
+                               break;
+
+                       case KEY_GREEN:
+                               m->act_entry=(m->act_entry/10)*10+1;
+                               rv=1;
+                               mloop=0;
+                               break;
+
+                       case KEY_YELLOW:
+                               m->act_entry=(m->act_entry/10)*10+2;
+                               rv=1;
+                               mloop=0;
+                               break;
+
+                       case KEY_BLUE:
+                               m->act_entry=(m->act_entry/10)*10+3;
+                               rv=1;
+                               mloop=0;
+                               break;
+
+                       case KEY_1:
+                               m->act_entry=(m->act_entry/10)*10+4;
+                               rv=1;
+                               mloop=0;
+                               break;
+
+                       case KEY_2:
+                               m->act_entry=(m->act_entry/10)*10+5;
+                               rv=1;
+                               mloop=0;
+                               break;
+
+                       case KEY_3:
+                               m->act_entry=(m->act_entry/10)*10+6;
+                               rv=1;
+                               mloop=0;
+                               break;
+
+                       case KEY_4:
+                               m->act_entry=(m->act_entry/10)*10+7;
+                               rv=1;
+                               mloop=0;
+                               break;
+
+                       case KEY_5:
+                               m->act_entry=(m->act_entry/10)*10+8;
+                               rv=1;
+                               mloop=0;
+                               break;
+
+                       case KEY_6:
+                               m->act_entry=(m->act_entry/10)*10+9;
+                               rv=1;
+                               mloop=0;
+                               break;
+
+                       case KEY_UP:
+                       case KEY_VOLUMEDOWN:    --m->act_entry;
+                                       break;
+
+                       case KEY_DOWN:
+                       case KEY_VOLUMEUP:      ++m->act_entry;
+                                       break;
+
+                       case KEY_PAGEUP :       m->act_entry-=10;
+                                       break;
+
+                       case KEY_PAGEDOWN :     m->act_entry+=10;
+                                       break;
+
+                       case KEY_OK:
+                               rv=1;
+                               mloop=0;
+                               break;
+
+                       case KEY_EXIT:
+                               rv=0;
+                               mloop=0;
+                               break;
+
+                       case KEY_MUTE:  break;
+
+                       case KEY_HELP:
+                               rv=-99;
+                               mloop=0;
+                               break;
+
+                       case KEY_POWER:
+                               rv=-1;
+                               mloop=0;
+                               break;
+
+                       case KEY_SETUP:
+                               rv=-98;
+                               mloop=0;
+                               break;
+                               
+                       default:        continue;
+               }
+
+               if (m->act_entry>=m->num_entrys)
+               {
+                       m->act_entry=0;
+               }
+               if(m->act_entry<0)
+               {
+                       m->act_entry=(m->num_entrys)?m->num_entrys-1:0;
+               }
+       } while(mloop);
+
+       ShowInfo(m);
+
+return rv;
+}
+
+int AddListEntry(MENU *m, char *line, int pos)
+{
+int i,j,found=0,pfound=1;
+PLISTENTRY entr;
+char *ptr1,*ptr2,*ptr3;
+
+
+       if(!strlen(line))
+       {
+               return 1;
+       }
+       
+       if(m->num_entrys>=m->max_entrys)
+       {
+               if((m->list=realloc(m->list,(m->max_entrys+LIST_STEP)*sizeof(PLISTENTRY)))==NULL)
+               {
+                       printf(NOMEM);
+                       Clear_List(m,0);
+                       return 0;
+               }
+               for(i=m->num_entrys; i<m->num_entrys+LIST_STEP; i++)
+               {
+                       if((entr=calloc(1,sizeof(LISTENTRY)))==NULL)
+                               {
+                               printf(NOMEM);
+                               Clear_List(m,0);
+                               return -1;
+                               }
+                       m->list[i]=entr;
+               }
+               m->max_entrys+=LIST_STEP;
+       }
+       
+       entr=m->list[m->num_entrys];
+
+       if(m == &funcs)
+       {
+               entr->type=TYP_WEATH;
+               entr->entry=strdup(line);
+               entr->headerpos=pos;
+               m->num_entrys++;
+               found=1;
+       }
+       else
+       {
+               for(i=TYP_MENU; !found && i<=TYP_EXECUTE; i++)
+               {
+                       if((ptr1=strstr(line,TYPESTR[i]))==line)
+                       {
+                               ptr2=strchr(ptr1,'=');
+                               ptr2++;
+                               if(*ptr2=='*')
+                               {
+                                       entr->underline=1;
+                                       while(*(++ptr2))
+                                       {
+                                               *(ptr2-1)=*ptr2;
+                                       }
+                                       *(ptr2-1)=0;
+                                       ptr2=strchr(ptr1,'=')+1;
+                               }
+                               if((i==TYP_MENU) || ((ptr1=strchr(ptr2,','))!=NULL))
+                               {
+                                       if(i!=TYP_MENU)
+                                       {
+                                               ++ptr1;
+                                               if((ptr3=strstr(ptr1,"abs://"))!=NULL)
+                                               {
+                                                       memmove(ptr3,ptr3+3,strlen(ptr3));
+                                                       entr->absolute=1;
+                                               }
+                                               else
+                                               {
+                                                       entr->absolute=0;
+                                               }
+                                               if((i==TYP_PICTURE) || (i==TYP_PICHTML))
+                                               {
+                                                       if(*ptr1=='|')
+                                                       {
+                                                               pfound=0;
+                                                               ptr2=ptr1;
+                                                               ++ptr1;
+                                                               for(j=PTYP_JPG; !pfound && j<=PTYP_PNG; j++)
+                                                               {
+                                                                       if(strncasecmp(ptr1,PTYPESTR[j],3)==0)
+                                                                       {
+                                                                               pfound=1;
+                                                                               entr->pictype=j;
+                                                                               ptr1+=3;
+                                                                               if(sscanf(ptr1,"%d",&(entr->repeat))!=1)
+                                                                               {
+                                                                                       entr->repeat=0;
+                                                                               }
+                                                                               ptr1=strchr(ptr1,'|');
+                                                                               while(ptr1 && (*(++ptr1)))
+                                                                               {
+                                                                                       *(ptr2++)=*ptr1;
+                                                                               }
+                                                                               *(ptr2)=0;
+                                                                       }
+                                                               }       
+                                                       }
+                                               }
+                                       }
+                                       ptr2=strchr(line,'=');
+                                       ptr2++;
+                                       entr->type=i;
+                                       if((i==TYP_TXTHTML) || (i==TYP_TEXTPAGE) || (i==TYP_TXTPLAIN))
+                                       {
+                                               entr->pictype=i;
+                                       }
+                                       entr->entry=strdup(ptr2);
+                                       entr->headerpos=pos;
+                                       m->num_entrys++;
+                                       found=1;
+                               }
+                       }
+               }
+       }
+       return !found || (found && pfound);
+}
+
+int Get_Menu(void)
+{
+int rv=-1, loop=1, mlevel=0, clevel=0, pos=0;
+char *pt1;
+FILE *fh;
+
+       Clear_List(&menu,1);
+       if((fh=fopen(TCF_FILE,"r"))!=NULL)
+       {
+               loop=1;
+               while((loop==1) && fgets(line_buffer, BUFSIZE, fh))
+               {
+                       TrimString(line_buffer);
+                       pt1=strstr(line_buffer,TYPESTR[TYP_MENU]);
+                       if(pt1 && (pt1==line_buffer))
+                       {
+                               if(pos==menu.act_header)
+                               {
+                                       clevel=menu.headerlevels[pos];
+                                       loop=0;
+                               }
+                               mlevel++;
+                               pos++;
+                       }
+                       else
+                       {
+                               pt1=strstr(line_buffer,TYPESTR[TYP_ENDMENU]);
+                               if(pt1 && (pt1==line_buffer))
+                               {
+                                       mlevel--;
+                               }
+                       }
+               }
+               if(loop)
+               {
+                       return rv;
+               }
+               
+               --pos;
+               --mlevel;
+               loop=1;
+               while((loop==1) && fgets(line_buffer, BUFSIZE, fh))
+               {
+                       TrimString(line_buffer);
+                       pt1=strstr(line_buffer,TYPESTR[TYP_MENU]);
+                       if(pt1 && (pt1==line_buffer))
+                       {
+                               pos++;
+                               if(mlevel==clevel)
+                               {
+                                       AddListEntry(&menu, line_buffer, pos);
+                                       rv=0;
+                               }
+                               mlevel++;
+                       }
+                       pt1=strstr(line_buffer,TYPESTR[TYP_ENDMENU]);
+                       if(pt1 && (pt1==line_buffer))
+                       {
+                               mlevel--;
+                       }
+                       else
+                       {
+                               if(mlevel==clevel)
+                               {
+                                       AddListEntry(&menu, line_buffer, pos);
+                                       rv=0;
+                               }
+                       }
+                       if(mlevel<clevel)
+                       {
+                               loop=0;
+                       }
+               }
+       fclose(fh);
+       }
+
+       return rv;
+}
+
+/******************************************************************************
+ * ShowInfo
+ ******************************************************************************/
+
+#define XX 0xA7
+#define XL 58
+
+void ShowInfo(MENU *m)
+{
+       int scrollbar_len, scrollbar_ofs, scrollbar_cor, loop;
+       int index=m->act_entry,tind=m->act_entry, sbw=(m->num_entrys>10)?14:0;
+       char tstr[BUFSIZE], *tptr;
+       int moffs=35, ixw=400, iyw=(m->num_entrys<10)?((m->num_entrys+1)*30+moffs):375, dy, my, mh=iyw-moffs-radius-8, toffs, soffs=4, isx, isy;
+       dy=(m->num_entrys<10)?30:(mh/11);
+       toffs=dy/2;
+       my=moffs+dy+toffs;
+       
+       Center_Screen(ixw, iyw, &isx, &isy);
+
+       tind=index;
+       
+       //frame layout
+       RenderBox(isx, isy, ixw, iyw, radius, CMC);
+//     RenderBox(0, 0, ixw, iyw, GRID, CMCS);
+
+       // titlebar
+       RenderBox(isx+2, isy+2, ixw-2, moffs+5, radius, CMH);
+
+       //selectbar
+       RenderBox(isx+2, isy+moffs+toffs+soffs+(index%10)*dy+2, ixw-sbw-2, dy+2, radius, CMCS);
+
+
+       if(sbw)
+       {
+               //sliderframe
+               RenderBox(isx+ixw-sbw, isy+moffs+8, sbw, mh, radius, CMCP1);
+               //slider
+               scrollbar_len = (double)mh / (double)((m->num_entrys/LIST_STEP+1)*LIST_STEP);
+               scrollbar_ofs = scrollbar_len*(double)((index/LIST_STEP)*LIST_STEP);
+               scrollbar_cor = scrollbar_len*(double)LIST_STEP;
+               RenderBox(isx+ixw-sbw, isy+moffs + scrollbar_ofs+8, sbw,  scrollbar_cor , radius, CMCP3);
+       }
+
+       // Title text
+       RenderString(m->headertxt[m->act_header], isx+45, isy+dy-soffs+3, ixw-sbw, LEFT, FSIZE_BIG, CMHT);
+
+       index /= 10;
+       //Show table of commands
+       for(loop = index*10; (loop < (index+1)*10) && (loop < m->num_entrys); ++loop)
+       {
+               strcpy(tstr,m->list[loop]->entry);
+               if((tptr=strchr(tstr,','))!=NULL)
+               {
+                       *tptr=0;
+               }
+               RenderString(tstr, isx+45, isy+my, ixw-sbw-65, LEFT, FSIZE_MED, ((loop%10) == (tind%10))?CMCST:CMCT);
+               if(m->list[loop]->type==TYP_MENU)
+               {
+                       RenderString(">", isx+30, isy+my, 65, LEFT, FSIZE_MED, ((loop%10) == (tind%10))?CMCST:CMCT);
+               }
+               if(m->list[loop]->underline)
+               {
+                       RenderBox(isx+10, isy+my+soffs+2, ixw-10-sbw, my+soffs+2, 0, CMCP3);
+                       RenderBox(isx+10, isy+my+soffs+3, ixw-10-sbw, my+soffs+3, 0, CMCP1);
+               }
+
+               switch(loop % 10)
+               {
+                       case 0: RenderCircle(isx+9,isy+my-15,RED);    break;
+                       case 1: RenderCircle(isx+9,isy+my-15,GREEN);  break;
+                       case 2: RenderCircle(isx+9,isy+my-15,YELLOW); break;
+                       case 3: RenderCircle(isx+9,isy+my-15,BLUE0);  break;
+/*
+                       case 0: PaintIcon("/share/tuxbox/neutrino/icons/rot.raw",9,my-17,1); break;
+                       case 1: PaintIcon("/share/tuxbox/neutrino/icons/gruen.raw",9,my-17,1); break;
+                       case 2: PaintIcon("/share/tuxbox/neutrino/icons/gelb.raw",9,my-17,1); break;
+                       case 3: PaintIcon("/share/tuxbox/neutrino/icons/blau.raw",9,my-17,1); break;
+*/
+                       default:
+                               sprintf(tstr,"%1d",(loop % 10)-3);
+                               RenderString(tstr, isx+10, isy+my-1, 15, CENTER, FSIZE_SMALL, ((loop%10) == (tind%10))?CMCST:CMCT);
+                       break;
+
+               }
+               my += dy;
+       }
+       //copy backbuffer to framebuffer
+       memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres);
+}
+
+
+/* Parse City-Code from Entry
+ */
+
+static int prs_get_city(void)
+{
+char *tptr;
+int cpos;
+int res;
+int len;
+
+       len=strlen(menu.list[menu.act_entry]->entry);
+
+       if ((tptr=strchr(menu.list[menu.act_entry]->entry,','))!=NULL)
+       {
+               ShowInfo(&menu);
+               if(!cmdline)
+               {
+                       ShowMessage(prs_translate("Bitte warten",CONVERT_LIST),0);
+               }
+               cpos=(tptr-menu.list[menu.act_entry]->entry);
+               strncpy(city_code,++tptr,len-cpos-1);
+               strncpy(city_name,menu.list[menu.act_entry]->entry,cpos);
+               city_name[cpos]=0;
+               city_code[len-cpos-1]=0;
+               printf("Tuxwetter <Citycode %s selected>\n",city_code);
+               if((res=parser(city_code,CONVERT_LIST,metric,intype,ctmo))!=0)
+               {
+                       ShowMessage((res==-1)?prs_translate("keine Daten vom Wetterserver erhalten!",CONVERT_LIST):prs_translate("Datei convert.list nicht gefunden",CONVERT_LIST),1);
+                       city_code[0]=0;
+                       return 1;
+               }
+       }
+       else
+       {
+               ShowMessage(prs_translate("Ungültige Daten aus tuxwetter.conf",CONVERT_LIST),1);
+               city_code[0]=0;
+               return 1;
+       }
+       
+       return 0;
+}
+
+void clear_screen(void)
+{
+//     for(; sy <= ey; sy++) memset(lbb + sx + var_screeninfo.xres*(sy),TRANSP, ex-sx + 1);
+       memset(lbb, TRANSP, fix_screeninfo.line_length*var_screeninfo.yres);
+       memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres);
+}
+
+       
+
+void show_data(int index)
+{
+#ifndef WWEATHER
+       char *pt1 = NULL;
+       int itmp;
+#endif
+
+char vstr[512],v2str[512],rstr[512],tstr[512],icon[60];
+int vy=70,col1=40,col2=340;
+
+int wxw=ex-sx-10;              //box width 
+int wyw=ey-sy;                 //box height
+int gys=vy;                    //table space top
+int gysf=34;                   //table space bottom
+int gxs=40;                    //table space left
+int gxw=((wxw-(gxs*2))/5) * 5; //table width
+int gywf=100;                  //table footer height
+int gyw=wyw-vy-gywf-gysf;      //table height
+int gicw=gxw/5;                        //table data width
+int dy=26;                     //linespace
+int vxs=0,wsx,wsy;
+int tret=0;
+int prelate=0;
+int rcd;
+int HMED=22;
+int slim=0;                    //using 720x576
+time_t atime;
+struct tm *sltime;
+char tun[2]="C",sun[5]="km/h",dun[3]="km",pun[5]="mbar",cun[20];
+
+       if(var_screeninfo.xres < 800)
+               slim=1;
+
+       clear_screen();
+
+       Center_Screen(wxw, wyw, &wsx, &wsy);
+       gxs+=wsx;
+       gys+=wsy;
+       gyw+=wsy;
+       col1+=wsx;
+       col2+=wsx;
+       vy+=wsy;
+
+       //frame layout
+       if(index!=1)
+       {
+               RenderBox(wsx, wsy, wxw, wyw, radius, CMC);
+               RenderBox(wsx+2, wsy+2, wxw-2, 44, radius, CMH);
+       }
+       else
+       {
+               if(!cmdline)
+               {
+                       ShowMessage(prs_translate("Bitte warten",CONVERT_LIST),0);
+               }
+       }
+
+       strcpy(cun,prs_translate("Uhr",CONVERT_LIST));
+       if(!metric)
+       {
+               sprintf(tun,"F");
+               sprintf(sun,"mph");
+               sprintf(dun,"mi");
+               sprintf(pun,"in");
+               *cun=0;
+       }
+       if(index==-99)
+       {
+               int i;
+               unsigned char grstr[XL+1]={'G'^XX,'r'^XX,'\xFC'^XX,'\xDF'^XX,'e'^XX,' '^XX,'v'^XX,'o'^XX,'m'^XX,' '^XX,'N'^XX,'e'^XX,'w'^XX,'-'^XX,'T'^XX,'u'^XX,'x'^XX,'w'^XX,'e'^XX,'t'^XX,'t'^XX,'e'^XX,'r'^XX,'-'^XX,'T'^XX,'e'^XX,'a'^XX,'m'^XX,'!'^XX,' '^XX,' '^XX,';'^XX,'-'^XX,')'^XX,' '^XX,' '^XX,'w'^XX,'w'^XX,'w'^XX,'.'^XX,'k'^XX,'e'^XX,'y'^XX,'w'^XX,'e'^XX,'l'^XX,'t'^XX,'-'^XX,'b'^XX,'o'^XX,'a'^XX,'r'^XX,'d'^XX,'.'^XX,'c'^XX,'o'^XX,'m'^XX,0};
+
+               sprintf(rstr,"CS-Tuxwetter    Version %s",P_VERSION);
+               RenderString(rstr, 0, 34, wxw, CENTER, FSIZE_BIG, CMHT);
+
+               sprintf(rstr,"%s",prs_translate("Steuertasten in den Menüs",CONVERT_LIST));
+               RenderString(rstr, 0, vy, wxw, CENTER, HMED, GREEN);
+               vy+=dy;
+
+               sprintf(rstr,"%s",prs_translate("Farbtasten Rot, Grün, Gelb, Blau",CONVERT_LIST));
+               RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT);
+               sprintf(rstr,"%s",prs_translate("Direktanwahl Funktionen 1-4",CONVERT_LIST));
+               RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT);
+               vy+=dy;
+
+               sprintf(rstr,"%s",prs_translate("Zifferntasten 1-6",CONVERT_LIST));
+               RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT);
+               sprintf(rstr,"%s",prs_translate("Direktanwahl Funktionen 5-10",CONVERT_LIST));
+               RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT);
+               vy+=dy;
+
+               sprintf(rstr,"%s",prs_translate("Hoch",CONVERT_LIST));
+               RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT);
+               sprintf(rstr,"%s",prs_translate("vorheriger Menüeintrag",CONVERT_LIST));
+               RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT);
+               vy+=dy;
+
+               sprintf(rstr,"%s",prs_translate("Runter",CONVERT_LIST));
+               RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT);
+               sprintf(rstr,"%s",prs_translate("nächster Menüeintrag",CONVERT_LIST));
+               RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT);
+               vy+=dy;
+
+               sprintf(rstr,"%s",prs_translate("PgDown (bei mehrseitigen Menüs)",CONVERT_LIST));
+               RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT);
+               sprintf(rstr,"%s",prs_translate("eine Seite vorblättern",CONVERT_LIST));
+               RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT);
+               vy+=dy;
+
+               sprintf(rstr,"%s",prs_translate("PgUp (bei mehrseitigen Menüs)",CONVERT_LIST));
+               RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT);
+               sprintf(rstr,"%s",prs_translate("eine Seite zurückblättern",CONVERT_LIST));
+               RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT);
+               vy+=dy;
+
+               sprintf(rstr,"%s",prs_translate("OK",CONVERT_LIST));
+               RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT);
+               sprintf(rstr,"%s",prs_translate("Menüpunkt ausführen",CONVERT_LIST));
+               RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT);
+               vy+=dy;
+
+               sprintf(rstr,"%s",prs_translate("Home",CONVERT_LIST));
+               RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT);
+               sprintf(rstr,"%s",prs_translate("zurück zum vorigen Menü",CONVERT_LIST));
+               RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT);
+               vy+=dy;
+
+               sprintf(rstr,"%s",prs_translate("MENU-Taste (im Hauptmenü)",CONVERT_LIST));
+               RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT);
+               sprintf(rstr,"%s",prs_translate("fehlende Übersetzungen anzeigen",CONVERT_LIST));
+               RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT);
+               vy+=dy;
+
+               sprintf(rstr,"%s",prs_translate("Standby-Taste",CONVERT_LIST));
+               RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT);
+               sprintf(rstr,"%s",prs_translate("CS-Tuxwetter beenden",CONVERT_LIST));
+               RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT);
+               vy+=(1.5*(double)dy);
+
+               sprintf(rstr,"%s",prs_translate("Steuertasten in Datenanzeige",CONVERT_LIST));
+               RenderString(rstr, 0, vy, wxw, CENTER, HMED, GREEN);
+               vy+=dy;
+
+               sprintf(rstr,"%s",prs_translate("Hoch",CONVERT_LIST));
+               RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT);
+               sprintf(rstr,"%s",prs_translate("vorherigen Eintrag anzeigen",CONVERT_LIST));
+               RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT);
+               vy+=dy;
+
+               sprintf(rstr,"%s",prs_translate("Runter",CONVERT_LIST));
+               RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT);
+               sprintf(rstr,"%s",prs_translate("nächsten Eintrag anzeigen",CONVERT_LIST));
+               RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT);
+               vy+=dy;
+/*
+               sprintf(rstr,"%s",prs_translate("Links (in Bildanzeige)",CONVERT_LIST));
+               RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT);
+               sprintf(rstr,"%s",prs_translate("neu downloaden (für WebCams)",CONVERT_LIST));
+               RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT);
+               vy+=dy;
+
+               sprintf(rstr,"%s",prs_translate("Rechts (bei Ani-GIF's)",CONVERT_LIST));
+               RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT);
+               sprintf(rstr,"%s",prs_translate("Animation wiederholen",CONVERT_LIST));
+               RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT);
+               vy+=dy;
+*/
+               sprintf(rstr,"%s",prs_translate("Rot (in fehlenden Übersetzungen)",CONVERT_LIST));
+               RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT);
+               sprintf(rstr,"%s",prs_translate("Fehlliste löschen",CONVERT_LIST));
+               RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT);
+               vy+=dy;
+
+               sprintf(rstr,"%s",prs_translate("OK / Home",CONVERT_LIST));
+               RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT);
+               sprintf(rstr,"%s",prs_translate("Aktuelle Anzeige schließen",CONVERT_LIST));
+               RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT);
+               vy+=(1.5*(double)dy);
+
+               for(i=0; i<(XL-1); i++)
+                       {
+                               grstr[i]^=XX;
+                       }
+               RenderString(grstr, 0, vy, wxw, CENTER, HMED, CMHT);
+               memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres);
+               rcd=GetRCCode();
+               while((rcd != KEY_OK) && (rcd != KEY_EXIT))
+               {
+                       rcd=GetRCCode();
+               }
+       }
+       else
+       {
+               if(index==1)
+               {
+                       int i, tmax[7], tmin[7], mint=100, maxt=-100, j, pmin, pmax;
+                       double tstep=1, garr[70], tv1, tv2, tv3;
+
+                       RenderBox(wsx, wsy, wxw, wyw, radius, CMC);
+                       RenderBox(wsx, wsy, wxw, 44, radius, CMH);
+                       sprintf(rstr,"%s",prs_translate("Trend für die kommende Woche",CONVERT_LIST));
+                       RenderString(rstr, wsx, wsy+34, wxw, CENTER, FSIZE_BIG, CMHT);
+                       RenderLine(gxs,gys,gxs,gys+gyw+gywf,CMCIT);
+                       RenderLine(gxs+1,gys,gxs+1,gys+gyw+gywf,CMCIT);
+                       for(i=0; i<5; i++)
+                       {
+                               prs_get_val(i, PRE_TEMPH,0,vstr);
+                               if(sscanf(vstr,"%d",&tmax[i])!=1)
+                               {
+                                       if(!i)
+                                       {
+                                               vxs=1;
+                                               tmax[i]=0;
+                                       }
+                                       else
+                                       {
+                                               tmax[i]=tmax[i-1];
+                                       }
+                               }
+                               prs_get_val(i, PRE_TEMPL,0,vstr);
+                               if(sscanf(vstr,"%d",&tmin[i])!=1)
+                               {
+                                       tmin[i]=(i)?tmin[i-1]:0;
+                               }
+                               if(tmin[i]<mint)
+                               {
+                                       mint=tmin[i];
+                               }
+                               if((i || !vxs)  && tmax[i]<mint)
+                               {
+                                       mint=tmax[i];
+                               }
+                               if((i || !vxs)  && tmax[i]>maxt)
+                               {
+                                       maxt=tmax[i];
+                               }
+                               if(tmin[i]>maxt)
+                               {
+                                       maxt=tmin[i];
+                               }
+                               if(!show_icons)
+                               {
+#ifdef WWEATHER
+                                       prs_get_dwday(i, PRE_DAY,vstr);
+                                       strcat(vstr,"_SIG");
+#else
+                                       prs_get_day(i, vstr, metric);
+                                       if((pt1=strchr(vstr,','))!=NULL)
+                                       {
+                                               strcpy(pt1,"_SIG");
+                                       }
+#endif
+                                       strcpy(rstr,prs_translate(vstr,CONVERT_LIST));
+                                       RenderString(rstr, gxs+i*gicw, gys+gyw+(FSIZE_BIG/2+gywf/2), gicw, CENTER, FSIZE_BIG, CMCT);//weekday
+                               }
+                               RenderLine(gxs+(i+1)*gicw,gys,gxs+(i+1)*gicw,gys+gyw+gywf,CMCIT);
+                       }
+                       RenderLine(gxs+i*gicw+1,gys,gxs+i*gicw+1,gys+gyw+gywf,CMCIT);
+                       tstep=(5*(1+(int)((maxt-mint)/5))+1);
+                       tstep=(double)(gyw-5)/tstep;
+
+                       RenderLine(gxs,gys,gxs,gys+gyw,CMCIT);
+                       RenderLine(gxs+1,gys,gxs+1,gys+gyw,CMCIT);
+                       RenderLine(gxs+2,gys,gxs+2,gys+gyw,CMCIT);
+                       RenderLine(gxs,gys+gyw,gxs+gxw,gys+gyw,CMCIT);
+                       RenderLine(gxs,gys+gyw+1,gxs+gxw,gys+gyw+1,CMCIT);
+                       RenderLine(gxs,gys+gyw+2,gxs+gxw,gys+gyw+2,CMCIT);
+                       RenderLine(gxs,gys+gyw+gywf,gxs+gxw,gys+gyw+gywf,CMCIT);
+                       RenderLine(gxs,gys+gyw+gywf+1,gxs+gxw,gys+gyw+gywf+1,CMCIT);
+                       RenderString(prs_translate("Höchstwerte",CONVERT_LIST), gxs, gys, gxw/2, CENTER, FSIZE_SMALL, YELLOW);
+                       RenderString(prs_translate("Tiefstwerte",CONVERT_LIST), gxs+(gxw/2), gys, gxw/2, CENTER, FSIZE_SMALL, GREEN);
+
+                       for(i=1; i<=(5*(1+(int)((maxt-mint)/5))+1); i++)
+                       {
+                               if(i)
+                               {
+//                                     RenderLine(gxs,gys+gyw-(i*tstep)-1,gxs+gxw,gys+gyw-(i*tstep)-1,((!(mint+i-1)))?CMCT:CMCIT);
+                                       RenderLine(gxs,gys+gyw-(i*tstep)-2,gxs+gxw,gys+gyw-(i*tstep)-2,((!(mint+i-1)))?CMCT:CMCIT);
+                                       if(!((mint+i-1)%5))
+                                       {
+                                               RenderLine(gxs,gys+gyw-(i*tstep)-3,gxs+gxw,gys+gyw-(i*tstep)-3,((!(mint+i-1)))?CMCT:CMCIT);
+                                       }
+                                       RenderLine(gxs,gys+gyw-(i*tstep)-1,gxs+gxw,gys+gyw-(i*tstep)-1,CMCP3);
+                               }
+                               sprintf(vstr,"%d",mint+i-1);
+                               RenderString(vstr,gxs-35,gys+gyw-(i*tstep)+7, 30, RIGHT, FSIZE_VSMALL, CMCT);
+                               RenderString(vstr,gxs+gxw+2,gys+gyw-(i*tstep)+7, 30, RIGHT, FSIZE_VSMALL, CMCT);
+                       }
+                       RenderLine(gxs,gys+gyw-((i-1)*tstep)-3,gxs+gxw,gys+gyw-((i-1)*tstep)-3,((!(mint+i-1)))?CMCT:CMCIT);
+
+// Geglättete Kurven
+
+                       for(i=0; i<5; i++)
+                       {
+                               tv1=tmin[i];
+                               tv2=tmin[i+1];
+                               for(j=0; j<10; j++)
+                               {
+                                       tv3=j-2;
+                                       if(j<2)
+                                       {
+                                               garr[i*10+j]=tv1;
+                                       }
+                                       else
+                                       {
+                                               if(j>7)
+                                               {
+                                                       garr[i*10+j]=tv2;
+                                               }
+                                               else
+                                               {
+                                                       garr[i*10+j]=((tv1*(6.0-tv3))+(tv2*tv3))/6.0;
+                                               }
+                                       }
+                               }
+                       }
+                       for(i=2; i<39; i++)
+                       {
+                               garr[i]=(garr[i-2]+garr[i-1]+garr[i]+garr[i+1]+garr[i+2])/5.0;
+                       }
+                       for(i=1; i<=40; i++)
+                       {
+                               pmin=(gys+gyw)-(garr[i-1]-mint+1)*tstep-1;
+                               pmax=(gys+gyw)-(garr[i]-mint+1)*tstep-1;
+                               RenderLine(gxs+gicw/2+((i-1)*(gicw/10)),pmin,gxs+gicw/2+i*(gicw/10),pmax,GREEN);
+                               RenderLine(gxs+gicw/2+((i-1)*(gicw/10)),pmin+1,gxs+gicw/2+i*(gicw/10),pmax+1,GREEN);
+                               RenderLine(gxs+gicw/2+((i-1)*(gicw/10)),pmin+2,gxs+gicw/2+i*(gicw/10),pmax+2,GREEN);
+                       }
+                       for(i=vxs; i<5; i++)
+                       {
+                               tv1=tmax[i];
+                               tv2=tmax[i+1];
+                               for(j=0; j<10; j++)
+                               {
+                                       tv3=j-2;
+                                       if(j<2)
+                                       {
+                                               garr[i*10+j]=tv1;
+                                       }
+                                       else
+                                       {
+                                               if(j>7)
+                                               {
+                                                       garr[i*10+j]=tv2;
+                                               }
+                                               else
+                                               {
+                                                       garr[i*10+j]=((tv1*(6.0-tv3))+(tv2*tv3))/6.0;
+                                               }
+                                       }
+                               }
+                       }
+                       for(i=2+10*vxs; i<39; i++)
+                       {
+                               garr[i]=(garr[i-2]+garr[i-1]+garr[i]+garr[i+1]+garr[i+2])/5.0;
+                       }
+                       for(i=1+10*vxs; i<=40; i++)
+                       {
+                               pmin=(gys+gyw)-(garr[i-1]-mint+1)*tstep-1;
+                               pmax=(gys+gyw)-(garr[i]-mint+1)*tstep-1;
+                               RenderLine(gxs+gicw/2+((i-1)*(gicw/10)),pmin,gxs+gicw/2+i*(gicw/10),pmax,YELLOW);
+                               RenderLine(gxs+gicw/2+((i-1)*(gicw/10)),pmin+1,gxs+gicw/2+i*(gicw/10),pmax+1,YELLOW);
+                               RenderLine(gxs+gicw/2+((i-1)*(gicw/10)),pmin+2,gxs+gicw/2+i*(gicw/10),pmax+2,YELLOW);
+                       }
+
+//     Ungeglättete Kurven
+/*
+                       for(i=1; i<7; i++)
+                       {
+                               {
+                                       pmin=(gys+gyw)-(tmin[i-1]-mint+1)*tstep-1;
+                                       pmax=(gys+gyw)-(tmin[i]-mint+1)*tstep-1;
+                                       RenderLine(gxs+gicw/2+gicw*(i-1),pmin,gxs+gicw/2+gicw*i,pmax,GREEN);
+                                       RenderLine(gxs+gicw/2+gicw*(i-1),pmin+1,gxs+gicw/2+gicw*i,pmax+1,GREEN);
+                                       pmin=(gys+gyw)-(tmax[i-1]-mint+1)*tstep-1;
+                                       pmax=(gys+gyw)-(tmax[i]-mint+1)*tstep-1;
+                                       RenderLine(gxs+gicw/2+gicw*(i-1),pmin,gxs+gicw/2+gicw*i,pmax,YELLOW);
+                                       RenderLine(gxs+gicw/2+gicw*(i-1),pmin+1,gxs+gicw/2+gicw*i,pmax+1,YELLOW);
+                               }
+                       }
+*/     
+
+//                     memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres);
+
+                       if(show_icons)
+                       {
+                               for(i=0; i<5; i++)
+                               {
+                                       prs_get_val(i,PRE_ICON,prelate,vstr);
+#ifdef WWEATHER
+                                       if (HTTP_downloadFile(vstr, ICON_FILE, 0, intype, ctmo, 2) == 0)
+#else
+                                       sprintf  (icon,"http://image.weather.com/web/common/intlwxicons/52/%s.gif",vstr);
+                                       if (HTTP_downloadFile(icon, ICON_FILE, 0, intype, ctmo, 2) == 0)
+#endif
+                                       {
+                                               int picx=80,picy=80;
+                                               tret=pic_on_data(icon,sx+gxs+(i*gicw)+((gicw/2)-(picx/2)),sy+gys+gyw+((gywf/2)-(picy/2)), picx, picy, 5, (i)?((i==4)?1:0):2, 0, 0);
+                                       }
+                                       prs_get_dwday(i, PRE_DAY,vstr);
+                                       strcat(vstr,"_SIG");
+                                       strcpy(rstr,prs_translate(vstr,CONVERT_LIST));
+                                       RenderString(rstr, gxs+(i*gicw+17), gys+gyw+FSIZE_BIG+5, gicw, LEFT, FSIZE_BIG,CMCT );//weekday
+                               }
+                       }
+
+                       memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres);
+               }
+               else
+               {
+                       if(index==0)
+                       {
+                               dy=24;
+                               vy-=2;
+
+                               // show icon
+                               prs_get_val(0, ACT_ICON, 0, vstr);
+#if 0
+                               sprintf (rstr,"%s.bmp",vstr);
+                               bmp2lcd (rstr);
+#endif
+                               if(show_icons)
+                               {
+                                       xremove(ICON_FILE);
+#ifdef WWEATHER
+                                       if (HTTP_downloadFile(vstr, ICON_FILE, 0, intype, ctmo, 2) != 0) 
+#else
+                                       sprintf  (icon,"http://image.weather.com/web/common/intlwxicons/52/%s.gif",vstr);
+                                       if (HTTP_downloadFile(icon, ICON_FILE, 0, intype, ctmo, 2) != 0)
+#endif
+                                       {
+                                               printf("Tuxwetter <unable to get icon>\n");
+                                       }
+                               }
+
+                               sprintf(rstr,"%s",prs_translate("Aktuelles Wetter",CONVERT_LIST));
+                               RenderString(rstr, 0, 34, wxw, CENTER, FSIZE_BIG, CMHT);
+
+                               sprintf(rstr,"%s",prs_translate("Standort:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, GREEN);
+#ifdef WWEATHER
+                               prs_get_val(0, ACT_CITY, 0, vstr);
+                               RenderString(vstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+#else
+                               sprintf(rstr,"%s",city_name);
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+#endif
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Längengrad:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+                               prs_get_dbl(0, ACT_LON, 0, vstr);
+                               sprintf(rstr,"%s",vstr);
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Breitengrad:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+                               prs_get_dbl(0, ACT_LAT, 0, vstr);
+                               sprintf(rstr,"%s",vstr);
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Ortszeit:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+#ifdef WWEATHER
+                               sprintf(rstr,"---");
+#else
+                               prs_get_time(0, ACT_TIME, vstr, metric);
+                               sprintf(rstr,"%s %s",vstr,cun);
+#endif
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Aktuelle Uhrzeit:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+//                             prs_get_time(0, ACT_TIME, vstr);
+                               time(&atime);
+                               sltime=localtime(&atime);
+                               if(metric)
+                               {
+                                       sprintf(rstr,"%02d:%02d %s",sltime->tm_hour,sltime->tm_min,cun);
+                               }
+                               else
+                               {
+                                       sprintf(rstr,"%02d:%02d %s",(sltime->tm_hour)?((sltime->tm_hour>12)?sltime->tm_hour-12:sltime->tm_hour):12,sltime->tm_min,(sltime->tm_hour>=12)?"PM":"AM");
+                               }
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Zeitpunkt der Messung:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+#ifdef WWEATHER
+                               prs_get_time(0, ACT_UPTIME, vstr, metric);
+#else
+                               prs_get_dtime(0, ACT_UPTIME, vstr, metric);
+#endif
+                               sprintf(rstr,"%s %s",vstr,cun);
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=(1.5*(double)dy);
+
+                               sprintf(rstr,"%s",prs_translate("Bedingung:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, GREEN);
+                               prs_get_val(0, ACT_COND, 0, vstr);
+                               sprintf(rstr,"%s",vstr);
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Temperatur:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+                               prs_get_val(0, ACT_TEMP, 0, vstr);
+#ifdef WWEATHER
+                               sprintf(rstr,"%s °%s",vstr,tun);
+#else
+                               prs_get_val(0, ACT_FTEMP, 0, v2str);
+                               sprintf(rstr,"%s °%s  %s %s °%s",vstr,tun,prs_translate("gefühlt:",CONVERT_LIST),v2str,tun);
+#endif
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Luftfeuchtigkeit:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+                               prs_get_val(0, ACT_HMID, 0, vstr);
+                               sprintf(rstr,"%s %%",vstr);
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Taupunkt:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+#ifdef WWEATHER
+                               sprintf(rstr,"---");
+#else
+                               prs_get_val(0, ACT_DEWP, 0, vstr);
+                               sprintf(rstr,"%s °%s",vstr,tun);
+#endif
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Luftdruck:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+                               prs_get_val(0, ACT_PRESS, 0, vstr);
+#ifdef WWEATHER
+                               RenderString(vstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+#else
+                               prs_get_val(0, ACT_PRTEND, 0, v2str);
+                               sprintf(rstr,"%s %s  %s",vstr,pun,v2str);
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+#endif
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Wind:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+                               prs_get_val(0, ACT_WINDD, 0, vstr);
+                               prs_get_val(0, ACT_WSPEED, 0, v2str);
+                               if((strstr(vstr,"windstill")!=NULL) || (strstr(v2str,"CALM")!=NULL))
+                               {
+                                       sprintf(rstr,"%s",prs_translate("windstill",CONVERT_LIST));
+                               }
+                               else
+                               {
+                                       sprintf(tstr,"%s",prs_translate("von",CONVERT_LIST));
+                                       sprintf(rstr,"%s %s %s %s %s",tstr,vstr,prs_translate("mit",CONVERT_LIST),v2str,sun);
+                               }
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=(1.5*(double)dy);
+
+                               sprintf(rstr,"%s",prs_translate("Sonnenaufgang:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+#ifdef WWEATHER
+                               sprintf(rstr,"---");
+#else
+                               prs_get_time(0, ACT_SUNR, vstr,metric);
+                               sprintf(rstr,"%s %s",vstr,cun);
+#endif
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Sonnenuntergang:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+#ifdef WWEATHER
+                               sprintf(rstr,"---");
+#else
+                               prs_get_time(0, ACT_SUNS, vstr,metric);
+                               sprintf(rstr,"%s %s",vstr,cun);
+#endif
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+#ifdef WWEATHER
+                               sprintf(rstr,"%s",prs_translate("Bewölkung:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+                               prs_get_val(0, ACT_CLOUDC, 0, v2str);
+                               sprintf(rstr,"%s %%",v2str);
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+#else
+                               sprintf(rstr,"%s",prs_translate("Mondphase:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+                               prs_get_val(0, ACT_MOON, 0, v2str);
+                               sprintf(rstr,"%s",v2str);
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;                 
+#endif
+                               sprintf(rstr,"%s",prs_translate("Fernsicht:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+                               prs_get_val(0, ACT_VIS, 0, vstr);
+#ifdef WWEATHER
+                               sprintf(rstr,"%s %s",vstr,dun);
+#else
+                               if(sscanf(vstr,"%d",&itmp)==1)
+                               {
+                                       sprintf(rstr,"%s %s",vstr,dun);
+                               }
+                               else
+                               {
+                                       strcpy(rstr,vstr);
+                               }
+#endif
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+#ifdef WWEATHER
+                               sprintf(rstr,"%s",prs_translate("Niederschlag:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+                               prs_get_val(0, ACT_PRECIPMM, 0, vstr);
+                               sprintf(rstr,"%s mm",vstr);
+#else
+                               sprintf(rstr,"%s",prs_translate("UV-Index:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+
+                               prs_get_val(0, ACT_UVIND, 0, vstr);
+                               prs_get_val(0, ACT_UVTEXT, 0, v2str);
+                               sprintf(rstr,"%s  %s",vstr,v2str);
+
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Regenrisiko:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+                               prs_get_val(0, PRE_PPCP, 0, vstr);
+                               sprintf(rstr,"%s %%",vstr);
+#endif
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+//                             memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres);
+
+                               if(show_icons)
+                               {
+                                       //tret=pic_on_data(icon, 540, 115, 100, 100, 5, 3, 0, 0);
+                                       if(!slim)
+                                               tret=pic_on_data(icon,700, 115, 100, 100, 5, 3, 0, 0);
+                                       else
+                                               tret=pic_on_data(icon,540, 115, 80, 80, 5, 3, 0, 0);
+                               }
+
+                               memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres);
+                       }
+                       else
+                       {
+                               --index;
+                               if(index==1)
+                               {
+                                       prs_get_val(index-1, PRE_TEMPH, 0, vstr);
+                                       if(strstr(vstr,"N/A")!=NULL)
+                                       {
+                                               prelate=1;
+                                       }
+                               }
+
+
+                               // show icon
+                               prs_get_val(index-1,PRE_ICON,prelate,vstr);
+#if 0
+                               sprintf (rstr,"%s.bmp",vstr);
+                               bmp2lcd (rstr);
+#endif
+                               if(show_icons)
+                               {
+                                       xremove(ICON_FILE);
+#ifdef WWEATHER
+                                       if (HTTP_downloadFile(vstr, ICON_FILE, 0, intype, ctmo, 2) != 0) 
+#else
+                                       sprintf  (icon,"http://image.weather.com/web/common/intlwxicons/52/%s.gif",vstr);
+                                       if (HTTP_downloadFile(icon, ICON_FILE,0,intype,ctmo,2) != 0)
+#endif
+                                       {
+                                               printf("Tuxwetter <unable to get icon file \n");
+                                       }
+                               }
+
+                               if(index==1)
+                               {
+                                       sprintf(vstr,"%s",prs_translate("Heute",CONVERT_LIST));
+                               }
+                               else
+                               {
+#ifdef WWEATHER
+                                       prs_get_dwday(index-1, PRE_DAY,rstr);
+                                       sprintf(vstr,"%s",prs_translate(rstr,CONVERT_LIST));
+#else
+                                       prs_get_day(index-1, vstr, metric);
+#endif
+                               }
+                               sprintf(rstr,"%s %s",prs_translate("Vorschau für",CONVERT_LIST),vstr);
+                               RenderString(rstr, 0, 34, wxw, CENTER, FSIZE_BIG, CMHT);
+
+                               sprintf(rstr,"%s",prs_translate("Standort:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, GREEN);
+                               sprintf(rstr,"%s",city_name);
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=(1.5*(double)dy);
+
+                               sprintf(rstr,"%s",prs_translate("Höchste Temperatur:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+                               prs_get_val(index-1,PRE_TEMPH,0,vstr);
+                               sprintf(rstr,"%s °%s",vstr,tun);
+                               RenderString((prelate)?"---":rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Tiefste Temperatur:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+                               prs_get_val(index-1,PRE_TEMPL,0,vstr);
+                               sprintf(rstr,"%s °%s",vstr,tun);
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Sonnenaufgang:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+#ifdef WWEATHER
+                               sprintf(rstr,"---");
+#else
+                               prs_get_time(index-1, PRE_SUNR,vstr,metric);
+                               sprintf(rstr,"%s %s",vstr,cun);
+#endif
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Sonnenuntergang:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+#ifdef WWEATHER
+                               sprintf(rstr,"---");
+#else
+                               prs_get_time(index-1, PRE_SUNS,vstr,metric);
+                               sprintf(rstr,"%s %s",vstr,cun);
+#endif
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=(1.5*(double)dy);
+
+                               RenderString(prs_translate("Tageswerte",CONVERT_LIST), col1, vy, col2-col1, LEFT, FSIZE_MED, GREEN);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Bedingung:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+                               prs_get_val(index-1, PRE_COND, 0, vstr);
+                               sprintf(rstr,"%s",vstr);
+                               RenderString((prelate)?"---":rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Wind:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+
+                               prs_get_val(index-1, PRE_WINDD, 0, vstr);
+                               prs_get_val(index-1, PRE_WSPEED, 0, v2str);
+                               sprintf(tstr,"%s",prs_translate("von",CONVERT_LIST));
+                               sprintf(rstr,"%s %s %s %s %s",tstr,vstr,prs_translate("mit",CONVERT_LIST),v2str,sun);
+
+                               RenderString((prelate)?"---":rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Luftfeuchtigkeit:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+#ifdef WWEATHER
+                               sprintf(rstr,"---");
+#else
+                               prs_get_val(index-1, PRE_HMID, 0, vstr);
+                               sprintf(rstr,"%s %%",vstr);
+#endif
+                               RenderString((prelate)?"---":rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+#ifdef WWEATHER
+                               sprintf(rstr,"%s",prs_translate("Niederschlag:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+
+                               prs_get_val(index-1, PRE_PRECIPMM, 0, vstr);
+                               sprintf(rstr,"%s mm",vstr);
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+#else
+                               sprintf(rstr,"%s",prs_translate("Regenrisiko:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+
+                               prs_get_val(index-1, PRE_PPCP, 0, vstr);
+                               sprintf(rstr,"%s %%",vstr);
+
+                               RenderString((prelate)?"---":rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+#endif
+                               vy+=(1.5*(double)dy);
+
+                               RenderString(prs_translate("Nachtwerte",CONVERT_LIST), col1, vy, col2-col1, LEFT, FSIZE_MED, GREEN);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Bedingung:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+#ifdef WWEATHER
+                               sprintf(rstr,"---");
+#else
+                               prs_get_val(index-1, PRE_COND, 1, vstr);
+                               sprintf(rstr,"%s",vstr);
+#endif
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Wind:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+#ifdef WWEATHER
+                               sprintf(rstr,"---");
+#else
+                               prs_get_val(index-1, PRE_WINDD, 1, vstr);
+                               prs_get_val(index-1, PRE_WSPEED, 1, v2str);
+                               if((strstr(vstr,"windstill")!=NULL) || (strstr(v2str,"CALM")!=NULL))
+                               {
+                                       sprintf(rstr,"%s",prs_translate("windstill",CONVERT_LIST));
+                               }       
+                               else
+                               {
+                                       sprintf(tstr,"%s",prs_translate("von",CONVERT_LIST));
+                                       sprintf(rstr,"%s %s %s %s %s",tstr,vstr,prs_translate("mit",CONVERT_LIST),v2str,sun);
+                               }
+#endif
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Luftfeuchtigkeit:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+#ifdef WWEATHER
+                               sprintf(rstr,"---");
+#else
+                               prs_get_val(index-1, PRE_HMID, 1, vstr);
+                               sprintf(rstr,"%s %%",vstr);
+#endif
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+                               sprintf(rstr,"%s",prs_translate("Regenrisiko:",CONVERT_LIST));
+                               RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT);
+#ifdef WWEATHER
+                               sprintf(rstr,"---");
+#else
+                               prs_get_val(index-1, PRE_PPCP, 1, vstr);
+                               sprintf(rstr,"%s %%",vstr);
+#endif
+                               RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT);
+                               vy+=dy;
+
+//                             memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres);
+
+                               if(show_icons)
+                               {
+                                       //tret=pic_on_data(icon, 540, 115, 100, 100, 5, 3, 0, 0);
+                                       tret=pic_on_data(icon,slim?540:700, 115, 100, 100, 5, 3, 0, 0);
+                               }
+
+                               memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres);
+                       }
+               }
+       }
+}
+
+void scale_pic(unsigned char **buffer, int x1, int y1, int xstart, int ystart, int xsize, int ysize,
+                          int *imx, int *imy, int *dxp, int *dyp, int *dxo, int *dyo, int center)
+{
+       float xfact=0, yfact=0;
+       int txsize=0, tysize=0;
+       int tempx =0, tempy=0;
+       int txstart =xstart, tystart= ystart;
+       
+       if (xsize > (ex-xstart)) txsize= (ex-xstart);
+       else  txsize= xsize; 
+       if (ysize > (ey-ystart)) tysize= (ey-ystart);
+       else tysize=ysize;
+       xfact= 1000*txsize/x1;
+       xfact= xfact/1000;
+       yfact= 1000*tysize/y1;
+       yfact= yfact/1000;
+       
+       if ( xfact <= yfact)
+       {
+               *imx=(int)x1*xfact;
+               *imy=(int)y1*xfact;
+               if (center !=0) 
+               {
+                       tystart=(ey-sy)-*imy;
+                       tystart=tystart/2;
+                       tystart=tystart+ystart;
+               }
+       }
+       else
+       {
+               *imx=(int)x1*yfact;
+               *imy=(int)y1*yfact;
+               if (center !=0) 
+               {
+                       txstart=(ex-sx)-*imx;
+                       txstart=txstart/2;
+                       txstart=txstart+xstart;
+               }
+       }
+       tempx=*imx;
+       tempy=*imy;
+       *buffer=(char*)color_average_resize(*buffer,x1,y1,*imx,*imy);
+
+       *dxp=0;
+       *dyp=0;
+       *dxo=txstart;
+       *dyo=tystart;
+}
+
+void close_jpg_gif_png(void)
+{
+#if 0
+       // clear Display        
+       fb_set_gmode(0);
+//     memcpy(&otr,&rtr,256);
+       ioctl(fb, FBIOPUTCMAP, oldcmap);
+//     for(; sy <= ey; sy++) memset(lbb + sx + var_screeninfo.xres*(sy),TRANSP, ex-sx + 1);
+       memset(lbb, TRANSP, var_screeninfo.xres*var_screeninfo.yres);
+       memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres);
+       gmodeon=0; 
+#endif
+}
+
+int wait_image(int repeat, int first)
+{
+time_t t1,t2;
+int rv;
+
+       if(!repeat)
+       {
+               rv=GetRCCode();
+               return rv;
+       }
+       time(&t1);
+       t2=t1;
+       while((t2-t1)<repeat)
+       {
+               rv=GetRCCode();
+               if(rv==-1)
+               {
+                       usleep(200000L);
+                       time(&t2);
+               }
+               else
+               {
+                       return rv;
+               }
+       }
+       
+       return KEY_LEFT;
+}
+
+int show_jpg(char *name, int xstart, int ystart, int xsize, int ysize, int wait, int repeat, int single, int center)
+{
+FILE *tfh;
+int x1,y1,rcj,rv=-1;
+int imx = -1,imy = -1,dxo = -1,dyo = -1,dxp = -1,dyp = -1;
+unsigned char *buffer=NULL;
+
+       if((tfh=fopen(name,"r"))!=NULL)
+       {
+               fclose(tfh);
+               if(fh_jpeg_getsize(name, &x1, &y1, xsize, ysize))
+               {
+                       printf("Tuxwetter <invalid JPG-Format>\n");
+                       return -1;
+               }
+               if((buffer=(unsigned char *) malloc(x1*y1*4))==NULL)
+               {
+                       printf(NOMEM);
+                       return -1;
+               }
+               if(!(rv=fh_jpeg_load(name, buffer, x1, y1)))
+               {
+                       scale_pic(&buffer,x1,y1,xstart,ystart,xsize,ysize,&imx,&imy,&dxp,&dyp,&dxo,&dyo,center);
+                       //fb_set_gmode(1);
+                       fb_display(buffer, imx, imy, dxp, dyp, dxo, dyo, 1, 1);
+                       gmodeon=1;
+               }
+               free(buffer);
+               
+               if(!rv && wait)
+               {
+                       rcj=wait_image(repeat, 1);
+                       while((rcj != KEY_OK) && (rcj != KEY_EXIT) && (rcj != KEY_DOWN) && (rcj != KEY_LEFT) && (rcj != KEY_UP) && (rcj != KEY_VOLUMEUP) && (rcj != KEY_VOLUMEDOWN))
+                       {
+                               rcj=wait_image(repeat, 0);
+                       }
+                       if(single || (rcj==KEY_OK) || (rcj==KEY_EXIT))
+                       {
+                               close_jpg_gif_png();
+                       }
+                       else
+                       {
+                               showBusy(startx+3,starty+3,10,0xff,00,00);
+//                             showBusy(startx+10,starty+10,20,170,0,0);
+                               if(rcj==KEY_EXIT)
+                               {
+                                       rcj=KEY_OK;
+                               }
+                               return rcj;
+                       }
+               }
+       }
+       
+       return (rv)?-1:0;       
+}
+
+int show_png(char *name, int xstart, int ystart, int xsize, int ysize, int wait, int repeat, int single, int center)
+{
+FILE *tfh;
+int x1,y1,rcn,rv=-1;
+int imx,imy,dxo,dyo,dxp,dyp;
+unsigned char *buffer=NULL;
+
+       if((tfh=fopen(name,"r"))!=NULL)
+       {
+               fclose(tfh);
+               if(fh_png_getsize(name, &x1, &y1, xsize, ysize))
+               {
+                       printf("Tuxwetter <invalid PNG-Format>\n");
+                       return -1;
+               }
+               if((buffer=(unsigned char *) malloc(x1*y1*4))==NULL)
+               {
+                       printf(NOMEM);
+                       return -1;
+               }
+               if(!(rv=fh_png_load(name, buffer, x1, y1)))
+               {
+                       scale_pic(&buffer,x1,y1,xstart,ystart,xsize,ysize,&imx,&imy,&dxp,&dyp,&dxo,&dyo,center);
+                       fb_set_gmode(1);
+                       fb_display(buffer, imx, imy, dxp, dyp, dxo, dyo, 1, 1);
+                       gmodeon=1;
+               }
+               free(buffer);
+               
+               if(!rv && wait)
+               {
+                       rcn=wait_image(repeat, 1);
+                       while((rcn != KEY_OK) && (rcn != KEY_EXIT) && (rcn != KEY_DOWN) && (rcn != KEY_LEFT) && (rcn != KEY_UP) && (rcn != KEY_VOLUMEUP) && (rcn != KEY_VOLUMEDOWN))
+                       {
+                               rcn=wait_image(repeat, 0);
+                       }
+                       if(single || (rcn==KEY_OK) || (rcn==KEY_EXIT))
+                       {
+                               close_jpg_gif_png();
+                       }
+                       else
+                       {
+                               showBusy(startx+3,starty+3,10,0xff,00,00);
+//                             showBusy(startx+10,starty+10,20,170,0,0);
+                               if(rcn==KEY_EXIT)
+                               {
+                                       rcn=KEY_OK;
+                               }
+                               return rcn;
+                       }
+               }
+       }
+       
+       return (rv)?-1:0;       
+}
+
+static int gifs=0;
+
+int show_gif(char *name, int xstart, int ystart, int xsize, int ysize, int wait, int repeat, int single, int center, int nodecomp)
+{
+FILE *tfh;
+int x1,y1,rcg,count,cloop,rv=-1;
+int imx,imy,dxo,dyo,dxp,dyp;
+char *buffer=NULL, fname[512];
+
+       if((tfh=fopen(name,"r"))!=NULL)
+       {
+               fclose(tfh);
+               if(nodecomp)
+               {
+                       count=gifs;
+               }
+               else
+               {               
+                       xremove("/tmp/tempgif.gif");
+                       gifs=count=gifdecomp(GIF_FILE, GIF_MFILE);
+               }
+               if(count<1)
+               {
+                       printf("Tuxwetter <invalid GIF-Format>\n");
+                       return -1;
+               }
+               cloop=0;
+               while(count--)
+               {
+                       sprintf(fname,"%s%02d.gif",GIF_MFILE,cloop++);
+                       if(fh_gif_getsize(fname, &x1, &y1, xsize, ysize))
+                       {
+                               printf("Tuxwetter <invalid GIF-Format>\n");
+                               return -1;
+                       }
+                       if((buffer=(unsigned char *) malloc(x1*y1*4))==NULL)
+                       {
+                               printf(NOMEM);
+                               return -1;
+                       }
+                       if(!(rv=fh_gif_load(fname, buffer, x1, y1)))
+                       {
+                               scale_pic(&buffer,x1,y1,xstart,ystart,xsize,ysize,&imx,&imy,&dxp,&dyp,&dxo,&dyo,center);
+                               fb_set_gmode(1);
+                               fb_display(buffer, imx, imy, dxp, dyp, dxo, dyo, 1, 1);
+                               gmodeon=1;
+
+                               if(gifs>1)
+                               {
+                                       sprintf(fname,"%s %2d / %d", prs_translate("Bild",CONVERT_LIST),cloop, gifs);
+//                                     LCD_draw_string(13, 9, fname);
+//                                     LCD_update();
+                               }
+                       }
+                       free(buffer);
+               }
+               
+               if(!rv && wait)
+               {
+                       rcg=wait_image(repeat, 1);
+                       while((rcg != KEY_OK) && (rcg != KEY_EXIT) && (rcg != KEY_DOWN) && (rcg != KEY_UP) && (rcg != KEY_VOLUMEUP) && (rcg != KEY_VOLUMEDOWN)&& (rcg != KEY_LEFT) && (rcg != KEY_RIGHT))
+                       {
+                               rcg=wait_image(repeat, 0);
+                       }
+                       if(single || (rcg==KEY_OK) || (rcg==KEY_EXIT))
+                       {
+                               close_jpg_gif_png();
+                       }
+                       else
+                       {
+                               showBusy(startx+3,starty+3,10,0xff,00,00);
+//                             showBusy(startx+10,starty+10,20,170,0,0);
+                               if(rcg==KEY_EXIT)
+                               {
+                                       rcg=KEY_OK;
+                               }
+                               return rcg;
+                       }
+               }
+       }
+       
+       return (rv)?-1:0;       
+}
+
+int pic_on_data(char *url, int xstart, int ystart, int xsize, int ysize, int wait, int single, int center, int rahmen)
+{
+FILE *tfh;
+int /*i,*/x1,y1,rv=-1;
+
+int imx,imy,dxo,dyo,dxp,dyp;
+unsigned char *buffer=NULL/*,*gbuf*/;
+unsigned char *tbuf=lfb;
+
+       if((tfh=fopen(ICON_FILE,"r"))!=NULL)
+       {
+               lfb=lbb;
+#ifdef WWEATHER
+               if(fh_png_getsize(ICON_FILE, &x1, &y1, xsize, ysize))
+               {
+                       printf("Tuxwetter <invalid PNG-Format>\n");
+                       return -1;
+               }
+#else
+               if(fh_gif_getsize(ICON_FILE, &x1, &y1, xsize, ysize))
+               {
+                       printf("Tuxwetter <invalid GIF-Format>\n");
+                       return -1;
+               }
+#endif
+               if((buffer=(unsigned char *) malloc(x1*y1*4))==NULL)
+               {
+                       printf(NOMEM);
+                       return -1;
+               }
+#ifdef WWEATHER
+               if(!(rv=fh_png_load(ICON_FILE, buffer, x1, y1)))
+#else
+               if(!(rv=fh_gif_load(ICON_FILE, buffer, x1, y1)))
+#endif
+               {
+                       scale_pic(&buffer,x1,y1,xstart,ystart,xsize,ysize,&imx,&imy,&dxp,&dyp,&dxo,&dyo,center);
+                       if (rahmen >0)
+                       {
+                               RenderBox(xstart+1-sx-rahmen, ystart-6-sy-rahmen,xstart+xsize+2-sx+rahmen,ystart+ysize-sy-6+rahmen, 0, CMCS);
+//                             memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres);
+                       }
+
+                       if(single & 2)
+                       {
+                               single &= ~2;
+#if 0
+// don't know what this is about
+#ifndef HAVE_DREAMBOX_HARDWARE
+                               i=fix_screeninfo.line_length*var_screeninfo.yres;
+                               gbuf=lfb;
+                               while(i--)
+                                       if(*gbuf >=127)
+                                               *(gbuf++)-=127;
+                                       else
+                                               *(gbuf++)=11;
+#endif
+#endif
+                       }
+
+                       fb_display(buffer, imx, imy, dxp, dyp, dxo, dyo, 0, single);
+#if 0
+// don't know what this is about
+                       if(single & 1)
+                       {
+                               ioctl(fb, FBIOPUTCMAP, &spcmap);
+                       }
+#endif
+                       gmodeon=1;
+
+               }
+               free(buffer);
+               lfb=tbuf;
+       }
+       return (rv)?-1:0;
+}
+
+int show_php(char *name, char *title, int plain, int highlite)
+{
+FILE *tfh;
+int x1,y1,cs,rcp,rv=-1,run=1,line=0,action=1,cut;
+int col1,sy=0,dy=26,psx,psy,pxw=/*620*/ex-sx,pyw=/*510*/ey-sy;
+
+       Center_Screen(pxw,pyw,&psx,&psy);
+       col1=psx+40;
+       sy=psy+70;
+       if((tfh=fopen(name,"r"))!=NULL)
+       {
+/*             if(gmodeon)
+               {
+                       close_jpg_gif_png();
+               }
+*/             fclose(tfh);
+
+               RenderString("X", psx+pxw/2, psy+pyw/2, 100, LEFT, FSIZE_SMALL, CMCT);
+               if(fh_php_getsize(name, plain, &x1, &y1))
+               {
+                       printf("Tuxwetter <invalid PHP-Format>\n");
+                       return -1;
+               }
+               cs=FSIZE_MED*((double)(pxw-1.5*(double)(col1-psx))/(double)x1);
+               if(cs>FSIZE_MED)
+               {
+                       cs=FSIZE_MED;
+               }               
+
+               dy=1.2*(double)cs;
+               
+               while(run)
+               {
+                       //frame layout
+                       if(action)
+                       {
+                               RenderBox(psx, psy, pxw, pyw, radius, CMC);
+                               RenderBox(psx+2, psy+2, pxw-4, 44, radius, CMH);
+                               RenderString(title, psx, psy+34, pxw, CENTER, FSIZE_BIG, CMHT);
+
+                               if(!(rv=fh_php_load(name, col1, sy, dy, cs, line, highlite, plain, &cut)))
+                               {
+                                       memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres);
+                               }
+                       }
+       
+                       if(!rv)
+                       {
+                               rcp=GetRCCode();
+                               while((rcp != KEY_OK) && (rcp != KEY_EXIT) && (rcp != KEY_PAGEUP) && (rcp != KEY_PAGEDOWN) && (rcp != KEY_DOWN) && (rcp != KEY_UP) && (rcp != KEY_VOLUMEUP) && (rcp != KEY_VOLUMEDOWN)&& (rcp != KEY_RED))
+                               {
+                                       rcp=GetRCCode();
+                               }
+                               if(rcp==KEY_EXIT)
+                               {
+                                       rcp=KEY_OK;
+                               }
+                               if((rcp != KEY_PAGEUP) && (rcp != KEY_PAGEDOWN))
+                               {
+                                       return rcp;
+                               }
+                               switch(rcp)
+                               {
+                                       case KEY_PAGEDOWN:
+                                               if((action=cut)!=0)
+                                               {
+                                                       line+=5;
+                                               }
+                                               break;
+                                               
+                                       case KEY_PAGEUP:
+                                               if(line)
+                                               {                               
+                                                       if((line-=5)<0)
+                                                       {
+                                                               line=0;
+                                                       }
+                                                       action=1;
+                                               }
+                                               else
+                                               {
+                                                       action=0;
+                                               }
+                                               break;
+                               }
+                       }
+                       rv=0;
+               }
+       }
+       return (rv)?-1:0;       
+}
+
+char *translate_url(char *cmd, int ftype, int absolute)
+{
+char *rptr=NULL,*pt1 = NULL,*pt2 = NULL,*pt3 = NULL,*pt4 = NULL,*pt5 = NULL;
+char *sstr=strdup(cmd),*estr=strdup(cmd);
+FILE *fh = NULL,*fh2 = NULL;
+int txttype=(ftype==TYP_TXTHTML),crlf=0;
+long flength = 0;
+
+
+       strcpy(trstr,cmd);
+       pt1=trstr;
+//     ++pt1;
+       if((pt2=strchr(pt1,'|'))!=NULL)
+       {
+               *pt2=0;
+               ++pt2;
+               if((pt3=strchr(pt2,'|'))!=NULL)
+               {
+                       *pt3=0;
+                       ++pt3;
+                       printf("Tuxwetter <Downloading %s>\n",pt1);
+                       if(!HTTP_downloadFile(pt1, TRANS_FILE, 1, intype, ctmo, 2))
+                       {
+                               if((fh=fopen(TRANS_FILE,"r"))!=NULL)
+                               {
+                                       fseek(fh,0,SEEK_END);
+                                       flength=ftell(fh);
+                                       rewind(fh);
+                                       if((htmstr=calloc(flength+1,sizeof(char)))!=NULL)
+                                       {
+                                               if(fread(htmstr,(size_t)flength,1,fh)>0)
+                                               {
+                                                       *(htmstr+flength)=0;
+                                                       if((pt4=strchr(htmstr,13))!=NULL)
+                                                               {
+                                                                       crlf=(*(pt4+1)==10);
+                                                               }
+                                                       pt4=sstr;
+                                                       while(*pt2)
+                                                       {
+                                                               if((*pt2=='\\') && (*(pt2+1)=='n'))
+                                                               {
+                                                                       if(crlf)
+                                                                       {
+                                                                               *pt4=13;
+                                                                               pt4++;
+                                                                       }
+                                                                       pt2++;
+                                                                       *pt4=10;
+                                                               }
+                                                               else
+                                                               {
+                                                                       *pt4=*pt2;
+                                                               }
+                                                               ++pt4;          
+                                                               ++pt2;
+                                                       }
+                                                       *pt4=0;
+                                       
+                                                       pt4=estr;
+                                                       while(*pt3)
+                                                       {
+                                                               if((*pt3=='\\') && (*(pt3+1)=='n'))
+                                                               {
+                                                                       if(crlf)
+                                                                       {
+                                                                               *pt4=13;
+                                                                               pt4++;
+                                                                       }
+                                                                       pt3++;
+                                                                       *pt4=10;
+                                                               }
+                                                               else
+                                                               {
+                                                                       *pt4=*pt3;
+                                                               }       
+                                                               ++pt4;          
+                                                               ++pt3;
+                                                       }
+                                                       *pt4=0;
+                                                       if((pt3=strstr(htmstr,sstr))!=NULL)
+                                                       {
+                                                               if((pt5=strstr(pt3+strlen(sstr)+1,estr))!=NULL)
+                                                               {
+                                                                       do
+                                                                       {
+                                                                               pt4=pt3;        
+                                                                               pt3++;
+                                                                               pt3=strstr(pt3,sstr);
+                                                                       }
+                                                                       while(pt3 && (pt3<pt5));
+                                                                       *pt5=0;
+                                                                       pt4+=strlen(sstr);
+                                                                       if(!txttype)
+                                                                       {
+                                                                               if(strstr(pt4,"://")!=NULL)
+                                                                               {
+                                                                                       sprintf(trstr+strlen(trstr)+1,"\"%s",pt4);
+                                                                               }
+                                                                               else
+                                                                               {
+                                                                                       if((pt5=(absolute)?(strrchr(pt1+8,'/')):(strchr(pt1+8,'/')))!=NULL)
+                                                                                       {
+                                                                                               sprintf(trstr+strlen(trstr)+1,"\"%s",pt1);
+                                                                                               sprintf(trstr+strlen(trstr)+1+(pt5-pt1)+((*pt4=='/')?1:2),"%s",pt4);
+                                                                                       }
+                                                                               }
+                                                                               rptr=trstr+strlen(trstr)+1;
+                                                                       }
+                                                                       else
+                                                                       {
+                                                                               xremove(PHP_FILE);
+                                                                               if((fh2=fopen(PHP_FILE,"w"))!=NULL)
+                                                                               {
+                                                                               int dontsave=0, newline=1;
+                                                                               
+                                                                                       flength=0;
+                                                                                       fprintf(fh2,"<br>");
+                                                                                               
+                                                                                       while(*pt4)     
+                                                                                       {
+                                                                                               if(*pt4=='<')
+                                                                                               {
+                                                                                                       dontsave=1;
+                                                                                               }
+                                                                                               if(*pt4=='>')
+                                                                                               {
+                                                                                                       dontsave=2;
+                                                                                               }
+                                                                                               if(!dontsave)
+                                                                                               {
+                                                                                                       if((*pt4==' ') && (flength>60))
+                                                                                                       {
+                                                                                                               fprintf(fh2,"\n<br>");
+                                                                                                               flength=0;
+                                                                                                               newline=1;
+                                                                                                       }
+                                                                                                       else
+                                                                                                       {
+                                                                                                               if(*pt4>' ' || newline<2)
+                                                                                                               {
+                                                                                                                       if(*pt4>' ')
+                                                                                                                       {
+                                                                                                                               newline=0;
+                                                                                                                       }
+                                                                                                                       fputc(*pt4,fh2);
+                                                                                                               }
+                                                                                                       }
+                                                                                                       if(*pt4==10)
+                                                                                                       {
+                                                                                                               if(newline<2)
+                                                                                                               {
+                                                                                                                       fprintf(fh2,"<br>");
+                                                                                                               }
+                                                                                                               flength=0;
+                                                                                                               ++newline;
+                                                                                                       }
+                                                                                                       flength++;
+                                                                                               }
+                                                                                               if(dontsave==2)
+                                                                                               {
+                                                                                                       dontsave=0;
+                                                                                               }
+                                                                                               pt4++;
+                                                                                       }
+                                                                                       fprintf(fh2,"\n<br><br>");
+                                                                                       fclose(fh2);
+                                                                                       rptr=pt1;
+                                                                               }
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                               free(htmstr);
+                                       }
+                               fclose(fh);
+                               }
+                       }
+               }
+       }
+
+       free(sstr);
+       free(estr);
+
+       if(rptr)
+       {
+               pt1=rptr;
+               while(*pt1)
+               {
+                       if(*pt1==' ')
+                       {
+                               *(pt1+strlen(pt1)+2)=0;
+                               memmove(pt1+2,pt1,strlen(pt1));
+                               *pt1++='%';
+                               *pt1++='2';
+                               *pt1='0';
+                       }
+                       pt1++;
+               }
+       }
+                       
+       return rptr;
+}
+
+int Menu_Up(MENU *m)
+{
+int llev=m->headerlevels[m->act_header], lmen=m->act_header, lentr=m->lastheaderentrys[m->act_header];
+       
+       while((lmen>=0) && (m->headerlevels[lmen]>=llev))
+       {
+               --lmen;
+       }
+       if(lmen<0)
+       {
+               return 0;
+       }
+       m->act_header=lmen;
+       Get_Menu();
+       m->act_entry=lentr;
+       
+       return 1;       
+}
+
+void read_neutrino_osd_conf(int *ex,int *sx,int *ey, int *sy)
+{
+       const char *filename="/var/tuxbox/config/neutrino.conf";
+       const char spres[][5]={"","_crt","_lcd"};
+       char sstr[4][32];
+       int pres=-1, loop, *sptr[4]={ex, sx, ey, sy};
+       char *buffer;
+       size_t len;
+       ssize_t read;
+       FILE* fd;
+
+       fd = fopen(filename, "r");
+       if(fd){
+               buffer=NULL;
+               len = 0;
+               while ((read = getline(&buffer, &len, fd)) != -1){
+                       sscanf(buffer, "screen_preset=%d", &pres);
+               }
+               if(buffer)
+                       free(buffer);
+               rewind(fd);
+               ++pres;
+               sprintf(sstr[0], "screen_EndX%s=%%d", spres[pres]);
+               sprintf(sstr[1], "screen_StartX%s=%%d", spres[pres]);
+               sprintf(sstr[2], "screen_EndY%s=%%d", spres[pres]);
+               sprintf(sstr[3], "screen_StartY%s=%%d", spres[pres]);
+
+               buffer=NULL;
+               len = 0;
+               while ((read = getline(&buffer, &len, fd)) != -1){
+                       for(loop=0; loop<4; loop++) {
+                               sscanf(buffer, sstr[loop], sptr[loop]);
+                       }
+               }
+               fclose(fd);
+               if(buffer)
+                       free(buffer);
+       }
+}
+
+/******************************************************************************
+ * Tuxwetter Main
+ ******************************************************************************/
+
+int main (int argc, char **argv)
+{
+int index=0,cindex=0,tv,rcm,rce,ferr=0,tret=-1;
+int mainloop=1,wloop=1, dloop=1;
+char rstr[BUFSIZE], *rptr;
+char tstr[BUFSIZE];
+FILE *tfh;
+LISTENTRY epl={NULL, 0, TYP_TXTPLAIN, TYP_TXTPLAIN, 0, 0, 0};
+PLISTENTRY pl=&epl;
+
+               // if problem with config file return from plugin
+
+               for(tv=1; tv<argc; tv++)
+               {
+                       if((strstr(argv[tv],"-v")==argv[tv])||(strstr(argv[tv],"--Version")==argv[tv]))
+                       {
+                               printf("CS-Tuxwetter Version %s\n",P_VERSION);
+                               return 0;
+                       }
+                       if(*argv[tv]=='/')
+                       {
+                               strcpy(TCF_FILE,argv[tv]);
+                       }
+                       if(strchr(argv[tv],'='))
+                       {
+                               cmdline=strdup(argv[tv]);
+                               TrimString(cmdline);
+                               TranslateString(cmdline);
+                       }
+               }
+
+//             system("ping -c 2 google.com &");
+
+               if((line_buffer=calloc(BUFSIZE+1, sizeof(char)))==NULL)
+               {
+                       printf(NOMEM);
+                       return -1;
+               }
+       
+               if (!ReadConf(cmdline))
+               {
+                       printf("Tuxwetter <Configuration failed>\n");
+                       return -1;
+               }
+       
+               if((trstr=malloc(BUFSIZE))==NULL)
+               {
+                       printf(NOMEM);
+                       return -1;
+               }
+
+               memset(&menu,0,sizeof(MENU));
+               memset(&funcs,0,sizeof(MENU));
+/*
+               if((menu.headertxt=calloc(MAX_MENUTXT, sizeof(char*)))==NULL)
+               {
+                       printf(NOMEM);
+                       free(line_buffer);
+                       Clear_List(&menu,-1);
+                       return -1;
+               }
+*/
+/*
+               if(Clear_List(&menu,1))
+               {
+                       printf(NOMEM);
+                       free(line_buffer);
+                       Clear_List(&menu,-1);
+                       return -1;
+               }
+*/
+               if(!cmdline)
+               {
+                       if(Check_Config())
+                       {
+                               printf("<tuxwetter> Unable to read tuxwetter.conf\n");
+                               Clear_List(&menu,-1);
+                               free(line_buffer);
+                               return -1;
+                       }
+               }
+
+               if((funcs.headertxt=calloc(1, sizeof(char*)))==NULL)
+               {
+                       printf(NOMEM);
+                       free(line_buffer);
+                       Clear_List(&menu,-1);
+                       Clear_List(&funcs,-1);
+                       return -1;
+               }
+
+               read_neutrino_osd_conf(&ex,&sx,&ey, &sy);
+               if((ex == -1) || (sx == -1) || (ey == -1) || (sy == -1)){
+                       sx = 40;
+                       ex = var_screeninfo.xres - 40;
+                       sy = 40;
+                       ey = var_screeninfo.yres - 40;
+               }
+               printf("sx=%i, ex =%i, sy=%i, ey=%i\n", sx, ex, sy, ey);
+
+               for(index=CMCST; index<=CMH; index++)
+               {
+                       sprintf(rstr,"menu_%s_alpha",menucoltxt[index]);
+                       if((tv=Read_Neutrino_Cfg(rstr))>=0)
+                               tr[index]=255-(float)tv*2.55;
+
+                       sprintf(rstr,"menu_%s_blue",menucoltxt[index]);
+                       if((tv=Read_Neutrino_Cfg(rstr))>=0)
+                               bl[index]=(float)tv*2.55;
+
+                       sprintf(rstr,"menu_%s_green",menucoltxt[index]);
+                       if((tv=Read_Neutrino_Cfg(rstr))>=0)
+                               gn[index]=(float)tv*2.55;
+
+                       sprintf(rstr,"menu_%s_red",menucoltxt[index]);
+                       if((tv=Read_Neutrino_Cfg(rstr))>=0)
+                               rd[index]=(float)tv*2.55;
+               }
+
+               cindex=CMC;
+               for(index=CMCP0; index<=CMCP3; index++)
+               {
+                       rd[index]=rd[cindex]+25;
+                       gn[index]=gn[cindex]+25;
+                       bl[index]=bl[cindex]+25;
+                       tr[index]=tr[cindex];
+                       cindex=index;
+               }
+
+               if(Read_Neutrino_Cfg("rounded_corners")>0)
+                       radius=10;
+               else
+                       radius=0;
+
+               fb = open(FB_DEVICE, O_RDWR);
+               if(fb == -1)
+               {
+                       perror("tuxwetter <open framebuffer device>");
+                       exit(1);
+               }
+
+               InitRC();
+
+               if((trstr=malloc(BUFSIZE))==NULL)
+               {
+                       printf(NOMEM);
+                       return -1;
+               }
+
+       //init framebuffer
+
+               if(ioctl(fb, FBIOGET_FSCREENINFO, &fix_screeninfo) == -1)
+               {
+                       perror("tuxwetter <FBIOGET_FSCREENINFO>\n");
+                       return -1;
+               }
+               if(ioctl(fb, FBIOGET_VSCREENINFO, &var_screeninfo) == -1)
+               {
+                       perror("tuxwetter <FBIOGET_VSCREENINFO>\n");
+                       return -1;
+               }
+               if(!(lfb = (unsigned char*)mmap(0, fix_screeninfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0)))
+               {
+                       perror("tuxwetter <mapping of Framebuffer>\n");
+                       return -1;
+               }
+
+       //init fontlibrary
+
+               if((error = FT_Init_FreeType(&library)))
+               {
+                       printf("tuxwetter <FT_Init_FreeType failed with Errorcode 0x%.2X>", error);
+                       munmap(lfb, fix_screeninfo.smem_len);
+                       return -1;
+               }
+
+               if((error = FTC_Manager_New(library, 1, 2, 0, &MyFaceRequester, NULL, &manager)))
+               {
+                       printf("tuxwetter <FTC_Manager_New failed with Errorcode 0x%.2X>\n", error);
+                       FT_Done_FreeType(library);
+                       munmap(lfb, fix_screeninfo.smem_len);
+                       return -1;
+               }
+
+               if((error = FTC_SBitCache_New(manager, &cache)))
+               {
+                       printf("tuxwetter <FTC_SBitCache_New failed with Errorcode 0x%.2X>\n", error);
+                       FTC_Manager_Done(manager);
+                       FT_Done_FreeType(library);
+                       munmap(lfb, fix_screeninfo.smem_len);
+                       return -1;
+               }
+
+               if((error = FTC_Manager_LookupFace(manager, FONT, &face)))
+               {
+                       if((error = FTC_Manager_LookupFace(manager, FONT2, &face)))
+                       {
+                               printf("tuxwetter <FTC_Manager_LookupFace failed with Errorcode 0x%.2X>\n", error);
+                               FTC_Manager_Done(manager);
+                               FT_Done_FreeType(library);
+                               munmap(lfb, fix_screeninfo.smem_len);
+                               return 2;
+                       }
+                       else
+                               desc.face_id = FONT2;
+               }
+               else
+                       desc.face_id = FONT;
+               
+               use_kerning = FT_HAS_KERNING(face);
+
+               desc.flags = FT_LOAD_MONOCHROME;
+
+       //init backbuffer
+
+               if(!(lbb = malloc(fix_screeninfo.line_length*var_screeninfo.yres)))
+               {
+                       perror("tuxwetter <allocating of Backbuffer>\n");
+                       FTC_Manager_Done(manager);
+                       FT_Done_FreeType(library);
+                       munmap(lfb, fix_screeninfo.smem_len);
+                       return -1;
+               }
+
+               memset(lbb, TRANSP, fix_screeninfo.line_length*var_screeninfo.yres);
+
+               startx = sx;
+               starty = sy;
+
+       /* Set up signal handlers. */
+       signal(SIGINT, quit_signal);
+       signal(SIGTERM, quit_signal);
+       signal(SIGQUIT, quit_signal);
+
+
+//  Startbildschirm
+
+       put_instance(instance=get_instance()+1);
+
+       if(show_splash && !cmdline)
+       {
+#if 0
+               sprintf (rstr,"cd /tmp\n/bin/busybox tar -xf bmps.tar startbild.jpg");
+               system(rstr);
+               show_jpg("/tmp/startbild.jpg", sx, sy, ex-sx, ey-sy, 5, 0, 1, 1);
+               xremove("/tmp/startbild.jpg");
+#endif
+               show_jpg("/var/tuxbox/config/tuxwetter/startbild.jpg", sx, sy, ex-sx, ey-sy, 5, 0, 1, 1);
+       }
+
+       //main loop
+       
+       menu.act_entry=0;
+       if(cmdline)
+       {
+               AddListEntry(&menu, cmdline, 0);
+               cindex=99;
+       }
+       else
+       {
+               if(Get_Menu())
+               {
+                       printf("Tuxwetter <unable to read tuxwetter.conf>\n");
+                       FTC_Manager_Done(manager);
+                       FT_Done_FreeType(library);
+                       munmap(lfb, fix_screeninfo.smem_len);
+                       put_instance(instance=get_instance()-1);
+                       return -1;
+               }
+               cindex=0;
+       }
+
+       while(mainloop)
+       {
+               if(cindex!=99)
+               {
+                       cindex=Get_Selection(&menu);
+               }
+               else
+               {
+                       cindex=1;
+               }
+               dloop=1;
+               switch(cindex)
+               {
+                       case -99:
+                               show_data(-99);
+                               break;
+                       
+                       case -1:
+                               mainloop=0;
+                               break;
+                               
+                       case 0:
+                               mainloop=Menu_Up(&menu);
+                               break;
+                               
+                       case -98:
+                               if((tfh=fopen(MISS_FILE,"r"))!=NULL)
+                               {
+                                       fclose(tfh);
+                                       pl=&epl;
+                                       sprintf(tstr,"%s,http://localhost/../../../..%s",prs_translate("Fehlende Übersetzungen",CONVERT_LIST),MISS_FILE);
+                                       pl->entry=strdup(tstr);
+                               }
+                               else
+                               {       
+                                       ShowMessage(prs_translate("Keine fehlenden Übersetzungen",CONVERT_LIST),1);
+                                       break;
+                               }
+                       case 1:
+                               if(cindex==1)
+                               {
+                                       pl=menu.list[menu.act_entry];
+                               }
+                               switch (pl->type)
+                               {
+                                       case TYP_MENU:
+                                               menu.act_header=pl->headerpos;
+                                               menu.lastheaderentrys[menu.act_header]=menu.act_entry;
+                                               Get_Menu();
+                                               menu.act_entry=0;
+                                               break;
+                                               
+                                       case TYP_EXECUTE:
+                                               if((rptr=strchr(pl->entry,','))!=NULL)
+                                               {
+                                                       rptr++;
+                                                       system(rptr);
+                                                       CloseRC();
+                                                       InitRC();
+                                               close_jpg_gif_png();
+                                               }
+                                               break;
+                                               
+                                       case TYP_PICTURE:
+                                       case TYP_PICHTML:
+                                       case TYP_TXTHTML:
+                                       case TYP_TEXTPAGE:
+                                       case TYP_TXTPLAIN:
+                                               dloop=1;
+                                               *line_buffer=0;
+//                                             LCD_Init();
+                                               do
+                                               {
+                                                       if((pl->type==TYP_TXTHTML) || (pl->type==TYP_PICHTML))
+                                                       {
+                                                       char *pt1=pl->entry, *pt2=nstr;
+                                                       
+                                                               strcpy(line_buffer,strchr(pt1,',')+1);
+                                                               while(*pt1 && (*pt1 != ','))
+                                                                       {
+                                                                               *pt2++=*pt1++;
+                                                                       }
+                                                               *pt2=0; 
+                                                               tret=0;
+                                                       }
+                                                       else
+                                                       {
+                                                               tret=Transform_Entry(pl->entry, line_buffer);
+                                                       }
+                                                       if(!tret)
+                                                       {
+                                                               if((pl->type==TYP_PICHTML) || (pl->type==TYP_TXTHTML))
+                                                               {
+                                                                       if((rptr=translate_url(line_buffer, pl->type, pl->absolute))!=NULL)
+                                                                       {
+                                                                               strcpy(line_buffer,rptr);
+                                                                       }
+                                                                       else
+                                                                       {
+                                                                               close_jpg_gif_png();
+                                                                               ShowMessage(prs_translate("Formatfehler der URL in der tuxwetter.conf",CONVERT_LIST),1);
+                                                                               dloop=-1;
+                                                                               break;
+                                                                       }
+                                                               }
+                                                               
+                                                               if((pl->type==TYP_PICHTML) || (pl->type==TYP_PICTURE))
+                                                               {
+                                                                       if(pl->pictype==PTYP_ASK)
+                                                                       {
+                                                                               if((rptr=strrchr(line_buffer,'.'))!=NULL)
+                                                                               {
+                                                                                       ++rptr;
+                                                                                       if(strncasecmp(rptr,"JPG",3)==0)
+                                                                                       {
+                                                                                               pl->pictype=PTYP_JPG;
+                                                                                       }
+                                                                                       else
+                                                                                       {
+                                                                                               if(strncasecmp(rptr,"GIF",3)==0)
+                                                                                               {
+                                                                                                       pl->pictype=PTYP_GIF;
+                                                                                               }
+                                                                                               else
+                                                                                               {
+                                                                                                       if(strncasecmp(rptr,"PNG",3)==0)
+                                                                                                       {
+                                                                                                               pl->pictype=PTYP_PNG;
+                                                                                                       }
+                                                                                               }
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                                       if(pl->pictype==PTYP_ASK)
+                                                                       {
+                                                                               close_jpg_gif_png();
+                                                                               ShowMessage(prs_translate("Nicht unterstütztes Dateiformat",CONVERT_LIST),1);
+                                                                               dloop=-1;
+                                                                               break;
+                                                                       }
+                                                               }
+
+                                                       
+                                                       
+                                                               if((pl->type==TYP_TXTHTML) || (pl->type==TYP_TEXTPAGE) || (pl->type==TYP_TXTPLAIN))
+                                                               {
+                                                                       if(gmodeon)
+                                                                       {
+                                                                               close_jpg_gif_png();
+                                                                               ShowInfo(&menu);
+                                                                       }
+                                                                       if(!cmdline)
+                                                                       {
+                                                                               ShowMessage(prs_translate("Bitte warten",CONVERT_LIST),0);
+                                                                       }
+                                                               }
+                                                               else
+                                                               {
+                                                                       if(!gmodeon && !cmdline)
+                                                                       {
+                                                                               ShowMessage(prs_translate("Bitte warten",CONVERT_LIST),0);
+                                                                       }
+                                                               }
+/*
+                                                               LCD_Clear();
+                                                               LCD_draw_rectangle (0,0,119,59, LCD_PIXEL_ON,LCD_PIXEL_OFF);
+                                                               LCD_draw_rectangle (3,3,116,56, LCD_PIXEL_ON,LCD_PIXEL_OFF);
+                                                               lpos=strlen(nstr);
+                                                               lrow=0;
+                                                               while(lpos>0)
+                                                               {
+                                                                       strncpy(dstr,nstr+LCD_CPL*lrow,LCD_CPL);
+                                                                       lpos-=LCD_CPL;
+                                                                       LCD_draw_string(13, (lrow+2)*LCD_RDIST, dstr);
+                                                                       lrow++;
+                                                               }
+                                                               LCD_update();
+                                                               ferr=(strlen(line_buffer))?0:-1;
+*/
+                                                               if((!ferr) && ((strcmp(line_buffer,lastpicture)!=0)||(loadalways)) && (pl->pictype!=TYP_TXTHTML))
+                                                               {
+                                                                       rptr=line_buffer;
+                                                                       if(*rptr=='\"')
+                                                                       {
+                                                                               ++rptr;
+                                                                       }
+                                                                       printf("Tuxwetter <Downloading %s>\n",rptr);
+                                                                       ferr=HTTP_downloadFile(rptr, (pl->pictype==PTYP_JPG)?JPG_FILE:(pl->pictype==PTYP_PNG)?PNG_FILE:(pl->pictype==PTYP_GIF)?GIF_FILE:PHP_FILE, 1, intype, ctmo, 2);
+                                                               }
+                                       
+                                                               if(!ferr)
+                                                               {
+                                                                       switch(pl->pictype)
+                                                                       {
+                                                                               case PTYP_JPG:
+                                                                                       tret=show_jpg(JPG_FILE, sx, sy, ex-sx, ey-sy, 5, pl->repeat, 0, 1);
+                                                                               break;
+
+                                                                               case PTYP_PNG:
+                                                                                       tret=show_png(PNG_FILE, sx, sy, ex-sx, ey-sy, 5, pl->repeat, 0, 1);
+                                                                               break;
+
+                                                                               case PTYP_GIF:
+                                                                                       tret=show_gif(GIF_FILE, sx, sy, ex-sx, ey-sy, 5, pl->repeat, 0, 1, (strcmp(line_buffer,lastpicture)==0));
+                                                                               break;
+
+                                                                               case TYP_TEXTPAGE:
+                                                                                       tret=show_php(PHP_FILE, nstr, 0, 1);
+                                                                               break;
+                                                                               
+                                                                               case TYP_TXTHTML:
+                                                                                       tret=show_php(PHP_FILE, nstr, 0, 0);
+                                                                               break;
+
+                                                                               case TYP_TXTPLAIN:
+                                                                               {
+                                                                                       FILE *fh1,*fh2;
+                                                                                       int cnt=0;
+                                                                                       char *pt1;
+                                                                                       
+                                                                                       tret=-1;
+                                                                                       if((fh1=fopen(PHP_FILE,"r"))!=NULL)
+                                                                                       {
+                                                                                               if((fh2=fopen(TMP_FILE,"w"))!=NULL)
+                                                                                               {
+                                                                                                       while(fgets(rstr, BUFSIZE-1,fh1))
+                                                                                                       {
+                                                                                                               TrimString(rstr);
+                                                                                                               pt1=rstr;
+                                                                                                               cnt=0;
+                                                                                                               fprintf(fh2,"<br>");
+                                                                                                               while(*pt1)
+                                                                                                               {       
+                                                                                                                       if(*pt1==' ' && cnt>40)
+                                                                                                                       {
+                                                                                                                               fprintf(fh2,"\n<br>");
+                                                                                                                               cnt=0;
+                                                                                                                       }
+                                                                                                                       else
+                                                                                                                       {
+                                                                                                                               fputc(*pt1,fh2);
+                                                                                                                               ++cnt;
+                                                                                                                       }
+                                                                                                               ++pt1;
+                                                                                                               }
+                                                                                                               fprintf(fh2,"\n");
+                                                                                                       }
+//                                                                                                     fprintf(fh2,"<br><br>\n");
+                                                                                                       fclose(fh2);
+                                                                                                       tret=show_php(TMP_FILE, nstr, 1, 0);
+                                                                                                       if(cindex==-98 && tret==KEY_RED)
+                                                                                                       {
+                                                                                                               xremove(MISS_FILE);
+                                                                                                       }
+                                                                                               }
+                                                                                               fclose(fh1);
+                                                                                       }
+                                                                               }
+                                                                               break;
+                                                                       }
+                                                                       
+                                                                       if(cindex!=-98)
+                                                                       {
+                                                                               strncpy(lastpicture,line_buffer,BUFSIZE);
+       
+                                                                               index=menu.act_entry;                                           
+                                                                               switch(tret)
+                                                                               {
+                                                                                       case -1:
+                                                                                               close_jpg_gif_png();
+                                                                                               ShowMessage(prs_translate("Datei kann nicht angezeigt werden.",CONVERT_LIST),1);
+                                                                                               dloop=-1;
+                                                                                               break;
+                                                                       
+                                                                                       case KEY_UP:
+                                                                                       case KEY_VOLUMEDOWN:
+                                                                                               if(--index < 0)
+                                                                                               {
+                                                                                                       index=menu.num_entrys-1;
+                                                                                               }
+                                                                                       break;
+                                                               
+                                                                                       case KEY_DOWN:
+                                                                                       case KEY_VOLUMEUP:
+                                                                                               if(++index>=menu.num_entrys)
+                                                                                               {
+                                                                                                       index=0;
+                                                                                               }
+                                                                                       break;
+                                                               
+                                                                                       case KEY_LEFT:
+                                                                                               *lastpicture=0;
+                                                                                       case KEY_RIGHT:
+                                                                                       break;
+                                                                                                                       
+                                                                                       default:
+                                                                                               dloop=0;
+                                                                                       break;
+                                                                               }
+                                                                               menu.act_entry=index;
+                                                                               pl=menu.list[menu.act_entry];
+                                                                               if((pl->type!=TYP_PICTURE) && (pl->type!=TYP_PICHTML) && (pl->type!=TYP_TXTHTML) && (pl->type!=TYP_TXTPLAIN) && (pl->type!=TYP_TEXTPAGE))
+                                                                               {
+                                                                                       dloop=0;
+                                                                                       cindex=99;
+                                                                               }
+                                                                       }
+                                                                       else
+                                                                       {
+                                                                               dloop=0;
+                                                                       }
+                                                               }
+                                                               else
+                                                               {
+                                                                       close_jpg_gif_png();
+                                                                       sprintf(tstr,"%s",prs_translate("Fehler",CONVERT_LIST));
+                                                                       sprintf(tstr,"%s %d %s.",tstr,ferr,prs_translate("beim Download",CONVERT_LIST));
+                                                                       ShowMessage(tstr,1);
+                                                                       ferr = 0;
+                                                                       dloop=-1;
+                                                               }
+                                                       
+                                                       
+                                                       
+                                                       }
+                                                       else
+                                                       {
+                                                               close_jpg_gif_png();
+                                                               ShowMessage(prs_translate("Formatfehler der URL in der tuxwetter.conf",CONVERT_LIST),1);
+                                                               dloop=-1;
+                                                               break;
+                                                       }
+                                               }
+                                               while(dloop>0);
+                                               close_jpg_gif_png();
+                                               break;
+                                                                                               
+                                       case TYP_CITY:
+                                               if(!prs_get_city())
+                                               {
+               
+                                                       rcm = -1;
+                                                       sprintf(tstr," ");
+                                                       
+                                                       Clear_List(&funcs, 1);
+                                                       funcs.act_entry=0;
+                                                       
+                                                       sprintf(tstr,"%s %s",prs_translate("Wetterdaten für",CONVERT_LIST),city_name);
+                                                       if(funcs.headertxt[0])
+                                                       {
+                                                               free(funcs.headertxt[0]);
+                                                       }
+                                                       funcs.headertxt[0]=strdup(tstr);
+
+                                                       for(index=0; index<MAX_FUNCS; index++)
+                                                       {
+#ifdef WWEATHER
+                                                               if(index==2)
+                                                               {
+                                                                       sprintf(rstr,"%s",prs_translate("Heute",CONVERT_LIST));
+                                                               }
+                                                               else
+                                                               {
+                                                                       prs_get_dwday(index-2, PRE_DAY,tstr);
+                                                                       sprintf(rstr,"%s",prs_translate(tstr,CONVERT_LIST));
+                                                               }
+#else
+                                                               if(index==2)
+                                                               {
+                                                                       sprintf(rstr,"%s",prs_translate("Heute",CONVERT_LIST));
+                                                               }
+                                                               else
+                                                               {
+                                                                       prs_get_day(index-2, rstr, metric);
+                                                               }
+                                                               if((rptr=strchr(rstr,','))!=NULL)
+                                                               {
+                                                                       *rptr=0;
+                                                               }
+#endif
+                                                               if(index>1)
+                                                               {
+                                                                       sprintf(tstr,"%s %s",prs_translate("Vorschau für",CONVERT_LIST),rstr);
+                                                               }
+                                                               else
+                                                               {
+                                                                       if(index==1)
+                                                                       {
+                                                                               sprintf(tstr,"%s",prs_translate("Wochentrend",CONVERT_LIST));
+                                                                       }
+                                                                       else
+                                                                       {
+                                                                               sprintf(tstr,"%s",prs_translate("Aktuelles Wetter",CONVERT_LIST));
+                                                                       }
+                                                               }
+                                                               AddListEntry(&funcs,tstr, 0);
+                                                       }
+                                                       wloop=1;
+                                                       while(wloop)
+                                                       {
+                                                               clear_screen();
+                                                               switch(Get_Selection(&funcs))
+                                                               {
+                                                                       case -99:
+                                                                               show_data(-99);
+                                                                               break;
+                               
+                                                                       case -1:
+                                                                               mainloop=0;
+                                                                               wloop=0;
+                                                                               break;
+                                                                               
+                                                                       case 0:
+                                                                               wloop=0;
+                                                                               break;
+                                                                               
+                                                                       case 1:
+                                                                               dloop=1;
+                                                                               while(dloop>0)
+                                                                               {
+                                                                                       if(!cmdline)
+                                                                                       {
+                                                                                               ShowMessage(prs_translate("Bitte warten",CONVERT_LIST),0);
+                                                                                       }
+                                                                                       show_data(funcs.act_entry);
+                                                                                       rce=GetRCCode();
+                                                                                       while((rce != KEY_OK) && (rce != KEY_EXIT) && (rce != KEY_DOWN) && (rce != KEY_UP) && (rce != KEY_VOLUMEUP) && (rce != KEY_VOLUMEDOWN))
+                                                                                       {
+                                                                                               rce=GetRCCode();
+                                                                                       }
+                                                                                       index=funcs.act_entry;
+                                                                                       if(gmodeon)
+                                                                                       {
+                                                                                               close_jpg_gif_png();
+                                                                                       }
+                                                                                       switch(rce)
+                                                                                       {
+                                                                                               case KEY_UP:
+                                                                                               case KEY_VOLUMEDOWN:
+                                                                                                       if(--index < 0)
+                                                                                                       {                                                       
+                                                                                                               index=MAX_FUNCS-1;
+                                                                                                       }
+                                                                                                       break;
+                                               
+                                                                                               case KEY_DOWN:
+                                                                                               case KEY_VOLUMEUP:
+                                                                                                       if(++index>=MAX_FUNCS)
+                                                                                                       {
+                                                                                                       index=0;
+                                                                                                       }
+                                                                                                       break;
+
+                                                                                               case KEY_OK:
+                                                                                               case KEY_EXIT:
+                                                                                                       dloop=0;
+                                                                                                       break;  
+                                                                                       }
+                                                                                       funcs.act_entry=index;
+                                                                               }
+                                                               }
+                                                       }
+                                               }
+                                               break;
+                               }       
+                               break;
+               }
+               clear_screen();
+               if(cindex==-98 && epl.entry)
+               {
+                       free(epl.entry);
+                       epl.entry=NULL;
+               }
+               
+               if(cmdline)
+               {
+                       mainloop=0;
+               }
+       }
+
+       //cleanup
+
+       // clear Display
+       free(proxyadress);
+       free(proxyuserpwd);
+       
+       Clear_List(&menu,-1);
+       Clear_List(&funcs,-1);
+
+       free(trstr);
+       if(cmdline)
+       {
+               free(cmdline);
+       }
+
+       FTC_Manager_Done(manager);
+       FT_Done_FreeType(library);
+
+       close_jpg_gif_png();
+       
+//     clear_lcd();
+       
+       CloseRC();
+
+    for(index=0; index<32; index++)
+    {
+       sprintf(tstr,"%s%02d.gif",GIF_MFILE,index);
+       xremove(tstr);
+    }
+       sprintf(tstr,"[ -e /tmp/picture* ] && rm /tmp/picture*");
+       system(tstr);
+       xremove("/tmp/tuxwettr.tmp");
+       xremove("/tmp/bmps.tar");
+       xremove("/tmp/icon.gif");
+       xremove("/tmp/tempgif.gif");
+       xremove(PHP_FILE);
+       put_instance(get_instance()-1);
+       
+       if((tfh=fopen(TIME_FILE,"r"))!=NULL)
+       {
+               fclose(tfh);
+               sprintf(line_buffer,"%s &",TIME_FILE);
+               system(line_buffer);
+               free(line_buffer);
+       }
+       
+
+       // clear Display
+       memset(lbb, TRANSP, fix_screeninfo.line_length*var_screeninfo.yres);
+       memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres);
+//     memset(lfb, TRANSP, fix_screeninfo.line_length*var_screeninfo.yres);
+       munmap(lfb, fix_screeninfo.smem_len);
+       close(fb);
+       free(lbb);
+       return 0;
+}
diff --git a/tuxwetter.cfg b/tuxwetter.cfg
new file mode 100644 (file)
index 0000000..3b98be0
--- /dev/null
@@ -0,0 +1,7 @@
+type=2
+name=CS-Tuxwetter
+desc=Wettervorhersage
+needfb=1
+needrc=1
+needlcd=1
+needoffs=1
diff --git a/tuxwetter.conf b/tuxwetter.conf
new file mode 100755 (executable)
index 0000000..5229083
--- /dev/null
@@ -0,0 +1,452 @@
+####################################################################################
+####                 CS-Tuxwetter Version 3.01 Beta  
+####            Aktuelle Wetterinfos, Wettervorhersagen und mehr.
+####################################################################################
+#
+# Konfigurationsdatei für CS-Tuxwetter
+#
+# InetConnection=ISDN/ANALOG  für langsamere Verbindungen zur Konfiguration von Timeoutzeiten
+#                             beim Download und des Fortschrittsbalkens, kann bei DSL entfallen
+#
+# Nutzer eine Proxservers können diesen dem Plugin mit folgenden Einträgen bekanntmachen
+#
+# ProxyAdressPort=ProxyAdresse:ProxyPort
+# ProxyUserPwd=Username:Passwort
+#
+# Beispiel:
+# ProxyAdressPort=192.168.0.128:8080
+# ProxyUserPwd=username1:passwort1
+#
+#      Beispiele für worldweatheronline.com
+#      Suche:
+#      http://www.worldweatheronline.com/feed/search.ashx?key=xxxxxxxx&format=xml&q=Frankfurt
+#
+#      Abfrage über Name:
+#      http://free.worldweatheronline.com/feed/weather.ashx?key=xxxxxxxx&num_of_days=5&includeLocation=yes&q=Frankfurt
+#
+#      Abfrage über Längen-/Breitengrad
+#      http://free.worldweatheronline.com/feed/weather.ashx?key=xxxxxxxx&num_of_days=5&includeLocation=yes&q=52.350,14.550
+
+MENU=CS-Tuxwetter
+       MENU=Favoriten
+               Stadt=Bremerhaven,Bremerhaven,Germany
+               Stadt=Iserlohn,Iserlohn,Germany
+               Stadt=Köln,Koln,Germany
+               Stadt=München,Munchen,Germany
+       ENDMENU
+       MENU=Wetterdaten
+               MENU=Deutschland
+                       MENU=Städte A-B
+                               Stadt=Aachen,Aachen,Germany
+                               Stadt=Ahaus,Ahaus,Germany
+                               Stadt=Ahrensburg,Ahrensburg,Germany
+                               Stadt=Allendorf,Allendorf,Germany
+                               Stadt=Alsenz,Alsenz,Germany
+                               Stadt=Altenbruch,Altenbruch,Germany
+                               Stadt=Amberg,Amberg,Germany
+                               Stadt=Ansbach,Ansbach,Germany
+                               Stadt=Aschaffenburg,Aschaffenburg,Germany
+                               Stadt=Augsburg,Augsburg,Germany
+                               Stadt=Aurich,Aurich,Germany
+                               Stadt=Bad Hersfeld,Bad%20Hersfeld,Germany
+                               Stadt=Bad Tölz,Bad%20Tolz,Germany
+                               Stadt=Bamberg,Bamberg,Germany
+                               Stadt=Bayreuth,Bayreuth,Germany
+                               Stadt=Bergisch-Gladbach,Bergisch%20Gladbach,Germany
+                               Stadt=Berlin,Berlin,Germany
+                               Stadt=Bielefeld,Bielefeld,Germany
+                               Stadt=Bitburg,Bitburg,Germany
+                               Stadt=Blexen,Blexen,Germany
+                               Stadt=Bonn,Bonn,Germany
+                               Stadt=Bottrop,Bottrop,Germany
+                               Stadt=Brandenburg,Brandenburg,Germany
+                               Stadt=Braunschweig,Braunschweig,Germany
+                               Stadt=Bremen,Bremen,Germany
+                               Stadt=Bremerhaven,Bremerhaven,Germany
+                               Stadt=Brunsbüttel,Brunsbuttel,Germany
+                               Stadt=Bückeburg,Buckeburg,Germany
+                       ENDMENU
+                       MENU=Städte C-D
+                               Stadt=Celle,Celle,Germany
+                               Stadt=Chemnitz,Chemnitz,Germany
+                               Stadt=Cloppenburg,Cloppenburg,Germany
+                               Stadt=Coburg,Coburg,Germany
+                               Stadt=Cottbus,Cottbus,Germany
+                               Stadt=Cuxhaven,Cuxhaven,Germany
+                               Stadt=Dachau,Dachau,Germany
+                               Stadt=Darmstadt,Darmstadt,Germany
+                               Stadt=Deggendorf,Deggendorf,Germany
+                               Stadt=Delmenhorst,Delmenhorst,Germany
+                               Stadt=Dessau,Dessau,Germany
+                               Stadt=Detmold,Detmold,Germany
+                               Stadt=Döbeln,Dobeln,Germany
+                               Stadt=Donaueschingen,Donaueschingen,Germany
+                               Stadt=Dortmund,Dortmund,Germany
+                               Stadt=Dresden,Dresden,Germany
+                               Stadt=Duhnen,Duhnen,Germany
+                               Stadt=Duisburg,Duisburg,Germany
+                               Stadt=Düsseldorf,Dusseldorf,Germany
+                       ENDMENU
+                       MENU=Städte E-F
+                               Stadt=Ebersberg,Ebersberg,Germany
+                               Stadt=Eberswalde,Eberswalde,Germany
+                               Stadt=Eckernförde,Eckernforde,Germany
+                               Stadt=Eggenfelden,Eggenfelden,Germany
+                               Stadt=Eichstätt,Eichstatt,Germany
+                               Stadt=Elmshorn,Elmshorn,Germany
+                               Stadt=Emden,Emden,Germany
+                               Stadt=Erding,Erding,Germany
+                               Stadt=Erfurt,Erfurt,Germany
+                               Stadt=Erlangen,Erlangen,Germany
+                               Stadt=Eschlkam,Eschlkam,Germany
+                               Stadt=Eschwege,Eschwege,Germany
+                               Stadt=Essen,Essen,Germany
+                               Stadt=Esslingen,Esslingen,Germany
+                               Stadt=Euskirchen,Euskirchen,Germany
+                               Stadt=Eutin,Eutin,Germany
+                               Stadt=Falkensee,Falkensee,Germany
+                               Stadt=Feucht,Feucht,Germany
+                               Stadt=Flensburg,Flensburg,Germany
+                               Stadt=Frankfurt am Main,Frankfurt%20Am%20Main,Germany
+                               Stadt=Frankfurt an der Oder,Frankfurt%20An%20Der%20Oder,Germany
+                               Stadt=Freiburg,Freiburg,Germany
+                               Stadt=Freising,Freising,Germany
+                               Stadt=Freudenstadt,Freudenstadt,Germany
+                               Stadt=Freyung,Freyung,Germany
+                               Stadt=Friedrichshafen,Friedrichshafen,Germany
+                               Stadt=Friesoythe,Friesoythe,Germany
+                               Stadt=Fritzlar,Fritzlar,Germany
+                               Stadt=Fulda,Fulda,Germany
+                               Stadt=Fürstenfeldbruck,Furstenfeldbruck,Germany
+                               Stadt=Fürth,Furth,Germany
+                       ENDMENU
+                       MENU=Städte G-H
+                               Stadt=Garmisch-Partenkirchen,Garmisch-Partenkirchen,Germany
+                               Stadt=Geilenkirchen,Geilenkirchen,Germany
+                               Stadt=Gelnhausen,Gelnhausen,Germany
+                               Stadt=Gelsenkirchen,Gelsenkirchen,Germany
+                               Stadt=Gera,Gera,Germany
+                               Stadt=Geretsried,Geretsried,Germany
+                               Stadt=Germersheim,Germersheim,Germany
+                               Stadt=Gettorf,Gettorf,Germany
+                               Stadt=Gießen,Giesen,Germany
+                               Stadt=Glauchau,50.820,12.530
+                               Stadt=Göppingen,Goppingen,Germany
+                               Stadt=Görlitz,Gorlitz,Germany
+                               Stadt=Göttingen,Gottingen,Germany
+                               Stadt=Grafenau,Grafenau,Germany
+                               Stadt=Grafenwöhr,Grafenwohr,Germany
+                               Stadt=Greifswald,Greifswald,Germany
+                               Stadt=Grünberg,Grunberg,Germany
+                               Stadt=Gütersloh,Gutersloh,Germany
+                               Stadt=Hagen,Hagen,Germany
+                               Stadt=Hahn,Hahn,Germany
+                               Stadt=Halle,Halle,Germany
+                               Stadt=Hamburg,Hamburg,Germany
+                               Stadt=Hamm,Hamm,Germany
+                               Stadt=Hanau,Hanau,Germany
+                               Stadt=Hannover,Hannover,Germany
+                               Stadt=Harrislee,Harrislee,Germany
+                               Stadt=Heidelberg,Heidelberg,Germany
+                               Stadt=Heilbronn,Heilbronn,Germany
+                               Stadt=Helgoland,Helgoland,Germany
+                               Stadt=Hennigsdorf,Hennigsdorf,Germany
+                               Stadt=Herne,Herne,Germany
+                               Stadt=Hildesheim,Hildesheim,Germany
+                               Stadt=Hinte,Hinte,Germany
+                               Stadt=Hochheim,Hochheim,Germany
+                               Stadt=Hof,Hof,Germany
+                               Stadt=Holzkirchen,Holzkirchen,Germany
+                               Stadt=Hürth,Hurth,Germany
+                               Stadt=Husby,Husby,Germany
+                               Stadt=Husum,Husum,Germany
+                       ENDMENU
+                       MENU=Städte I-K
+                               Stadt=Idar-Oberstein,Idar-Oberstein,Germany
+                               Stadt=Ingolstadt,Ingolstadt,Germany
+                               Stadt=Iserlohn,Iserlohn,Germany
+                               Stadt=Itzehoe,Itzehoe,Germany
+                               Stadt=Jever,Jever,Germany
+                               Stadt=Jülich,Julich,Germany
+                               Stadt=Kall,Kall,Germany
+                               Stadt=Karlsruhe,Karlsruhe,Germany
+                               Stadt=Kassel,Kassel,Germany
+                               Stadt=Kaufbeuren,Kaufbeuren,Germany
+                               Stadt=Kempten,Kempten,Germany
+                               Stadt=Kiel,Kiel,Germany
+                               Stadt=Kitzingen,Kitzingen,Germany
+                               Stadt=Koblenz,Koblenz,Germany
+                               Stadt=Köln,Koln,Germany
+                               Stadt=Konstanz,Konstanz,Germany
+                               Stadt=Krefeld,Krefeld,Germany
+                               Stadt=Kronshagen,Kronshagen,Germany
+                               Stadt=Krumbach,Krumbach,Germany
+                       ENDMENU
+                       MENU=Städte L-M
+                               Stadt=Laarbruch,Laarbruch,Germany
+                               Stadt=Lahr,Lahr,Germany
+                               Stadt=Landshut,Landshut,Germany
+                               Stadt=Langenhagen,Langenhagen,Germany
+                               Stadt=Lechfeld,Lechfeld,Germany
+                               Stadt=Leck,Leck,Germany
+                               Stadt=Leer,Leer,Germany
+                               Stadt=Leipzig,Leipzig,Germany
+                               Stadt=Leverkusen,Leverkusen,Germany
+                               Stadt=Lindenberg,Lindenberg,Germany
+                               Stadt=List,List,Germany
+                               Stadt=Lübeck,Lubeck,Germany
+                               Stadt=Lüchow,Luchow,Germany
+                               Stadt=Luckenwalde,Luckenwalde,Germany
+                               Stadt=Ludwigsburg,Ludwigsburg,Germany
+                               Stadt=Ludwigshafen,Ludwigshafen,Germany
+                               Stadt=Lüneburg,Luneburg,Germany
+                               Stadt=Magdeburg,Magdeburg,Germany
+                               Stadt=Mainz,Mainz,Germany
+                               Stadt=Mannheim,Mannheim,Germany
+                               Stadt=Marburg,Marburg,Germany
+                               Stadt=Marienfelde,Marienfelde,Germany
+                               Stadt=Marktbreit,Marktbreit,Germany
+                               Stadt=Meiningen,Meiningen,Germany
+                               Stadt=Memmingen,Memmingen,Germany
+                               Stadt=Meppen,Meppen,Germany
+                               Stadt=Merzig,Merzig,Germany
+                               Stadt=Minden,Minden,Germany
+                               Stadt=Mönchengladbach,Monchengladbach,Germany
+                               Stadt=Oldersum,Oldersum,Germany
+                               Stadt=Mühldorf,Muhldorf,Germany
+                               Stadt=München,Munchen,Germany
+                               Stadt=Münster,Munster,Germany
+                               Stadt=Murnau,Murnau,Germany
+                               Stadt=Mylau,50.620,12.270
+                       ENDMENU
+                       MENU=Städte N-O
+                               Stadt=Naumburg,Naumburg,Germany
+                               Stadt=Neubrandenburg,Neubrandenburg,Germany
+                               Stadt=Neumarkt,Neumarkt,Germany
+                               Stadt=Neumünster,Neumunster,Germany
+                               Stadt=Neunkirchen,Neunkirchen,Germany
+                               Stadt=Neuruppin,Neuruppin,Germany
+                               Stadt=Neuss,Neuss,Germany
+                               Stadt=Neuwied,Neuwied,Germany
+                               Stadt=Niendorf,Niendorf,Germany
+                               Stadt=Norden,Norden,Germany
+                               Stadt=Nordenham,Nordenham,Germany
+                               Stadt=Norderney,Norderney,Germany
+                               Stadt=Nordhausen,Nordhausen,Germany
+                               Stadt=Nordhorn,Nordhorn,Germany
+                               Stadt=Nördlingen,Nordlingen,Germany
+                               Stadt=Oberhausen,Oberhausen,Germany
+                               Stadt=Oberpfaffenhofen,Oberpfaffenhofen,Germany
+                               Stadt=Oberstdorf,Oberstdorf,Germany
+                               Stadt=Ochsenfurt,Ochsenfurt,Germany
+                               Stadt=Oeversee,Oeversee,Germany
+                               Stadt=Offenbach,Offenbach,Germany
+                               Stadt=Oldenburg,Oldenburg,Germany
+                               Stadt=Oranienburg,Oranienburg,Germany
+                               Stadt=Osnabrück,Osnabruck,Germany
+                               Stadt=Otterndorf,Otterndorf,Germany
+                       ENDMENU
+                       MENU=Städte P-R
+                               Stadt=Paderborn,Paderborn,Germany
+                               Stadt=Passau,Passau,Germany
+                               Stadt=Peine,Peine,Germany
+                               Stadt=Pfaffenhofen,Pfaffenhofen,Germany
+                               Stadt=Pfarrkirchen,Pfarrkirchen,Germany
+                               Stadt=Pforzheim,Pforzheim,Germany
+                               Stadt=Pinneberg,Pinneberg,Germany
+                               Stadt=Pirmasens,Pirmasens,Germany
+                               Stadt=Plauen,Plauen,Germany
+                               Stadt=Pocking,Pocking,Germany
+                               Stadt=Potsdam,Potsdam,Germany
+                               Stadt=Prenzlau,Prenzlau,Germany
+                               Stadt=Quickborn,Quickborn,Germany
+                               Stadt=Rastede,Rastede,Germany
+                               Stadt=Recklinghausen,Recklinghausen,Germany
+                               Stadt=Regensburg,Regensburg,Germany
+                               Stadt=Remscheid,Remscheid,Germany
+                               Stadt=Rendsburg,Rendsburg,Germany
+                               Stadt=Rennerod,Rennerod,Germany
+                               Stadt=Rosenheim,Rosenheim,Germany
+                               Stadt=Rostock,Rostock,Germany
+                               Stadt=Rüsselsheim,Russelsheim,Germany
+                       ENDMENU
+                       MENU=Städte S-U
+                               Stadt=Saarbrücken,49.230,7.000
+                               Stadt=Sahlenburg,53.870,8.630
+                               Stadt=Salzgitter,52.080,10.330
+                               Stadt=Salzwedel,52.850,11.150
+                               Stadt=Schiffdorf,53.530,8.650
+                               Stadt=Schleswig,54.520,9.550
+                               Stadt=Schrobenhausen,48.550,11.270
+                               Stadt=Schwabach,49.330,11.030
+                               Stadt=Schwäbisch Hall,49.110,9.730
+                               Stadt=Schweinfurt,50.050,10.230
+                               Stadt=Schwerin,53.630,11.380
+                               Stadt=Siegburg,50.800,7.200
+                               Stadt=Siegen,50.870,8.030
+                               Stadt=Solingen,51.180,7.080
+                               Stadt=Starnberg,48.000,11.350
+                               Stadt=Straubing,48.880,12.570
+                               Stadt=Stuttgart,48.770,9.180
+                               Stadt=Sulingen,52.680,8.800
+                               Stadt=Sylt,54.880,8.350
+                               Stadt=Tönning,54.320,8.950
+                               Stadt=Travemünde,53.970,10.870
+                               Stadt=Trier,49.750,6.630
+                               Stadt=Tübingen,48.530,9.050
+                               Stadt=Ulm,48.400,10.000
+                       ENDMENU
+                       MENU=Städte V-Z
+                               Stadt=Veitsbronn,49.520,10.880
+                               Stadt=Villingen-Schwenningen,48.070,8.450
+                               Stadt=Vilsbiburg,48.450,12.350
+                               Stadt=Vilshofen,48.620,13.180
+                               Stadt=Waldkirchen/Bayr.-Wald,48.730,13.600
+                               Stadt=Wallsbüll,54.580,9.000
+                               Stadt=Warnemünde,54.170,12.080
+                               Stadt=Weiden,49.680,12.160
+                               Stadt=Weimar,50.980,11.320
+                               Stadt=Weißenburg/Bayern,49.030,10.980
+                               Stadt=Werdau,50.730,12.380
+                               Stadt=Wernigerode,51.830,10.780
+                               Stadt=Westerland/Sylt,54.900,8.300
+                               Stadt=Westerstede,53.250,7.930
+                               Stadt=Wetzlar,50.550,8.500
+                               Stadt=Wiesbaden,50.080,8.250
+                               Stadt=Wilhelmshaven,53.520,8.130
+                               Stadt=Wittenberge,53.000,11.750
+                               Stadt=Wittingen,52.730,10.720
+                               Stadt=Wolfsburg,52.430,10.800
+                               Stadt=Wuppertal,51.270,7.180
+                               Stadt=Würzburg,49.790,9.940
+                               Stadt=Zeven,53.300,9.280
+                               Stadt=Zirndorf,49.450,10.950
+                               Stadt=Zwickau,50.720,12.500
+                       ENDMENU
+               ENDMENU
+               MENU=Aktuelles vom Wetterdienst(D)
+                       MENU=Deutschland
+                               PICTURE=heute-aktuell,http://www.dwd.de/wundk/wetter/de/Deutschland.jpg
+                               PICTURE=morgen-früh,http://www.dwd.de/wundk/wetter/de/Deutschland_morgen_frueh.jpg
+                               PICTURE=morgen-spät,http://www.dwd.de/wundk/wetter/de/Deutschland_morgen_spaet.jpg
+                               PICTURE=übermorgen-früh,http://www.dwd.de/wundk/wetter/de/Deutschland_ueberm_frueh.jpg
+                               PICTURE=übermorgen-spät,http://www.dwd.de/wundk/wetter/de/Deutschland_ueberm_spaet.jpg
+                       ENDMENU
+                       MENU=Region Nord-West
+                               PICTURE=heute-aktuell,http://www.dwd.de/wundk/wetter/de/Nordwest.jpg
+                               PICTURE=morgen-früh,http://www.dwd.de/wundk/wetter/de/Nordwest_morgen_frueh.jpg
+                               PICTURE=morgen-spät,http://www.dwd.de/wundk/wetter/de/Nordwest_morgen_spaet.jpg
+                               PICTURE=übermorgen-früh,http://www.dwd.de/wundk/wetter/de/Nordwest_ueberm_frueh.jpg
+                               PICTURE=übermorgen-spät,http://www.dwd.de/wundk/wetter/de/Nordwest_ueberm_spaet.jpg
+                       ENDMENU
+                       MENU=Region Nord-Ost
+                               PICTURE=heute-aktuell,http://www.dwd.de/wundk/wetter/de/Nordost.jpg
+                               PICTURE=morgen-früh,http://www.dwd.de/wundk/wetter/de/Nordost_morgen_frueh.jpg
+                               PICTURE=morgen-spät,http://www.dwd.de/wundk/wetter/de/Nordost_morgen_spaet.jpg
+                               PICTURE=übermorgen-früh,http://www.dwd.de/wundk/wetter/de/Nordost_ueberm_frueh.jpg
+                               PICTURE=übermorgen-spät,http://www.dwd.de/wundk/wetter/de/Nordost_ueberm_spaet.jpg
+                       ENDMENU
+                       MENU=Region West
+                               PICTURE=heute-aktuell,http://www.dwd.de/wundk/wetter/de/West.jpg
+                               PICTURE=morgen-früh,http://www.dwd.de/wundk/wetter/de/West_morgen_frueh.jpg
+                               PICTURE=morgen-spät,http://www.dwd.de/wundk/wetter/de/West_morgen_spaet.jpg
+                               PICTURE=übermorgen-früh,http://www.dwd.de/wundk/wetter/de/West_ueberm_frueh.jpg
+                               PICTURE=übermorgen-spät,http://www.dwd.de/wundk/wetter/de/West_ueberm_spaet.jpg
+                       ENDMENU
+                       MENU=Region Ost
+                               PICTURE=heute-aktuell,http://www.dwd.de/wundk/wetter/de/Ost.jpg
+                               PICTURE=morgen-früh,http://www.dwd.de/wundk/wetter/de/Ost_morgen_frueh.jpg
+                               PICTURE=morgen-spät,http://www.dwd.de/wundk/wetter/de/Ost_morgen_spaet.jpg
+                               PICTURE=übermorgen-früh,http://www.dwd.de/wundk/wetter/de/Ost_ueberm_frueh.jpg
+                               PICTURE=übermorgen-spät,http://www.dwd.de/wundk/wetter/de/Ost_ueberm_spaet.jpg
+                       ENDMENU
+                       MENU=Region Mitte
+                               PICTURE=heute-aktuell,http://www.dwd.de/wundk/wetter/de/Mitte.jpg
+                               PICTURE=morgen-früh,http://www.dwd.de/wundk/wetter/de/Mitte_morgen_frueh.jpg
+                               PICTURE=morgen-spät,http://www.dwd.de/wundk/wetter/de/Mitte_morgen_spaet.jpg
+                               PICTURE=übermorgen-früh,http://www.dwd.de/wundk/wetter/de/Mitte_ueberm_frueh.jpg
+                               PICTURE=übermorgen-spät,http://www.dwd.de/wundk/wetter/de/Mitte_ueberm_spaet.jpg
+                       ENDMENU
+                       MENU=Region Süd-Ost
+                               PICTURE=heute-aktuell,http://www.dwd.de/wundk/wetter/de/Suedost.jpg
+                               PICTURE=morgen-früh,http://www.dwd.de/wundk/wetter/de/Suedost_morgen_frueh.jpg
+                               PICTURE=morgen-spät,http://www.dwd.de/wundk/wetter/de/Suedost_morgen_spaet.jpg
+                               PICTURE=übermorgen-früh,http://www.dwd.de/wundk/wetter/de/Suedost_ueberm_frueh.jpg
+                               PICTURE=übermorgen-spät,http://www.dwd.de/wundk/wetter/de/Suedost_ueberm_spaet.jpg
+                       ENDMENU
+                       MENU=Region Süd-West
+                               PICTURE=heute-aktuell,http://www.dwd.de/wundk/wetter/de/Suedwest.jpg
+                               PICTURE=morgen-früh,http://www.dwd.de/wundk/wetter/de/Suedwest_morgen_frueh.jpg
+                               PICTURE=morgen-spät,http://www.dwd.de/wundk/wetter/de/Suedwest_morgen_spaet.jpg
+                               PICTURE=übermorgen-früh,http://www.dwd.de/wundk/wetter/de/Suedwest_ueberm_frueh.jpg
+                               PICTURE=übermorgen-spät,http://www.dwd.de/wundk/wetter/de/Suedwest_ueberm_spaet.jpg
+                       ENDMENU
+               ENDMENU
+       ENDMENU
+       MENU=Seewetter
+               PICTURE=Nordsee,|PNG|http://www.dwd.de/bvbw/generator/DWDWWW/Content/Schifffahrt/Seewetter/Wind__Seegang__Bild__default,property=default.jpg
+               PICTURE=Nordsee +24h,|PNG|http://www.dwd.de/bvbw/generator/DWDWWW/Content/Schifffahrt/Seewetter/Wind__Seegang__Nordsee__Bild__default,property=default.jpg
+               PICTURE=Nordsee +48h,|PNG|http://www.dwd.de/bvbw/generator/DWDWWW/Content/Schifffahrt/Seewetter/Wind__Seegang__Nordsee__48__Bild__default,property=default.jpg
+               PICTURE=Nordsee +72h,|PNG|http://www.dwd.de/bvbw/generator/DWDWWW/Content/Schifffahrt/Seewetter/Wind__Seegang__Nordsee__72__Bild__default,property=default.jpg
+       ENDMENU
+       MENU=Unwetterwarnungen
+                MENU=Deutschland
+                       PICTURE=DWD Deutschland,http://www.dwd.de/dyn/app/ws/maps/DE_x_x_0.gif
+                       PICTURE=Sturmwarnung Deutschland,http://www.dwd.de/dyn/app/ws/maps/DE_x_x_1.gif
+                       PICTURE=Starkregen Deutschland,http://www.dwd.de/dyn/app/ws/maps/DE_x_x_2.gif
+                       PICTURE=Gewitterwarnung Deutschland,http://www.dwd.de/dyn/app/ws/maps/DE_x_x_3.gif
+                       PICTURE=Glätte Deutschland,http://www.dwd.de/dyn/app/ws/maps/DE_x_x_4.gif
+                       PICTURE=Schnee Deutschland,http://www.dwd.de/dyn/app/ws/maps/DE_x_x_5.gif
+                       PICTURE=Frost Deutschland,http://www.dwd.de/dyn/app/ws/maps/DE_x_x_6.gif
+                       PICTURE=Nebel Deutschland,http://www.dwd.de/dyn/app/ws/maps/DE_x_x_7.gif
+                       PICTURE=Tauwetter Deutschland,http://www.dwd.de/dyn/app/ws/maps/DE_x_x_8.gif
+                ENDMENU
+                MENU=Warnlagen Nordseeküste
+                       TXTHTML=Helgoland,http://www.dwd.de/dyn/app/ws/html/reports/PIH_warning_de.html#WS_ANCHOR_0|<body>|</body>
+                       TXTHTML=Nordfriesland,http://www.dwd.de/dyn/app/ws/html/reports/NFX_warning_de.html#WS_ANCHOR_0|<body>|</body>
+                       TXTHTML=Cuxhaven,http://www.dwd.de/dyn/app/ws/html/reports/CUX_warning_de.html#WS_ANCHOR_0|<body>|</body>
+                       TXTHTML=Bremerhaven,http://www.dwd.de/dyn/app/ws/html/reports/BHV_warning_de.html#WS_ANCHOR_0|<body>|</body>
+                ENDMENU
+       ENDMENU
+       MENU=DAX
+               PICTURE=Dax Realtime Parkettkamera,|JPG15|http://deutsche-boerse.smarthouse.i24.cc/DAX_chart_realtime.jpg
+       ENDMENU
+       MENU=Tagesschau
+               PICTURE=Tagesschau-Wettervorschau,http://www.tagesschau.de/import/wetter/de-vs-3t.jpg
+               PICTURE=Tagesschau-Nacht,http://www.tagesschau.de/import/wetter/de-vs-tn.jpg
+               PICTURE=Tagesschau-Tag,http://www.tagesschau.de/import/wetter/de-vs-tt.jpg
+       ENDMENU
+       MENU=Webcams
+               PICTURE=Frankfurt/Römer,http://www.frankfurt.de/sis/frankfurtbilder/cams/pia/images/webcam_pia.jpg
+               PICTURE=Frankfurt/Messe,http://www.messefrankfurt.com/corporate/de/images/c003.jpg
+               PICTURE=Frankfurt/Skyline,http://www.frankfurt.de/sis/frankfurtbilder/cams/64cam/images/webcam_64.jpg
+               PICTURE=Fulda,http://www.uewag.de/WebCamImage/image.jpg
+               PICTURE=Hamburg/Rathausmarkt,http://www.hamburger-rathausmarkt.de/rathausmarkt.jpg
+               PICTURE=Köln-Dom/Rhein,http://www.restaurantoasis.de/WebCam.jpg
+               PICTURE=Köln-Dom/WDR,http://www.wdr.de/themen/global/webcams/domcam/domcam_live.jpg
+               PICTURE=Berlin,http://www.dhm.de/webcams/pics/cam4_large.jpg
+               PICTURE=Berlin,http://www.dhm.de/webcams/pics/cam2_large.jpg
+               PICTURE=Hannover,http://www.langelaube2.de/webcam/webcam.jpg
+               PICTURE=Leipzig,http://www.na-klarmann.de/cam.JPG
+               PICTURE=Schwarzwald/Hütte,http://www.emmendinger-huette.de/bilder/axis.jpg
+               PICTURE=Sylt,http://www.sylt-wetter.de/livecams/bild02.jpg
+               PICTURE=Zugspitze,http://www.zugspitze.de/livecamsdata/k1bildww.jpg
+               PICTURE=ES/Andorra,http://www.el-viking.com/left.jpg
+               PICTURE=USA/LosAngeles-Airport,http://abclocal.go.com/three/kabc/webcam/web1-2.jpg
+               PICTURE=USA/LosAngeles-Downtown,http://abclocal.go.com/three/kabc/webcam/web2-1.jpg
+               PICTURE=USA/LosAngeles-LongBeach,http://abclocal.go.com/three/kabc/webcam/web1-1.jpg
+               PICTURE=USA/NewYork-EmpireStateBuilding,http://www.nyvibe.net/nyvibescam/view.jpg
+       ENDMENU
+       MENU=Radiosender Studiocams
+               PICTURE=Eins Live - Moderator,|JPG10|http://www.einslive.de/webcam/studio_a_1.jpg
+               PICTURE=Eins Live - Gast,|JPG10|http://www.einslive.de/webcam/studio_a_2.jpg
+               PICTURE=HIT RADIO FFH - Cam 1,|JPG30|http://resource.ffh.de/webcams/ffh/cam1-fullsize.jpg
+               PICTURE=HIT RADIO FFH - Cam 2,|JPG30|http://resource.ffh.de/webcams/ffh/cam2-fullsize.jpg
+               PICTURE=hr3 - Studio 1,|JPG10|http://www.hrfoto.dunkel.de/webcams/hr3/studio1.jpg
+               PICTURE=hr3 - Studio 2,|JPG10|http://www.hrfoto.dunkel.de/webcams/hr3/studio2.jpg
+               PICTURE=N-JOY,|JPG30|http://data.ndr.de/webcams/njoy/cam.jpg
+               PICTURE=NDR2 - Studio 1,|JPG30|http://data.ndr.de/webcams/ndr2/cam1.jpg
+               PICTURE=NDR2 - Studio 2,|JPG30|http://data.ndr.de/webcams/ndr2/cam2.jpg
+               PICTURE=YOU FM,|JPG10|http://www.hrfoto.dunkel.de/webcams/xxl/studio1.jpg
+       ENDMENU
+ENDMENU
diff --git a/tuxwetter.h b/tuxwetter.h
new file mode 100644 (file)
index 0000000..819d33e
--- /dev/null
@@ -0,0 +1,134 @@
+#ifndef __TUXWETTER_H__
+
+#define __TUXWETTER_H__
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <linux/fb.h>
+#if HAVE_DVB_API_VERSION == 3
+#include <linux/input.h>
+#endif
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_CACHE_H
+#include FT_CACHE_SMALL_BITMAPS_H
+
+#define BUFSIZE        4095
+
+#define MISS_FILE      "/var/tuxbox/config/tuxwetter/missing_translations.txt"
+
+enum {LEFT, CENTER, RIGHT};
+
+FT_Error               error;
+FT_Library             library;
+FTC_Manager            manager;
+FTC_SBitCache          cache;
+FTC_SBit               sbit;
+#if FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 0
+FTC_Image_Desc         desc;
+#else
+FTC_ImageTypeRec       desc;
+#endif
+FT_Face                        face;
+FT_UInt                        prev_glyphindex;
+FT_Bool                        use_kerning;
+
+// rc codes
+
+#undef KEY_EPG
+#undef KEY_SAT
+#undef KEY_STOP
+#undef KEY_PLAY
+
+#define KEY_1                                  2
+#define KEY_2                                  3
+#define KEY_3                                  4
+#define KEY_4                                  5
+#define KEY_5                                  6
+#define KEY_6                                  7
+#define KEY_7                                  8
+#define KEY_8                                  9
+#define KEY_9                                  10
+#define KEY_BACKSPACE           14
+#define KEY_UP                  103
+#define KEY_LEFT                105
+#define KEY_RIGHT               106
+#define KEY_DOWN                108
+#define KEY_MUTE                113
+#define KEY_VOLUMEDOWN          114
+#define KEY_VOLUMEUP            115
+#define KEY_POWER               116
+#define KEY_HELP                138
+#define KEY_HOME                102
+#define KEY_EXIT                               174
+#define KEY_SETUP               141
+#define KEY_PAGEUP              104
+#define KEY_PAGEDOWN            109
+#define KEY_OK                         0x160
+#define KEY_RED                        0x18e
+#define KEY_GREEN                      0x18f
+#define KEY_YELLOW                     0x190
+#define KEY_BLUE                       0x191
+
+#define KEY_TVR                                        0x179
+#define KEY_TTX                                        0x184
+#define KEY_COOL                               0x1A1
+#define KEY_FAV                                        0x16C
+#define KEY_EPG                                        0x16D
+#define KEY_VF                                 0x175
+
+#define KEY_SAT                                        0x17D
+#define KEY_SKIPP                              0x197
+#define KEY_SKIPM                              0x19C
+#define KEY_TS                                 0x167
+#define KEY_AUDIO                              0x188
+#define KEY_REW                                        0x0A8
+#define KEY_FWD                                        0x09F
+#define KEY_HOLD                               0x077
+#define KEY_REC                                        0x0A7
+#define KEY_STOP                               0x080
+#define KEY_PLAY                               0x0CF
+
+//devs
+
+int fb;
+
+//framebuffer stuff
+
+enum {FILL, GRID};
+
+enum {CMCST, CMCS, CMCT, CMC, CMCIT, CMCI, CMHT, CMH, WHITE, BLUE0, GTRANSP, CMS, ORANGE, GREEN, YELLOW, RED, CMCP0, CMCP1, CMCP2, CMCP3};
+#define TRANSP 0
+
+extern int FSIZE_BIG;
+extern int FSIZE_MED;
+extern int FSIZE_SMALL;
+extern int FSIZE_VSMALL;
+extern int TABULATOR;
+
+extern unsigned char *lfb, *lbb;
+extern unsigned char *proxyadress, *proxyuserpwd;
+struct fb_fix_screeninfo fix_screeninfo;
+struct fb_var_screeninfo var_screeninfo;
+extern unsigned char rd[],gn[],bl[],tr[];
+
+int startx, starty, sx, ex, sy, ey, debounce, rblock;
+extern unsigned sc[8], tc[8];
+extern int instance;
+int get_instance(void);
+void put_instance(int pval);
+
+#define FB_DEVICE      "/dev/fb/0"
+
+#endif
+
diff --git a/tuxwetter.mcfg b/tuxwetter.mcfg
new file mode 100644 (file)
index 0000000..3ba8987
--- /dev/null
@@ -0,0 +1,14 @@
+# Metric=1/0                           Einheiten metrisch anzeigen
+Metric=1
+# InetConnection=ISDN/ANALOG           fuer langsamere Verbindungen zur Konfiguration von Timeoutzeiten
+InetConnection=DSL
+ConnectTimeout=5
+# Account bei weather.com              Bei worldweatheronline.com wird der LicenseKey als ACode verwendet
+#PartnerID=1005530704
+#LicenseKey=a9c95f7636ad307b
+#LicenseKey=A2550021575
+LicenseKey=3d3a896d1e152006112211
+# SplashScreen=1/0                     Startbildschirm anzeigen / nicht anzeigen
+SplashScreen=0
+# ShowIcons=1/0                                Wetter-Icons für Textanzeige downloaden / nicht downloaden
+ShowIcons=1
\ No newline at end of file