2002-03-25 14:21:30 +00:00
|
|
|
/***************************************************************************
|
|
|
|
* __________ __ ___.
|
|
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
|
|
* \/ \/ \/ \/ \/
|
2002-03-25 14:44:06 +00:00
|
|
|
* $Id$
|
2002-03-25 14:21:30 +00:00
|
|
|
*
|
|
|
|
* Copyright (C) 2002 by Daniel Stenberg <daniel@haxx.se>
|
|
|
|
*
|
|
|
|
* All files in this archive are subject to the GNU General Public License.
|
|
|
|
* See the file COPYING in the source tree root for full license agreement.
|
|
|
|
*
|
|
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
|
|
* KIND, either express or implied.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <ctype.h>
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
|
|
|
#include <errno.h>
|
|
|
|
#include <ctype.h>
|
|
|
|
#include <time.h>
|
|
|
|
|
2004-09-16 20:03:03 +00:00
|
|
|
#include "config.h"
|
2002-03-25 14:21:30 +00:00
|
|
|
#include "screenhack.h"
|
|
|
|
|
|
|
|
#include "version.h"
|
|
|
|
|
2002-03-26 14:27:03 +00:00
|
|
|
#include "lcd-x11.h"
|
2002-10-28 20:04:53 +00:00
|
|
|
#include "lcd-playersim.h"
|
2002-03-26 14:27:03 +00:00
|
|
|
|
2002-03-25 14:21:30 +00:00
|
|
|
#define MAX(x,y) ((x)>(y)?(x):(y))
|
|
|
|
#define MIN(x,y) ((x)<(y)?(x):(y))
|
|
|
|
|
|
|
|
#define PROGNAME "rockboxui"
|
|
|
|
|
|
|
|
/* -- -- */
|
|
|
|
|
2002-10-16 08:43:13 +00:00
|
|
|
GC draw_gc;
|
2002-03-25 14:21:30 +00:00
|
|
|
static Colormap cmap;
|
|
|
|
|
2003-01-20 09:39:38 +00:00
|
|
|
int display_zoom=1;
|
2002-10-28 20:04:53 +00:00
|
|
|
bool lcd_display_redraw=true;
|
2002-03-25 14:21:30 +00:00
|
|
|
|
|
|
|
XrmOptionDescRec options [] = {
|
2005-03-18 00:03:22 +00:00
|
|
|
/* { "-subtractive", ".additive", XrmoptionNoArg, "false" }, */
|
|
|
|
{ "-server", ".server", XrmoptionSepArg, 0 },
|
|
|
|
{ "-help", ".help", XrmoptionNoArg, "false" },
|
|
|
|
{ 0, 0, 0, 0 }
|
2002-03-25 14:21:30 +00:00
|
|
|
};
|
|
|
|
char *progclass = "rockboxui";
|
|
|
|
|
2005-07-08 19:26:17 +00:00
|
|
|
#ifdef IRIVER_H100_SERIES
|
2005-07-14 10:02:04 +00:00
|
|
|
#define BGCOLOR "lightblue"
|
2005-01-23 01:06:01 +00:00
|
|
|
#elif defined ARCHOS_GMINI120
|
2005-07-14 10:02:04 +00:00
|
|
|
#define BGCOLOR "royalblue"
|
2004-09-16 20:03:03 +00:00
|
|
|
#else
|
2005-07-14 10:02:04 +00:00
|
|
|
#define BGCOLOR "lightgreen"
|
2004-09-16 20:03:03 +00:00
|
|
|
#endif
|
2005-07-14 10:02:04 +00:00
|
|
|
|
|
|
|
|
|
|
|
char *defaults [] = {
|
|
|
|
".background: " BGCOLOR,
|
2005-03-18 00:03:22 +00:00
|
|
|
".foreground: black",
|
|
|
|
"*help: false",
|
|
|
|
0
|
2002-03-25 14:21:30 +00:00
|
|
|
};
|
|
|
|
|
2005-07-14 10:02:04 +00:00
|
|
|
static XColor getcolor[4];
|
|
|
|
|
|
|
|
/* set a range of bitmap indices to a gradient from startcolour to endcolour
|
|
|
|
inherited from the win32 sim code by Jens Arnold */
|
|
|
|
static void lcdcolors(int index, int count, XColor *start, XColor *end)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
count--;
|
|
|
|
for (i = 0; i <= count; i++)
|
|
|
|
{
|
|
|
|
getcolor[i+index].red = start->red
|
|
|
|
+ (end->red - start->red) * i / count;
|
|
|
|
getcolor[i+index].green = start->green
|
|
|
|
+ (end->green - start->green) * i / count;
|
|
|
|
getcolor[i+index].blue = start->blue
|
|
|
|
+ (end->blue - start->blue) * i / count;
|
|
|
|
XAllocColor (dpy, cmap, &getcolor[i+index]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-25 14:21:30 +00:00
|
|
|
void init_window ()
|
|
|
|
{
|
2005-03-18 00:03:22 +00:00
|
|
|
XGCValues gcv;
|
|
|
|
XWindowAttributes xgwa;
|
2002-03-25 14:21:30 +00:00
|
|
|
|
2005-03-18 00:03:22 +00:00
|
|
|
XGetWindowAttributes (dpy, window, &xgwa);
|
2005-07-14 10:02:04 +00:00
|
|
|
XColor bg;
|
|
|
|
XColor fg;
|
2002-03-25 14:21:30 +00:00
|
|
|
|
2005-03-18 00:03:22 +00:00
|
|
|
cmap = xgwa.colormap;
|
2002-03-25 14:21:30 +00:00
|
|
|
|
2005-07-14 10:02:04 +00:00
|
|
|
XParseColor (dpy, cmap, BGCOLOR, &bg);
|
|
|
|
XParseColor (dpy, cmap, "black", &fg);
|
|
|
|
getcolor[0] = bg;
|
|
|
|
getcolor[1] = bg;
|
|
|
|
getcolor[2] = bg;
|
|
|
|
getcolor[3] = bg;
|
|
|
|
|
|
|
|
lcdcolors(0, 4, &bg, &fg);
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
for(i=0; i<4; i++) {
|
|
|
|
printf("color %d: %d %d %d\n",
|
|
|
|
i,
|
|
|
|
getcolor[i].red,
|
|
|
|
getcolor[i].green,
|
|
|
|
getcolor[i].blue);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2005-03-18 00:03:22 +00:00
|
|
|
gcv.function = GXxor;
|
2005-07-14 10:02:04 +00:00
|
|
|
gcv.foreground = getcolor[3].pixel;
|
2005-03-18 00:03:22 +00:00
|
|
|
draw_gc = XCreateGC (dpy, window, GCForeground, &gcv);
|
2002-03-25 14:21:30 +00:00
|
|
|
|
2005-03-18 00:03:22 +00:00
|
|
|
screen_resized(LCD_WIDTH, LCD_HEIGHT);
|
2002-03-25 14:21:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void screen_resized(int width, int height)
|
|
|
|
{
|
2005-03-18 00:03:22 +00:00
|
|
|
int maxx, maxy;
|
|
|
|
maxx = width;
|
|
|
|
maxy = height;
|
2002-10-28 20:04:53 +00:00
|
|
|
|
2005-03-18 23:51:52 +00:00
|
|
|
XtAppLock(app);
|
2005-07-14 10:02:04 +00:00
|
|
|
XSetForeground(dpy, draw_gc, getcolor[0].pixel);
|
|
|
|
|
2005-03-18 00:03:22 +00:00
|
|
|
XFillRectangle(dpy, window, draw_gc, 0, 0, width*display_zoom,
|
|
|
|
height*display_zoom);
|
2005-03-18 23:51:52 +00:00
|
|
|
XtAppUnlock(app);
|
2005-03-18 00:03:22 +00:00
|
|
|
screen_redraw();
|
|
|
|
}
|
2002-03-25 14:21:30 +00:00
|
|
|
|
2005-03-18 00:03:22 +00:00
|
|
|
void drawrect(int color, int x1, int y1, int x2, int y2)
|
|
|
|
{
|
2005-03-18 23:51:52 +00:00
|
|
|
XtAppLock(app);
|
2005-07-14 10:02:04 +00:00
|
|
|
XSetForeground(dpy, draw_gc, getcolor[color].pixel);
|
2005-03-18 00:03:22 +00:00
|
|
|
XFillRectangle(dpy, window, draw_gc, x1*display_zoom, y1*display_zoom,
|
|
|
|
x2*display_zoom, y2*display_zoom);
|
2005-03-18 23:51:52 +00:00
|
|
|
XtAppUnlock(app);
|
2002-03-25 14:21:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void help(void)
|
|
|
|
{
|
2005-03-18 00:03:22 +00:00
|
|
|
printf(PROGNAME " " ROCKBOXUI_VERSION " " __DATE__ "\n"
|
|
|
|
"usage: " PROGNAME "\n");
|
2002-03-25 14:21:30 +00:00
|
|
|
}
|
|
|
|
|
2005-07-14 10:02:04 +00:00
|
|
|
static void drawline(int color, int x1, int y1, int x2, int y2)
|
2002-03-25 14:21:30 +00:00
|
|
|
{
|
2005-03-18 23:51:52 +00:00
|
|
|
XtAppLock(app);
|
2005-07-14 10:02:04 +00:00
|
|
|
XSetForeground(dpy, draw_gc, getcolor[color].pixel);
|
2005-03-18 00:03:22 +00:00
|
|
|
|
|
|
|
XDrawLine(dpy, window, draw_gc,
|
|
|
|
(int)(x1*display_zoom),
|
|
|
|
(int)(y1*display_zoom),
|
|
|
|
(int)(x2*display_zoom),
|
|
|
|
(int)(y2*display_zoom));
|
2005-03-18 23:51:52 +00:00
|
|
|
XtAppUnlock(app);
|
2002-03-25 14:21:30 +00:00
|
|
|
}
|
|
|
|
|
2005-07-14 10:02:04 +00:00
|
|
|
void dots(int *colors, struct coordinate *points, int count)
|
2002-03-26 10:59:39 +00:00
|
|
|
{
|
2005-07-14 10:02:04 +00:00
|
|
|
int color;
|
2005-03-18 23:51:52 +00:00
|
|
|
XtAppLock(app);
|
2005-03-18 00:03:22 +00:00
|
|
|
|
|
|
|
while (count--) {
|
2005-07-14 10:02:04 +00:00
|
|
|
color = colors[count];
|
|
|
|
XSetForeground(dpy, draw_gc, getcolor[color].pixel);
|
2005-03-18 00:03:22 +00:00
|
|
|
XFillRectangle(dpy, window, draw_gc,
|
|
|
|
points[count].x*display_zoom,
|
|
|
|
points[count].y*display_zoom,
|
|
|
|
display_zoom,
|
|
|
|
display_zoom);
|
|
|
|
}
|
2005-03-18 23:51:52 +00:00
|
|
|
XtAppUnlock(app);
|
2002-03-26 10:59:39 +00:00
|
|
|
}
|
|
|
|
|
2002-06-14 11:00:13 +00:00
|
|
|
/* this is where the applicaton starts */
|
|
|
|
extern void app_main(void);
|
2002-03-25 14:21:30 +00:00
|
|
|
|
2005-03-18 23:51:52 +00:00
|
|
|
void screenhack()
|
2002-03-25 14:21:30 +00:00
|
|
|
{
|
2005-03-18 00:03:22 +00:00
|
|
|
Bool helpme;
|
|
|
|
|
|
|
|
/* This doesn't work, but I don't know why (Daniel 1999-12-01) */
|
|
|
|
helpme = get_boolean_resource ("help", "Boolean");
|
|
|
|
if(helpme)
|
|
|
|
help();
|
2002-03-25 14:21:30 +00:00
|
|
|
|
2005-03-18 00:03:22 +00:00
|
|
|
printf(PROGNAME " " ROCKBOXUI_VERSION " (" __DATE__ ")\n");
|
2002-03-25 14:21:30 +00:00
|
|
|
|
2005-03-18 00:03:22 +00:00
|
|
|
init_window();
|
2002-03-25 14:21:30 +00:00
|
|
|
|
2005-03-18 00:03:22 +00:00
|
|
|
screen_redraw();
|
2002-03-25 14:21:30 +00:00
|
|
|
|
2005-03-18 00:03:22 +00:00
|
|
|
app_main();
|
2002-03-25 14:21:30 +00:00
|
|
|
}
|
|
|
|
|
2005-07-14 10:35:26 +00:00
|
|
|
/* used for the player sim */
|
|
|
|
void drawdots(int color, struct coordinate *points, int count)
|
|
|
|
{
|
|
|
|
XtAppLock(app);
|
|
|
|
XSetForeground(dpy, draw_gc, getcolor[color==0?0:3].pixel);
|
|
|
|
|
|
|
|
while (count--) {
|
|
|
|
XFillRectangle(dpy, window, draw_gc,
|
|
|
|
points[count].x*display_zoom,
|
|
|
|
points[count].y*display_zoom,
|
|
|
|
display_zoom,
|
|
|
|
display_zoom);
|
|
|
|
}
|
|
|
|
XtAppUnlock(app);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* used for the player sim */
|
|
|
|
void drawrectangles(int color, struct rectangle *points, int count)
|
|
|
|
{
|
|
|
|
XtAppLock(app);
|
|
|
|
|
|
|
|
XSetForeground(dpy, draw_gc, getcolor[color==0?0:3].pixel);
|
|
|
|
while (count--) {
|
|
|
|
XFillRectangle(dpy, window, draw_gc,
|
|
|
|
points[count].x*display_zoom,
|
|
|
|
points[count].y*display_zoom,
|
|
|
|
points[count].width*display_zoom,
|
|
|
|
points[count].height*display_zoom);
|
|
|
|
}
|
|
|
|
XtAppUnlock(app);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-25 14:21:30 +00:00
|
|
|
void screen_redraw()
|
|
|
|
{
|
2005-05-23 16:23:25 +00:00
|
|
|
/* draw a border around the screen */
|
2002-03-26 14:27:03 +00:00
|
|
|
#define X1 0
|
|
|
|
#define Y1 0
|
2005-10-23 13:06:25 +00:00
|
|
|
#define X2 (LCD_WIDTH + 2*MARGIN_X - 1)
|
|
|
|
#define Y2 (LCD_HEIGHT + 2*MARGIN_Y - 1)
|
2002-03-26 14:27:03 +00:00
|
|
|
|
2005-03-18 00:03:22 +00:00
|
|
|
drawline(1, X1, Y1, X2, Y1);
|
|
|
|
drawline(1, X2, Y1, X2, Y2);
|
|
|
|
drawline(1, X1, Y2, X2, Y2);
|
|
|
|
drawline(1, X1, Y1, X1, Y2);
|
2005-10-23 23:49:46 +00:00
|
|
|
lcd_display_redraw = true;
|
2005-03-18 00:03:22 +00:00
|
|
|
lcd_update();
|
2005-05-23 16:23:25 +00:00
|
|
|
#ifdef LCD_REMOTE_HEIGHT
|
|
|
|
/* draw a border around the remote LCD screen */
|
|
|
|
#define RX1 0
|
2005-10-23 13:06:25 +00:00
|
|
|
#define RY1 (Y2 + 1)
|
|
|
|
#define RX2 (LCD_REMOTE_WIDTH + 2*MARGIN_X - 1)
|
|
|
|
#define RY2 (RY1 + LCD_REMOTE_HEIGHT + 2*MARGIN_Y - 1)
|
2005-05-23 16:23:25 +00:00
|
|
|
|
|
|
|
drawline(1, RX1, RY1, RX2, RY1);
|
|
|
|
drawline(1, RX2, RY1, RX2, RY2);
|
|
|
|
drawline(1, RX1, RY2, RX2, RY2);
|
|
|
|
drawline(1, RX1, RY1, RX1, RY2);
|
2005-10-23 23:49:46 +00:00
|
|
|
lcd_display_redraw = true;
|
2005-05-23 16:23:25 +00:00
|
|
|
lcd_remote_update();
|
|
|
|
#endif
|
2002-03-25 14:21:30 +00:00
|
|
|
}
|