--- /dev/null
+/*
+ * $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);
+ }
+ }
+}
--- /dev/null
+/*
+ * $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__
+
+
+
--- /dev/null
+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
--- /dev/null
+/*
+ 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
--- /dev/null
+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ü|
--- /dev/null
+/*
+ * $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;
+}
--- /dev/null
+/*
+ * $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
--- /dev/null
+//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));
+ }
+ }
+}
+
+
--- /dev/null
+#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
--- /dev/null
+/*
+ * $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);
+}
--- /dev/null
+/*
+ * $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
--- /dev/null
+/*
+ * $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;
+}
--- /dev/null
+/*
+ * $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
--- /dev/null
+#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
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+#ifndef __HTTP_H__
+#define __HTTP_H__
+
+int HTTP_downloadFile(char *URL, char *downloadTarget, int showprogress, int tmo, int ctmo, int repeats);
+
+#endif
--- /dev/null
+#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;
+}
+
+
--- /dev/null
+#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
--- /dev/null
+/*
+ * $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);
+}
+
--- /dev/null
+/*
+ * $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
--- /dev/null
+/*
+*********************************************************************************************
+********************************** 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;
+}
+
+
--- /dev/null
+
+#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__
+
--- /dev/null
+#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",°)==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);
+}
--- /dev/null
+#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
--- /dev/null
+# $(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
--- /dev/null
+/*
+ * $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);
+}
+
--- /dev/null
+/*
+ * $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
--- /dev/null
+####################################################################################
+#### 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
--- /dev/null
+/*
+ * $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);
+}
--- /dev/null
+/*
+ * $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
--- /dev/null
+/*
+ * $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));
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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
--- /dev/null
+#!/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§Hdr=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§Hdr=on&spellToler=std&search='$leosuche
+ sed 's/ //g
+ s/<\/td>/\n/g
+ s/<\n\n>/\n/g
+ s/<B>/~G/g
+ s/<\/B>/~S/g
+ s/\®//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
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+type=2
+name=CS-Tuxwetter
+desc=Wettervorhersage
+needfb=1
+needrc=1
+needlcd=1
+needoffs=1
--- /dev/null
+####################################################################################
+#### 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
--- /dev/null
+#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
+
--- /dev/null
+# 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