00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "GtkMgr.h"
00020 #include "goo/gmem.h"
00021 #include <sys/mman.h>
00022 #include <sys/ioctl.h>
00023 #include <fcntl.h>
00024 #include <unistd.h>
00025 #include <liberdm/display.h>
00026 #include <gdk/gdkx.h>
00027 #include <string.h>
00028 #include "config.h"
00029 #define defaultRGBCube 5
00030
00031
00032 GtkMgr::GtkMgr(void)
00033 : window(NULL)
00034 , gc(NULL)
00035 , pixmap(NULL)
00036 , visual(NULL)
00037 , bkColor(-1)
00038 , fb_mem(NULL)
00039 , fb(0)
00040 {
00041 fb = open ("/dev/fb0", O_RDWR);
00042 fb_mem = (unsigned char *)mmap(NULL, SCREEN_WIDTH * CLIENT_AREA, PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);
00043 }
00044
00045 GtkMgr::~GtkMgr(void)
00046 {
00047 munmap(fb_mem, SCREEN_WIDTH * CLIENT_AREA);
00048 close(fb);
00049 }
00050
00051 void GtkMgr::setupWindow()
00052 {
00053 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
00054 gtk_window_set_title(GTK_WINDOW(window), PACKAGE " " VERSION );
00055 gtk_window_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
00056 gtk_container_set_border_width(GTK_CONTAINER(window), 0);
00057 gtk_widget_set_size_request(GTK_WIDGET(window), SCREEN_WIDTH, SCREEN_HEIGHT - TOOLBAR_HEIGTH - PAGEBAR_HEIGHT);
00058 gtk_window_set_modal(GTK_WINDOW(window), FALSE);
00059 gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
00060 gtk_widget_set_events (window,
00061 GDK_EXPOSURE_MASK | GDK_BUTTON_MOTION_MASK |
00062 GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
00063 GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
00064
00065
00066 GTK_WIDGET_UNSET_FLAGS(window, GTK_DOUBLE_BUFFERED);
00067
00068 gtk_widget_show(window);
00069
00070 pixmap = gdk_pixmap_new (window->window,
00071 window->allocation.width,
00072 window->allocation.height, -1);
00073 gc = gdk_gc_new (pixmap);
00074 lineColor.pixel = gdk_rgb_xpixel_from_rgb (0x0);
00075 gdk_gc_set_foreground(gc, &lineColor);
00076
00077
00078 display = gdk_x11_display_get_xdisplay(gdk_display_get_default());
00079 screenNum = DefaultScreen(display);
00080 visual = DefaultVisual(display, screenNum);
00081
00082
00083 Pixmap bm_no;
00084 Colormap cmap;
00085 Cursor no_ptr;
00086 XColor black, dummy;
00087 static char bm_no_data[] = {0, 0, 0, 0, 0, 0, 0, 0};
00088
00089 cmap = DefaultColormap(display, DefaultScreen(display));
00090 XAllocNamedColor(display, cmap, "black", &black, &dummy);
00091 bm_no = XCreateBitmapFromData(display, GDK_WINDOW_XWINDOW(window->window), bm_no_data, 8, 8);
00092 no_ptr = XCreatePixmapCursor(display, bm_no, bm_no, &black, &black, 0, 0);
00093
00094 XDefineCursor(display, GDK_WINDOW_XWINDOW(window->window), no_ptr);
00095 XFreeCursor(display, no_ptr);
00096 if (bm_no != None)
00097 {
00098 XFreePixmap(display, bm_no);
00099 }
00100 XFreeColors(display, cmap, &black.pixel, 1, 0);
00101 }
00102
00103 void GtkMgr::dfb_copyImage(unsigned char *mem, SplashBitmap * bitmap,
00104 int xSrc , int ySrc ,
00105 int xDest , int yDest ,
00106 int width , int height )
00107 {
00108
00109
00110 if (width < 0)
00111 {
00112 width = bitmap->getWidth();
00113 }
00114 if (height < 0)
00115 {
00116 height = bitmap->getHeight();
00117 }
00118
00119 if (xDest < 0)
00120 {
00121 xSrc -= xDest; width += xDest; xDest = 0;
00122 }
00123 else if (xDest > SCREEN_WIDTH)
00124 {
00125 return;
00126 }
00127
00128 if (yDest < 0)
00129 {
00130 ySrc -= yDest; height += yDest; yDest = 0;
00131 }
00132 else if (yDest > CLIENT_AREA)
00133 {
00134 return;
00135 }
00136
00137 if (xDest + width >= SCREEN_WIDTH) { width = SCREEN_WIDTH - xDest; }
00138 if (yDest + height >= CLIENT_AREA) { height = CLIENT_AREA - yDest; }
00139
00140 unsigned char *p = (unsigned char *)(bitmap->getDataPtr() + ySrc * bitmap->getRowSize() + xSrc);
00141 mem = mem + yDest * SCREEN_WIDTH + xDest;
00142
00143
00144
00145
00146 for(int i = 0; i < height; ++i)
00147 {
00148 memcpy(mem, p, width);
00149 p += bitmap->getRowSize();
00150 mem += SCREEN_WIDTH;
00151 }
00152 }
00153
00154 void GtkMgr::clearBkground()
00155 {
00156 memset(fb_mem, bkColor, SCREEN_WIDTH * CLIENT_AREA);
00157 }
00158
00159 void GtkMgr::drawImage(SplashBitmap * bitmap,
00160 int xSrc, int ySrc,
00161 int xDest, int yDest,
00162 int width , int height,
00163 GBool bDrawBorder)
00164 {
00165 if (bitmap)
00166 {
00167 if (width < 0) width = bitmap->getWidth();
00168 if (height < 0) height = bitmap->getHeight();
00169
00170 dfb_copyImage(fb_mem, bitmap, xSrc, ySrc, xDest, yDest, width, height);
00171
00172 if (bDrawBorder)
00173 {
00174
00175 XSetForeground(display, GDK_GC_XGC(gc), 0);
00176 XSetLineAttributes(display, GDK_GC_XGC(gc), 1, LineSolid, CapProjecting, JoinMiter);
00177 XDrawRectangle(display, GDK_WINDOW_XWINDOW(window->window), GDK_GC_XGC(gc),
00178 xDest, yDest, width, height);
00179 }
00180 }
00181 }
00182
00183 void GtkMgr::setLineColor(const int color)
00184 {
00185 XSetForeground(display, GDK_GC_XGC(gc), color);
00186 }
00187
00188 void GtkMgr::setLineAttributes(const int width, const int style)
00189 {
00190 XSetLineAttributes(display, GDK_GC_XGC(gc), width, style, CapProjecting, JoinMiter);
00191 }
00192
00193 void GtkMgr::drawLine(const int x1, const int y1, const int x2, const int y2)
00194 {
00195 XDrawLine(display, GDK_WINDOW_XWINDOW(window->window), GDK_GC_XGC(gc), x1, y1, x2, y2);
00196 }
00197