|
|
b5ae1b6 |
Index: extras/lcd/examples/README
|
|
|
b5ae1b6 |
===================================================================
|
|
|
b5ae1b6 |
--- extras/lcd/examples/README (revision 2626)
|
|
|
b5ae1b6 |
+++ extras/lcd/examples/README (revision 2627)
|
|
|
b5ae1b6 |
@@ -9,10 +9,10 @@
|
|
|
b5ae1b6 |
Building
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
The Makefile in this directory is for the top level packager. So
|
|
|
b5ae1b6 |
-to "build" the project, do this:
|
|
|
b5ae1b6 |
+to "build" lcd_mod.cod`, do this:
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
-$ gpasm lcd_mod.asm
|
|
|
b5ae1b6 |
+$ make -f makefile
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
This should assemble with no errors.
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
Index: extras/lcd/examples/makefile
|
|
|
b5ae1b6 |
===================================================================
|
|
|
b5ae1b6 |
--- extras/lcd/examples/makefile (nonexistent)
|
|
|
b5ae1b6 |
+++ extras/lcd/examples/makefile (revision 2627)
|
|
|
b5ae1b6 |
@@ -0,0 +1,16 @@
|
|
|
b5ae1b6 |
+
|
|
|
b5ae1b6 |
+all : lcd_mod.cod
|
|
|
b5ae1b6 |
+
|
|
|
b5ae1b6 |
+ifdef EXTENDED_INSTRUCTIONS
|
|
|
b5ae1b6 |
+ ASM_FLAGS = -c --extended
|
|
|
b5ae1b6 |
+else
|
|
|
b5ae1b6 |
+ ASM_FLAGS = -c
|
|
|
b5ae1b6 |
+endif
|
|
|
b5ae1b6 |
+
|
|
|
b5ae1b6 |
+
|
|
|
b5ae1b6 |
+%.o : %.asm
|
|
|
b5ae1b6 |
+ gpasm $(ASM_FLAGS) $<
|
|
|
b5ae1b6 |
+
|
|
|
b5ae1b6 |
+%.cod : %.o
|
|
|
b5ae1b6 |
+ gplink --map -q -o $@ $<
|
|
|
b5ae1b6 |
+
|
|
|
b5ae1b6 |
Index: extras/lcd/lcd.h
|
|
|
b5ae1b6 |
===================================================================
|
|
|
b5ae1b6 |
--- extras/lcd/lcd.h (revision 2626)
|
|
|
b5ae1b6 |
+++ extras/lcd/lcd.h (revision 2627)
|
|
|
b5ae1b6 |
@@ -60,6 +60,7 @@
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
typedef char _5X7 [7][6];
|
|
|
b5ae1b6 |
typedef char _5X8 [8][6];
|
|
|
b5ae1b6 |
+struct raw_font { _5X8 C_5X8;};
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
class LcdFont {
|
|
|
b5ae1b6 |
public:
|
|
|
b5ae1b6 |
Index: extras/lcd/lcdfont.h
|
|
|
b5ae1b6 |
===================================================================
|
|
|
b5ae1b6 |
--- extras/lcd/lcdfont.h (revision 2626)
|
|
|
b5ae1b6 |
+++ extras/lcd/lcdfont.h (revision 2627)
|
|
|
b5ae1b6 |
@@ -1,5 +1,5 @@
|
|
|
b5ae1b6 |
#define FONT_LEN 256
|
|
|
b5ae1b6 |
-_5X8 test[FONT_LEN] = {
|
|
|
b5ae1b6 |
+raw_font font_list[FONT_LEN] = {
|
|
|
b5ae1b6 |
{ /* 0 */
|
|
|
b5ae1b6 |
" ",
|
|
|
b5ae1b6 |
" ",
|
|
|
b5ae1b6 |
Index: extras/lcd/lcdgui.cc
|
|
|
b5ae1b6 |
===================================================================
|
|
|
b5ae1b6 |
--- extras/lcd/lcdgui.cc (revision 2626)
|
|
|
b5ae1b6 |
+++ extras/lcd/lcdgui.cc (revision 2627)
|
|
|
b5ae1b6 |
@@ -31,29 +31,32 @@
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
cairo_surface_t *LcdFont::create_image(LcdDisplay *lcdP, _5X8 *ch)
|
|
|
b5ae1b6 |
{
|
|
|
b5ae1b6 |
- int rows = 6 + lcdP->dots.y * lcdP->pixels.y;
|
|
|
b5ae1b6 |
- int cols = 1 + lcdP->dots.x * lcdP->pixels.x;
|
|
|
b5ae1b6 |
- cairo_surface_t *image = gdk_window_create_similar_surface(mywindow,
|
|
|
b5ae1b6 |
- CAIRO_CONTENT_COLOR_ALPHA, cols, rows);
|
|
|
b5ae1b6 |
- cairo_t *cr = cairo_create(image);
|
|
|
b5ae1b6 |
- cairo_set_line_width(cr, 0.5);
|
|
|
b5ae1b6 |
+ int rows = 6 + lcdP->dots.y * lcdP->pixels.y;
|
|
|
b5ae1b6 |
+ int cols = 1 + lcdP->dots.x * lcdP->pixels.x;
|
|
|
b5ae1b6 |
+ cairo_surface_t *image = gdk_window_create_similar_surface(mywindow,
|
|
|
b5ae1b6 |
+ CAIRO_CONTENT_COLOR_ALPHA, cols, rows);
|
|
|
b5ae1b6 |
+ cairo_t *cr = cairo_create(image);
|
|
|
b5ae1b6 |
+ cairo_set_line_width(cr, 0.5);
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- for (int j = 0; j < lcdP->dots.y; j++) {
|
|
|
b5ae1b6 |
- for (int i = 0; i < lcdP->dots.x; i++) {
|
|
|
b5ae1b6 |
- if (ch[0][j][i] == '.') {
|
|
|
b5ae1b6 |
- double y = 5 + lcdP->pixels.y * j;
|
|
|
b5ae1b6 |
- double x = i * lcdP->pixels.x;
|
|
|
b5ae1b6 |
- cairo_set_source_rgb(cr, double(0x11) / 255, double(0x33) / 255, double(0x11) / 255);
|
|
|
b5ae1b6 |
- cairo_rectangle(cr, x, y, lcdP->pixels.x, lcdP->pixels.y);
|
|
|
b5ae1b6 |
- cairo_fill_preserve(cr);
|
|
|
b5ae1b6 |
- cairo_set_source_rgb(cr, double(0x66) / 255, double(0x88) / 255, double(0x66) / 255);
|
|
|
b5ae1b6 |
- cairo_stroke(cr);
|
|
|
b5ae1b6 |
- }
|
|
|
b5ae1b6 |
+ for (int j = 0; j < lcdP->dots.y; j++)
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ for (int i = 0; i < lcdP->dots.x; i++)
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ if (ch[0][j][i] == '.')
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ double y = 5 + lcdP->pixels.y * j;
|
|
|
b5ae1b6 |
+ double x = i * lcdP->pixels.x;
|
|
|
b5ae1b6 |
+ cairo_set_source_rgb(cr, double(0x11) / 255, double(0x33) / 255, double(0x11) / 255);
|
|
|
b5ae1b6 |
+ cairo_rectangle(cr, x, y, lcdP->pixels.x, lcdP->pixels.y);
|
|
|
b5ae1b6 |
+ cairo_fill_preserve(cr);
|
|
|
b5ae1b6 |
+ cairo_set_source_rgb(cr, double(0x66) / 255, double(0x88) / 255, double(0x66) / 255);
|
|
|
b5ae1b6 |
+ cairo_stroke(cr);
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
}
|
|
|
b5ae1b6 |
- }
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- cairo_destroy(cr);
|
|
|
b5ae1b6 |
- return image;
|
|
|
b5ae1b6 |
+ cairo_destroy(cr);
|
|
|
b5ae1b6 |
+ return image;
|
|
|
b5ae1b6 |
}
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
@@ -66,147 +69,169 @@
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
LcdFont::LcdFont(gint characters, GtkWidget *parent_window, LcdDisplay *lcdP)
|
|
|
b5ae1b6 |
{
|
|
|
b5ae1b6 |
- pixmaps.reserve(characters);
|
|
|
b5ae1b6 |
- mywindow = gtk_widget_get_window(parent_window);
|
|
|
b5ae1b6 |
+ pixmaps.reserve(characters);
|
|
|
b5ae1b6 |
+ mywindow = gtk_widget_get_window(parent_window);
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- for (gint i = 0; i < characters; i++) {
|
|
|
b5ae1b6 |
- if (strlen(test[i][0]) < 5) {
|
|
|
b5ae1b6 |
- pixmaps.push_back(nullptr);
|
|
|
b5ae1b6 |
+ for (gint i = 0; i < characters; i++)
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ if (strlen(font_list[i].C_5X8[0]) < 5)
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ pixmaps.push_back(nullptr);
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- } else {
|
|
|
b5ae1b6 |
- pixmaps.push_back(create_image(lcdP, &test[i]));
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
+ else
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ pixmaps.push_back(create_image(lcdP, &font_list[i].C_5X8));
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
}
|
|
|
b5ae1b6 |
- }
|
|
|
b5ae1b6 |
}
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
LcdFont::~LcdFont()
|
|
|
b5ae1b6 |
{
|
|
|
b5ae1b6 |
- for (size_t i = 0; i < pixmaps.size(); ++i) {
|
|
|
b5ae1b6 |
- if (pixmaps[i]) {
|
|
|
b5ae1b6 |
- cairo_surface_destroy(pixmaps[i]);
|
|
|
b5ae1b6 |
+ for (size_t i = 0; i < pixmaps.size(); ++i)
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ if (pixmaps[i])
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ cairo_surface_destroy(pixmaps[i]);
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
}
|
|
|
b5ae1b6 |
- }
|
|
|
b5ae1b6 |
}
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
void LcdFont::update_pixmap(int pos, _5X8 *tempchar, LcdDisplay *lcdP)
|
|
|
b5ae1b6 |
{
|
|
|
b5ae1b6 |
- if (pixmaps[pos]) {
|
|
|
b5ae1b6 |
- cairo_surface_destroy(pixmaps[pos]);
|
|
|
b5ae1b6 |
- pixmaps[pos] = nullptr;
|
|
|
b5ae1b6 |
- }
|
|
|
b5ae1b6 |
+ if (pixmaps[pos])
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ cairo_surface_destroy(pixmaps[pos]);
|
|
|
b5ae1b6 |
+ pixmaps[pos] = nullptr;
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- pixmaps[pos] = create_image(lcdP, tempchar);
|
|
|
b5ae1b6 |
+ pixmaps[pos] = create_image(lcdP, tempchar);
|
|
|
b5ae1b6 |
}
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
cairo_surface_t *LcdFont::getPixMap(unsigned int index)
|
|
|
b5ae1b6 |
{
|
|
|
b5ae1b6 |
- return ((index < pixmaps.size()) && pixmaps[index]) ? pixmaps[index] : pixmaps[0];
|
|
|
b5ae1b6 |
+ return ((index < pixmaps.size()) && pixmaps[index]) ? pixmaps[index] : pixmaps[0];
|
|
|
b5ae1b6 |
}
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
void LcdDisplay::update_cgram_pixmaps()
|
|
|
b5ae1b6 |
{
|
|
|
b5ae1b6 |
- int i, j, k;
|
|
|
b5ae1b6 |
- _5X8 tempchar;
|
|
|
b5ae1b6 |
+ int i, j, k;
|
|
|
b5ae1b6 |
+ _5X8 tempchar;
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- if (fontP == nullptr) {
|
|
|
b5ae1b6 |
- return;
|
|
|
b5ae1b6 |
- }
|
|
|
b5ae1b6 |
+ if (fontP == nullptr)
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ return;
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- for (i = 0; i < CGRAM_SIZE / 8; i++) {
|
|
|
b5ae1b6 |
- for (j = 0; j < 8; j++) {
|
|
|
b5ae1b6 |
- for (k = 0; k < 5; k++) {
|
|
|
b5ae1b6 |
- if (m_hd44780->getCGRam(8 * i + j) & (1 << (4 - k))) {
|
|
|
b5ae1b6 |
- tempchar[j][k] = '.';
|
|
|
b5ae1b6 |
+ for (i = 0; i < CGRAM_SIZE / 8; i++)
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ for (j = 0; j < 8; j++)
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ for (k = 0; k < 5; k++)
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ if (m_hd44780->getCGRam(8 * i + j) & (1 << (4 - k)))
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ tempchar[j][k] = '.';
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- } else {
|
|
|
b5ae1b6 |
- tempchar[j][k] = ' ';
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
+ else
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ tempchar[j][k] = ' ';
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
+
|
|
|
b5ae1b6 |
+ tempchar[j][5] = 0;
|
|
|
b5ae1b6 |
}
|
|
|
b5ae1b6 |
- }
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- tempchar[j][5] = 0;
|
|
|
b5ae1b6 |
+ fontP->update_pixmap(i, &tempchar, this);
|
|
|
b5ae1b6 |
+ fontP->update_pixmap(i + 8, &tempchar, this);
|
|
|
b5ae1b6 |
}
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- fontP->update_pixmap(i, &tempchar, this);
|
|
|
b5ae1b6 |
- fontP->update_pixmap(i + 8, &tempchar, this);
|
|
|
b5ae1b6 |
- }
|
|
|
b5ae1b6 |
-
|
|
|
b5ae1b6 |
- m_hd44780->setCGRamupdate(false);
|
|
|
b5ae1b6 |
+ m_hd44780->setCGRamupdate(false);
|
|
|
b5ae1b6 |
}
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
cairo_surface_t *LcdDisplay::get_pixmap(gint row, gint col)
|
|
|
b5ae1b6 |
{
|
|
|
b5ae1b6 |
- if (m_hd44780->CGRamupdate()) {
|
|
|
b5ae1b6 |
- update_cgram_pixmaps();
|
|
|
b5ae1b6 |
- }
|
|
|
b5ae1b6 |
+ if (m_hd44780->CGRamupdate())
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ update_cgram_pixmaps();
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- return fontP ? fontP->getPixMap(m_hd44780->getDDRam(row, col)) : nullptr;
|
|
|
b5ae1b6 |
+ return fontP ? fontP->getPixMap(m_hd44780->getDDRam(row, col)) : nullptr;
|
|
|
b5ae1b6 |
}
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
-static gboolean lcd_expose_event(GtkWidget *widget, GdkEvent * , gpointer user_data)
|
|
|
b5ae1b6 |
+static gboolean lcd_expose_event(GtkWidget *widget, GdkEvent *, gpointer user_data)
|
|
|
b5ae1b6 |
{
|
|
|
b5ae1b6 |
- LcdDisplay *lcdP = static_cast<LcdDisplay *>(user_data);
|
|
|
b5ae1b6 |
- // If there is no font, then go create it.
|
|
|
b5ae1b6 |
+ LcdDisplay *lcdP = static_cast<LcdDisplay *>(user_data);
|
|
|
b5ae1b6 |
+ // If there is no font, then go create it.
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- if (!lcdP->fontP) {
|
|
|
b5ae1b6 |
- lcdP->fontP = new LcdFont(FONT_LEN, widget, lcdP);
|
|
|
b5ae1b6 |
- }
|
|
|
b5ae1b6 |
+ if (!lcdP->fontP)
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ lcdP->fontP = new LcdFont(FONT_LEN, widget, lcdP);
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- GtkAllocation allocation;
|
|
|
b5ae1b6 |
- gtk_widget_get_allocation(widget, &allocation);
|
|
|
b5ae1b6 |
- lcdP->w_width = allocation.width;
|
|
|
b5ae1b6 |
- lcdP->w_height = allocation.height;
|
|
|
b5ae1b6 |
- cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(widget));
|
|
|
b5ae1b6 |
- lcdP->update(cr);
|
|
|
b5ae1b6 |
- cairo_destroy(cr);
|
|
|
b5ae1b6 |
- return FALSE;
|
|
|
b5ae1b6 |
+ GtkAllocation allocation;
|
|
|
b5ae1b6 |
+ gtk_widget_get_allocation(widget, &allocation);
|
|
|
b5ae1b6 |
+ lcdP->w_width = allocation.width;
|
|
|
b5ae1b6 |
+ lcdP->w_height = allocation.height;
|
|
|
b5ae1b6 |
+ cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(widget));
|
|
|
b5ae1b6 |
+ lcdP->update(cr);
|
|
|
b5ae1b6 |
+ cairo_destroy(cr);
|
|
|
b5ae1b6 |
+ return FALSE;
|
|
|
b5ae1b6 |
}
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
void LcdDisplay::update(cairo_t *cr)
|
|
|
b5ae1b6 |
{
|
|
|
b5ae1b6 |
- guint i, j;
|
|
|
b5ae1b6 |
- cairo_set_source_rgb(cr,
|
|
|
b5ae1b6 |
- double(0x78) / 255, double(0xa8) / 255, double(0x78) / 255);
|
|
|
b5ae1b6 |
- cairo_rectangle(cr, 0.0, 0.0, w_width, w_height);
|
|
|
b5ae1b6 |
- cairo_fill(cr);
|
|
|
b5ae1b6 |
- gint cw = get_char_width();
|
|
|
b5ae1b6 |
- gint ch = get_char_height();
|
|
|
b5ae1b6 |
- gint border = get_border();
|
|
|
b5ae1b6 |
+ guint i, j;
|
|
|
b5ae1b6 |
+ cairo_set_source_rgb(cr,
|
|
|
b5ae1b6 |
+ double(0x78) / 255, double(0xa8) / 255, double(0x78) / 255);
|
|
|
b5ae1b6 |
+ cairo_rectangle(cr, 0.0, 0.0, w_width, w_height);
|
|
|
b5ae1b6 |
+ cairo_fill(cr);
|
|
|
b5ae1b6 |
+ gint cw = get_char_width();
|
|
|
b5ae1b6 |
+ gint ch = get_char_height();
|
|
|
b5ae1b6 |
+ gint border = get_border();
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- if (!(disp_type & TWO_ROWS_IN_ONE)) {
|
|
|
b5ae1b6 |
- for (j = 0; j < rows; j++)
|
|
|
b5ae1b6 |
- for (i = 0; i < cols; i++) {
|
|
|
b5ae1b6 |
- cairo_set_source_surface(cr, get_pixmap(j, i), border + i * cw, border + j * (ch));
|
|
|
b5ae1b6 |
- cairo_paint(cr);
|
|
|
b5ae1b6 |
- }
|
|
|
b5ae1b6 |
+ if (!(disp_type & TWO_ROWS_IN_ONE))
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ for (j = 0; j < rows; j++)
|
|
|
b5ae1b6 |
+ for (i = 0; i < cols; i++)
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ cairo_set_source_surface(cr, get_pixmap(j, i), border + i * cw, border + j * (ch));
|
|
|
b5ae1b6 |
+ cairo_paint(cr);
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- } else {
|
|
|
b5ae1b6 |
- guint pos;
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
+ else
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ guint pos;
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- for (pos = 0, j = 0; j < rows; j++)
|
|
|
b5ae1b6 |
- for (i = 0; i < cols; pos++, i++) {
|
|
|
b5ae1b6 |
- cairo_set_source_surface(cr, get_pixmap(j, i), border + pos * cw, border);
|
|
|
b5ae1b6 |
- cairo_paint(cr);
|
|
|
b5ae1b6 |
- }
|
|
|
b5ae1b6 |
- }
|
|
|
b5ae1b6 |
+ for (pos = 0, j = 0; j < rows; j++)
|
|
|
b5ae1b6 |
+ for (i = 0; i < cols; pos++, i++)
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ cairo_set_source_surface(cr, get_pixmap(j, i), border + pos * cw, border);
|
|
|
b5ae1b6 |
+ cairo_paint(cr);
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
}
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
-static gint cursor_event(GtkWidget * , GdkEvent *event, gpointer * )
|
|
|
b5ae1b6 |
+static gint cursor_event(GtkWidget *, GdkEvent *event, gpointer * )
|
|
|
b5ae1b6 |
{
|
|
|
b5ae1b6 |
- if ((event->type == GDK_BUTTON_PRESS) &&
|
|
|
b5ae1b6 |
- ((event->button.button == 1) ||
|
|
|
b5ae1b6 |
- (event->button.button == 3))) {
|
|
|
b5ae1b6 |
- return TRUE;
|
|
|
b5ae1b6 |
- }
|
|
|
b5ae1b6 |
+ if ((event->type == GDK_BUTTON_PRESS) &&
|
|
|
b5ae1b6 |
+ ((event->button.button == 1) ||
|
|
|
b5ae1b6 |
+ (event->button.button == 3)))
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ return TRUE;
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- return FALSE;
|
|
|
b5ae1b6 |
+ return FALSE;
|
|
|
b5ae1b6 |
}
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
@@ -217,63 +242,68 @@
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
void LcdDisplay::CreateGraphics()
|
|
|
b5ae1b6 |
{
|
|
|
b5ae1b6 |
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
|
|
b5ae1b6 |
+ window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- if (window) {
|
|
|
b5ae1b6 |
- char title[128];
|
|
|
b5ae1b6 |
- g_snprintf(title, sizeof(title), "%d X %d", rows, cols);
|
|
|
b5ae1b6 |
+ if (window)
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ char title[128];
|
|
|
b5ae1b6 |
+ g_snprintf(title, sizeof(title), "%d X %d", rows, cols);
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- if (disp_type & TWO_ROWS_IN_ONE) {
|
|
|
b5ae1b6 |
- g_strlcat(title, " (in one row)", sizeof(title));
|
|
|
b5ae1b6 |
- }
|
|
|
b5ae1b6 |
+ if (disp_type & TWO_ROWS_IN_ONE)
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ g_strlcat(title, " (in one row)", sizeof(title));
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- gtk_widget_realize(window);
|
|
|
b5ae1b6 |
- gtk_window_set_title(GTK_WINDOW(window), "LCD");
|
|
|
b5ae1b6 |
- GtkWidget *main_vbox = gtk_vbox_new(FALSE, 5);
|
|
|
b5ae1b6 |
- gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 0);
|
|
|
b5ae1b6 |
- gtk_container_add(GTK_CONTAINER(window), main_vbox);
|
|
|
b5ae1b6 |
- GtkWidget *vbox =
|
|
|
b5ae1b6 |
- gtk_widget_new(gtk_vbox_get_type(),
|
|
|
b5ae1b6 |
- "GtkBox::homogeneous", FALSE,
|
|
|
b5ae1b6 |
- //"GtkBox::spacing", 5,
|
|
|
b5ae1b6 |
- //"GtkContainer::border_width", 10,
|
|
|
b5ae1b6 |
- "GtkWidget::parent", main_vbox,
|
|
|
b5ae1b6 |
- "GtkWidget::visible", TRUE,
|
|
|
b5ae1b6 |
- nullptr);
|
|
|
b5ae1b6 |
- GtkWidget *frame =
|
|
|
b5ae1b6 |
- gtk_widget_new(gtk_frame_get_type(),
|
|
|
b5ae1b6 |
- "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
|
|
|
b5ae1b6 |
- "GtkFrame::label_xalign", 0.5,
|
|
|
b5ae1b6 |
- "GtkFrame::label", title,
|
|
|
b5ae1b6 |
- //"GtkContainer::border_width", 10,
|
|
|
b5ae1b6 |
- "GtkWidget::parent", vbox,
|
|
|
b5ae1b6 |
- "GtkWidget::visible", TRUE,
|
|
|
b5ae1b6 |
- nullptr);
|
|
|
b5ae1b6 |
- darea = gtk_drawing_area_new();
|
|
|
b5ae1b6 |
+ gtk_widget_realize(window);
|
|
|
b5ae1b6 |
+ gtk_window_set_title(GTK_WINDOW(window), "LCD");
|
|
|
b5ae1b6 |
+ GtkWidget *main_vbox = gtk_vbox_new(FALSE, 5);
|
|
|
b5ae1b6 |
+ gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 0);
|
|
|
b5ae1b6 |
+ gtk_container_add(GTK_CONTAINER(window), main_vbox);
|
|
|
b5ae1b6 |
+ GtkWidget *vbox =
|
|
|
b5ae1b6 |
+ gtk_widget_new(gtk_vbox_get_type(),
|
|
|
b5ae1b6 |
+ "GtkBox::homogeneous", FALSE,
|
|
|
b5ae1b6 |
+ //"GtkBox::spacing", 5,
|
|
|
b5ae1b6 |
+ //"GtkContainer::border_width", 10,
|
|
|
b5ae1b6 |
+ "GtkWidget::parent", main_vbox,
|
|
|
b5ae1b6 |
+ "GtkWidget::visible", TRUE,
|
|
|
b5ae1b6 |
+ nullptr);
|
|
|
b5ae1b6 |
+ GtkWidget *frame =
|
|
|
b5ae1b6 |
+ gtk_widget_new(gtk_frame_get_type(),
|
|
|
b5ae1b6 |
+ "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
|
|
|
b5ae1b6 |
+ "GtkFrame::label_xalign", 0.5,
|
|
|
b5ae1b6 |
+ "GtkFrame::label", title,
|
|
|
b5ae1b6 |
+ //"GtkContainer::border_width", 10,
|
|
|
b5ae1b6 |
+ "GtkWidget::parent", vbox,
|
|
|
b5ae1b6 |
+ "GtkWidget::visible", TRUE,
|
|
|
b5ae1b6 |
+ nullptr);
|
|
|
b5ae1b6 |
+ darea = gtk_drawing_area_new();
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- if (!(disp_type & TWO_ROWS_IN_ONE)) {
|
|
|
b5ae1b6 |
- gtk_widget_set_size_request(darea,
|
|
|
b5ae1b6 |
- cols * get_char_width() + 2 * get_border(),
|
|
|
b5ae1b6 |
- rows * (get_char_height() + get_border()) + get_border());
|
|
|
b5ae1b6 |
+ if (!(disp_type & TWO_ROWS_IN_ONE))
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ gtk_widget_set_size_request(darea,
|
|
|
b5ae1b6 |
+ cols * get_char_width() + 2 * get_border(),
|
|
|
b5ae1b6 |
+ rows * (get_char_height() + get_border()) + get_border());
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
- } else {
|
|
|
b5ae1b6 |
- gtk_widget_set_size_request(darea,
|
|
|
b5ae1b6 |
- rows * cols * get_char_width() + 2 * get_border(),
|
|
|
b5ae1b6 |
- get_char_height() + 2 * get_border());
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
+ else
|
|
|
b5ae1b6 |
+ {
|
|
|
b5ae1b6 |
+ gtk_widget_set_size_request(darea,
|
|
|
b5ae1b6 |
+ rows * cols * get_char_width() + 2 * get_border(),
|
|
|
b5ae1b6 |
+ get_char_height() + 2 * get_border());
|
|
|
b5ae1b6 |
+ }
|
|
|
b5ae1b6 |
+
|
|
|
b5ae1b6 |
+ gtk_container_add(GTK_CONTAINER(frame), darea);
|
|
|
b5ae1b6 |
+ g_signal_connect(darea,
|
|
|
b5ae1b6 |
+ "expose_event",
|
|
|
b5ae1b6 |
+ G_CALLBACK(lcd_expose_event),
|
|
|
b5ae1b6 |
+ this);
|
|
|
b5ae1b6 |
+ gtk_widget_add_events(darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
|
|
|
b5ae1b6 |
+ g_signal_connect(darea,
|
|
|
b5ae1b6 |
+ "button_press_event",
|
|
|
b5ae1b6 |
+ G_CALLBACK(cursor_event),
|
|
|
b5ae1b6 |
+ nullptr);
|
|
|
b5ae1b6 |
+ gtk_widget_show_all(window);
|
|
|
b5ae1b6 |
}
|
|
|
b5ae1b6 |
-
|
|
|
b5ae1b6 |
- gtk_container_add(GTK_CONTAINER(frame), darea);
|
|
|
b5ae1b6 |
- g_signal_connect(darea,
|
|
|
b5ae1b6 |
- "expose_event",
|
|
|
b5ae1b6 |
- G_CALLBACK(lcd_expose_event),
|
|
|
b5ae1b6 |
- this);
|
|
|
b5ae1b6 |
- gtk_widget_add_events(darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
|
|
|
b5ae1b6 |
- g_signal_connect(darea,
|
|
|
b5ae1b6 |
- "button_press_event",
|
|
|
b5ae1b6 |
- G_CALLBACK(cursor_event),
|
|
|
b5ae1b6 |
- nullptr);
|
|
|
b5ae1b6 |
- gtk_widget_show_all(window);
|
|
|
b5ae1b6 |
- }
|
|
|
b5ae1b6 |
}
|
|
|
b5ae1b6 |
|
|
|
b5ae1b6 |
#endif //HAVE_GUI
|