summaryrefslogtreecommitdiff
path: root/app/wlib/gtklib
diff options
context:
space:
mode:
Diffstat (limited to 'app/wlib/gtklib')
-rw-r--r--app/wlib/gtklib/CMakeLists.txt6
-rw-r--r--app/wlib/gtklib/bitmap.c13
-rw-r--r--app/wlib/gtklib/browserhelp.c2
-rw-r--r--app/wlib/gtklib/button.c7
-rw-r--r--app/wlib/gtklib/gtkint.h3
-rw-r--r--app/wlib/gtklib/pixbuf.c11
-rw-r--r--app/wlib/gtklib/print.c8
-rw-r--r--app/wlib/gtklib/tooltip.c6
-rw-r--r--app/wlib/gtklib/util.c85
-rw-r--r--app/wlib/gtklib/window.c10
-rw-r--r--app/wlib/gtklib/wpref.c15
11 files changed, 102 insertions, 64 deletions
diff --git a/app/wlib/gtklib/CMakeLists.txt b/app/wlib/gtklib/CMakeLists.txt
index 6c673d9..ab0d790 100644
--- a/app/wlib/gtklib/CMakeLists.txt
+++ b/app/wlib/gtklib/CMakeLists.txt
@@ -3,6 +3,7 @@
target_include_directories(xtrkcad-wlib
PRIVATE
${xtrkcad-lib_SOURCE_DIR}
+ ${xtrkcad-lib_BINARY_DIR}
)
target_sources(xtrkcad-wlib
@@ -78,6 +79,11 @@ find_package (GTK2)
# configure for GTK's native Unix print
find_package (GTKUnixPrint)
+# Needed for xtc.image1 include
+add_dependencies(xtrkcad-wlib
+ genbitmaps
+)
+
target_include_directories(xtrkcad-wlib
PRIVATE
${GTK_INCLUDE_DIRS}
diff --git a/app/wlib/gtklib/bitmap.c b/app/wlib/gtklib/bitmap.c
index b1ff2ed..7136461 100644
--- a/app/wlib/gtklib/bitmap.c
+++ b/app/wlib/gtklib/bitmap.c
@@ -67,8 +67,11 @@ wBitmapCreate( wWin_p parent, wWinPix_t x, wWinPix_t y, long options,
gtk_widget_realize( parent->widget ); /* force allocation, if pending */
}
- /* create the bitmap from supplied xpm data */
- pixbuf = gdk_pixbuf_new_from_xpm_data( (const char **)iconP->bits );
+ /* create the bitmap from supplied data */
+ assert ( *(int*)iconP->bits == 0x47646b50 ||
+ *(int*)iconP->bits == 0x506b6447 );
+ pixbuf = gdk_pixbuf_new_from_inline( -1, iconP->bits, FALSE, NULL );
+
g_object_ref_sink(pixbuf);
image = gtk_image_new_from_pixbuf( pixbuf );
gtk_widget_show( image );
@@ -106,7 +109,7 @@ wIcon_p wIconCreateBitMap( wWinPix_t w, wWinPix_t h, const char * bits,
ip->color = color;
// Copy bits
int nBytes = ( ( w + 7 ) / 8 ) * h;
- ip->bits = (char*)malloc( nBytes );
+ ip->bits = (wIconBitMap_t)malloc( nBytes );
memcpy( (void*)ip->bits, bits, nBytes );
return ip;
}
@@ -117,7 +120,7 @@ wIcon_p wIconCreateBitMap( wWinPix_t w, wWinPix_t h, const char * bits,
* \returns icon handle
*/
-wIcon_p wIconCreatePixMap( char *pm[] )
+wIcon_p wIconCreatePixMap( wIconBitMap_t pm )
{
wIcon_p ip;
ip = (wIcon_p)malloc( sizeof *ip );
@@ -125,7 +128,7 @@ wIcon_p wIconCreatePixMap( char *pm[] )
ip->w = 0;
ip->h = 0;
ip->color = 0;
- ip->bits = pm;
+ ip->bits = (wIconBitMap_t) pm;
return ip;
}
diff --git a/app/wlib/gtklib/browserhelp.c b/app/wlib/gtklib/browserhelp.c
index 6d2ac5d..9b32d79 100644
--- a/app/wlib/gtklib/browserhelp.c
+++ b/app/wlib/gtklib/browserhelp.c
@@ -91,7 +91,7 @@ TopicToUrl(char **helpUrl, const char *topic)
void wHelp(const char * topic)
{
int rc;
- char *url;
+ char *url = NULL;
// char *currentPath;
assert(topic != NULL);
diff --git a/app/wlib/gtklib/button.c b/app/wlib/gtklib/button.c
index 7193b11..c337f46 100644
--- a/app/wlib/gtklib/button.c
+++ b/app/wlib/gtklib/button.c
@@ -33,6 +33,7 @@
#include "gtkint.h"
#include "i18n.h"
+#include "assert.h"
#define MIN_BUTTON_WIDTH (80)
@@ -97,7 +98,11 @@ void wlibSetLabel(
bm = (wIcon_p)labelStr;
if (bm->gtkIconType == gtkIcon_pixmap) {
- pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)bm->bits);
+ // check gdk_pixbuf header
+ assert ( *(int*)bm->bits == 0x47646b50 ||
+ *(int*)bm->bits == 0x506b6447 );
+ pixbuf = gdk_pixbuf_new_from_inline( -1, bm->bits, FALSE, NULL );
+
} else {
pixbuf = wlibPixbufFromXBM( bm );
}
diff --git a/app/wlib/gtklib/gtkint.h b/app/wlib/gtklib/gtkint.h
index e3757a4..b1f44e4 100644
--- a/app/wlib/gtklib/gtkint.h
+++ b/app/wlib/gtklib/gtkint.h
@@ -27,6 +27,7 @@
#include "gdk/gdk.h"
#include "gtk/gtk.h"
+#include <assert.h>
#ifdef WINDOWS
#define strcasecmp _stricmp
@@ -137,7 +138,7 @@ struct wIcon_t {
wWinPix_t w;
wWinPix_t h;
wDrawColor color;
- const void * bits;
+ wIconBitMap_t bits;
};
extern char wConfigName[];
diff --git a/app/wlib/gtklib/pixbuf.c b/app/wlib/gtklib/pixbuf.c
index 0d6e8b7..d0c1068 100644
--- a/app/wlib/gtklib/pixbuf.c
+++ b/app/wlib/gtklib/pixbuf.c
@@ -48,14 +48,20 @@ GdkPixbuf* wlibMakePixbuf(
wIcon_p ip)
{
GdkPixbuf * pixbuf;
+#ifdef LATER
char line0[40];
char line2[40];
+#endif
assert(ip != NULL);
- if (ip->gtkIconType == gtkIcon_pixmap) {
- pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)ip->bits);
+ assert( ip->gtkIconType == gtkIcon_pixmap );
+ assert ( *(int*)ip->bits == 0x47646b50 ||
+ *(int*)ip->bits == 0x506b6447 );
+ pixbuf = gdk_pixbuf_new_from_inline( -1, ip->bits, FALSE, NULL );
+#ifdef LATER
} else {
+ assert( ip->gtkIconType != gtkIcon_pixmap );
const char * bits;
long rgb;
int row,col,wb;
@@ -92,6 +98,7 @@ GdkPixbuf* wlibMakePixbuf(
g_free(pixmapData[row+3]);
}
}
+#endif
return pixbuf;
}
diff --git a/app/wlib/gtklib/print.c b/app/wlib/gtklib/print.c
index 609efa9..2c7c278 100644
--- a/app/wlib/gtklib/print.c
+++ b/app/wlib/gtklib/print.c
@@ -755,7 +755,7 @@ void psPrintString(
/** \todo use a getter function instead of double conversion */
desc = pango_font_description_from_string(wlibFontTranslate(fp));
- pango_font_description_set_size(desc, fs * PANGO_SCALE * scale_text);
+ pango_font_description_set_absolute_size(desc, fs * PANGO_SCALE * scale_text);
// render the string to a Pango layout
pango_layout_set_font_description(layout, desc);
@@ -1063,14 +1063,14 @@ wBool_t wPrintDocStart(const char * title, int fTotalPageCount, int * copiesP)
psPrint_d.dpi = p_def;
scale_adjust = 72/p_def;
} else {
- if (printTextScale > 0.0) {
- scale_text = printTextScale;
- }
if (printScale > 0.0) {
scale_adjust = printScale;
}
psPrint_d.dpi = 72;
}
+ if (printTextScale > 0.0) {
+ scale_text = printTextScale;
+ }
// in XTrackCAD 0,0 is top left, in cairo bottom left. This is
// corrected via the following transformations.
diff --git a/app/wlib/gtklib/tooltip.c b/app/wlib/gtklib/tooltip.c
index 75c8870..7c1eef9 100644
--- a/app/wlib/gtklib/tooltip.c
+++ b/app/wlib/gtklib/tooltip.c
@@ -159,9 +159,9 @@ void wControlSetBalloon( wControl_p b, wWinPix_t dx, wWinPix_t dy,
//GtkWidget *alignment;
GdkColor color;
- color.red = 0x00C5 * 65536/255;
- color.green = 0x006F * 65536/255;
- color.blue = 0x0078 * 65536/255;
+ color.red = 0x00FE * 65536/255;
+ color.green = 0x007F * 65536/255;
+ color.blue = 0x007F * 65536/255;
balloonF = gtk_window_new( GTK_WINDOW_POPUP );
gtk_window_set_type_hint( GTK_WINDOW( balloonF), GDK_WINDOW_TYPE_HINT_TOOLTIP );
diff --git a/app/wlib/gtklib/util.c b/app/wlib/gtklib/util.c
index 3f746e6..b8777fd 100644
--- a/app/wlib/gtklib/util.c
+++ b/app/wlib/gtklib/util.c
@@ -76,7 +76,7 @@ static wBool_t reverseIcon =
#endif
#endif
-
+static bool audioOn;
/*
*****************************************************************************
@@ -97,45 +97,38 @@ GdkPixbuf* wlibPixbufFromXBM(
wIcon_p ip)
{
GdkPixbuf * pixbuf;
-
- char line0[40];
- char line2[40];
-
- char ** pixmapData;
- int row, col, wb;
- long rgb;
- const char * bits;
-
- wb = (ip->w + 7) / 8;
- pixmapData = (char**) malloc((3 + ip->h) * sizeof *pixmapData);
- pixmapData[0] = line0;
- rgb = wDrawGetRGB(ip->color);
- sprintf(line0, " %ld %ld 2 1", ip->w, ip->h);
- sprintf(line2, "# c #%2.2lx%2.2lx%2.2lx", (rgb >> 16)&0xFF, (rgb >> 8)&0xFF,
- rgb & 0xFF);
- pixmapData[1] = ". c None s None";
- pixmapData[2] = line2;
- bits = ip->bits;
-
- for (row = 0; row < ip->h; row++) {
- pixmapData[row + 3] = (char*) malloc((ip->w + 1) * sizeof **pixmapData);
-
- for (col = 0; col < ip->w; col++) {
- if (bits[ row * wb + (col >> 3) ] & (1 << (col & 07))) {
- pixmapData[row + 3][col] = '#';
- } else {
- pixmapData[row + 3][col] = '.';
+ wIconBitMap_t bits = ip->bits;
+ static unsigned char background[4] = { 0xFF, 0xFF, 0xFF, 0x0 };
+ long rgb = wDrawGetRGB(ip->color);
+ unsigned char foreground[4];
+ foreground[0] = ( rgb >> 16 ) & 0xFF;
+ foreground[1] = ( rgb >> 8 ) &0xFF;
+ foreground[2] = rgb & 0xFF;
+ foreground[3] = 0xFF;
+ int wb = (ip->w + 7) / 8;
+ size_t siz = ip->h * (wb * 8) * 4 * sizeof ( unsigned char );
+ unsigned char * pData = (unsigned char*)malloc( siz );
+ unsigned char * pCurr = pData;
+ int iStride = cairo_format_stride_for_width( CAIRO_FORMAT_RGB24, ip->w );
+
+ for ( int y = 0; y < ip->h; y++ ) {
+ for ( int x = 0; x < ip->w; x++ ) {
+ int iIndex = y * wb + ( x >> 3 );
+ int iOffset = x & 0x7;
+ unsigned char iValue = bits[ iIndex ];
+ int iMask = 1<<iOffset;
+ wBool_t bOn = (iValue & iMask) ? TRUE : FALSE ;
+ for ( int p = 0; p < 4; p++ ) {
+ *pCurr++ = ( bOn ? foreground[p] : background[p] );
}
+// printf( bOn?"*":" " );
}
- pixmapData[row + 3][ip->w] = 0;
+// printf( "\n" );
}
+// printf("\n");
- pixbuf = gdk_pixbuf_new_from_xpm_data((const char **) pixmapData);
-
- for (row = 0; row < ip->h; row++) {
- free(pixmapData[row + 3]);
- }
- free(pixmapData);
+ pixbuf = gdk_pixbuf_new_from_data( pData, GDK_COLORSPACE_RGB, TRUE, 8,
+ ip->w, ip->h, iStride, NULL, NULL );
return pixbuf;
}
@@ -355,13 +348,27 @@ wControl_p wlibGetControlFromPos(
*****************************************************************************
*/
+
/**
- * Beep!
- * \return
+ * Change audio setting.
+ *
+ * \param setting true: beep is on
+ */
+void
+wSetAudio(bool setting)
+{
+ audioOn = (setting > 0);
+}
+
+/**
+ * Sound speaker if audio is enabled.
+ *
*/
void wBeep(void)
{
- gdk_display_beep(gdk_display_get_default());
+ if(audioOn) {
+ gdk_display_beep(gdk_display_get_default());
+ }
}
/**
diff --git a/app/wlib/gtklib/window.c b/app/wlib/gtklib/window.c
index b8a3cdf..f5050ea 100644
--- a/app/wlib/gtklib/window.c
+++ b/app/wlib/gtklib/window.c
@@ -53,7 +53,7 @@ static int keyState;
static wBool_t gtkBlockEnabled = TRUE;
static wBool_t maximize_at_next_show = FALSE;
-#include "../../bin/bitmaps/xtc.xpm"
+#include "bitmaps/xtc.image1"
static GdkPixbuf *windowIconPixbuf = NULL;
/*
@@ -305,7 +305,7 @@ void wWinSetSize(
void wWinShow(
wWin_p win, /* Window */
- wBool_t show) /* Command */
+ unsigned show) /* Command */
{
//GtkRequisition min_req, pref_req;
@@ -318,7 +318,8 @@ void wWinShow(
}
int width, height;
-
+ show &= ~(DONTGRABFOCUS); // flag is ignored on Linux
+
if (show) {
keyState = 0;
getPos(win);
@@ -360,6 +361,7 @@ void wWinShow(
gtk_window_present(GTK_WINDOW(win->gtkwin));
+
gdk_window_raise(gtk_widget_get_window(win->gtkwin));
if (win->shown && win->modalLevel > 0) {
@@ -1049,7 +1051,7 @@ static wWin_p wWinCommonCreate(
}
if ( windowIconPixbuf == NULL ) {
- windowIconPixbuf = gdk_pixbuf_new_from_xpm_data((const char**)&xtc_xpm);
+ windowIconPixbuf = gdk_pixbuf_new_from_inline(-1, (unsigned char *)xtc_image1, FALSE, NULL);
}
gtk_window_set_icon( GTK_WINDOW(w->gtkwin), windowIconPixbuf );
diff --git a/app/wlib/gtklib/wpref.c b/app/wlib/gtklib/wpref.c
index 356dd95..d83f3e9 100644
--- a/app/wlib/gtklib/wpref.c
+++ b/app/wlib/gtklib/wpref.c
@@ -107,6 +107,11 @@ const char * wGetAppLibDir( void )
return appLibDir;
}
+ strcpy(appLibDir, XTRKCAD_INSTALL_PREFIX "/" XTRKCAD_SHARE_INSTALL_DIR);
+ if ((stat( appLibDir, &buf) == 0 ) && S_ISDIR(buf.st_mode)) {
+ return appLibDir;
+ }
+
char * dir1 = "/usr/share/";
char * dir2 = "/usr/local/share/";
char * beta = "";
@@ -265,13 +270,15 @@ wlibSetProfileFilename(char *name)
if (name && name[0]) {
size_t length;
length = snprintf(profileFile, 0, "%s", name);
- profileFile = malloc(length + sizeof(NULL));
+ length += sizeof("");
+ profileFile = malloc(length);
snprintf( profileFile, length, "%s", name );
} else {
size_t length;
length = snprintf(profileFile, 0, "%s/%s.rc", workDir, wConfigName );
- profileFile = malloc(length + sizeof(NULL));
- length = snprintf(profileFile, length+sizeof(NULL), "%s/%s.rc", workDir, wConfigName );
+ length += sizeof("");
+ profileFile = malloc(length);
+ length = snprintf(profileFile, length, "%s/%s.rc", workDir, wConfigName );
}
}
@@ -631,4 +638,4 @@ wPrefFormatLine(const char* section, const char* name, const char* value, char*
value = "";
}
sprintf(result, "%s.%s: %s", section, name, value);
-} \ No newline at end of file
+}