summaryrefslogtreecommitdiff
path: root/app/wlib
diff options
context:
space:
mode:
Diffstat (limited to 'app/wlib')
-rw-r--r--app/wlib/CMakeLists.txt23
-rw-r--r--app/wlib/gtklib/CMakeLists.txt103
-rw-r--r--app/wlib/gtklib/bitmap.c38
-rw-r--r--app/wlib/gtklib/boxes.c194
-rw-r--r--app/wlib/gtklib/browserhelp.c69
-rw-r--r--app/wlib/gtklib/button.c904
-rw-r--r--app/wlib/gtklib/color.c512
-rw-r--r--app/wlib/gtklib/control.c259
-rw-r--r--app/wlib/gtklib/droplist.c441
-rw-r--r--app/wlib/gtklib/dynarr.h10
-rw-r--r--app/wlib/gtklib/filesel.c203
-rw-r--r--app/wlib/gtklib/font.c369
-rw-r--r--app/wlib/gtklib/gtkdraw-cairo.c1357
-rw-r--r--app/wlib/gtklib/gtkint.h307
-rw-r--r--app/wlib/gtklib/help.c43
-rw-r--r--app/wlib/gtklib/ixhelp.c424
-rw-r--r--app/wlib/gtklib/lines.c132
-rw-r--r--app/wlib/gtklib/list.c519
-rw-r--r--app/wlib/gtklib/liststore.c219
-rw-r--r--app/wlib/gtklib/main.c30
-rw-r--r--app/wlib/gtklib/menu.c493
-rw-r--r--app/wlib/gtklib/message.c224
-rw-r--r--app/wlib/gtklib/notice.c344
-rw-r--r--app/wlib/gtklib/opendocument.c88
-rw-r--r--app/wlib/gtklib/osxhelp.c169
-rw-r--r--app/wlib/gtklib/pixbuf.c96
-rw-r--r--app/wlib/gtklib/png.c65
-rw-r--r--app/wlib/gtklib/print.c1074
-rw-r--r--app/wlib/gtklib/single.c356
-rw-r--r--app/wlib/gtklib/splash.c115
-rw-r--r--app/wlib/gtklib/statusbar.c205
-rw-r--r--app/wlib/gtklib/sysinfo.c137
-rw-r--r--app/wlib/gtklib/text.c604
-rw-r--r--app/wlib/gtklib/timer.c95
-rw-r--r--app/wlib/gtklib/tooltip.c236
-rw-r--r--app/wlib/gtklib/treeview.c424
-rw-r--r--app/wlib/gtklib/uthash.h102
-rw-r--r--app/wlib/gtklib/util.c831
-rw-r--r--app/wlib/gtklib/window.c1339
-rw-r--r--app/wlib/gtklib/wpref.c360
-rw-r--r--app/wlib/gtklib/writebitmap.c102
-rw-r--r--app/wlib/include/CMakeLists.txt12
-rw-r--r--app/wlib/include/getline.h132
-rw-r--r--app/wlib/include/getopt.h2
-rw-r--r--app/wlib/include/wlib.h407
-rw-r--r--app/wlib/mswlib/CMakeLists.txt89
-rw-r--r--app/wlib/mswlib/backgnd.c369
-rw-r--r--app/wlib/mswlib/checksum.c14
-rw-r--r--app/wlib/mswlib/dynarr.h12
-rw-r--r--app/wlib/mswlib/getline/LICENSE25
-rw-r--r--app/wlib/mswlib/getline/README.md5
-rw-r--r--app/wlib/mswlib/getline/getline.c73
-rw-r--r--app/wlib/mswlib/getopt.c87
-rw-r--r--app/wlib/mswlib/gwin32.c155
-rw-r--r--app/wlib/mswlib/mswbitmap.c252
-rw-r--r--app/wlib/mswlib/mswbox.c45
-rw-r--r--app/wlib/mswlib/mswbutt.c341
-rw-r--r--app/wlib/mswlib/mswchoic.c357
-rw-r--r--app/wlib/mswlib/mswcolor.c131
-rw-r--r--app/wlib/mswlib/mswdraw.c1921
-rw-r--r--app/wlib/mswlib/mswedit.c592
-rw-r--r--app/wlib/mswlib/mswint.h181
-rw-r--r--app/wlib/mswlib/mswlines.c53
-rw-r--r--app/wlib/mswlib/mswlist.c1285
-rw-r--r--app/wlib/mswlib/mswmenu.c694
-rw-r--r--app/wlib/mswlib/mswmisc.c882
-rw-r--r--app/wlib/mswlib/mswmsg.c168
-rw-r--r--app/wlib/mswlib/mswpref.c442
-rw-r--r--app/wlib/mswlib/mswprint.c158
-rw-r--r--app/wlib/mswlib/mswsplash.c196
-rw-r--r--app/wlib/mswlib/mswstatus.c38
-rw-r--r--app/wlib/mswlib/mswtext.c568
-rw-r--r--app/wlib/mswlib/simple-gettext.c600
-rw-r--r--app/wlib/mswlib/sysinfo.c138
-rw-r--r--app/wlib/mswlib/unittest/CMakeLists.txt16
-rw-r--r--app/wlib/mswlib/utf8conv.c277
-rw-r--r--app/wlib/test/testapp.c2
77 files changed, 12937 insertions, 11397 deletions
diff --git a/app/wlib/CMakeLists.txt b/app/wlib/CMakeLists.txt
index 4fa7469..7f7ee82 100644
--- a/app/wlib/CMakeLists.txt
+++ b/app/wlib/CMakeLists.txt
@@ -1,10 +1,19 @@
-PROJECT(wlib)
+project(wlib)
-INCLUDE_DIRECTORIES("${wlib_SOURCE_DIR}/include")
+add_library( xtrkcad-wlib
+ "")
-IF(XTRKCAD_USE_GTK)
- ADD_SUBDIRECTORY(gtklib)
-ELSE(XTRKCAD_USE_GTK)
- ADD_SUBDIRECTORY(mswlib)
-ENDIF(XTRKCAD_USE_GTK)
+add_subdirectory(include)
+
+# add i18n.h to include path
+target_include_directories(xtrkcad-wlib
+ PRIVATE
+ ${xtrkcad-lib_SOURCE_DIR}
+)
+
+if(XTRKCAD_USE_GTK)
+ add_subdirectory(gtklib)
+else()
+ add_subdirectory(mswlib)
+endif()
diff --git a/app/wlib/gtklib/CMakeLists.txt b/app/wlib/gtklib/CMakeLists.txt
index 97ab56f..6c673d9 100644
--- a/app/wlib/gtklib/CMakeLists.txt
+++ b/app/wlib/gtklib/CMakeLists.txt
@@ -1,7 +1,12 @@
# Setup GTK UI library...
-file(GLOB headers *.h)
-set(sources
+target_include_directories(xtrkcad-wlib
+ PRIVATE
+ ${xtrkcad-lib_SOURCE_DIR}
+)
+
+target_sources(xtrkcad-wlib
+ PRIVATE
bitmap.c
boxes.c
button.c
@@ -20,11 +25,11 @@ set(sources
notice.c
opendocument.c
pixbuf.c
- png.c
print.c
single.c
splash.c
statusbar.c
+ sysinfo.c
text.c
timer.c
tooltip.c
@@ -32,66 +37,80 @@ set(sources
util.c
window.c
wpref.c
-# end of refactored sources
+ writebitmap.c
gtkdraw-cairo.c
- )
+)
# help system is OS and build specific, add appropriate source files
if(APPLE)
if (XTRKCAD_USE_APPLEHELP)
- set(sources
- ${sources}
+ target_sources(xtrkcad-wlib
+ PRIVATE
osxhelp.c)
- else(XTRKCAD_USE_APPLEHELP)
+ else()
if(XTRKCAD_USE_BROWSER)
- set(sources
- ${sources}
- browserhelp.c)
- else(XTRKCAD_USE_BROWSER)
- PKG_CHECK_MODULES(GTK_WEBKIT "webkit-1.0" REQUIRED)
- set(sources
- ${sources}
- ixhelp.c)
- endif(XTRKCAD_USE_BROWSER)
- endif(XTRKCAD_USE_APPLEHELP)
-else(APPLE)
+ target_sources(xtrkcad-wlib
+ PRIVATE
+ browserhelp.c)
+ else()
+ PKG_CHECK_MODULES(GTK_WEBKIT "webkit-1.0" REQUIRED)
+ target_sources(xtrkcad-wlib
+ PRIVATE
+ ixhelp.c)
+ endif()
+ endif()
+else()
if(XTRKCAD_USE_BROWSER)
- set(sources
- ${sources}
- browserhelp.c)
- else(XTRKCAD_USE_BROWSER)
+ target_sources(xtrkcad-wlib
+ PRIVATE
+ browserhelp.c)
+ else()
PKG_CHECK_MODULES(GTK_WEBKIT "webkit-1.0" REQUIRED)
- set(sources
- ${sources}
- ixhelp.c)
- endif(XTRKCAD_USE_BROWSER)
-endif(APPLE)
-
-include_directories(${XTrkCAD_BINARY_DIR})
-
-add_library(xtrkcad-wlib ${headers} ${sources})
+ target_sources(xtrkcad-wlib
+ PRIVATE
+ ixhelp.c)
+ endif()
+endif()
# GTK
find_package (GTK2)
-include_directories(${GTK_INCLUDE_DIRS})
-target_link_libraries(xtrkcad-wlib ${GTK_LIBRARIES})
# configure for GTK's native Unix print
find_package (GTKUnixPrint)
-include_directories(${GTK_UNIX_PRINT_INCLUDE_DIRS})
-target_link_libraries(xtrkcad-wlib ${GTK_UNIX_PRINT_LIBRARIES})
+
+target_include_directories(xtrkcad-wlib
+ PRIVATE
+ ${GTK_INCLUDE_DIRS}
+ ${GTK_UNIX_PRINT_INCLUDE_DIRS}
+)
+target_link_libraries(xtrkcad-wlib
+ PRIVATE
+ dynstring
+ ${GTK_UNIX_PRINT_LIBRARIES}
+ ${GTK_LIBRARIES}
+)
# add dependency to webkit if configured
if (APPLE)
if(NOT XTRKCAD_USE_APPLEHELP)
if(NOT XTRKCAD_USE_BROWSER)
- include_directories(${GTK_WEBKIT_INCLUDE_DIRS})
- target_link_libraries(xtrkcad-wlib ${GTK_WEBKIT_LIBRARIES})
+ target_include_directories(xtrkcad-wlib
+ ${GTK_WEBKIT_INCLUDE_DIRS}
+ )
+ target_link_libraries(xtrkcad-wlib
+ PRIVATE
+ ${GTK_WEBKIT_LIBRARIES}
+ )
endif()
endif()
-else (APPLE)
+else ()
if(NOT XTRKCAD_USE_BROWSER)
- include_directories(${GTK_WEBKIT_INCLUDE_DIRS})
- target_link_libraries(xtrkcad-wlib ${GTK_WEBKIT_LIBRARIES})
+ target_include_directories(xtrkcad-wlib
+ ${GTK_WEBKIT_INCLUDE_DIRS}
+ )
+ target_link_libraries(xtrkcad-wlib
+ PRIVATE
+ ${GTK_WEBKIT_LIBRARIES}
+ )
endif()
-endif(APPLE)
+endif()
diff --git a/app/wlib/gtklib/bitmap.c b/app/wlib/gtklib/bitmap.c
index eb5ef94..b1ff2ed 100644
--- a/app/wlib/gtklib/bitmap.c
+++ b/app/wlib/gtklib/bitmap.c
@@ -16,7 +16,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
@@ -46,54 +46,57 @@ struct wBitmap_t {
*/
wControl_p
-wBitmapCreate( wWin_p parent, wPos_t x, wPos_t y, long options, wIcon_p iconP )
+wBitmapCreate( wWin_p parent, wWinPix_t x, wWinPix_t y, long options,
+ const struct wIcon_t * iconP )
{
wBitmap_p bt;
GdkPixbuf *pixbuf;
GtkWidget *image;
-
+
bt = wlibAlloc( parent, B_BITMAP, x, y, NULL, sizeof *bt, NULL );
bt->w = iconP->w;
bt->h = iconP->h;
bt->option = options;
-
+
/*
- * Depending on the platform, parent->widget->window might still be null
+ * Depending on the platform, parent->widget->window might still be null
* at this point. The window allocation should be forced before creating
* the pixmap.
*/
- if ( gtk_widget_get_window( parent->widget ) == NULL )
- gtk_widget_realize( parent->widget ); /* force allocation, if pending */
-
+ if ( gtk_widget_get_window( parent->widget ) == NULL ) {
+ 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 );
g_object_ref_sink(pixbuf);
image = gtk_image_new_from_pixbuf( pixbuf );
gtk_widget_show( image );
g_object_unref( (gpointer)pixbuf );
-
+
bt->widget = gtk_fixed_new();
gtk_widget_show( bt->widget );
gtk_container_add( GTK_CONTAINER(bt->widget), image );
-
+
wlibComputePos( (wControl_p)bt );
wlibControlGetSize( (wControl_p)bt );
gtk_fixed_put( GTK_FIXED( parent->widget ), bt->widget, bt->realX, bt->realY );
-
+
return( (wControl_p)bt );
}
/**
* Create a two-tone icon
- *
+ *
* \param w IN width of icon
* \param h IN height of icon
* \param bits IN bitmap
- * \param color IN color
+ * \param color IN color
* \returns icon handle
*/
-wIcon_p wIconCreateBitMap( wPos_t w, wPos_t h, const char * bits, wDrawColor color )
+wIcon_p wIconCreateBitMap( wWinPix_t w, wWinPix_t h, const char * bits,
+ wDrawColor color )
{
wIcon_p ip;
ip = (wIcon_p)malloc( sizeof *ip );
@@ -101,7 +104,10 @@ wIcon_p wIconCreateBitMap( wPos_t w, wPos_t h, const char * bits, wDrawColor col
ip->w = w;
ip->h = h;
ip->color = color;
- ip->bits = bits;
+ // Copy bits
+ int nBytes = ( ( w + 7 ) / 8 ) * h;
+ ip->bits = (char*)malloc( nBytes );
+ memcpy( (void*)ip->bits, bits, nBytes );
return ip;
}
@@ -125,7 +131,7 @@ wIcon_p wIconCreatePixMap( char *pm[] )
/**
* Set the color a two-tone icon
- *
+ *
* \param ip IN icon handle
* \param color IN color to use
*/
diff --git a/app/wlib/gtklib/boxes.c b/app/wlib/gtklib/boxes.c
index cf419e6..3c0173b 100644
--- a/app/wlib/gtklib/boxes.c
+++ b/app/wlib/gtklib/boxes.c
@@ -36,8 +36,8 @@
#include "gtkint.h"
struct wBox_t {
- WOBJ_COMMON
- wBoxType_e boxTyp;
+ WOBJ_COMMON
+ wBoxType_e boxTyp;
};
#define B (1)
@@ -60,12 +60,12 @@ struct wBox_t {
*/
void wBoxSetSize(
- wBox_p b,
- wPos_t w,
- wPos_t h)
+ wBox_p b,
+ wWinPix_t w,
+ wWinPix_t h)
{
- b->w = w;
- b->h = h;
+ b->w = w;
+ b->h = h;
}
/**
@@ -82,78 +82,78 @@ void wBoxSetSize(
*/
void wlibDrawBox(
- wWin_p win,
- wBoxType_e style,
- wPos_t x,
- wPos_t y,
- wPos_t w,
- wPos_t h)
+ wWin_p win,
+ wBoxType_e style,
+ wWinPix_t x,
+ wWinPix_t y,
+ wWinPix_t w,
+ wWinPix_t h)
{
- wPos_t x0, y0, x1, y1;
- GdkDrawable * window;
- cairo_t *cr;
- static char colors[8][4][2] = {
- { /* ThinB */ {B,0}, {B,0}, {B,0}, {B,0} },
- { /* ThinW */ {W,0}, {W,0}, {W,0}, {W,0} },
- { /* AboveW */ {W,0}, {W,0}, {B,0}, {B,0} },
- { /* BelowW */ {B,0}, {B,0}, {W,0}, {W,0} },
- { /* ThickB */ {B,B}, {B,B}, {B,B}, {B,B} },
- { /* ThickW */ {W,W}, {W,W}, {W,W}, {W,W} },
- { /* RidgeW */ {W,B}, {W,B}, {B,W}, {B,W} },
- { /* TroughW*/ {B,W}, {B,W}, {W,B}, {W,B} }
- };
- window = gtk_widget_get_window(win->widget);
- cr = gdk_cairo_create(window);
- cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
- cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
- cairo_set_line_width(cr, 1.0);
- x0 = x;
- x1 = x+w;
- y0 = y;
- y1 = y+h;
- SETCOLOR(style, 0, 0);
- cairo_move_to(cr, x0, y0);
- cairo_line_to(cr, x0, y1);
- cairo_stroke_preserve(cr);
- SETCOLOR(style, 1, 0);
- cairo_move_to(cr, x0, y0);
- cairo_line_to(cr, x1, y0);
- cairo_stroke_preserve(cr);
- SETCOLOR(style, 2, 0);
- cairo_move_to(cr, x1, y1);
- cairo_line_to(cr, x0+1, y1);
- cairo_stroke_preserve(cr);
- SETCOLOR(style, 3, 0);
- cairo_move_to(cr, x1, y1-1);
- cairo_line_to(cr, x1, y0+1);
- cairo_stroke_preserve(cr);
-
- if (style < wBoxThickB) {
- cairo_destroy(cr);
- return;
- }
-
- x0++;
- y0++;
- x1--;
- y1--;
- SETCOLOR(style, 0, 1);
- cairo_move_to(cr, x0, y0);
- cairo_line_to(cr, x0, y1);
- cairo_stroke_preserve(cr);
- SETCOLOR(style, 1, 1);
- cairo_move_to(cr, x0+1, y0);
- cairo_line_to(cr, x1, y0);
- cairo_stroke_preserve(cr);
- SETCOLOR(style, 2, 1);
- cairo_move_to(cr, x1, y1);
- cairo_line_to(cr, x0+1, y1);
- cairo_stroke_preserve(cr);
- SETCOLOR(style, 3, 1);
- cairo_move_to(cr, x1, y1-1);
- cairo_line_to(cr, x1, y0+1);
- cairo_stroke_preserve(cr);
- cairo_destroy(cr);
+ wWinPix_t x0, y0, x1, y1;
+ GdkDrawable * window;
+ cairo_t *cr;
+ static char colors[8][4][2] = {
+ { /* ThinB */ {B,0}, {B,0}, {B,0}, {B,0} },
+ { /* ThinW */ {W,0}, {W,0}, {W,0}, {W,0} },
+ { /* AboveW */ {W,0}, {W,0}, {B,0}, {B,0} },
+ { /* BelowW */ {B,0}, {B,0}, {W,0}, {W,0} },
+ { /* ThickB */ {B,B}, {B,B}, {B,B}, {B,B} },
+ { /* ThickW */ {W,W}, {W,W}, {W,W}, {W,W} },
+ { /* RidgeW */ {W,B}, {W,B}, {B,W}, {B,W} },
+ { /* TroughW*/ {B,W}, {B,W}, {W,B}, {W,B} }
+ };
+ window = gtk_widget_get_window(win->widget);
+ cr = gdk_cairo_create(window);
+ cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
+ cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
+ cairo_set_line_width(cr, 1.0);
+ x0 = x;
+ x1 = x+w;
+ y0 = y;
+ y1 = y+h;
+ SETCOLOR(style, 0, 0);
+ cairo_move_to(cr, x0, y0);
+ cairo_line_to(cr, x0, y1);
+ cairo_stroke_preserve(cr);
+ SETCOLOR(style, 1, 0);
+ cairo_move_to(cr, x0, y0);
+ cairo_line_to(cr, x1, y0);
+ cairo_stroke_preserve(cr);
+ SETCOLOR(style, 2, 0);
+ cairo_move_to(cr, x1, y1);
+ cairo_line_to(cr, x0+1, y1);
+ cairo_stroke_preserve(cr);
+ SETCOLOR(style, 3, 0);
+ cairo_move_to(cr, x1, y1-1);
+ cairo_line_to(cr, x1, y0+1);
+ cairo_stroke_preserve(cr);
+
+ if (style < wBoxThickB) {
+ cairo_destroy(cr);
+ return;
+ }
+
+ x0++;
+ y0++;
+ x1--;
+ y1--;
+ SETCOLOR(style, 0, 1);
+ cairo_move_to(cr, x0, y0);
+ cairo_line_to(cr, x0, y1);
+ cairo_stroke_preserve(cr);
+ SETCOLOR(style, 1, 1);
+ cairo_move_to(cr, x0+1, y0);
+ cairo_line_to(cr, x1, y0);
+ cairo_stroke_preserve(cr);
+ SETCOLOR(style, 2, 1);
+ cairo_move_to(cr, x1, y1);
+ cairo_line_to(cr, x0+1, y1);
+ cairo_stroke_preserve(cr);
+ SETCOLOR(style, 3, 1);
+ cairo_move_to(cr, x1, y1-1);
+ cairo_line_to(cr, x1, y0+1);
+ cairo_stroke_preserve(cr);
+ cairo_destroy(cr);
}
/**
@@ -165,9 +165,9 @@ void wlibDrawBox(
static void boxRepaint(wControl_p b)
{
- wBox_p bb = (wBox_p)(b);
- wWin_p win = bb->parent;
- wlibDrawBox(win, bb->boxTyp, bb->realX, bb->realY, bb->w, bb->h);
+ wBox_p bb = (wBox_p)(b);
+ wWin_p win = bb->parent;
+ wlibDrawBox(win, bb->boxTyp, bb->realX, bb->realY, bb->w, bb->h);
}
/**
@@ -184,21 +184,21 @@ static void boxRepaint(wControl_p b)
*/
wBox_p wBoxCreate(
- wWin_p parent,
- wPos_t bx,
- wPos_t by,
- const char * labelStr,
- wBoxType_e boxTyp,
- wPos_t bw,
- wPos_t bh)
+ wWin_p parent,
+ wWinPix_t bx,
+ wWinPix_t by,
+ const char * labelStr,
+ wBoxType_e boxTyp,
+ wWinPix_t bw,
+ wWinPix_t bh)
{
- wBox_p b;
- b = (wBox_p)wlibAlloc(parent, B_BOX, bx, by, labelStr, sizeof *b, NULL);
- wlibComputePos((wControl_p)b);
- b->boxTyp = boxTyp;
- b->w = bw;
- b->h = bh;
- b->repaintProc = boxRepaint;
- wlibAddButton((wControl_p)b);
- return b;
+ wBox_p b;
+ b = (wBox_p)wlibAlloc(parent, B_BOX, bx, by, labelStr, sizeof *b, NULL);
+ wlibComputePos((wControl_p)b);
+ b->boxTyp = boxTyp;
+ b->w = bw;
+ b->h = bh;
+ b->repaintProc = boxRepaint;
+ wlibAddButton((wControl_p)b);
+ return b;
}
diff --git a/app/wlib/gtklib/browserhelp.c b/app/wlib/gtklib/browserhelp.c
index aa8f5c7..6d2ac5d 100644
--- a/app/wlib/gtklib/browserhelp.c
+++ b/app/wlib/gtklib/browserhelp.c
@@ -17,18 +17,21 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
#include <assert.h>
#include <string.h>
+#include <limits.h>
-#include "misc.h"
+//#include "misc.h"
#include "gtkint.h"
#include "i18n.h"
+extern wBool_t CheckHelpTopicExists(const char * topic);
+
#include "dynstring.h"
#define debug 0
@@ -43,7 +46,8 @@
"variable.\n Also make sure that the user has sufficient access rights to read these" \
"files."
/**
- * Create a fully qualified url from a topic
+ * Create a fully qualified url from a topic. The library path is converted to
+ * an absolute path first. The url is then created from that path.
*
* \param helpUrl OUT pointer to url, free by caller
* \param topic IN the help topic
@@ -52,20 +56,29 @@
static void
TopicToUrl(char **helpUrl, const char *topic)
{
- DynString url;
- DynStringMalloc(&url, 16);
-
- // build up the url line
- DynStringCatCStrs(&url,
- "file://",
- wGetAppLibDir(),
- "/html/",
- topic,
- ".html",
- NULL);
-
- *helpUrl = strdup(DynStringToCStr(&url));
- DynStringFree(&url);
+ DynString url;
+ DynStringMalloc(&url, 16);
+ char *realPath;
+
+ realPath = realpath(wGetAppLibDir(), NULL);
+
+ if(realPath) {
+ // build up the url line
+ DynStringCatCStrs(&url,
+ "file://",
+ realPath,
+ "/html/",
+ topic,
+ ".html",
+ NULL);
+
+ *helpUrl = strdup(DynStringToCStr(&url));
+ DynStringFree(&url);
+ free(realPath);
+ } else {
+ wNoticeEx( NT_ERROR, _("Not enough memory for realpath()"), _("Exit"), NULL);
+ wExit(0);
+ }
}
/**
* Invoke the system's default browser to display help for <topic>. First the
@@ -77,22 +90,22 @@ TopicToUrl(char **helpUrl, const char *topic)
void wHelp(const char * topic)
{
- int rc;
- char *url;
- char *currentPath;
-
- assert(topic != NULL);
- assert(strlen(topic));
+ int rc;
+ char *url;
+// char *currentPath;
- if (!CheckHelpTopicExists(topic)) return;
+ assert(topic != NULL);
+ assert(strlen(topic));
- TopicToUrl(&url, topic);
+ if (!CheckHelpTopicExists(topic)) { return; }
+ TopicToUrl(&url, topic);
+ printf(">%s<\n", url);
rc = wOpenFileExternal(url);
if (!rc) {
- wNotice(HELPERRORTEXT, _("Cancel"), NULL);
- }
+ wNotice(HELPERRORTEXT, _("Cancel"), NULL);
+ }
- free(url);
+ free(url);
}
diff --git a/app/wlib/gtklib/button.c b/app/wlib/gtklib/button.c
index 51106c8..7193b11 100644
--- a/app/wlib/gtklib/button.c
+++ b/app/wlib/gtklib/button.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -53,10 +53,17 @@
void wButtonSetBusy(wButton_p bb, int value)
{
- bb->recursion++;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bb->widget), value);
- bb->recursion--;
- bb->busy = value;
+ bb->recursion++;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bb->widget), value);
+ bb->recursion--;
+ bb->busy = value;
+ if (!value) {
+ if (bb->timer_id) {
+ g_source_remove(bb->timer_id);
+ bb->timer_id = 0;
+ }
+ bb->timer_state = -1;
+ }
}
/**
@@ -70,57 +77,58 @@ void wButtonSetBusy(wButton_p bb, int value)
*/
void wlibSetLabel(
- GtkWidget *widget,
- long option,
- const char * labelStr,
- GtkLabel * * labelG,
- GtkWidget * * imageG)
+ GtkWidget *widget,
+ long option,
+ const char * labelStr,
+ GtkLabel * * labelG,
+ GtkWidget * * imageG)
{
- wIcon_p bm;
- GdkBitmap * mask;
-
- if (widget == 0) {
- abort();
- }
-
- if (labelStr) {
- if (option&BO_ICON) {
- GdkPixbuf *pixbuf;
-
- bm = (wIcon_p)labelStr;
-
- if (bm->gtkIconType == gtkIcon_pixmap) {
- pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)bm->bits);
- } else {
- pixbuf = wlibPixbufFromXBM( bm );
- }
- double scaleicon;
- wPrefGetFloat(PREFSECTION, LARGEICON, &scaleicon, 1.0);
- if (scaleicon<1.0) scaleicon=1.0;
- if (scaleicon>2.0) scaleicon=2.0;
- GdkPixbuf *pixbuf2 =
- gdk_pixbuf_scale_simple(pixbuf, gdk_pixbuf_get_width(pixbuf)*scaleicon, gdk_pixbuf_get_height(pixbuf)*scaleicon, GDK_INTERP_BILINEAR);
- g_object_ref_sink(pixbuf);
- g_object_unref((gpointer)pixbuf);
- if (*imageG==NULL) {
- *imageG = gtk_image_new_from_pixbuf(pixbuf2);
- gtk_container_add(GTK_CONTAINER(widget), *imageG);
- gtk_widget_show(*imageG);
- } else {
- gtk_image_set_from_pixbuf(GTK_IMAGE(*imageG), pixbuf2);
- }
- g_object_ref_sink(pixbuf2);
- g_object_unref((gpointer)pixbuf2);
- } else {
- if (*labelG==NULL) {
- *labelG = (GtkLabel*)gtk_label_new(wlibConvertInput(labelStr));
- gtk_container_add(GTK_CONTAINER(widget), (GtkWidget*)*labelG);
- gtk_widget_show((GtkWidget*)*labelG);
- } else {
- gtk_label_set_text(*labelG, wlibConvertInput(labelStr));
- }
- }
- }
+ wIcon_p bm;
+// GdkBitmap * mask;
+
+ if (widget == 0) {
+ abort();
+ }
+
+ if (labelStr) {
+ if (option&BO_ICON) {
+ GdkPixbuf *pixbuf;
+
+ bm = (wIcon_p)labelStr;
+
+ if (bm->gtkIconType == gtkIcon_pixmap) {
+ pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)bm->bits);
+ } else {
+ pixbuf = wlibPixbufFromXBM( bm );
+ }
+ double scaleicon;
+ wPrefGetFloat(PREFSECTION, LARGEICON, &scaleicon, 1.0);
+ if (scaleicon<1.0) { scaleicon=1.0; }
+ if (scaleicon>2.0) { scaleicon=2.0; }
+ GdkPixbuf *pixbuf2 =
+ gdk_pixbuf_scale_simple(pixbuf, gdk_pixbuf_get_width(pixbuf)*scaleicon,
+ gdk_pixbuf_get_height(pixbuf)*scaleicon, GDK_INTERP_BILINEAR);
+ g_object_ref_sink(pixbuf);
+ g_object_unref((gpointer)pixbuf);
+ if (*imageG==NULL) {
+ *imageG = gtk_image_new_from_pixbuf(pixbuf2);
+ gtk_container_add(GTK_CONTAINER(widget), *imageG);
+ gtk_widget_show(*imageG);
+ } else {
+ gtk_image_set_from_pixbuf(GTK_IMAGE(*imageG), pixbuf2);
+ }
+ g_object_ref_sink(pixbuf2);
+ g_object_unref((gpointer)pixbuf2);
+ } else {
+ if (*labelG==NULL) {
+ *labelG = (GtkLabel*)gtk_label_new(wlibConvertInput(labelStr));
+ gtk_container_add(GTK_CONTAINER(widget), (GtkWidget*)*labelG);
+ gtk_widget_show((GtkWidget*)*labelG);
+ } else {
+ gtk_label_set_text(*labelG, wlibConvertInput(labelStr));
+ }
+ }
+ }
}
/**
@@ -131,7 +139,7 @@ void wlibSetLabel(
void wButtonSetLabel(wButton_p bb, const char * labelStr)
{
- wlibSetLabel(bb->widget, bb->option, labelStr, &bb->labelG, &bb->imageG);
+ wlibSetLabel(bb->widget, bb->option, labelStr, &bb->labelG, &bb->imageG);
}
/**
@@ -141,51 +149,166 @@ void wButtonSetLabel(wButton_p bb, const char * labelStr)
*/
void wlibButtonDoAction(
- wButton_p bb)
+ wButton_p bb)
{
- if (bb->action) {
- bb->action(bb->data);
- }
+ if (bb->action) {
+ bb->action(bb->data);
+ }
}
+
/**
* Signal handler for button push
- * \param widget IN the widget
+ * \param widget IN the widget or NULL for autorepeat
* \param value IN the button handle (same as widget???)
*/
static void pushButt(
- GtkWidget *widget,
- gpointer value)
+ GtkWidget *widget,
+ gpointer value)
{
- wButton_p b = (wButton_p)value;
+ wButton_p b = (wButton_p)value;
+
+ if (debugWindow >= 2) {
+ printf("%s button pushed\n", b->labelStr?b->labelStr:"No label");
+ }
- if (debugWindow >= 2) {
- printf("%s button pushed\n", b->labelStr?b->labelStr:"No label");
- }
+ if (b->recursion) {
+ return;
+ }
- if (b->recursion) {
- return;
- }
+ wlibStringUpdate();
+ if (b->action) {
+ b->action(b->data);
+ }
- if (b->action) {
- b->action(b->data);
- }
- if (!b->busy) {
- b->recursion++;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->widget), FALSE);
- b->recursion--;
- }
}
+#define REPEAT_STAGE0_DELAY 500
+#define REPEAT_STAGE1_DELAY 150
+#define REPEAT_STAGE2_DELAY 100
+
+/* Timer callback function! */
+static int timer_func ( void * data)
+{
+ wButton_p bb = (wButton_p)data;
+ if (bb->timer_id == 0) {
+ bb->timer_state = -1;
+ return FALSE;
+ }
+ /* Autorepeat state machine */
+ switch (bb->timer_state) {
+ case 0: /* Enable slow auto-repeat */
+ g_source_remove(bb->timer_id);
+ bb->timer_id = 0;
+ bb->timer_state = 1;
+ bb->timer_id = g_timeout_add( REPEAT_STAGE1_DELAY, timer_func, bb);
+ bb->timer_count = 0;
+ break;
+ case 1: /* Check if it's time for fast repeat yet */
+ if (bb->timer_count++ > 10) {
+ bb->timer_state = 2;
+ }
+ break;
+ case 2: /* Start fast auto-repeat */
+ g_source_remove(bb->timer_id);
+ bb->timer_id = 0;
+ bb->timer_state = 3;
+ bb->timer_id = g_timeout_add( REPEAT_STAGE2_DELAY, timer_func, bb);
+ break;
+ case 3:
+ break;
+ default:
+ g_source_remove(bb->timer_id);
+ bb->timer_id = 0;
+ bb->timer_state = -1;
+ return FALSE;
+ break;
+ }
+
+ pushButt(NULL,bb);
+
+ return TRUE;
+
+}
+
+static gint pressButt(
+ GtkWidget *widget,
+ GdkEventButton *event,
+ wButton_p bb)
+{
+
+ if ( debugWindow >= 1 ) {
+ printf( "buttonPress: %s\n", bb->labelStr );
+ }
+ if (bb->recursion) {
+ return TRUE;
+
+ }
+
+
+ if (bb->option & BO_REPEAT) {
+ /* Remove an existing timer */
+ if (bb->timer_id) {
+ g_source_remove(bb->timer_id);
+ }
+
+ /* Setup a timer */
+ bb->timer_id = g_timeout_add( REPEAT_STAGE0_DELAY, timer_func, bb);
+ bb->timer_state = 0;
+
+ }
+
+ if (!bb->busy) {
+ bb->recursion++;
+ int sensitive = gtk_widget_get_sensitive (GTK_WIDGET(bb->widget));
+ if (sensitive) {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bb->widget), TRUE);
+ }
+ bb->recursion--;
+ }
+
+
+ return TRUE;
+
+}
+
+static gint releaseButt(
+ GtkWidget *widget,
+ GdkEventButton *event,
+ wButton_p bb)
+{
+
+ if ( debugWindow >= 1 ) {
+ printf( "buttonRelease: %s\n", bb->labelStr );
+ }
+ /* Remove any existing timer */
+ if (bb->timer_id) {
+ g_source_remove(bb->timer_id);
+ bb->timer_id = 0;
+ }
+
+ bb->timer_state = -1;
+
+ pushButt(widget,bb); //Do here to simulate "clicked"
+
+ if (!bb->busy) {
+ bb->recursion++;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bb->widget), FALSE);
+ bb->recursion--;
+ }
+ return TRUE;
+}
+
+
/**
* Called after expose event default hander - allows the button to be outlined
*/
static wBool_t exposeButt(
- GtkWidget *widget,
- GdkEventExpose *event,
- gpointer g)
+ GtkWidget *widget,
+ GdkEventExpose *event,
+ gpointer g)
{
wControl_p b = (wControl_p)g;
return wControlExpose(widget,event,b);
@@ -207,57 +330,62 @@ static wBool_t exposeButt(
*/
wButton_p wButtonCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- const char * labelStr,
- long option,
- wPos_t width,
- wButtonCallBack_p action,
- void * data)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ wWinPix_t width,
+ wButtonCallBack_p action,
+ void * data)
{
- wButton_p b;
- if (option&BO_ICON) //The labelStr here is a wIcon_p
- b = wlibAlloc(parent, B_BUTTON, x, y, " ", sizeof *b, data);
- else
- b = wlibAlloc(parent, B_BUTTON, x, y, labelStr, sizeof *b, data);
- b->option = option;
- b->action = action;
- wlibComputePos((wControl_p)b);
-
- b->widget = gtk_toggle_button_new();
- g_signal_connect(GTK_OBJECT(b->widget), "clicked",
- G_CALLBACK(pushButt), b);
- g_signal_connect_after(GTK_OBJECT(b->widget), "expose-event",
- G_CALLBACK(exposeButt), b);
- if (width > 0) {
- gtk_widget_set_size_request(b->widget, width, -1);
- }
-
- if( labelStr ){
- wButtonSetLabel(b, labelStr);
- }
-
- gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
-
- if (option & BB_DEFAULT) {
- gtk_widget_set_can_default(b->widget, GTK_CAN_DEFAULT);
- gtk_widget_grab_default(b->widget);
- gtk_window_set_default(GTK_WINDOW(parent->gtkwin), b->widget);
- }
-
- wlibControlGetSize((wControl_p)b);
-
- if (width == 0 && b->w < MIN_BUTTON_WIDTH && (b->option&BO_ICON)==0) {
- b->w = MIN_BUTTON_WIDTH;
- gtk_widget_set_size_request(b->widget, b->w, b->h);
- }
-
- gtk_widget_show(b->widget);
- wlibAddButton((wControl_p)b);
- wlibAddHelpString(b->widget, helpStr);
- return b;
+ wButton_p b;
+ if (option&BO_ICON) { //The labelStr here is a wIcon_p
+ b = wlibAlloc(parent, B_BUTTON, x, y, " ", sizeof *b, data);
+ } else {
+ b = wlibAlloc(parent, B_BUTTON, x, y, labelStr, sizeof *b, data);
+ }
+ b->option = option;
+ b->action = action;
+ wlibComputePos((wControl_p)b);
+
+ b->widget = gtk_toggle_button_new();
+ g_signal_connect(GTK_OBJECT(b->widget), "button_press_event",
+ G_CALLBACK(pressButt), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "button_release_event",
+ G_CALLBACK(releaseButt), b);
+ //g_signal_connect(GTK_OBJECT(b->widget), "clicked",
+ // G_CALLBACK(pushButt), b);
+ g_signal_connect_after(GTK_OBJECT(b->widget), "expose-event",
+ G_CALLBACK(exposeButt), b);
+ if (width > 0) {
+ gtk_widget_set_size_request(b->widget, width, -1);
+ }
+
+ if( labelStr ) {
+ wButtonSetLabel(b, labelStr);
+ }
+
+ gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
+
+ if (option & BB_DEFAULT) {
+ gtk_widget_set_can_default(b->widget, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default(b->widget);
+ gtk_window_set_default(GTK_WINDOW(parent->gtkwin), b->widget);
+ }
+
+ wlibControlGetSize((wControl_p)b);
+
+ if (width == 0 && b->w < MIN_BUTTON_WIDTH && (b->option&BO_ICON)==0) {
+ b->w = MIN_BUTTON_WIDTH;
+ gtk_widget_set_size_request(b->widget, b->w, b->h);
+ }
+
+ gtk_widget_show(b->widget);
+ wlibAddButton((wControl_p)b);
+ wlibAddHelpString(b->widget, helpStr);
+ return b;
}
@@ -270,10 +398,10 @@ wButton_p wButtonCreate(
*/
struct wChoice_t {
- WOBJ_COMMON
- long *valueP;
- wChoiceCallBack_p action;
- int recursion;
+ WOBJ_COMMON
+ long *valueP;
+ wChoiceCallBack_p action;
+ int recursion;
};
@@ -288,33 +416,33 @@ struct wChoice_t {
*/
static long choiceGetValue(
- wChoice_p bc)
+ wChoice_p bc)
{
- GList * child, * children;
- long value, inx;
-
- if (bc->type == B_TOGGLE) {
- value = 0;
- } else {
- value = -1;
- }
-
- for (children=child=gtk_container_get_children(GTK_CONTAINER(bc->widget)),inx=0;
- child; child=child->next,inx++) {
- if (gtk_toggle_button_get_active(child->data)) {
- if (bc->type == B_TOGGLE) {
- value |= (1<<inx);
- } else {
- value = inx;
- }
- }
- }
-
- if (children) {
- g_list_free(children);
- }
-
- return value;
+ GList * child, * children;
+ long value, inx;
+
+ if (bc->type == B_TOGGLE) {
+ value = 0;
+ } else {
+ value = -1;
+ }
+
+ for (children=child=gtk_container_get_children(GTK_CONTAINER(bc->widget)),inx=0;
+ child; child=child->next,inx++) {
+ if (gtk_toggle_button_get_active(child->data)) {
+ if (bc->type == B_TOGGLE) {
+ value |= (1<<inx);
+ } else {
+ value = inx;
+ }
+ }
+ }
+
+ if (children) {
+ g_list_free(children);
+ }
+
+ return value;
}
/**
@@ -325,24 +453,24 @@ static long choiceGetValue(
*/
void wRadioSetValue(
- wChoice_p bc, /* Radio box */
- long value) /* Value */
+ wChoice_p bc, /* Radio box */
+ long value) /* Value */
{
- GList * child, * children;
- long inx;
-
- for (children=child=gtk_container_get_children(GTK_CONTAINER(bc->widget)),inx=0;
- child; child=child->next,inx++) {
- if (inx == value) {
- bc->recursion++;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(child->data), TRUE);
- bc->recursion--;
- }
- }
-
- if (children) {
- g_list_free(children);
- }
+ GList * child, * children;
+ long inx;
+
+ for (children=child=gtk_container_get_children(GTK_CONTAINER(bc->widget)),inx=0;
+ child; child=child->next,inx++) {
+ if (inx == value) {
+ bc->recursion++;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(child->data), TRUE);
+ bc->recursion--;
+ }
+ }
+
+ if (children) {
+ g_list_free(children);
+ }
}
/**
@@ -353,9 +481,9 @@ void wRadioSetValue(
*/
long wRadioGetValue(
- wChoice_p bc) /* Radio box */
+ wChoice_p bc) /* Radio box */
{
- return choiceGetValue(bc);
+ return choiceGetValue(bc);
}
/**
@@ -366,24 +494,24 @@ long wRadioGetValue(
*/
void wToggleSetValue(
- wChoice_p bc, /* Toggle box */
- long value) /* Values */
+ wChoice_p bc, /* Toggle box */
+ long value) /* Values */
{
- GList * child, * children;
- long inx;
- bc->recursion++;
+ GList * child, * children;
+ long inx;
+ bc->recursion++;
- for (children=child=gtk_container_get_children(GTK_CONTAINER(bc->widget)),inx=0;
- child; child=child->next,inx++) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(child->data),
- (value&(1<<inx))!=0);
- }
+ for (children=child=gtk_container_get_children(GTK_CONTAINER(bc->widget)),inx=0;
+ child; child=child->next,inx++) {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(child->data),
+ (value&(1<<inx))!=0);
+ }
- if (children) {
- g_list_free(children);
- }
+ if (children) {
+ g_list_free(children);
+ }
- bc->recursion--;
+ bc->recursion--;
}
@@ -395,9 +523,9 @@ void wToggleSetValue(
*/
long wToggleGetValue(
- wChoice_p b) /* Toggle box */
+ wChoice_p b) /* Toggle box */
{
- return choiceGetValue(b);
+ return choiceGetValue(b);
}
/**
@@ -410,35 +538,35 @@ long wToggleGetValue(
*/
static int pushChoice(
- GtkWidget *widget,
- gpointer b)
+ GtkWidget *widget,
+ gpointer b)
{
- wChoice_p bc = (wChoice_p)b;
- long value = choiceGetValue(bc);
+ wChoice_p bc = (wChoice_p)b;
+ long value = choiceGetValue(bc);
- if (debugWindow >= 2) {
- printf("%s choice pushed = %ld\n", bc->labelStr?bc->labelStr:"No label",
- value);
- }
+ if (debugWindow >= 2) {
+ printf("%s choice pushed = %ld\n", bc->labelStr?bc->labelStr:"No label",
+ value);
+ }
- if (bc->type == B_RADIO &&
- !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))) {
- return 1;
- }
+ if (bc->type == B_RADIO &&
+ !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))) {
+ return 1;
+ }
- if (bc->recursion) {
- return 1;
- }
+ if (bc->recursion) {
+ return 1;
+ }
- if (bc->valueP) {
- *bc->valueP = value;
- }
+ if (bc->valueP) {
+ *bc->valueP = value;
+ }
- if (bc->action) {
- bc->action(value, bc->data);
- }
+ if (bc->action) {
+ bc->action(value, bc->data);
+ }
- return 1;
+ return 1;
}
/**
@@ -449,13 +577,13 @@ static int pushChoice(
*/
static void choiceRepaint(
- wControl_p b)
+ wControl_p b)
{
- wChoice_p bc = (wChoice_p)b;
+ wChoice_p bc = (wChoice_p)b;
- if (gtk_widget_get_visible(b->widget)) {
- wlibDrawBox(bc->parent, wBoxBelow, bc->realX-1, bc->realY-1, bc->w+1, bc->h+1);
- }
+ if (gtk_widget_get_visible(b->widget)) {
+ wlibDrawBox(bc->parent, wBoxBelow, bc->realX-1, bc->realY-1, bc->w+1, bc->h+1);
+ }
}
/**
@@ -475,95 +603,95 @@ static void choiceRepaint(
*/
wChoice_p wRadioCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- const char * labelStr,
- long option,
- const char **labels,
- long *valueP,
- wChoiceCallBack_p action,
- void *data)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ const char * const *labels,
+ long *valueP,
+ wChoiceCallBack_p action,
+ void *data)
{
- wChoice_p b;
- const char ** label;
- GtkWidget *butt0=NULL, *butt;
-
- if ((option & BC_NOBORDER)==0) {
- if (x>=0) {
- x++;
- } else {
- x--;
- }
-
- if (y>=0) {
- y++;
- } else {
- y--;
- }
- }
-
- b = wlibAlloc(parent, B_RADIO, x, y, labelStr, sizeof *b, data);
- b->option = option;
- b->action = action;
- b->valueP = valueP;
- wlibComputePos((wControl_p)b);
-
- ((wControl_p)b)->outline = FALSE;
-
- if (option&BC_HORZ) {
- b->widget = gtk_hbox_new(FALSE, 0);
- } else {
- b->widget = gtk_vbox_new(FALSE, 0);
- }
-
- if (b->widget == 0) {
- abort();
- }
-
- for (label=labels; *label; label++) {
- butt = gtk_radio_button_new_with_label(
- butt0?gtk_radio_button_get_group(GTK_RADIO_BUTTON(butt0)):NULL, _(*label));
-
- if (butt0==NULL) {
- butt0 = butt;
- }
-
- gtk_box_pack_start(GTK_BOX(b->widget), butt, TRUE, TRUE, 0);
- gtk_widget_show(butt);
- g_signal_connect(GTK_OBJECT(butt), "toggled",
- G_CALLBACK(pushChoice), b);
- g_signal_connect_after(GTK_OBJECT(b->widget), "expose-event",
- G_CALLBACK(exposeButt), b);
- wlibAddHelpString(butt, helpStr);
- }
-
- if (option & BB_DEFAULT) {
- gtk_widget_set_can_default(b->widget, TRUE);
- gtk_widget_grab_default(b->widget);
- }
-
- if (valueP) {
- wRadioSetValue(b, *valueP);
- }
-
- if ((option & BC_NOBORDER)==0) {
- b->repaintProc = choiceRepaint;
- b->w += 2;
- b->h += 2;
- }
-
- gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
- wlibControlGetSize((wControl_p)b);
-
- if (labelStr) {
- b->labelW = wlibAddLabel((wControl_p)b, labelStr);
- }
-
- gtk_widget_show(b->widget);
- wlibAddButton((wControl_p)b);
- return b;
+ wChoice_p b;
+ const char * const * label;
+ GtkWidget *butt0=NULL, *butt;
+
+ if ((option & BC_NOBORDER)==0) {
+ if (x>=0) {
+ x++;
+ } else {
+ x--;
+ }
+
+ if (y>=0) {
+ y++;
+ } else {
+ y--;
+ }
+ }
+
+ b = wlibAlloc(parent, B_RADIO, x, y, labelStr, sizeof *b, data);
+ b->option = option;
+ b->action = action;
+ b->valueP = valueP;
+ wlibComputePos((wControl_p)b);
+
+ ((wControl_p)b)->outline = FALSE;
+
+ if (option&BC_HORZ) {
+ b->widget = gtk_hbox_new(FALSE, 0);
+ } else {
+ b->widget = gtk_vbox_new(FALSE, 0);
+ }
+
+ if (b->widget == 0) {
+ abort();
+ }
+
+ for (label=labels; *label; label++) {
+ butt = gtk_radio_button_new_with_label(
+ butt0?gtk_radio_button_get_group(GTK_RADIO_BUTTON(butt0)):NULL, _(*label));
+
+ if (butt0==NULL) {
+ butt0 = butt;
+ }
+
+ gtk_box_pack_start(GTK_BOX(b->widget), butt, TRUE, TRUE, 0);
+ gtk_widget_show(butt);
+ g_signal_connect(GTK_OBJECT(butt), "toggled",
+ G_CALLBACK(pushChoice), b);
+ g_signal_connect_after(GTK_OBJECT(b->widget), "expose-event",
+ G_CALLBACK(exposeButt), b);
+ wlibAddHelpString(butt, helpStr);
+ }
+
+ if (option & BB_DEFAULT) {
+ gtk_widget_set_can_default(b->widget, TRUE);
+ gtk_widget_grab_default(b->widget);
+ }
+
+ if (valueP) {
+ wRadioSetValue(b, *valueP);
+ }
+
+ if ((option & BC_NOBORDER)==0) {
+ b->repaintProc = choiceRepaint;
+ b->w += 2;
+ b->h += 2;
+ }
+
+ gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
+ wlibControlGetSize((wControl_p)b);
+
+ if (labelStr) {
+ b->labelW = wlibAddLabel((wControl_p)b, labelStr);
+ }
+
+ gtk_widget_show(b->widget);
+ wlibAddButton((wControl_p)b);
+ return b;
}
/**
@@ -583,82 +711,82 @@ wChoice_p wRadioCreate(
*/
wChoice_p wToggleCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- const char * labelStr,
- long option,
- const char **labels,
- long *valueP,
- wChoiceCallBack_p action,
- void *data)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ const char * const * labels,
+ long *valueP,
+ wChoiceCallBack_p action,
+ void *data)
{
- wChoice_p b;
- const char ** label;
-
- if ((option & BC_NOBORDER)==0) {
- if (x>=0) {
- x++;
- } else {
- x--;
- }
-
- if (y>=0) {
- y++;
- } else {
- y--;
- }
- }
-
- b = wlibAlloc(parent, B_TOGGLE, x, y, labelStr, sizeof *b, data);
- b->option = option;
- b->action = action;
- wlibComputePos((wControl_p)b);
-
- ((wControl_p)b)->outline = FALSE;
-
- if (option&BC_HORZ) {
- b->widget = gtk_hbox_new(FALSE, 0);
- } else {
- b->widget = gtk_vbox_new(FALSE, 0);
- }
-
- if (b->widget == 0) {
- abort();
- }
-
- for (label=labels; *label; label++) {
- GtkWidget *butt;
-
- butt = gtk_check_button_new_with_label(_(*label));
- gtk_box_pack_start(GTK_BOX(b->widget), butt, TRUE, TRUE, 0);
- gtk_widget_show(butt);
- g_signal_connect(GTK_OBJECT(butt), "toggled",
- G_CALLBACK(pushChoice), b);
- g_signal_connect_after(GTK_OBJECT(b->widget), "expose-event",
- G_CALLBACK(exposeButt), b);
- wlibAddHelpString(butt, helpStr);
- }
-
- if (valueP) {
- wToggleSetValue(b, *valueP);
- }
-
- if ((option & BC_NOBORDER)==0) {
- b->repaintProc = choiceRepaint;
- b->w += 2;
- b->h += 2;
- }
-
- gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
- wlibControlGetSize((wControl_p)b);
-
- if (labelStr) {
- b->labelW = wlibAddLabel((wControl_p)b, labelStr);
- }
-
- gtk_widget_show(b->widget);
- wlibAddButton((wControl_p)b);
- return b;
+ wChoice_p b;
+ const char * const * label;
+
+ if ((option & BC_NOBORDER)==0) {
+ if (x>=0) {
+ x++;
+ } else {
+ x--;
+ }
+
+ if (y>=0) {
+ y++;
+ } else {
+ y--;
+ }
+ }
+
+ b = wlibAlloc(parent, B_TOGGLE, x, y, labelStr, sizeof *b, data);
+ b->option = option;
+ b->action = action;
+ wlibComputePos((wControl_p)b);
+
+ ((wControl_p)b)->outline = FALSE;
+
+ if (option&BC_HORZ) {
+ b->widget = gtk_hbox_new(FALSE, 0);
+ } else {
+ b->widget = gtk_vbox_new(FALSE, 0);
+ }
+
+ if (b->widget == 0) {
+ abort();
+ }
+
+ for (label=labels; *label; label++) {
+ GtkWidget *butt;
+
+ butt = gtk_check_button_new_with_label(_(*label));
+ gtk_box_pack_start(GTK_BOX(b->widget), butt, TRUE, TRUE, 0);
+ gtk_widget_show(butt);
+ g_signal_connect(GTK_OBJECT(butt), "toggled",
+ G_CALLBACK(pushChoice), b);
+ g_signal_connect_after(GTK_OBJECT(b->widget), "expose-event",
+ G_CALLBACK(exposeButt), b);
+ wlibAddHelpString(butt, helpStr);
+ }
+
+ if (valueP) {
+ wToggleSetValue(b, *valueP);
+ }
+
+ if ((option & BC_NOBORDER)==0) {
+ b->repaintProc = choiceRepaint;
+ b->w += 2;
+ b->h += 2;
+ }
+
+ gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
+ wlibControlGetSize((wControl_p)b);
+
+ if (labelStr) {
+ b->labelW = wlibAddLabel((wControl_p)b, labelStr);
+ }
+
+ gtk_widget_show(b->widget);
+ wlibAddButton((wControl_p)b);
+ return b;
}
diff --git a/app/wlib/gtklib/color.c b/app/wlib/gtklib/color.c
index e1689d2..d193872 100644
--- a/app/wlib/gtklib/color.c
+++ b/app/wlib/gtklib/color.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <assert.h>
#include <stdlib.h>
@@ -45,62 +45,62 @@ wDrawColor wDrawColorBlack;
static GArray *colorMap_garray = NULL; // Change to use glib array
static colorMap_t colorMap[] = {
- { 255, 255, 255 }, /* White */
- { 0, 0, 0 }, /* Black */
- { 255, 0, 0 }, /* Red */
- { 0, 255, 0 }, /* Green */
- { 0, 0, 255 }, /* Blue */
- { 255, 255, 0 }, /* Yellow */
- { 255, 0, 255 }, /* Purple */
- { 0, 255, 255 }, /* Aqua */
- { 128, 0, 0 }, /* Dk. Red */
- { 0, 128, 0 }, /* Dk. Green */
- { 0, 0, 128 }, /* Dk. Blue */
- { 128, 128, 0 }, /* Dk. Yellow */
- { 128, 0, 128 }, /* Dk. Purple */
- { 0, 128, 128 }, /* Dk. Aqua */
- { 65, 105, 225 }, /* Royal Blue */
- { 0, 191, 255 }, /* DeepSkyBlue */
- { 125, 206, 250 }, /* LightSkyBlue */
- { 70, 130, 180 }, /* Steel Blue */
- { 176, 224, 230 }, /* Powder Blue */
- { 127, 255, 212 }, /* Aquamarine */
- { 46, 139, 87 }, /* SeaGreen */
- { 152, 251, 152 }, /* PaleGreen */
- { 124, 252, 0 }, /* LawnGreen */
- { 50, 205, 50 }, /* LimeGreen */
- { 34, 139, 34 }, /* ForestGreen */
- { 255, 215, 0 }, /* Gold */
- { 188, 143, 143 }, /* RosyBrown */
- { 139, 69, 19 }, /* SaddleBrown */
- { 245, 245, 220 }, /* Beige */
- { 210, 180, 140 }, /* Tan */
- { 210, 105, 30 }, /* Chocolate */
- { 165, 42, 42 }, /* Brown */
- { 255, 165, 0 }, /* Orange */
- { 255, 127, 80 }, /* Coral */
- { 255, 99, 71 }, /* Tomato */
- { 255, 105, 180 }, /* HotPink */
- { 255, 192, 203 }, /* Pink */
- { 176, 48, 96 }, /* Maroon */
- { 238, 130, 238 }, /* Violet */
- { 160, 32, 240 }, /* Purple */
- { 16, 16, 16 }, /* Gray */
- { 32, 32, 32 }, /* Gray */
- { 48, 48, 48 }, /* Gray */
- { 64, 64, 64 }, /* Gray */
- { 80, 80, 80 }, /* Gray */
- { 96, 96, 96 }, /* Gray */
- { 112, 112, 122 }, /* Gray */
- { 128, 128, 128 }, /* Gray */
- { 144, 144, 144 }, /* Gray */
- { 160, 160, 160 }, /* Gray */
- { 176, 176, 176 }, /* Gray */
- { 192, 192, 192 }, /* Gray */
- { 208, 208, 208 }, /* Gray */
- { 224, 224, 224 }, /* Gray */
- { 240, 240, 240 }, /* Gray */
- { 255, 255, 255 } /* WhitePixel */
+ { 255, 255, 255 }, /* White */
+ { 0, 0, 0 }, /* Black */
+ { 255, 0, 0 }, /* Red */
+ { 0, 255, 0 }, /* Green */
+ { 0, 0, 255 }, /* Blue */
+ { 255, 255, 0 }, /* Yellow */
+ { 255, 0, 255 }, /* Purple */
+ { 0, 255, 255 }, /* Aqua */
+ { 128, 0, 0 }, /* Dk. Red */
+ { 0, 128, 0 }, /* Dk. Green */
+ { 0, 0, 128 }, /* Dk. Blue */
+ { 128, 128, 0 }, /* Dk. Yellow */
+ { 128, 0, 128 }, /* Dk. Purple */
+ { 0, 128, 128 }, /* Dk. Aqua */
+ { 65, 105, 225 }, /* Royal Blue */
+ { 0, 191, 255 }, /* DeepSkyBlue */
+ { 125, 206, 250 }, /* LightSkyBlue */
+ { 70, 130, 180 }, /* Steel Blue */
+ { 176, 224, 230 }, /* Powder Blue */
+ { 127, 255, 212 }, /* Aquamarine */
+ { 46, 139, 87 }, /* SeaGreen */
+ { 152, 251, 152 }, /* PaleGreen */
+ { 124, 252, 0 }, /* LawnGreen */
+ { 50, 205, 50 }, /* LimeGreen */
+ { 34, 139, 34 }, /* ForestGreen */
+ { 255, 215, 0 }, /* Gold */
+ { 188, 143, 143 }, /* RosyBrown */
+ { 139, 69, 19 }, /* SaddleBrown */
+ { 245, 245, 220 }, /* Beige */
+ { 210, 180, 140 }, /* Tan */
+ { 210, 105, 30 }, /* Chocolate */
+ { 165, 42, 42 }, /* Brown */
+ { 255, 165, 0 }, /* Orange */
+ { 255, 127, 80 }, /* Coral */
+ { 255, 99, 71 }, /* Tomato */
+ { 255, 105, 180 }, /* HotPink */
+ { 255, 192, 203 }, /* Pink */
+ { 176, 48, 96 }, /* Maroon */
+ { 238, 130, 238 }, /* Violet */
+ { 160, 32, 240 }, /* Purple */
+ { 16, 16, 16 }, /* Gray */
+ { 32, 32, 32 }, /* Gray */
+ { 48, 48, 48 }, /* Gray */
+ { 64, 64, 64 }, /* Gray */
+ { 80, 80, 80 }, /* Gray */
+ { 96, 96, 96 }, /* Gray */
+ { 112, 112, 122 }, /* Gray */
+ { 128, 128, 128 }, /* Gray */
+ { 144, 144, 144 }, /* Gray */
+ { 160, 160, 160 }, /* Gray */
+ { 176, 176, 176 }, /* Gray */
+ { 192, 192, 192 }, /* Gray */
+ { 208, 208, 208 }, /* Gray */
+ { 224, 224, 224 }, /* Gray */
+ { 240, 240, 240 }, /* Gray */
+ { 255, 255, 255 } /* WhitePixel */
};
#define NUM_GRAYS (16)
@@ -117,21 +117,21 @@ static char lastColorChar = '!';
*/
wDrawColor wDrawColorGray(
- int percent)
+ int percent)
{
- int n;
- long rgb;
- n = (percent * (NUM_GRAYS+1)) / 100;
-
- if (n <= 0) {
- return wDrawColorBlack;
- } else if (n >= NUM_GRAYS) {
- return wDrawColorWhite;
- } else {
- n = (n*256)/NUM_GRAYS;
- rgb = RGB(n, n, n);
- return wDrawFindColor(rgb);
- }
+ int n;
+ long rgb;
+ n = (percent * (NUM_GRAYS+1)) / 100;
+
+ if (n <= 0) {
+ return wDrawColorBlack;
+ } else if (n >= NUM_GRAYS) {
+ return wDrawColorWhite;
+ } else {
+ n = (n*256)/NUM_GRAYS;
+ rgb = RGB(n, n, n);
+ return wDrawFindColor(rgb);
+ }
}
/**
@@ -142,12 +142,12 @@ wDrawColor wDrawColorGray(
void wlibGetColorMap(void)
{
- if (gtkColorMap) {
- return;
- }
+ if (gtkColorMap) {
+ return;
+ }
- gtkColorMap = gtk_widget_get_colormap(gtkMainW->widget);
- return;
+ gtkColorMap = gtk_widget_get_colormap(gtkMainW->widget);
+ return;
}
/**
@@ -160,21 +160,21 @@ void wlibGetColorMap(void)
static void init_colorMapValue(colorMap_t * t)
{
- t->rgb = RGB(t->red, t->green, t->blue);
- t->normalColor.red = t->red*65535/255;
- t->normalColor.green = t->green*65535/255;
- t->normalColor.blue = t->blue*65535/255;
- gdk_colormap_alloc_color(gtkColorMap, &t->normalColor, FALSE, TRUE);
- t->invertColor = t->normalColor;
- t->invertColor.pixel ^= g_array_index(colorMap_garray, colorMap_t,
- wDrawColorWhite).normalColor.pixel;
- t->colorChar = lastColorChar++;
-
- if (lastColorChar >= 0x7F) {
- lastColorChar = '!'+1;
- } else if (lastColorChar == '"') {
- lastColorChar++;
- }
+ t->rgb = RGB(t->red, t->green, t->blue);
+ t->normalColor.red = t->red*65535/255;
+ t->normalColor.green = t->green*65535/255;
+ t->normalColor.blue = t->blue*65535/255;
+ gdk_colormap_alloc_color(gtkColorMap, &t->normalColor, FALSE, TRUE);
+ t->invertColor = t->normalColor;
+ t->invertColor.pixel ^= g_array_index(colorMap_garray, colorMap_t,
+ wDrawColorWhite).normalColor.pixel;
+ t->colorChar = lastColorChar++;
+
+ if (lastColorChar >= 0x7F) {
+ lastColorChar = '!'+1;
+ } else if (lastColorChar == '"') {
+ lastColorChar++;
+ }
}
/**
@@ -185,15 +185,15 @@ static void init_colorMapValue(colorMap_t * t)
static void init_colorMap(void)
{
- int gint;
- colorMap_garray = g_array_sized_new(TRUE, TRUE, sizeof(colorMap_t),
- sizeof(colorMap)/sizeof(colorMap_t));
- g_array_append_vals(colorMap_garray, &colorMap,
- sizeof(colorMap)/sizeof(colorMap_t));
-
- for (gint=0; gint<colorMap_garray->len; gint++) {
- init_colorMapValue(&g_array_index(colorMap_garray, colorMap_t, gint));
- }
+ int gint;
+ colorMap_garray = g_array_sized_new(TRUE, TRUE, sizeof(colorMap_t),
+ sizeof(colorMap)/sizeof(colorMap_t));
+ g_array_append_vals(colorMap_garray, &colorMap,
+ sizeof(colorMap)/sizeof(colorMap_t));
+
+ for (gint=0; gint<colorMap_garray->len; gint++) {
+ init_colorMapValue(&g_array_index(colorMap_garray, colorMap_t, gint));
+ }
}
/**
@@ -206,57 +206,57 @@ static void init_colorMap(void)
*/
wDrawColor wDrawFindColor(
- long rgb0)
+ long rgb0)
{
- wDrawColor cc;
- int r0, g0, b0, r1, g1, b1;
- int d0;
- int i;
- colorMap_t tempMapValue;
- wlibGetColorMap();
- cc = wDrawColorBlack;
- r0 = (int)(rgb0>>16)&0xFF;
- g0 = (int)(rgb0>>8)&0xFF;
- b0 = (int)(rgb0)&0xFF;
- d0 = 256*3;
-
- // Initialize garray if needed
- if (colorMap_garray == NULL) {
- init_colorMap();
- }
-
- // Iterate over entire garray
- for (i=0; i<colorMap_garray->len; i++) {
- int d1;
- colorMap_t * cm_p;
-
- cm_p = &g_array_index(colorMap_garray, colorMap_t, i);
- r1 = (int)cm_p->red;
- g1 = (int)cm_p->green;
- b1 = (int)cm_p->blue;
- d1 = abs(r0-r1) + abs(g0-g1) + abs(b0-b1);
-
- if (d1 == 0) {
- return i;
- }
-
- if (d1 < d0) {
- d0 = d1;
- cc = i;
- }
- }
-
- if (d0 <= MAX_COLOR_DISTANCE) {
- return cc;
- }
-
- // No good value - so add one
- tempMapValue.red = r0;
- tempMapValue.green = g0;
- tempMapValue.blue = b0;
- init_colorMapValue(&tempMapValue);
- g_array_append_val(colorMap_garray,tempMapValue);
- return i;
+ wDrawColor cc;
+ int r0, g0, b0, r1, g1, b1;
+ int d0;
+ int i;
+ colorMap_t tempMapValue;
+ wlibGetColorMap();
+ cc = wDrawColorBlack;
+ r0 = (int)(rgb0>>16)&0xFF;
+ g0 = (int)(rgb0>>8)&0xFF;
+ b0 = (int)(rgb0)&0xFF;
+ d0 = 256*3;
+
+ // Initialize garray if needed
+ if (colorMap_garray == NULL) {
+ init_colorMap();
+ }
+
+ // Iterate over entire garray
+ for (i=0; i<colorMap_garray->len; i++) {
+ int d1;
+ colorMap_t * cm_p;
+
+ cm_p = &g_array_index(colorMap_garray, colorMap_t, i);
+ r1 = (int)cm_p->red;
+ g1 = (int)cm_p->green;
+ b1 = (int)cm_p->blue;
+ d1 = abs(r0-r1) + abs(g0-g1) + abs(b0-b1);
+
+ if (d1 == 0) {
+ return i;
+ }
+
+ if (d1 < d0) {
+ d0 = d1;
+ cc = i;
+ }
+ }
+
+ if (d0 <= MAX_COLOR_DISTANCE) {
+ return cc;
+ }
+
+ // No good value - so add one
+ tempMapValue.red = r0;
+ tempMapValue.green = g0;
+ tempMapValue.blue = b0;
+ init_colorMapValue(&tempMapValue);
+ g_array_append_val(colorMap_garray,tempMapValue);
+ return i;
}
/**
@@ -267,21 +267,21 @@ wDrawColor wDrawFindColor(
*/
long wDrawGetRGB(
- wDrawColor color)
+ wDrawColor color)
{
- colorMap_t * colorMap_e;
- wlibGetColorMap();
+ colorMap_t * colorMap_e;
+ wlibGetColorMap();
- if (colorMap_garray == NULL) {
- init_colorMap();
- }
+ if (colorMap_garray == NULL) {
+ init_colorMap();
+ }
- if (color < 0 || color > colorMap_garray->len) {
- abort();
- }
+ if (color < 0 || color > colorMap_garray->len) {
+ abort();
+ }
- colorMap_e = &g_array_index(colorMap_garray, colorMap_t, color);
- return colorMap_e->rgb;
+ colorMap_e = &g_array_index(colorMap_garray, colorMap_t, color);
+ return colorMap_e->rgb;
}
/**
@@ -293,27 +293,27 @@ long wDrawGetRGB(
*/
GdkColor* wlibGetColor(
- wDrawColor color,
- wBool_t normal)
+ wDrawColor color,
+ wBool_t normal)
{
- colorMap_t * colorMap_e;
- wlibGetColorMap();
+ colorMap_t * colorMap_e;
+ wlibGetColorMap();
- if (colorMap_garray == NULL) {
- init_colorMap();
- }
+ if (colorMap_garray == NULL) {
+ init_colorMap();
+ }
- if (color < 0 || color > colorMap_garray->len) {
- abort();
- }
+ if (color < 0 || color > colorMap_garray->len) {
+ abort();
+ }
- colorMap_e = &g_array_index(colorMap_garray, colorMap_t, color);
+ colorMap_e = &g_array_index(colorMap_garray, colorMap_t, color);
- if (normal) {
- return &colorMap_e->normalColor;
- } else {
- return &colorMap_e->invertColor;
- }
+ if (normal) {
+ return &colorMap_e->normalColor;
+ } else {
+ return &colorMap_e->invertColor;
+ }
}
@@ -326,12 +326,12 @@ GdkColor* wlibGetColor(
*/
typedef struct {
- wDrawColor * valueP;
- const char * labelStr;
- wColorSelectButtonCallBack_p action;
- void * data;
- wDrawColor color;
- wButton_p button;
+ wDrawColor * valueP;
+ const char * labelStr;
+ wColorSelectButtonCallBack_p action;
+ void * data;
+ wDrawColor color;
+ wButton_p button;
} colorData_t;
/**
@@ -344,23 +344,23 @@ typedef struct {
static void
colorChange(GtkColorButton *widget, gpointer user_data)
{
- colorData_t *cd = user_data;
- GdkColor newcolor;
- long rgb;
+ colorData_t *cd = user_data;
+ GdkColor newcolor;
+ long rgb;
- gtk_color_button_get_color(widget, &newcolor);
+ gtk_color_button_get_color(widget, &newcolor);
- rgb = RGB((int)(newcolor.red/256), (int)(newcolor.green/256),
- (int)(newcolor.blue/256));
- cd->color = wDrawFindColor(rgb);
+ rgb = RGB((int)(newcolor.red/256), (int)(newcolor.green/256),
+ (int)(newcolor.blue/256));
+ cd->color = wDrawFindColor(rgb);
- if (cd->valueP) {
- *(cd->valueP) = cd->color;
- }
+ if (cd->valueP) {
+ *(cd->valueP) = cd->color;
+ }
- if (cd->action) {
- cd->action(cd->data, cd->color);
- }
+ if (cd->action) {
+ cd->action(cd->data, cd->color);
+ }
}
/**
@@ -372,14 +372,14 @@ colorChange(GtkColorButton *widget, gpointer user_data)
*/
void wColorSelectButtonSetColor(
- wButton_p bb,
- wDrawColor color)
+ wButton_p bb,
+ wDrawColor color)
{
- GdkColor *colorOfButton = wlibGetColor(color, TRUE);
+ GdkColor *colorOfButton = wlibGetColor(color, TRUE);
- gtk_color_button_set_color(GTK_COLOR_BUTTON(bb->widget),
- colorOfButton);
- ((colorData_t*)((wControl_p)bb)->data)->color = color;
+ gtk_color_button_set_color(GTK_COLOR_BUTTON(bb->widget),
+ colorOfButton);
+ ((colorData_t*)((wControl_p)bb)->data)->color = color;
}
@@ -391,9 +391,9 @@ void wColorSelectButtonSetColor(
*/
wDrawColor wColorSelectButtonGetColor(
- wButton_p bb)
+ wButton_p bb)
{
- return ((colorData_t*)((wControl_p)bb)->data)->color;
+ return ((colorData_t*)((wControl_p)bb)->data)->color;
}
/**
@@ -413,57 +413,57 @@ wDrawColor wColorSelectButtonGetColor(
*/
wButton_p wColorSelectButtonCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- const char * labelStr,
- long option,
- wPos_t width,
- wDrawColor *valueP,
- wColorSelectButtonCallBack_p action,
- void * data)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ wWinPix_t width,
+ wDrawColor *valueP,
+ wColorSelectButtonCallBack_p action,
+ void * data)
{
- wButton_p b;
- colorData_t * cd;
- cd = malloc(sizeof(colorData_t));
- cd->valueP = valueP;
- cd->action = action;
- cd->data = data;
- cd->labelStr = labelStr;
- cd->color = (valueP?*valueP:0);
-
- b = wlibAlloc(parent, B_BUTTON, x, y, labelStr, sizeof *b, cd);
- b->option = option;
- wlibComputePos((wControl_p)b);
-
- b->widget = gtk_color_button_new();
- GtkStyle *style;
- style = gtk_widget_get_style(b->widget);
- style->xthickness = 1;
- style->ythickness = 1;
- gtk_widget_set_style(b->widget, style);
- gtk_widget_set_size_request(GTK_WIDGET(b->widget), 22, 22);
- g_signal_connect(GTK_OBJECT(b->widget), "color-set",
- G_CALLBACK(colorChange), cd);
-
- gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
-
- if (option & BB_DEFAULT) {
- gtk_widget_set_can_default(b->widget, GTK_CAN_DEFAULT);
- gtk_widget_grab_default(b->widget);
- gtk_window_set_default(GTK_WINDOW(parent->gtkwin), b->widget);
- }
-
- wlibControlGetSize((wControl_p)b);
-
- gtk_widget_show(b->widget);
- wlibAddButton((wControl_p)b);
- wlibAddHelpString(b->widget, helpStr);
- wColorSelectButtonSetColor(b, (valueP?*valueP:0));
-
- if (labelStr) {
- ((wControl_p)b)->labelW = wlibAddLabel((wControl_p)b, labelStr);
- }
- return b;
+ wButton_p b;
+ colorData_t * cd;
+ cd = malloc(sizeof(colorData_t));
+ cd->valueP = valueP;
+ cd->action = action;
+ cd->data = data;
+ cd->labelStr = labelStr;
+ cd->color = (valueP?*valueP:0);
+
+ b = wlibAlloc(parent, B_BUTTON, x, y, labelStr, sizeof *b, cd);
+ b->option = option;
+ wlibComputePos((wControl_p)b);
+
+ b->widget = gtk_color_button_new();
+ GtkStyle *style;
+ style = gtk_widget_get_style(b->widget);
+ style->xthickness = 1;
+ style->ythickness = 1;
+ gtk_widget_set_style(b->widget, style);
+ gtk_widget_set_size_request(GTK_WIDGET(b->widget), 22, 22);
+ g_signal_connect(GTK_OBJECT(b->widget), "color-set",
+ G_CALLBACK(colorChange), cd);
+
+ gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
+
+ if (option & BB_DEFAULT) {
+ gtk_widget_set_can_default(b->widget, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default(b->widget);
+ gtk_window_set_default(GTK_WINDOW(parent->gtkwin), b->widget);
+ }
+
+ wlibControlGetSize((wControl_p)b);
+
+ gtk_widget_show(b->widget);
+ wlibAddButton((wControl_p)b);
+ wlibAddHelpString(b->widget, helpStr);
+ wColorSelectButtonSetColor(b, (valueP?*valueP:0));
+
+ if (labelStr) {
+ ((wControl_p)b)->labelW = wlibAddLabel((wControl_p)b, labelStr);
+ }
+ return b;
}
diff --git a/app/wlib/gtklib/control.c b/app/wlib/gtklib/control.c
index 07d9210..d43d2b6 100644
--- a/app/wlib/gtklib/control.c
+++ b/app/wlib/gtklib/control.c
@@ -1,7 +1,7 @@
/** \file control.c
* Control Utilities
*/
-/*
+/*
* Copyright 2016 Martin Fischer <m_fischer@sf.net>
*
* This program is free software; you can redistribute it and/or modify
@@ -46,31 +46,31 @@
*/
void wControlShow(
- wControl_p b,
- wBool_t show)
+ wControl_p b,
+ wBool_t show)
{
- if (b->type == B_LINES) {
- wlibLineShow((wLine_p)b, show);
- return;
- }
-
- if (b->widget == NULL) {
- abort();
- }
-
- if (show) {
- gtk_widget_show(b->widget);
-
- if (b->label) {
- gtk_widget_show(b->label);
- }
- } else {
- gtk_widget_hide(b->widget);
-
- if (b->label) {
- gtk_widget_hide(b->label);
- }
- }
+ if (b->type == B_LINES) {
+ wlibLineShow((wLine_p)b, show);
+ return;
+ }
+
+ if (b->widget == NULL) {
+ abort();
+ }
+
+ if (show) {
+ gtk_widget_show(b->widget);
+
+ if (b->label) {
+ gtk_widget_show(b->label);
+ }
+ } else {
+ gtk_widget_hide(b->widget);
+
+ if (b->label) {
+ gtk_widget_hide(b->label);
+ }
+ }
}
/**
@@ -82,14 +82,24 @@ void wControlShow(
*/
void wControlActive(
- wControl_p b,
- int active)
+ wControl_p b,
+ int active)
{
- if (b->widget == NULL) {
- abort();
- }
+ if (b->widget == NULL) {
+ abort();
+ }
+
+ if (b->type == B_LIST || b->type == B_DROPLIST ) {
+
+ gtk_widget_set_sensitive(gtk_bin_get_child(GTK_BIN(b->widget)), active);
+ gtk_combo_box_set_button_sensitivity(GTK_COMBO_BOX(b->widget),
+ active?GTK_SENSITIVITY_ON:GTK_SENSITIVITY_OFF);
- gtk_widget_set_sensitive(GTK_WIDGET(b->widget), active);
+ } else {
+
+ gtk_widget_set_sensitive(GTK_WIDGET(b->widget), active);
+
+ }
}
/**
@@ -102,17 +112,17 @@ void wControlActive(
* \returns width of label including some space
*/
-wPos_t wLabelWidth(
- const char * label)
+wWinPix_t wLabelWidth(
+ const char * label)
{
- GtkWidget * widget;
- GtkRequisition requisition;
- widget = gtk_label_new(wlibConvertInput(label));
- gtk_widget_size_request(widget, &requisition);
- g_object_ref_sink (widget);
- gtk_widget_destroy(widget);
- g_object_unref(widget);
- return requisition.width+8;
+ GtkWidget * widget;
+ GtkRequisition requisition;
+ widget = gtk_label_new(wlibConvertInput(label));
+ gtk_widget_size_request(widget, &requisition);
+ g_object_ref_sink (widget);
+ gtk_widget_destroy(widget);
+ g_object_unref(widget);
+ return requisition.width+8;
}
/**
@@ -122,10 +132,10 @@ wPos_t wLabelWidth(
* \returns width
*/
-wPos_t wControlGetWidth(
- wControl_p b)
+wWinPix_t wControlGetWidth(
+ wControl_p b)
{
- return b->w;
+ return b->w;
}
/**
@@ -135,10 +145,10 @@ wPos_t wControlGetWidth(
* \returns height
*/
-wPos_t wControlGetHeight(
- wControl_p b)
+wWinPix_t wControlGetHeight(
+ wControl_p b)
{
- return b->h;
+ return b->h;
}
/**
@@ -148,10 +158,10 @@ wPos_t wControlGetHeight(
* \returns position
*/
-wPos_t wControlGetPosX(
- wControl_p b) /* Control */
+wWinPix_t wControlGetPosX(
+ wControl_p b) /* Control */
{
- return b->realX;
+ return b->realX;
}
/**
@@ -161,10 +171,11 @@ wPos_t wControlGetPosX(
* \returns position
*/
-wPos_t wControlGetPosY(
- wControl_p b) /* Control */
+wWinPix_t wControlGetPosY(
+ wControl_p b) /* Control */
{
- return b->realY - BORDERSIZE - ((b->parent->option&F_MENUBAR)?b->parent->menu_height:0);
+ return b->realY - BORDERSIZE - ((b->parent->option&F_MENUBAR)
+ ?b->parent->menu_height:0);
}
/**
@@ -176,27 +187,29 @@ wPos_t wControlGetPosY(
*/
void wControlSetPos(
- wControl_p b,
- wPos_t x,
- wPos_t y)
+ wControl_p b,
+ wWinPix_t x,
+ wWinPix_t y)
{
- b->realX = x;
- b->realY = y + BORDERSIZE + ((b->parent->option&F_MENUBAR)?b->parent->menu_height:0);
-
- if (b->widget) {
- gtk_fixed_move(GTK_FIXED(b->parent->widget), b->widget, b->realX, b->realY);
- }
-
- if (b->label) {
- GtkRequisition requisition, reqwidget;
- gtk_widget_size_request(b->label, &requisition);
- if (b->widget)
- gtk_widget_size_request(b->widget, &reqwidget);
- else
- reqwidget.height = requisition.height;
- gtk_fixed_move(GTK_FIXED(b->parent->widget), b->label, b->realX-b->labelW,
- b->realY+(reqwidget.height/2 - requisition.height/2));
- }
+ b->realX = x;
+ b->realY = y + BORDERSIZE + ((b->parent->option&F_MENUBAR)
+ ?b->parent->menu_height:0);
+
+ if (b->widget) {
+ gtk_fixed_move(GTK_FIXED(b->parent->widget), b->widget, b->realX, b->realY);
+ }
+
+ if (b->label) {
+ GtkRequisition requisition, reqwidget;
+ gtk_widget_size_request(b->label, &requisition);
+ if (b->widget) {
+ gtk_widget_size_request(b->widget, &reqwidget);
+ } else {
+ reqwidget.height = requisition.height;
+ }
+ gtk_fixed_move(GTK_FIXED(b->parent->widget), b->label, b->realX-b->labelW,
+ b->realY+(reqwidget.height/2 - requisition.height/2));
+ }
}
/**
@@ -207,24 +220,25 @@ void wControlSetPos(
*/
void wControlSetLabel(
- wControl_p b,
- const char * labelStr)
+ wControl_p b,
+ const char * labelStr)
{
- GtkRequisition requisition,reqwidget;
-
- if (b->label) {
- gtk_label_set_text(GTK_LABEL(b->label), wlibConvertInput(labelStr));
- gtk_widget_size_request(b->label, &requisition);
- if (b->widget)
- gtk_widget_size_request(b->widget, &reqwidget);
- else
- reqwidget.height = requisition.height;
- b->labelW = requisition.width+8;
- gtk_fixed_move(GTK_FIXED(b->parent->widget), b->label, b->realX-b->labelW,
- b->realY+(reqwidget.height/2 - requisition.height/2));
- } else {
- b->labelW = wlibAddLabel(b, labelStr);
- }
+ GtkRequisition requisition,reqwidget;
+
+ if (b->label) {
+ gtk_label_set_text(GTK_LABEL(b->label), wlibConvertInput(labelStr));
+ gtk_widget_size_request(b->label, &requisition);
+ if (b->widget) {
+ gtk_widget_size_request(b->widget, &reqwidget);
+ } else {
+ reqwidget.height = requisition.height;
+ }
+ b->labelW = requisition.width+8;
+ gtk_fixed_move(GTK_FIXED(b->parent->widget), b->label, b->realX-b->labelW,
+ b->realY+(reqwidget.height/2 - requisition.height/2));
+ } else {
+ b->labelW = wlibAddLabel(b, labelStr);
+ }
}
/**
@@ -235,10 +249,10 @@ void wControlSetLabel(
*/
void wControlSetContext(
- wControl_p b,
- void * context)
+ wControl_p b,
+ void * context)
{
- b->data = context;
+ b->data = context;
}
/**
@@ -248,31 +262,21 @@ void wControlSetContext(
*/
void wControlSetFocus(
- wControl_p b)
+ wControl_p b)
{
}
wBool_t wControlExpose (
- GtkWidget * widget,
- GdkEventExpose * event,
- wControl_p b
- )
+ GtkWidget * widget,
+ GdkEventExpose * event,
+ wControl_p b
+)
{
GdkWindow * win = gtk_widget_get_window(b->widget);
cairo_t * cr = NULL;
if (win) {
cr = gdk_cairo_create(win);
- } else return TRUE;
-
-#ifdef CURSOR_SURFACE
- if (b && b->cursor_surface.surface && b->cursor_surface.show) {
- cairo_set_source_surface(cr,b->cursor_surface.surface,event->area.x, event->area.y);
- cairo_set_operator(cr,CAIRO_OPERATOR_OVER);
- cairo_rectangle(cr,event->area.x, event->area.y,
- event->area.width, event->area.height);
- cairo_fill(cr);
- }
-#endif
+ } else { return TRUE; }
if (b->outline) {
cairo_set_source_rgb(cr, 0.23, 0.37, 0.80);
@@ -281,7 +285,7 @@ wBool_t wControlExpose (
cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
cairo_rectangle(cr,event->area.x+2, event->area.y+2,
- event->area.width-4, event->area.height-4);
+ event->area.width-4, event->area.height-4);
cairo_stroke(cr);
}
@@ -289,7 +293,7 @@ wBool_t wControlExpose (
cairo_destroy(cr);
- return FALSE;
+ return FALSE;
}
/**
@@ -301,26 +305,21 @@ wBool_t wControlExpose (
*
*/
void wControlHilite(
- wControl_p b,
- wBool_t hilite)
+ wControl_p b,
+ wBool_t hilite)
{
- cairo_t *cr;
- int off = GTKCONTROLHILITEWIDTH/2+1;
-
- if (b->widget == NULL) {
- return;
- }
-
- if (! gtk_widget_get_visible(b->widget)) {
- return;
- }
-
- if (! gtk_widget_get_visible(b->parent->widget)) {
- return;
- }
+// cairo_t *cr;
+// int off = GTKCONTROLHILITEWIDTH/2+1;
+ if ( debugWindow >= 1 ) {
+ printf( "wControlHIlite( %s, %d )\n", b->labelStr, hilite );
+ }
- b->outline = hilite;
+ if (b->widget == NULL) {
+ return;
+ }
+ b->outline = hilite;
- if (b->widget)
- gtk_widget_queue_draw(b->widget);
+ if (b->widget) {
+ gtk_widget_queue_draw(b->widget);
+ }
}
diff --git a/app/wlib/gtklib/droplist.c b/app/wlib/gtklib/droplist.c
index 69a2efd..a4abced 100644
--- a/app/wlib/gtklib/droplist.c
+++ b/app/wlib/gtklib/droplist.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -51,30 +51,30 @@
int
wlibDropListAddColumns(GtkWidget *dropList, int columns)
{
- int i;
- int start = 0;
- GtkCellRenderer *cell;
-
- if (gtk_combo_box_get_has_entry(GTK_COMBO_BOX(dropList))) {
- start = 1;
- }
-
- /* Create cell renderer. */
- cell = gtk_cell_renderer_text_new();
-
- for (i = start; i < columns; i++) {
- /* Pack it into the droplist */
- gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(dropList), cell, TRUE);
-
- /* Connect renderer to data source */
- gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(dropList),
- cell,
- "text",
- LISTCOL_TEXT + i,
- NULL);
- }
-
- return (i);
+ int i;
+ int start = 0;
+ GtkCellRenderer *cell;
+
+ if (gtk_combo_box_get_has_entry(GTK_COMBO_BOX(dropList))) {
+ start = 1;
+ }
+
+ /* Create cell renderer. */
+ cell = gtk_cell_renderer_text_new();
+
+ for (i = start; i < columns; i++) {
+ /* Pack it into the droplist */
+ gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(dropList), cell, TRUE);
+
+ /* Connect renderer to data source */
+ gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(dropList),
+ cell,
+ "text",
+ LISTCOL_TEXT + i,
+ NULL);
+ }
+
+ return (i);
}
/**
@@ -86,7 +86,7 @@ wlibDropListAddColumns(GtkWidget *dropList, int columns)
wIndex_t wDropListGetCount(wList_p b)
{
- return (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(b->listStore), NULL));
+ return (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(b->listStore), NULL));
}
/**
@@ -99,7 +99,7 @@ wIndex_t wDropListGetCount(wList_p b)
void
wDropListClear(wList_p b)
{
- wlibListStoreClear(b->listStore);
+ wlibListStoreClear(b->listStore);
}
/**
@@ -111,22 +111,22 @@ wDropListClear(wList_p b)
void *wDropListGetItemContext(wList_p b, wIndex_t inx)
{
- GtkTreeIter iter;
- wListItem_p data = NULL;
-
- if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(b->listStore), &iter, NULL,
- inx)) {
- gtk_tree_model_get(GTK_TREE_MODEL(b->listStore),
- &iter,
- LISTCOL_DATA, (void *)&data,
- -1);
- }
-
- if (data) {
- return (data->itemData);
- } else {
- return (NULL);
- }
+ GtkTreeIter iter;
+ wListItem_p data = NULL;
+
+ if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(b->listStore), &iter, NULL,
+ inx)) {
+ gtk_tree_model_get(GTK_TREE_MODEL(b->listStore),
+ &iter,
+ LISTCOL_DATA, (void *)&data,
+ -1);
+ }
+
+ if (data) {
+ return (data->itemData);
+ } else {
+ return (NULL);
+ }
}
/**
@@ -138,21 +138,21 @@ void *wDropListGetItemContext(wList_p b, wIndex_t inx)
*/
void wDropListAddValue(
- wList_p b,
- char *text,
- wListItem_p data)
+ wList_p b,
+ char *text,
+ wListItem_p data)
{
- GtkTreeIter iter;
+ GtkTreeIter iter;
- assert(b != NULL);
- assert(text != NULL);
+ assert(b != NULL);
+ assert(text != NULL);
- gtk_list_store_append(b->listStore, &iter); // append new row to tree store
+ gtk_list_store_append(b->listStore, &iter); // append new row to tree store
- gtk_list_store_set(b->listStore, &iter,
- LISTCOL_TEXT, text,
- LISTCOL_DATA, (void *)data,
- -1);
+ gtk_list_store_set(b->listStore, &iter,
+ LISTCOL_TEXT, text,
+ LISTCOL_DATA, (void *)data,
+ -1);
}
/**
@@ -162,25 +162,25 @@ void wDropListAddValue(
*/
void wListSetValue(
- wList_p bl,
- const char * val)
+ wList_p bl,
+ const char * val)
{
- assert(bl->listStore!=NULL);
+ assert(bl->listStore!=NULL);
- bl->recursion++;
+ bl->recursion++;
- if (bl->type == B_DROPLIST) {
- bl->editted = TRUE;
- gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(bl->widget))), val);
+ if (bl->type == B_DROPLIST) {
+ bl->editted = TRUE;
+ gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(bl->widget))), val);
- if (bl->action) {
- bl->action(-1, val, 0, bl->data, NULL);
- }
- } else {
- assert(FALSE);
- }
+ if (bl->action) {
+ bl->action(-1, val, 0, bl->data, NULL);
+ }
+ } else {
+ assert(FALSE);
+ }
- bl->recursion--;
+ bl->recursion--;
}
/**
@@ -195,11 +195,11 @@ void wListSetValue(
void wDropListSetIndex(wList_p b, int val)
{
- if ((b->option&BL_NONE)!=0 && val < 0) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(b->widget), -1);
- } else {
- gtk_combo_box_set_active(GTK_COMBO_BOX(b->widget), val);
- }
+ if ((b->option&BL_NONE)!=0 && val < 0) {
+ gtk_combo_box_set_active(GTK_COMBO_BOX(b->widget), -1);
+ } else {
+ gtk_combo_box_set_active(GTK_COMBO_BOX(b->widget), val);
+ }
}
/**
@@ -214,24 +214,24 @@ void wDropListSetIndex(wList_p b, int val)
*/
wBool_t wDropListSetValues(
- wList_p b,
- wIndex_t row,
- const char * labelStr,
- wIcon_p bm,
- void *itemData)
+ wList_p b,
+ wIndex_t row,
+ const char * labelStr,
+ wIcon_p bm,
+ void *itemData)
{
- GtkTreeIter iter;
-
- if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(b->listStore), &iter, NULL,
- row)) {
- gtk_list_store_set(b->listStore,
- &iter,
- LISTCOL_TEXT, labelStr,
- -1);
- return (TRUE);
- } else {
- return (FALSE);
- }
+ GtkTreeIter iter;
+
+ if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(b->listStore), &iter, NULL,
+ row)) {
+ gtk_list_store_set(b->listStore,
+ &iter,
+ LISTCOL_TEXT, labelStr,
+ -1);
+ return (TRUE);
+ } else {
+ return (FALSE);
+ }
}
/**
@@ -245,72 +245,75 @@ wBool_t wDropListSetValues(
*/
static int DropListChanged(
- GtkComboBox * comboBox,
- gpointer data)
+ GtkComboBox * comboBox,
+ gpointer data)
{
- wList_p bl = (wList_p)data;
- GtkTreeIter iter;
-
- wIndex_t inx = 0;
- gchar *string = NULL;
- wListItem_p listItemP = NULL;
-
- if (bl->recursion) {
- return 0;
- }
-
- /* Obtain currently selected item from combo box. */
- if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(comboBox), &iter)) {
- GtkTreeModel *model;
-
- /* Obtain data model from combo box. */
- model = gtk_combo_box_get_model(comboBox);
-
- /* get the selected row */
- string = gtk_tree_model_get_string_from_iter(model,
- &iter);
- inx = atoi(string);
- g_free(string);
- string = NULL;
-
- /* Obtain string from model. */
- gtk_tree_model_get(model, &iter,
- LISTCOL_TEXT, &string,
- LISTCOL_DATA, (void *)&listItemP,
- -1);
- bl->editted = FALSE;
-
- } else {
- /* Nothing selected, user is entering text directly */
- inx = -1;
- GtkEntry * entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(bl->widget)));
- if ( entry == NULL )
- return 0;
- const char * string1 = gtk_entry_get_text(entry);
- if ( string1 == NULL )
- return 0;
- string = g_strdup(string1);
- bl->editted = TRUE;
- }
-
- /* selection changed, store new selections and call back */
- if (bl->last != inx || bl->editted == TRUE) {
-
- bl->last = inx;
-
- if (bl->valueP) {
- *bl->valueP = inx;
- }
-
- /* selection changed -> callback */
- if (string && bl->action) {
- bl->action(inx, string, 1, bl->data, listItemP?listItemP->itemData:NULL);
- }
- }
-
- if ( string )
- g_free(string);
- return 1;
+ wList_p bl = (wList_p)data;
+ GtkTreeIter iter;
+
+ wIndex_t inx = 0;
+ gchar *string = NULL;
+ wListItem_p listItemP = NULL;
+
+ if (bl->recursion) {
+ return 0;
+ }
+
+ /* Obtain currently selected item from combo box. */
+ if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(comboBox), &iter)) {
+ GtkTreeModel *model;
+
+ /* Obtain data model from combo box. */
+ model = gtk_combo_box_get_model(comboBox);
+
+ /* get the selected row */
+ string = gtk_tree_model_get_string_from_iter(model,
+ &iter);
+ inx = atoi(string);
+ g_free(string);
+ string = NULL;
+
+ /* Obtain string from model. */
+ gtk_tree_model_get(model, &iter,
+ LISTCOL_TEXT, &string,
+ LISTCOL_DATA, (void *)&listItemP,
+ -1);
+ bl->editted = FALSE;
+
+ } else {
+ /* Nothing selected, user is entering text directly */
+ inx = -1;
+ GtkEntry * entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(bl->widget)));
+ if ( entry == NULL ) {
+ return 0;
+ }
+ const char * string1 = gtk_entry_get_text(entry);
+ if ( string1 == NULL ) {
+ return 0;
+ }
+ string = g_strdup(string1);
+ bl->editted = TRUE;
+ }
+
+ /* selection changed, store new selections and call back */
+ if (bl->last != inx || bl->editted == TRUE) {
+
+ bl->last = inx;
+
+ if (bl->valueP) {
+ *bl->valueP = inx;
+ }
+
+ /* selection changed -> callback */
+ if (string && bl->action) {
+ bl->action(inx, string, 1, bl->data, listItemP?listItemP->itemData:NULL);
+ }
+ }
+
+ if ( string ) {
+ g_free(string);
+ }
+ return 1;
}
/**
@@ -324,15 +327,15 @@ static int DropListChanged(
GtkWidget *
wlibNewDropList(GtkListStore *ls, int editable)
{
- GtkWidget *widget;
+ GtkWidget *widget;
- if (editable) {
- widget = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(ls));
- } else {
- widget = gtk_combo_box_new_with_model(GTK_TREE_MODEL(ls));
- }
+ if (editable) {
+ widget = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(ls));
+ } else {
+ widget = gtk_combo_box_new_with_model(GTK_TREE_MODEL(ls));
+ }
- return (widget);
+ return (widget);
}
/**
@@ -352,80 +355,80 @@ wlibNewDropList(GtkListStore *ls, int editable)
*/
wList_p wDropListCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- const char * labelStr,
- long option,
- long number,
- wPos_t width,
- long *valueP,
- wListCallBack_p action,
- void *data)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ long number,
+ wWinPix_t width,
+ long *valueP,
+ wListCallBack_p action,
+ void *data)
{
- wList_p b;
+ wList_p b;
- b = (wList_p)wlibAlloc(parent, B_DROPLIST, x, y, labelStr, sizeof *b, data);
- b->option = option;
- b->number = number;
- b->count = 0;
- b->last = -1;
- b->valueP = valueP;
- b->action = action;
- b->listX = b->realX;
- b->colCnt = 0;
- b->colWidths = NULL;
- b->colRightJust = NULL;
- b->editable = ((option & BL_EDITABLE) != 0);
+ b = (wList_p)wlibAlloc(parent, B_DROPLIST, x, y, labelStr, sizeof *b, data);
+ b->option = option;
+ b->number = number;
+ b->count = 0;
+ b->last = -1;
+ b->valueP = valueP;
+ b->action = action;
+ b->listX = b->realX;
+ b->colCnt = 0;
+ b->colWidths = NULL;
+ b->colRightJust = NULL;
+ b->editable = ((option & BL_EDITABLE) != 0);
- assert(width != 0);
+ assert(width != 0);
- wlibComputePos((wControl_p)b);
+ wlibComputePos((wControl_p)b);
- // create tree store for storing the contents
- b->listStore = wlibNewListStore(DROPLIST_TEXTCOLUMNS);
+ // create tree store for storing the contents
+ b->listStore = wlibNewListStore(DROPLIST_TEXTCOLUMNS);
- if (!b->listStore) {
- abort();
- }
+ if (!b->listStore) {
+ abort();
+ }
- // create the droplist
- b->widget = wlibNewDropList(b->listStore,
- option & BL_EDITABLE);
+ // create the droplist
+ b->widget = wlibNewDropList(b->listStore,
+ option & BL_EDITABLE);
- if (b->widget == 0) {
- abort();
- }
- g_object_ref_sink(b->listStore);
- g_object_unref(G_OBJECT(b->listStore));
+ if (b->widget == 0) {
+ abort();
+ }
+ g_object_ref_sink(b->listStore);
+ g_object_unref(G_OBJECT(b->listStore));
- wlibDropListAddColumns(b->widget, DROPLIST_TEXTCOLUMNS);
+ wlibDropListAddColumns(b->widget, DROPLIST_TEXTCOLUMNS);
- gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(b->widget),
- LISTCOL_TEXT);
+ gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(b->widget),
+ LISTCOL_TEXT);
- // combo's style
- gtk_rc_parse_string("style \"my-style\" { GtkComboBox::appears-as-list = 1 } widget \"*.mycombo\" style \"my-style\" ");
- gtk_widget_set_name(b->widget,"mycombo");
+ // combo's style
+ gtk_rc_parse_string("style \"my-style\" { GtkComboBox::appears-as-list = 1 } widget \"*.mycombo\" style \"my-style\" ");
+ gtk_widget_set_name(b->widget,"mycombo");
- g_signal_connect(GTK_OBJECT(b->widget), "changed",
- G_CALLBACK(DropListChanged), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "changed",
+ G_CALLBACK(DropListChanged), b);
- gtk_widget_set_size_request(b->widget, width, -1);
+ gtk_widget_set_size_request(b->widget, width, -1);
- gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
- wlibControlGetSize((wControl_p)b);
+ gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
+ wlibControlGetSize((wControl_p)b);
- if (labelStr) {
- b->labelW = wlibAddLabel((wControl_p)b, labelStr);
- }
+ if (labelStr) {
+ b->labelW = wlibAddLabel((wControl_p)b, labelStr);
+ }
- gtk_widget_show(b->widget);
- wlibAddButton((wControl_p)b);
- wlibAddHelpString(b->widget, helpStr);
+ gtk_widget_show(b->widget);
+ wlibAddButton((wControl_p)b);
+ wlibAddHelpString(b->widget, helpStr);
- return b;
+ return b;
}
diff --git a/app/wlib/gtklib/dynarr.h b/app/wlib/gtklib/dynarr.h
index 2adf115..1eefd62 100644
--- a/app/wlib/gtklib/dynarr.h
+++ b/app/wlib/gtklib/dynarr.h
@@ -14,7 +14,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@@ -22,10 +22,10 @@
#define DYNARR_H_SEEN
typedef struct {
- int cnt;
- int max;
- void * ptr;
- } dynArr_t;
+ int cnt;
+ int max;
+ void * ptr;
+} dynArr_t;
#define DYNARR_APPEND(T,DA,INCR) \
{ if ((DA).cnt >= (DA).max) { \
diff --git a/app/wlib/gtklib/filesel.c b/app/wlib/gtklib/filesel.c
index a1fb7cc..3d4fb85 100644
--- a/app/wlib/gtklib/filesel.c
+++ b/app/wlib/gtklib/filesel.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -41,114 +41,115 @@
#define MAX_ALLOWEDFILTERS 10
struct wFilSel_t {
- GtkWidget * window; /**< file selector handle*/
- wFilSelCallBack_p action; /**< */
- void * data; /**< */
- int pattCount; /**< number of file patterns*/
- wBool_t loadPatternsAdded; /** Already loaded */
- GtkFileFilter *filter[ MAX_ALLOWEDFILTERS ]; /**< array of file patterns */
- wFilSelMode_e mode; /**< used for load or save */
- int opt; /**< see FS_ options */
- const char * title; /**< dialog box title */
- wWin_p parent; /**< parent window */
- char *defaultExtension; /**< to use if no extension specified */
- };
+ GtkWidget * window; /**< file selector handle*/
+ wFilSelCallBack_p action; /**< */
+ void * data; /**< */
+ int pattCount; /**< number of file patterns*/
+ wBool_t loadPatternsAdded; /** Already loaded */
+ GtkFileFilter *filter[ MAX_ALLOWEDFILTERS ]; /**< array of file patterns */
+ wFilSelMode_e mode; /**< used for load or save */
+ int opt; /**< see FS_ options */
+ const char * title; /**< dialog box title */
+ wWin_p parent; /**< parent window */
+ char *defaultExtension; /**< to use if no extension specified */
+};
/**
* Signal handler for 'changed' signal of custom combo box. The filter
* is set accordinng to the file format active in the combo box
- *
- * \param comboBox the combo box
+ *
+ * \param comboBox the combo box
* \param fileSelector data of the file selector
- *
+ *
*/
-static void FileFormatChanged( GtkWidget *comboBox,
- struct wFilSel_t *fileSelector )
+static void FileFormatChanged( GtkWidget *comboBox,
+ struct wFilSel_t *fileSelector )
{
// get active entry
int entry = (int)gtk_combo_box_get_active (GTK_COMBO_BOX(comboBox));
-
+
if( entry>=0 ) {
- g_object_ref(G_OBJECT( (fileSelector->filter)[ entry ]));
- gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(fileSelector->window ),
- (fileSelector->filter)[ entry ]);
+ g_object_ref(G_OBJECT( (fileSelector->filter)[ entry ]));
+ gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(fileSelector->window ),
+ (fileSelector->filter)[ entry ]);
}
}
/**
- * Create a widget containing a combo box for selecting a file format.
+ * Create a widget containing a combo box for selecting a file format.
* From an array of filters, the names are retrieved and used to populate
- * the combo box.
+ * the combo box.
* \param IN dialogBox
* \param patterns IN number of entries for combo
* \param filters IN
* \returns the newly created widget
*/
-
-static GtkWidget *CreateFileformatSelector(struct wFilSel_t *dialogBox,
- int patterns,
- GtkFileFilter **filters)
+
+static GtkWidget *CreateFileformatSelector(struct wFilSel_t *dialogBox,
+ int patterns,
+ GtkFileFilter **filters)
{
GtkWidget *hbox = gtk_hbox_new(FALSE, 12);
GtkWidget *text = gtk_label_new(_("Save format:"));
GtkWidget *combo = gtk_combo_box_text_new ();
- g_signal_connect(G_OBJECT(combo),
- "changed",
- (GCallback)FileFormatChanged,
- dialogBox );
+ g_signal_connect(G_OBJECT(combo),
+ "changed",
+ (GCallback)FileFormatChanged,
+ dialogBox );
gtk_box_pack_start (GTK_BOX(hbox),
- text,
- FALSE,
- FALSE,
- 0);
+ text,
+ FALSE,
+ FALSE,
+ 0);
gtk_box_pack_end (GTK_BOX(hbox),
- combo,
- TRUE,
- TRUE,
- 0);
+ combo,
+ TRUE,
+ TRUE,
+ 0);
for(int i=0; i < patterns; i++ ) {
const char *nameOfFilter = gtk_file_filter_get_name( filters[ i ] );
gtk_combo_box_text_append_text( GTK_COMBO_BOX_TEXT(combo), nameOfFilter );
}
gtk_combo_box_set_active (GTK_COMBO_BOX(combo), 0);
-
+
gtk_widget_show_all(hbox);
-
- return(hbox);
+
+ return(hbox);
}
/**
* Create a new file selector. Only the internal data structures are
- * set up, no dialog is created.
+ * set up, no dialog is created.
*
* \param w IN parent window
* \param mode IN ?
* \param opt IN ?
* \param title IN dialog title
* \param pattList IN list of selection patterns
- * \param action IN callback
+ * \param action IN callback
* \param data IN ?
* \return the newly created file selector structure
*/
-
+
struct wFilSel_t * wFilSelCreate(
- wWin_p w,
- wFilSelMode_e mode,
- int opt,
- const char * title,
- const char * pattList,
- wFilSelCallBack_p action,
- void * data )
+ wWin_p w,
+ wFilSelMode_e mode,
+ int opt,
+ const char * title,
+ const char * pattList,
+ wFilSelCallBack_p action,
+ void * data )
{
struct wFilSel_t *fs;
fs = (struct wFilSel_t*)malloc(sizeof *fs);
- if (!fs)
+ if (!fs) {
return NULL;
+ }
fs->parent = w;
fs->window = 0;
@@ -208,22 +209,24 @@ struct wFilSel_t * wFilSelCreate(
gtk_file_filter_add_pattern (fs->filter[ count ], cp1 );
cp1 = strtok_r(NULL, ";", &filterState );
}
- if (cp1s)
+ if (cp1s) {
free(cp1s);
+ }
}
// the first pattern is considered to match the default extension
if( count == 0 && !(opt&FS_PICTURES)) {
fs->defaultExtension = strdup( cp2 );
int i = 0;
- for (i=0; i<strlen(cp2) && cp2[i] != ' ' && cp2[i] != ';';i++) ;
- if (i<strlen(cp2)) fs->defaultExtension[i] = '\0';
+ for (i=0; i<strlen(cp2) && cp2[i] != ' ' && cp2[i] != ';'; i++) ;
+ if (i<strlen(cp2)) { fs->defaultExtension[i] = '\0'; }
}
fs->pattCount = ++count;
}
cp = strtok_r( NULL, ":", &patternState );
}
- if (cps)
+ if (cps) {
free(cps);
+ }
} else {
@@ -234,13 +237,13 @@ struct wFilSel_t * wFilSelCreate(
}
/**
- * Show and handle the file selection dialog.
+ * Show and handle the file selection dialog.
*
- * \param fs IN file selection
+ * \param fs IN file selection
* \param dirName IN starting directory
* \return always TRUE
*/
-
+
int wFilSelect( struct wFilSel_t * fs, const char * dirName )
{
char name[1024];
@@ -250,67 +253,71 @@ int wFilSelect( struct wFilSel_t * fs, const char * dirName )
GError *err = NULL;
if (fs->window == NULL) {
- fs->window = gtk_file_chooser_dialog_new( fs->title,
- GTK_WINDOW( fs->parent->gtkwin ),
- (fs->mode == FS_LOAD ? GTK_FILE_CHOOSER_ACTION_OPEN : GTK_FILE_CHOOSER_ACTION_SAVE ),
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- (fs->mode == FS_LOAD ? GTK_STOCK_OPEN : GTK_STOCK_SAVE ), GTK_RESPONSE_ACCEPT,
- NULL );
- if (fs->window==0) abort();
+ fs->window = gtk_file_chooser_dialog_new( fs->title,
+ GTK_WINDOW( fs->parent->gtkwin ),
+ (fs->mode == FS_LOAD ? GTK_FILE_CHOOSER_ACTION_OPEN :
+ GTK_FILE_CHOOSER_ACTION_SAVE ),
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ (fs->mode == FS_LOAD ? GTK_STOCK_OPEN : GTK_STOCK_SAVE ), GTK_RESPONSE_ACCEPT,
+ NULL );
+ if (fs->window==0) { abort(); }
if ( fs->mode == FS_SAVE ) {
- // get confirmation before overwritting an existing file
- gtk_file_chooser_set_do_overwrite_confirmation( GTK_FILE_CHOOSER(fs->window), TRUE );
+ // get confirmation before overwritting an existing file
+ gtk_file_chooser_set_do_overwrite_confirmation( GTK_FILE_CHOOSER(fs->window),
+ TRUE );
}
-
+
/** \todo for loading a shortcut folder could be added linking to the example directory */
}
strcpy( name, dirName );
- gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(fs->window), name );
+ gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(fs->window), name );
if( fs->mode == FS_SAVE || fs->mode == FS_UPDATE ) {
- gtk_file_chooser_set_extra_widget( GTK_FILE_CHOOSER(fs->window),
- CreateFileformatSelector(fs, fs->pattCount, fs->filter ));
- }
- // Add a current folder and a shortcut to it for Load/import dialogs
- if( fs->mode == FS_LOAD ) {
- gtk_file_chooser_add_shortcut_folder( GTK_FILE_CHOOSER(fs->window), name, NULL );
+ gtk_file_chooser_set_extra_widget( GTK_FILE_CHOOSER(fs->window),
+ CreateFileformatSelector(fs, fs->pattCount, fs->filter ));
+ }
+ // Add a current folder and a shortcut to it for Load/import dialogs
+ if( fs->mode == FS_LOAD ) {
+ gtk_file_chooser_add_shortcut_folder( GTK_FILE_CHOOSER(fs->window), name,
+ NULL );
// allow selecting multiple files
if( fs->opt & FS_MULTIPLEFILES ) {
gtk_file_chooser_set_select_multiple ( GTK_FILE_CHOOSER(fs->window), TRUE);
- }
+ }
// add the file filters to the dialog box
if( fs->pattCount && !fs->loadPatternsAdded) {
for( i = 0; i < fs->pattCount; i++ ) {
- gtk_file_chooser_add_filter( GTK_FILE_CHOOSER( fs->window ), fs->filter[ i ] );
+ gtk_file_chooser_add_filter( GTK_FILE_CHOOSER( fs->window ), fs->filter[ i ] );
}
fs->loadPatternsAdded = TRUE;
- }
- }
-
- int resp = gtk_dialog_run( GTK_DIALOG( fs->window ));
+ }
+ }
+
+ int resp = gtk_dialog_run( GTK_DIALOG( fs->window ));
if( resp == GTK_RESPONSE_ACCEPT || resp == GTK_RESPONSE_APPLY) {
- char **fileNames;
+ char **fileNames;
GSList *fileNameList;
-
+
fileNameList = gtk_file_chooser_get_uris( GTK_FILE_CHOOSER(fs->window) );
- fileNames = calloc( sizeof(char *), g_slist_length (fileNameList) );
-
+ fileNames = calloc( sizeof(char *), g_slist_length (fileNameList) );
+
for (i=0; i < g_slist_length (fileNameList); i++ ) {
char *namePart;
file = g_filename_from_uri( g_slist_nth_data( fileNameList, i ), &host, &err );
-
+
// check for presence of file extension
// jump behind the last directory delimiter
namePart = strrchr( file, '/' ) + 1;
// is there a dot in the last part, yes->extension present
- if( !strchr( namePart, '.' ) ){
-
+ if( !strchr( namePart, '.' ) ) {
+
// else try to find the current filter and parse its name
- GtkFileFilter *currentFilter = gtk_file_chooser_get_filter (GTK_FILE_CHOOSER(fs->window) );
+ GtkFileFilter *currentFilter = gtk_file_chooser_get_filter (GTK_FILE_CHOOSER(
+ fs->window) );
if (currentFilter) {
const char *nameOfFilter = gtk_file_filter_get_name( currentFilter );
char *pattern = strdup( nameOfFilter );
@@ -324,28 +331,28 @@ int wFilSelect( struct wFilSel_t * fs, const char * dirName )
extension = startDelimiter + 2;
}
}
- file = g_realloc( file, strlen(file)+strlen(extension));
+ file = g_realloc( file, strlen(file)+strlen(extension)+1);
strcat( file, extension );
free( pattern );
}
- }
+ }
fileNames[ i ] = file;
g_free( g_slist_nth_data ( fileNameList, i));
}
-
+
gtk_widget_hide( GTK_WIDGET( fs->window ));
if (fs->action) {
fs->action( g_slist_length(fileNameList), fileNames, fs->data );
}
-
+
for(i=0; i < g_slist_length(fileNameList); i++) {
g_free( fileNames[ i ]);
}
free( fileNames );
- g_slist_free (fileNameList);
+ g_slist_free (fileNameList);
} else {
gtk_widget_hide( GTK_WIDGET( fs->window ));
}
-
+
return 1;
}
diff --git a/app/wlib/gtklib/font.c b/app/wlib/gtklib/font.c
index e2f741b..e89307c 100644
--- a/app/wlib/gtklib/font.c
+++ b/app/wlib/gtklib/font.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
@@ -67,7 +67,7 @@ static GtkWidget *fontSelectionDialog;
int absoluteFontSize = 18;
struct wFont_t {
- PangoFontDescription *fontDescription;
+ PangoFontDescription *fontDescription;
};
static wFont_p standardFonts[F_HELV-F_TIMES+1][2][2];
@@ -85,76 +85,76 @@ static wFont_p curFont = NULL;
static void fontSelectionDialogCallback(GtkFontSelectionDialog
*fontSelectionDialog, gint response, gpointer data)
{
- if (response == GTK_RESPONSE_APPLY || response == GTK_RESPONSE_OK) {
- gchar *fontName;
-
- fontName = gtk_font_selection_dialog_get_font_name(fontSelectionDialog);
- wPrefSetString("font", "name", fontName);
- pango_font_description_free(curFont->fontDescription);
- curFont->fontDescription = pango_font_description_from_string(fontName);
- absoluteFontSize = (pango_font_description_get_size(
- curFont->fontDescription))/PANGO_SCALE;
+ if (response == GTK_RESPONSE_APPLY || response == GTK_RESPONSE_OK) {
+ gchar *fontName;
+
+ fontName = gtk_font_selection_dialog_get_font_name(fontSelectionDialog);
+ wPrefSetString("font", "name", fontName);
+ pango_font_description_free(curFont->fontDescription);
+ curFont->fontDescription = pango_font_description_from_string(fontName);
+ absoluteFontSize = (pango_font_description_get_size(
+ curFont->fontDescription))/PANGO_SCALE;
#if WLIB_FONT_DEBUG >= 2
- fprintf(stderr, "new font selection:\n");
- fprintf(stderr, " font name \"%s\"\n", fontName);
- fprintf(stderr, " font size is %d\n",
- pango_font_description_get_size(curFont->fontDescription)/PANGO_SCALE);
- fprintf(stderr, " font size is absolute %d\n",
- pango_font_description_get_size_is_absolute(curFont->fontDescription));
+ fprintf(stderr, "new font selection:\n");
+ fprintf(stderr, " font name \"%s\"\n", fontName);
+ fprintf(stderr, " font size is %d\n",
+ pango_font_description_get_size(curFont->fontDescription)/PANGO_SCALE);
+ fprintf(stderr, " font size is absolute %d\n",
+ pango_font_description_get_size_is_absolute(curFont->fontDescription));
#endif
- g_free(fontName);
- }
+ g_free(fontName);
+ }
- if (response == GTK_RESPONSE_OK || response == GTK_RESPONSE_CANCEL) {
- gtk_widget_hide(GTK_WIDGET(fontSelectionDialog));
- }
+ if (response == GTK_RESPONSE_OK || response == GTK_RESPONSE_CANCEL) {
+ gtk_widget_hide(GTK_WIDGET(fontSelectionDialog));
+ }
}
static wBool_t fontInitted = FALSE;
static wBool_t fontInit()
{
- const char *fontNames[] = {
- "times 18",
- "times italic 18",
- "times bold 18",
- "times bold italic 18",
- "helvetica 18",
- "helvetica oblique 18",
- "helvetica bold 18",
- "helvetica bold oblique 18",
- };
- int s = 0;
- int i, j, k;
-
- for (i = F_TIMES; i <= F_HELV; ++i) {
- for (j = FW_MEDIUM; j <= FW_BOLD; ++j) {
- for (k = FS_REGULAR; k <= FS_ITALIC; ++k) {
- PangoFontDescription *fontDescription = pango_font_description_from_string(
- fontNames[s++]);
- wFont_p standardFont = (wFont_p) malloc(sizeof(struct wFont_t));
- standardFont->fontDescription = fontDescription;
- standardFonts[i-F_TIMES][j][k] = standardFont;
- }
- }
- }
-
- if (curFont == NULL) {
- curFont = (wFont_p) malloc(sizeof(struct wFont_t));
-
- if (curFont == NULL) {
- return FALSE;
- }
-
- const char *fontName = wPrefGetString("font", "name");
- curFont->fontDescription = pango_font_description_from_string(
- fontName ? fontName : "helvetica 18");
- absoluteFontSize = (int) PANGO_PIXELS(pango_font_description_get_size(
- curFont->fontDescription));
- }
-
- fontInitted = TRUE;
- return TRUE;
+ const char *fontNames[] = {
+ "times 18",
+ "times italic 18",
+ "times bold 18",
+ "times bold italic 18",
+ "helvetica 18",
+ "helvetica oblique 18",
+ "helvetica bold 18",
+ "helvetica bold oblique 18",
+ };
+ int s = 0;
+ int i, j, k;
+
+ for (i = F_TIMES; i <= F_HELV; ++i) {
+ for (j = FW_MEDIUM; j <= FW_BOLD; ++j) {
+ for (k = FS_REGULAR; k <= FS_ITALIC; ++k) {
+ PangoFontDescription *fontDescription = pango_font_description_from_string(
+ fontNames[s++]);
+ wFont_p standardFont = (wFont_p) malloc(sizeof(struct wFont_t));
+ standardFont->fontDescription = fontDescription;
+ standardFonts[i-F_TIMES][j][k] = standardFont;
+ }
+ }
+ }
+
+ if (curFont == NULL) {
+ curFont = (wFont_p) malloc(sizeof(struct wFont_t));
+
+ if (curFont == NULL) {
+ return FALSE;
+ }
+
+ const char *fontName = wPrefGetString("font", "name");
+ curFont->fontDescription = pango_font_description_from_string(
+ fontName ? fontName : "helvetica 18");
+ absoluteFontSize = (int) PANGO_PIXELS(pango_font_description_get_size(
+ curFont->fontDescription));
+ }
+
+ fontInitted = TRUE;
+ return TRUE;
}
@@ -182,62 +182,63 @@ PangoLayout *wlibFontCreatePangoLayout(GtkWidget *widget,
wFont_p fp,
wFontSize_t fs,
const char *s,
- int *width_p,
- int *height_p,
- int *ascent_p,
- int *descent_p,
- int *baseline_p)
+ wDrawPix_t *width_p,
+ wDrawPix_t *height_p,
+ wDrawPix_t *ascent_p,
+ wDrawPix_t *descent_p,
+ wDrawPix_t *baseline_p)
{
- if (!fontInitted) {
- fontInit();
- }
-
- PangoLayout *layout = NULL;
- gchar *utf8 = wlibConvertInput(s);
- /* RPH -- pango_cairo_create_layout() is missing in CentOS 4.8.
- CentOS 4.8 only has GTK 2.4.13 and Pango 1.6.0 and does not have
- libpangocairo at all.
- pango_cairo_create_layout() was introduced with Pango 1.10. */
+ if (!fontInitted) {
+ fontInit();
+ }
+
+ PangoLayout *layout = NULL;
+ gchar *utf8 = wlibConvertInput(s);
+ /* RPH -- pango_cairo_create_layout() is missing in CentOS 4.8.
+ CentOS 4.8 only has GTK 2.4.13 and Pango 1.6.0 and does not have
+ libpangocairo at all.
+ pango_cairo_create_layout() was introduced with Pango 1.10. */
#if PANGO_VERSION_MAJOR >= 1 && PANGO_VERSION_MINOR >= 10
- if (cairo != NULL) {
- layout = pango_cairo_create_layout((cairo_t *) cairo);
- pango_layout_set_text(layout, utf8, -1);
- } else
+ if (cairo != NULL) {
+ layout = pango_cairo_create_layout((cairo_t *) cairo);
+ pango_layout_set_text(layout, utf8, -1);
+ } else
#endif
- layout = gtk_widget_create_pango_layout(widget, utf8);
-
- PangoFontDescription *fontDescription = (fp ? fp : curFont)->fontDescription;
- PangoContext *context;
- PangoFontMetrics *metrics;
- /* set attributes */
- pango_font_description_set_size(fontDescription,
- FONTSIZE_TO_PANGOSIZE(fs) * PANGO_SCALE);
- pango_layout_set_font_description(layout, fontDescription);
- /* get layout measures */
- pango_layout_get_size(layout, width_p, height_p);
- *width_p = *width_p / PANGO_SCALE;
- *height_p = *height_p / PANGO_SCALE;
- context = gtk_widget_create_pango_context(widget);
- metrics = pango_context_get_metrics(context, fontDescription,
- pango_context_get_language(context));
- *baseline_p = pango_layout_get_baseline(layout) / PANGO_SCALE;
- *ascent_p = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE;
- *descent_p = pango_font_metrics_get_descent(metrics) / PANGO_SCALE;
- pango_font_metrics_unref(metrics);
- g_object_unref(context);
+ layout = gtk_widget_create_pango_layout(widget, utf8);
+
+ PangoFontDescription *fontDescription = (fp ? fp : curFont)->fontDescription;
+ PangoContext *context;
+ PangoFontMetrics *metrics;
+ /* set attributes */
+ pango_font_description_set_size(fontDescription,
+ FONTSIZE_TO_PANGOSIZE(fs) * PANGO_SCALE);
+ pango_layout_set_font_description(layout, fontDescription);
+ /* get layout measures */
+ gint width_i, height_i;
+ pango_layout_get_size(layout, &width_i, &height_i);
+ *width_p = width_i / PANGO_SCALE;
+ *height_p = height_i / PANGO_SCALE;
+ context = gtk_widget_create_pango_context(widget);
+ metrics = pango_context_get_metrics(context, fontDescription,
+ pango_context_get_language(context));
+ *baseline_p = pango_layout_get_baseline(layout) / PANGO_SCALE;
+ *ascent_p = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE;
+ *descent_p = pango_font_metrics_get_descent(metrics) / PANGO_SCALE;
+ pango_font_metrics_unref(metrics);
+ g_object_unref(context);
#if WLIB_FONT_DEBUG >= 3
- fprintf(stderr, "font layout created:\n");
- fprintf(stderr, " widget: %p\n", widget);
- //fprintf(stderr, " font description:%p\n", fp);
- fprintf(stderr, " font size: %f\n", fs);
- fprintf(stderr, " layout text: \"%s\" (utf8)\n", utf8);
- fprintf(stderr, " layout width: %d\n", *width_p);
- fprintf(stderr, " layout height: %d\n", *height_p);
- fprintf(stderr, " layout ascent: %d (pixels)\n", *ascent_p);
- fprintf(stderr, " layout descent: %d (pixels)\n", *descent_p);
+ fprintf(stderr, "font layout created:\n");
+ fprintf(stderr, " widget: %p\n", widget);
+ //fprintf(stderr, " font description:%p\n", fp);
+ fprintf(stderr, " font size: %f\n", fs);
+ fprintf(stderr, " layout text: \"%s\" (utf8)\n", utf8);
+ fprintf(stderr, " layout width: %d\n", *width_p);
+ fprintf(stderr, " layout height: %d\n", *height_p);
+ fprintf(stderr, " layout ascent: %d (pixels)\n", *ascent_p);
+ fprintf(stderr, " layout descent: %d (pixels)\n", *descent_p);
#endif
- return layout;
+ return layout;
}
/**
@@ -247,7 +248,7 @@ PangoLayout *wlibFontCreatePangoLayout(GtkWidget *widget,
void wlibFontDestroyPangoLayout(PangoLayout *layout)
{
- g_object_ref_sink(layout);
+ g_object_ref_sink(layout);
g_object_unref(layout);
}
@@ -258,9 +259,9 @@ void wlibFontDestroyPangoLayout(PangoLayout *layout)
void wInitializeFonts()
{
- if (!fontInitted) {
- fontInit();
- }
+ if (!fontInitted) {
+ fontInit();
+ }
}
/**
@@ -271,41 +272,41 @@ void wInitializeFonts()
*/
void wSelectFont(
- const char * title)
+ const char * title)
{
- if (!fontInitted) {
- fontInit();
- }
-
- if (fontSelectionDialog == NULL) {
- fontSelectionDialog = gtk_font_selection_dialog_new(_("Font Select"));
- gtk_window_set_position(GTK_WINDOW(fontSelectionDialog), GTK_WIN_POS_MOUSE);
- gtk_window_set_modal(GTK_WINDOW(fontSelectionDialog), TRUE);
- gtk_font_selection_dialog_set_preview_text(GTK_FONT_SELECTION_DIALOG(
- fontSelectionDialog), sampleText);
- g_signal_connect(G_OBJECT(fontSelectionDialog), "response",
- G_CALLBACK(fontSelectionDialogCallback), NULL);
- g_signal_connect(G_OBJECT(fontSelectionDialog), "destroy",
- G_CALLBACK(gtk_widget_destroyed), &fontSelectionDialog);
- }
-
- gtk_window_set_title(GTK_WINDOW(fontSelectionDialog), title);
-
- if (curFont != NULL) {
- gchar *fontName;
-
- /* the curFont description contains the latest font info
- * which is depended on the current scale
- * overwrite it with the absoluteFontSize */
- pango_font_description_set_size(curFont->fontDescription,
- FONTSIZE_TO_PANGOSIZE(absoluteFontSize) * PANGO_SCALE);
- fontName = pango_font_description_to_string(curFont->fontDescription);
- gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(
- fontSelectionDialog), fontName);
- g_free(fontName);
- }
-
- gtk_widget_show(fontSelectionDialog);
+ if (!fontInitted) {
+ fontInit();
+ }
+
+ if (fontSelectionDialog == NULL) {
+ fontSelectionDialog = gtk_font_selection_dialog_new(_("Font Select"));
+ gtk_window_set_position(GTK_WINDOW(fontSelectionDialog), GTK_WIN_POS_MOUSE);
+ gtk_window_set_modal(GTK_WINDOW(fontSelectionDialog), TRUE);
+ gtk_font_selection_dialog_set_preview_text(GTK_FONT_SELECTION_DIALOG(
+ fontSelectionDialog), sampleText);
+ g_signal_connect(G_OBJECT(fontSelectionDialog), "response",
+ G_CALLBACK(fontSelectionDialogCallback), NULL);
+ g_signal_connect(G_OBJECT(fontSelectionDialog), "destroy",
+ G_CALLBACK(gtk_widget_destroyed), &fontSelectionDialog);
+ }
+
+ gtk_window_set_title(GTK_WINDOW(fontSelectionDialog), title);
+
+ if (curFont != NULL) {
+ gchar *fontName;
+
+ /* the curFont description contains the latest font info
+ * which is depended on the current scale
+ * overwrite it with the absoluteFontSize */
+ pango_font_description_set_size(curFont->fontDescription,
+ FONTSIZE_TO_PANGOSIZE(absoluteFontSize) * PANGO_SCALE);
+ fontName = pango_font_description_to_string(curFont->fontDescription);
+ gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(
+ fontSelectionDialog), fontName);
+ g_free(fontName);
+ }
+
+ gtk_widget_show(fontSelectionDialog);
}
/**
@@ -316,11 +317,11 @@ void wSelectFont(
static wFont_p wlibSelectedFont(void)
{
- if (!fontInitted) {
- fontInit();
- }
+ if (!fontInitted) {
+ fontInit();
+ }
- return curFont;
+ return curFont;
}
/**
@@ -331,16 +332,16 @@ static wFont_p wlibSelectedFont(void)
wFontSize_t wSelectedFontSize(void)
{
- if (!fontInitted) {
- fontInit();
- }
+ if (!fontInitted) {
+ fontInit();
+ }
#if WLIB_FONT_DEBUG >= 3
- fprintf(stderr, "the font size of current font description is: %d\n",
- pango_font_description_get_size(curFont->fontDescription)/PANGO_SCALE);
- fprintf(stderr, "the font size of absoluteFontSize is: %d\n",absoluteFontSize);
+ fprintf(stderr, "the font size of current font description is: %d\n",
+ pango_font_description_get_size(curFont->fontDescription)/PANGO_SCALE);
+ fprintf(stderr, "the font size of absoluteFontSize is: %d\n",absoluteFontSize);
#endif
- return absoluteFontSize;
+ return absoluteFontSize;
}
/**
@@ -352,7 +353,7 @@ wFontSize_t wSelectedFontSize(void)
void wSetSelectedFontSize(wFontSize_t size)
{
- absoluteFontSize = size;
+ absoluteFontSize = size;
}
/**
@@ -367,30 +368,30 @@ void wSetSelectedFontSize(wFontSize_t size)
const char *wlibFontTranslate(wFont_p fp)
{
- static gchar *fontName = NULL;
+ static gchar *fontName = NULL;
- if (fontName != NULL) {
- g_free(fontName);
- }
+ if (fontName != NULL) {
+ g_free(fontName);
+ }
- if (!fontInitted) {
- fontInit();
- }
+ if (!fontInitted) {
+ fontInit();
+ }
- if (fp == NULL) {
- fp = wlibSelectedFont();
- }
+ if (fp == NULL) {
+ fp = wlibSelectedFont();
+ }
- if (fp == NULL) {
- fp = standardFonts[0][FW_MEDIUM][FS_REGULAR];
- }
+ if (fp == NULL) {
+ fp = standardFonts[0][FW_MEDIUM][FS_REGULAR];
+ }
- fontName = pango_font_description_to_string(fp->fontDescription);
+ fontName = pango_font_description_to_string(fp->fontDescription);
#if WLIB_FONT_DEBUG >= 2
- fprintf(stderr, "font translation: ");
- fprintf(stderr, " \"%s\"\n", fontName);
+ fprintf(stderr, "font translation: ");
+ fprintf(stderr, " \"%s\"\n", fontName);
#endif
- return (const char *) fontName;
+ return (const char *) fontName;
}
/**
@@ -401,9 +402,9 @@ const char *wlibFontTranslate(wFont_p fp)
wFont_p wStandardFont(int face, wBool_t bold, wBool_t italic)
{
- if (!fontInitted) {
- fontInit();
- }
+ if (!fontInitted) {
+ fontInit();
+ }
- return standardFonts[face-F_TIMES][bold][italic];
+ return standardFonts[face-F_TIMES][bold][italic];
}
diff --git a/app/wlib/gtklib/gtkdraw-cairo.c b/app/wlib/gtklib/gtkdraw-cairo.c
index 4498a2c..f24bde6 100644
--- a/app/wlib/gtklib/gtkdraw-cairo.c
+++ b/app/wlib/gtklib/gtkdraw-cairo.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -49,40 +49,40 @@ static long drawVerbose = 0;
wBool_t wDrawDoTempDraw = TRUE;
struct wDrawBitMap_t {
- int w;
- int h;
- int x;
- int y;
- const unsigned char * bits;
- GdkPixmap * pixmap;
- GdkBitmap * mask;
- };
+ int w;
+ int h;
+ int x;
+ int y;
+ const unsigned char * bits;
+ GdkPixmap * pixmap;
+ GdkBitmap * mask;
+};
//struct wDraw_t {
- //WOBJ_COMMON
- //void * context;
- //wDrawActionCallBack_p action;
- //wDrawRedrawCallBack_p redraw;
+//WOBJ_COMMON
+//void * context;
+//wDrawActionCallBack_p action;
+//wDrawRedrawCallBack_p redraw;
- //GdkPixmap * pixmap;
- //GdkPixmap * pixmapBackup;
+//GdkPixmap * pixmap;
+//GdkPixmap * pixmapBackup;
- //double dpi;
+//double dpi;
- //GdkGC * gc;
- //wDrawWidth lineWidth;
- //wDrawOpts opts;
- //wPos_t maxW;
- //wPos_t maxH;
- //unsigned long lastColor;
- //wBool_t lastColorInverted;
- //const char * helpStr;
+//GdkGC * gc;
+//wDrawWidth lineWidth;
+//wDrawOpts opts;
+//wWinPix_t maxW;
+//wWinPix_t maxH;
+//unsigned long lastColor;
+//wBool_t lastColorInverted;
+//const char * helpStr;
- //wPos_t lastX;
- //wPos_t lastY;
+//wWinPix_t lastX;
+//wWinPix_t lastY;
- //wBool_t delayUpdate;
- //};
+//wBool_t delayUpdate;
+//};
struct wDraw_t psPrint_d;
@@ -109,95 +109,10 @@ struct wDraw_t psPrint_d;
*
*******************************************************************************/
-static cairo_t* gtkDrawCreateCairoCursorContext(
- wControl_p ct,
- cairo_surface_t * surf,
- wDrawWidth width,
- wDrawLineType_e lineType,
- wDrawColor color,
- wDrawOpts opts )
-{
- cairo_t* cairo;
-
- cairo = cairo_create(surf);
-
- width = width ? abs(width) : 1;
- cairo_set_line_width(cairo, width);
-
- cairo_set_line_cap(cairo, CAIRO_LINE_CAP_BUTT);
- cairo_set_line_join(cairo, CAIRO_LINE_JOIN_MITER);
-
- switch(lineType)
- {
- case wDrawLineSolid:
- {
- cairo_set_dash(cairo, 0, 0, 0);
- break;
- }
- case wDrawLineDash:
- {
- double dashes[] = { 5, 3 };
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0);
- break;
- }
- case wDrawLineDot:
- {
- double dashes[] = { 1, 2 };
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0);
- break;
- }
- case wDrawLineDashDot:
- {
- double dashes[] = { 5, 2, 1, 2 };
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0);
- break;
- }
- case wDrawLineDashDotDot:
- {
- double dashes[] = { 5, 2, 1, 2, 1, 2 };
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0);
- break;
- }
- case wDrawLineCenter:
- {
- double dashes[] = { 8, 3, 5, 3};
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0.0);
- break;
- }
- case wDrawLinePhantom:
- {
- double dashes[] = { 8, 3, 5, 3, 5, 3};
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0.0);
- break;
- }
-
- }
- GdkColor * gcolor;
-
-
- cairo_set_operator(cairo, CAIRO_OPERATOR_SOURCE);
- gcolor = wlibGetColor(color, TRUE);
-
- if (ct->type == B_DRAW) {
- wDraw_p bd = (wDraw_p)ct;
- bd->lastColor = color;
- }
-
- cairo_set_source_rgba(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0, gcolor->blue / 65535.0, 1.0);
-
- return cairo;
-}
-
wBool_t wDrawSetTempMode(
- wDraw_p bd,
- wBool_t bTemp )
+ wDraw_p bd,
+ wBool_t bTemp )
{
wBool_t ret = bd->bTempMode;
bd->bTempMode = bTemp;
@@ -209,102 +124,99 @@ wBool_t wDrawSetTempMode(
}
static cairo_t* gtkDrawCreateCairoContext(
- wDraw_p bd,
- GdkDrawable * win,
- wDrawWidth width,
- wDrawLineType_e lineType,
- wDrawColor color,
- wDrawOpts opts )
+ wDraw_p bd,
+ GdkDrawable * win,
+ wDrawWidth width,
+ wDrawLineType_e lineType,
+ wDrawColor color,
+ wDrawOpts opts )
{
cairo_t* cairo;
- if (win)
+ if (win) {
cairo = gdk_cairo_create(win);
- else {
+ } else {
if (opts & wDrawOptTemp) {
- if ( ! bd->bTempMode )
- printf( "Temp draw in Main Mode. Contact Developers. See %s:%d\n", "gtkdraw-cario.c", __LINE__+1 );
-/* Temp Draw In Main Mode:
- You are seeing this message because there is a wDraw*() call on tempD but you are not in the context of TempRedraw()
- Typically this happens when Cmd<Object>() is processing a C_DOWN or C_MOVE action and it writes directly to tempD
- Instead it sould set some state which allows c_redraw to do the actual drawing
- If you set a break point on the printf you'll see the offending wDraw*() call in the traceback
- It should be sufficient to remove that draw code or move it to C_REDRAW
- This is not fatal but the draw will be ineffective because the next TempRedraw() will erase the temp surface
- before the expose event can copy (or bitblt) it
-*/
+ if ( ! bd->bTempMode ) {
+ printf( "Temp draw in Main Mode. Contact Developers. See %s:%d\n",
+ "gtkdraw-cario.c", __LINE__+1 );
+ }
+ /* Temp Draw In Main Mode:
+ You are seeing this message because there is a wDraw*() call on tempD but you are not in the context of TempRedraw()
+ Typically this happens when Cmd<Object>() is processing a C_DOWN or C_MOVE action and it writes directly to tempD
+ Instead it sould set some state which allows c_redraw to do the actual drawing
+ If you set a break point on the printf you'll see the offending wDraw*() call in the traceback
+ It should be sufficient to remove that draw code or move it to C_REDRAW
+ This is not fatal but the draw will be ineffective because the next TempRedraw() will erase the temp surface
+ before the expose event can copy (or bitblt) it
+ */
cairo = cairo_create(bd->temp_surface);
} else {
- if ( bd->bTempMode )
- printf( "Main draw in Temp Mode. Contact Developers. See %s:%d\n", "gtkdraw-cario.c", __LINE__+1 );
-/* Main Draw In Temp Mode:
- You are seeing this message because there is a wDraw*() call on mainD but you are in the context of TempRedraw()
- Typically this happens when C_REDRAW action calls wDraw*() on mainD, in which case it should be writing to tempD.
- Or the wDraw*() call should be removed if it is redundant.
- If you set a break point on the printf you'll see the offending wDraw*() call in the traceback
- This is not fatal but could result in garbage being left on the screen if the command is cancelled.
-*/
+ if ( bd->bTempMode ) {
+ printf( "Main draw in Temp Mode. Contact Developers. See %s:%d\n",
+ "gtkdraw-cario.c", __LINE__+1 );
+ }
+ /* Main Draw In Temp Mode:
+ You are seeing this message because there is a wDraw*() call on mainD but you are in the context of TempRedraw()
+ Typically this happens when C_REDRAW action calls wDraw*() on mainD, in which case it should be writing to tempD.
+ Or the wDraw*() call should be removed if it is redundant.
+ If you set a break point on the printf you'll see the offending wDraw*() call in the traceback
+ This is not fatal but could result in garbage being left on the screen if the command is cancelled.
+ */
cairo = gdk_cairo_create(bd->pixmap);
}
}
width = width ? abs(width) : 1;
- if ( color == wDrawColorWhite )
- width += 1; // Remove ghosts
+ if ( color == wDrawColorWhite ) {
+ width += 1; // Remove ghosts
+ }
cairo_set_line_width(cairo, width);
cairo_set_line_cap(cairo, CAIRO_LINE_CAP_BUTT);
cairo_set_line_join(cairo, CAIRO_LINE_JOIN_MITER);
- switch(lineType)
- {
- case wDrawLineSolid:
- {
- cairo_set_dash(cairo, 0, 0, 0);
- break;
- }
- case wDrawLineDash:
- {
- double dashes[] = { 5, 3 };
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0);
- break;
- }
- case wDrawLineDot:
- {
- double dashes[] = { 1, 2 };
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0);
- break;
- }
- case wDrawLineDashDot:
- {
- double dashes[] = { 5, 2, 1, 2 };
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0);
- break;
- }
- case wDrawLineDashDotDot:
- {
- double dashes[] = { 5, 2, 1, 2, 1, 2 };
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0);
- break;
- }
- case wDrawLineCenter:
- {
- double dashes[] = { 8, 3, 5, 3};
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0.0);
- break;
- }
- case wDrawLinePhantom:
- {
- double dashes[] = { 8, 3, 5, 3, 5, 3};
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0.0);
- break;
- }
+ switch(lineType) {
+ case wDrawLineSolid: {
+ cairo_set_dash(cairo, 0, 0, 0);
+ break;
+ }
+ case wDrawLineDash: {
+ double dashes[] = { 5, 3 };
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cairo, dashes, len_dashes, 0);
+ break;
+ }
+ case wDrawLineDot: {
+ double dashes[] = { 1, 2 };
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cairo, dashes, len_dashes, 0);
+ break;
+ }
+ case wDrawLineDashDot: {
+ double dashes[] = { 5, 2, 1, 2 };
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cairo, dashes, len_dashes, 0);
+ break;
+ }
+ case wDrawLineDashDotDot: {
+ double dashes[] = { 5, 2, 1, 2, 1, 2 };
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cairo, dashes, len_dashes, 0);
+ break;
+ }
+ case wDrawLineCenter: {
+ double dashes[] = { 8, 3, 5, 3};
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cairo, dashes, len_dashes, 0.0);
+ break;
+ }
+ case wDrawLinePhantom: {
+ double dashes[] = { 8, 3, 5, 3, 5, 3};
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cairo, dashes, len_dashes, 0.0);
+ break;
+ }
}
GdkColor * gcolor;
@@ -315,49 +227,22 @@ static cairo_t* gtkDrawCreateCairoContext(
bd->lastColor = color;
- cairo_set_source_rgb(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0, gcolor->blue / 65535.0);
+ cairo_set_source_rgb(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0,
+ gcolor->blue / 65535.0);
return cairo;
}
-static cairo_t* gtkDrawDestroyCairoContext(cairo_t *cairo) {
+static cairo_t* gtkDrawDestroyCairoContext(cairo_t *cairo)
+{
cairo_destroy(cairo);
return NULL;
}
-#ifdef CURSOR_SURFACE
-cairo_t* CreateCursorSurface(wControl_p ct, wSurface_p surface, wPos_t width, wPos_t height, wDrawColor color, wDrawOpts opts) {
-
- cairo_t * cairo = NULL;
-
- if ((opts&wDrawOptCursor) || (opts&wDrawOptCursorRmv)) {
-
- if (surface!=NULL || surface->width != width || surface->height != height) {
- if (surface->surface) cairo_surface_destroy(surface->surface);
- surface->surface = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, width,height );
- surface->width = width;
- surface->height = height;
-
- }
-
- cairo = gtkDrawCreateCairoCursorContext(ct,surface->surface,0,wDrawLineSolid, color, opts);
- cairo_save(cairo);
- cairo_set_source_rgba(cairo, 0.0, 0.0, 0.0, 0.0);
- cairo_paint(cairo);
- cairo_restore(cairo);
- surface->show = TRUE;
- cairo_set_operator(cairo,CAIRO_OPERATOR_SOURCE);
- }
-
- return cairo;
-
-}
-#endif
-
- void wDrawDelayUpdate(
- wDraw_p bd,
- wBool_t delay )
+void wDrawDelayUpdate(
+ wDraw_p bd,
+ wBool_t delay )
{
GdkRectangle update_rect;
@@ -372,17 +257,17 @@ cairo_t* CreateCursorSurface(wControl_p ct, wSurface_p surface, wPos_t width, wP
}
- void wDrawLine(
- wDraw_p bd,
- wPos_t x0, wPos_t y0,
- wPos_t x1, wPos_t y1,
- wDrawWidth width,
- wDrawLineType_e lineType,
- wDrawColor color,
- wDrawOpts opts )
+void wDrawLine(
+ wDraw_p bd,
+ wDrawPix_t x0, wDrawPix_t y0,
+ wDrawPix_t x1, wDrawPix_t y1,
+ wDrawWidth width,
+ wDrawLineType_e lineType,
+ wDrawColor color,
+ wDrawOpts opts )
{
- GdkGC * gc;
- GdkRectangle update_rect;
+// GdkGC * gc;
+// GdkRectangle update_rect;
if ( bd == &psPrint_d ) {
psPrintLine( x0, y0, x1, y1, width, lineType, color, opts );
@@ -393,13 +278,15 @@ cairo_t* CreateCursorSurface(wControl_p ct, wSurface_p surface, wPos_t width, wP
x1 = INMAPX(bd,x1);
y1 = INMAPY(bd,y1);
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, width, lineType, color, opts);
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, width, lineType, color,
+ opts);
cairo_move_to(cairo, x0 + 0.5, y0 + 0.5);
cairo_line_to(cairo, x1 + 0.5, y1 + 0.5);
cairo_stroke(cairo);
gtkDrawDestroyCairoContext(cairo);
- if (bd->widget)
- gtk_widget_queue_draw(GTK_WIDGET(bd->widget)); //,x0,y0+1,x1,y1+1);
+ if (bd->widget) {
+ gtk_widget_queue_draw(GTK_WIDGET(bd->widget)); //,x0,y0+1,x1,y1+1);
+ }
}
@@ -418,79 +305,86 @@ cairo_t* CreateCursorSurface(wControl_p ct, wSurface_p surface, wPos_t width, wP
*/
- void wDrawArc(
- wDraw_p bd,
- wPos_t x0, wPos_t y0,
- wPos_t r,
- wAngle_t angle0,
- wAngle_t angle1,
- int drawCenter,
- wDrawWidth width,
- wDrawLineType_e lineType,
- wDrawColor color,
- wDrawOpts opts )
+void wDrawArc(
+ wDraw_p bd,
+ wDrawPix_t x0, wDrawPix_t y0,
+ wDrawPix_t r,
+ wAngle_t angle0,
+ wAngle_t angle1,
+ int drawCenter,
+ wDrawWidth width,
+ wDrawLineType_e lineType,
+ wDrawColor color,
+ wDrawOpts opts )
{
int x, y, w, h;
if ( bd == &psPrint_d ) {
- psPrintArc( x0, y0, r, angle0, angle1, drawCenter, width, lineType, color, opts );
+ psPrintArc( x0, y0, r, angle0, angle1, drawCenter, width, lineType, color,
+ opts );
return;
}
- if (r < 6.0/75.0) return;
+ if (r < 6.0/75.0) { return; }
x = INMAPX(bd,x0-r);
y = INMAPY(bd,y0+r);
w = 2*r;
h = 2*r;
// now create the new arc
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, width, lineType, color, opts);
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, width, lineType, color,
+ opts);
cairo_new_path(cairo);
// its center point marker
- if(drawCenter)
- {
+ if(drawCenter) {
// draw a small crosshair to mark the center of the curve
- cairo_move_to(cairo, INMAPX(bd, x0 - (CENTERMARK_LENGTH / 2)), INMAPY(bd, y0 ));
+ cairo_move_to(cairo, INMAPX(bd, x0 - (CENTERMARK_LENGTH / 2)), INMAPY(bd,
+ y0 ));
cairo_line_to(cairo, INMAPX(bd, x0 + (CENTERMARK_LENGTH / 2)), INMAPY(bd, y0 ));
cairo_move_to(cairo, INMAPX(bd, x0), INMAPY(bd, y0 - (CENTERMARK_LENGTH / 2 )));
- cairo_line_to(cairo, INMAPX(bd, x0) , INMAPY(bd, y0 + (CENTERMARK_LENGTH / 2)));
+ cairo_line_to(cairo, INMAPX(bd, x0), INMAPY(bd, y0 + (CENTERMARK_LENGTH / 2)));
cairo_new_sub_path( cairo );
}
// draw the curve itself
- cairo_arc_negative(cairo, INMAPX(bd, x0), INMAPY(bd, y0), r, (angle0 - 90 + angle1) * (M_PI / 180.0), (angle0 - 90) * (M_PI / 180.0));
+ cairo_arc_negative(cairo, INMAPX(bd, x0), INMAPY(bd, y0), r,
+ (angle0 - 90 + angle1) * (M_PI / 180.0), (angle0 - 90) * (M_PI / 180.0));
cairo_stroke(cairo);
gtkDrawDestroyCairoContext(cairo);
- if (bd->widget && !bd->delayUpdate)
- gtk_widget_queue_draw_area(bd->widget,x,y,w,h);
+ if (bd->widget && !bd->delayUpdate) {
+ gtk_widget_queue_draw_area(bd->widget,x,y,w,h);
+ }
}
- void wDrawPoint(
- wDraw_p bd,
- wPos_t x0, wPos_t y0,
- wDrawColor color,
- wDrawOpts opts )
+void wDrawPoint(
+ wDraw_p bd,
+ wDrawPix_t x0, wDrawPix_t y0,
+ wDrawColor color,
+ wDrawOpts opts )
{
- GdkRectangle update_rect;
+// GdkRectangle update_rect;
if ( bd == &psPrint_d ) {
/*psPrintArc( x0, y0, r, angle0, angle1, drawCenter, width, lineType, color, opts );*/
return;
}
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color, opts);
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color,
+ opts);
cairo_new_path(cairo);
cairo_arc(cairo, INMAPX(bd, x0), INMAPY(bd, y0), 0.75, 0, 2 * M_PI);
cairo_stroke(cairo);
gtkDrawDestroyCairoContext(cairo);
- if (bd->widget && !bd->delayUpdate)
- gtk_widget_queue_draw_area(bd->widget,INMAPX(bd,x0-0.75),INMAPY(bd,y0+0.75),2,2);
+ if (bd->widget && !bd->delayUpdate) {
+ gtk_widget_queue_draw_area(bd->widget,INMAPX(bd,x0-0.75),INMAPY(bd,y0+0.75),2,
+ 2);
+ }
}
@@ -500,23 +394,23 @@ cairo_t* CreateCursorSurface(wControl_p ct, wSurface_p surface, wPos_t width, wP
*
******************************************************************************/
- void wDrawString(
- wDraw_p bd,
- wPos_t x, wPos_t y,
- wAngle_t a,
- const char * s,
- wFont_p fp,
- wFontSize_t fs,
- wDrawColor color,
- wDrawOpts opts )
+void wDrawString(
+ wDraw_p bd,
+ wDrawPix_t x, wDrawPix_t y,
+ wAngle_t a,
+ const char * s,
+ wFont_p fp,
+ wFontSize_t fs,
+ wDrawColor color,
+ wDrawOpts opts )
{
PangoLayout *layout;
GdkRectangle update_rect;
- int w;
- int h;
- gint ascent;
- gint descent;
- gint baseline;
+ wDrawPix_t w;
+ wDrawPix_t h;
+ wDrawPix_t ascent;
+ wDrawPix_t descent;
+ wDrawPix_t baseline;
double angle = -M_PI * a / 180.0;
if ( bd == &psPrint_d ) {
@@ -528,19 +422,21 @@ cairo_t* CreateCursorSurface(wControl_p ct, wSurface_p surface, wPos_t width, wP
y = INMAPY(bd,y);
/* draw text */
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color, opts);
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color,
+ opts);
cairo_save( cairo );
cairo_identity_matrix(cairo);
layout = wlibFontCreatePangoLayout(bd->widget, cairo, fp, fs, s,
- (int *) &w, (int *) &h,
- (int *) &ascent, (int *) &descent, (int *) &baseline);
+ &w, &h,
+ &ascent, &descent, &baseline);
/* cairo does not support the old method of text removal by overwrite;
* if color is White, then overwrite old text with a White rectangle */
GdkColor* const gcolor = wlibGetColor(color, TRUE);
- cairo_set_source_rgb(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0, gcolor->blue / 65535.0);
+ cairo_set_source_rgb(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0,
+ gcolor->blue / 65535.0);
cairo_translate( cairo, x, y );
cairo_rotate( cairo, angle );
@@ -554,7 +450,7 @@ cairo_t* CreateCursorSurface(wControl_p ct, wSurface_p surface, wPos_t width, wP
cairo_restore( cairo );
gtkDrawDestroyCairoContext(cairo);
- if (bd->delayUpdate || bd->widget == NULL) return;
+ if (bd->delayUpdate || bd->widget == NULL) { return; }
/* recalculate the area to be updated
* for simplicity sake I added plain text height ascent and descent,
@@ -565,48 +461,52 @@ cairo_t* CreateCursorSurface(wControl_p ct, wSurface_p surface, wPos_t width, wP
update_rect.width = (gint) (w * cos( angle ) + h * sin(angle))+2;
update_rect.height = (gint) (h * sin( angle ) + w * cos(angle))+2;
gtk_widget_draw(bd->widget, &update_rect);
- if (bd->widget && !bd->delayUpdate)
- gtk_widget_queue_draw_area(bd->widget, update_rect.x, update_rect.y, update_rect.width, update_rect.height);
-
+ if (bd->widget && !bd->delayUpdate) {
+ gtk_widget_queue_draw_area(bd->widget, update_rect.x, update_rect.y,
+ update_rect.width, update_rect.height);
+ }
+
}
- void wDrawGetTextSize(
- wPos_t *w,
- wPos_t *h,
- wPos_t *d,
- wPos_t *a,
- wDraw_p bd,
- const char * s,
- wFont_p fp,
- wFontSize_t fs )
+void wDrawGetTextSize(
+ wDrawPix_t *w,
+ wDrawPix_t *h,
+ wDrawPix_t *d,
+ wDrawPix_t *a,
+ wDraw_p bd,
+ const char * s,
+ wFont_p fp,
+ wFontSize_t fs )
{
- int textWidth;
- int textHeight;
- int ascent;
- int descent;
- int baseline;
+ wDrawPix_t textWidth;
+ wDrawPix_t textHeight;
+ wDrawPix_t ascent;
+ wDrawPix_t descent;
+ wDrawPix_t baseline;
*w = 0;
*h = 0;
/* draw text */
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, wDrawColorBlack, bd->bTempMode?wDrawOptTemp:0 );
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid,
+ wDrawColorBlack, bd->bTempMode?wDrawOptTemp:0 );
cairo_identity_matrix(cairo);
wlibFontDestroyPangoLayout(
- wlibFontCreatePangoLayout(bd->widget, cairo, fp, fs, s,
- &textWidth, (int *) &textHeight,
- (int *) &ascent, (int *) &descent, (int *) &baseline) );
-
- *w = (wPos_t) textWidth;
- *h = (wPos_t) textHeight;
- *a = (wPos_t) ascent;
- //*d = (wPos_t) textHeight-ascent;
- *d = (wPos_t) descent;
-
- if (debugWindow >= 3)
- fprintf(stderr, "text metrics: w=%d, h=%d, d=%d\n", *w, *h, *d);
+ wlibFontCreatePangoLayout(bd->widget, cairo, fp, fs, s,
+ &textWidth, &textHeight,
+ &ascent, &descent, &baseline) );
+
+ *w = textWidth;
+ *h = textHeight;
+ *a = ascent;
+ //*d = textHeight-ascent;
+ *d = descent;
+
+ if (debugWindow >= 3) {
+ fprintf(stderr, "text metrics: w=%0.1f, h=%0.1f, d=%0.1f\n", *w, *h, *d);
+ }
gtkDrawDestroyCairoContext(cairo);
}
@@ -619,9 +519,9 @@ cairo_t* CreateCursorSurface(wControl_p ct, wSurface_p surface, wPos_t width, wP
*******************************************************************************/
static void wlibDrawFilled(
- cairo_t * cairo,
- wDrawColor color,
- wDrawOpts opt )
+ cairo_t * cairo,
+ wDrawColor color,
+ wDrawOpts opt )
{
if ( (opt & wDrawOptTransparent) != 0 ) {
if ( (opt & wDrawOptTemp) == 0 ) {
@@ -630,26 +530,28 @@ static void wlibDrawFilled(
cairo_fill_preserve(cairo);
}
GdkColor * gcolor = wlibGetColor(color, TRUE);
- cairo_set_source_rgba(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0, gcolor->blue / 65535.0, 1.0);
+ cairo_set_source_rgba(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0,
+ gcolor->blue / 65535.0, 1.0);
cairo_set_operator(cairo, CAIRO_OPERATOR_OVER);
cairo_stroke_preserve(cairo);
cairo_set_operator(cairo, CAIRO_OPERATOR_OVER);
- cairo_set_source_rgba(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0, gcolor->blue / 65535.0, 0.3);
+ cairo_set_source_rgba(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0,
+ gcolor->blue / 65535.0, 0.3);
}
cairo_fill(cairo);
}
- void wDrawFilledRectangle(
- wDraw_p bd,
- wPos_t x,
- wPos_t y,
- wPos_t w,
- wPos_t h,
- wDrawColor color,
- wDrawOpts opt )
+void wDrawFilledRectangle(
+ wDraw_p bd,
+ wDrawPix_t x,
+ wDrawPix_t y,
+ wDrawPix_t w,
+ wDrawPix_t h,
+ wDrawColor color,
+ wDrawOpts opt )
{
- GdkRectangle update_rect;
+// GdkRectangle update_rect;
if ( bd == &psPrint_d ) {
psPrintFillRectangle( x, y, w, h, color, opt );
@@ -659,7 +561,8 @@ static void wlibDrawFilled(
x = INMAPX(bd,x);
y = INMAPY(bd,y)-h;
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color, opt);
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color,
+ opt);
cairo_move_to(cairo, x, y);
cairo_rel_line_to(cairo, w, 0);
@@ -669,22 +572,23 @@ static void wlibDrawFilled(
wlibDrawFilled( cairo, color, opt );
gtkDrawDestroyCairoContext(cairo);
- if (bd->widget && !bd->delayUpdate)
+ if (bd->widget && !bd->delayUpdate) {
gtk_widget_queue_draw_area(GTK_WIDGET(bd->widget),x,y,w,h);
+ }
}
- void wDrawPolygon(
- wDraw_p bd,
- wPos_t p[][2],
- wPolyLine_e type[],
- int cnt,
- wDrawColor color,
- wDrawWidth dw,
- wDrawLineType_e lt,
- wDrawOpts opt,
- int fill,
- int open )
+void wDrawPolygon(
+ wDraw_p bd,
+ wDrawPix_t p[][2],
+ wPolyLine_e type[],
+ int cnt,
+ wDrawColor color,
+ wDrawWidth dw,
+ wDrawLineType_e lt,
+ wDrawOpts opt,
+ int fill,
+ int open )
{
static int maxCnt = 0;
static GdkPoint *points;
@@ -695,34 +599,37 @@ static void wlibDrawFilled(
return;
}
- if (cnt > maxCnt) {
- if (points == NULL)
+ if (cnt > maxCnt) {
+ if (points == NULL) {
points = (GdkPoint*)malloc( cnt*sizeof *points );
- else
+ } else {
points = (GdkPoint*)realloc( points, cnt*sizeof *points );
- if (points == NULL)
+ }
+ if (points == NULL) {
abort();
+ }
maxCnt = cnt;
}
- wPos_t min_x,max_x,min_y,max_y;
+ wDrawPix_t min_x,max_x,min_y,max_y;
min_x = max_x = INMAPX(bd,p[0][0]);
min_y = max_y = INMAPY(bd,p[0][1]);
- for (i=0; i<cnt; i++) {
- points[i].x = INMAPX(bd,p[i][0]);
- if (points[i].x < min_x) min_x = points[i].x;
- if (points[i].x > max_x) max_x = points[i].x;
- if (points[i].y > max_y) max_y = points[i].y;
- points[i].y = INMAPY(bd,p[i][1]);
+ for (i=0; i<cnt; i++) {
+ points[i].x = INMAPX(bd,p[i][0]);
+ if (points[i].x < min_x) { min_x = points[i].x; }
+ if (points[i].y < min_y) { min_y = points[i].y; }
+ if (points[i].x > max_x) { max_x = points[i].x; }
+ if (points[i].y > max_y) { max_y = points[i].y; }
+ points[i].y = INMAPY(bd,p[i][1]);
}
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, fill?0:dw, fill?wDrawLineSolid:lt, color, opt);
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, fill?0:dw,
+ fill?wDrawLineSolid:lt, color, opt);
- for(i = 0; i < cnt; ++i)
- {
+ for(i = 0; i < cnt; ++i) {
int j = i-1;
int k = i+1;
- if (j < 0) j = cnt-1;
- if (k > cnt-1) k = 0;
+ if (j < 0) { j = cnt-1; }
+ if (k > cnt-1) { k = 0; }
GdkPoint mid0, mid1, mid3, mid4;
// save is static because of an apparent compiler bug on Linux
// This happens with RelWithDebInfo target
@@ -770,20 +677,24 @@ static void wlibDrawFilled(
save = points[0];
} else {
cairo_move_to(cairo, mid0.x, mid0.y);
- if (type[i] == 1)
- cairo_curve_to(cairo, points[i].x, points[i].y, points[i].x, points[i].y, mid1.x, mid1.y);
- else
+ if (type[i] == 1) {
+ cairo_curve_to(cairo, points[i].x, points[i].y, points[i].x, points[i].y,
+ mid1.x, mid1.y);
+ } else {
cairo_curve_to(cairo, mid3.x, mid3.y, mid4.x, mid4.y, mid1.x, mid1.y);
+ }
save = mid0;
}
} else if (!type || type[i] == wPolyLineStraight || (open && (i==cnt-1))) {
cairo_line_to(cairo, points[i].x, points[i].y);
} else {
cairo_line_to(cairo, mid0.x, mid0.y);
- if (type[i] == wPolyLineSmooth)
- cairo_curve_to(cairo, points[i].x, points[i].y, points[i].x, points[i].y, mid1.x, mid1.y);
- else
+ if (type[i] == wPolyLineSmooth) {
+ cairo_curve_to(cairo, points[i].x, points[i].y, points[i].x, points[i].y,
+ mid1.x, mid1.y);
+ } else {
cairo_curve_to(cairo, mid3.x, mid3.y, mid4.x, mid4.y, mid1.x, mid1.y);
+ }
}
if ((i==cnt-1) && !open) {
cairo_line_to(cairo, save.x, save.y);
@@ -795,18 +706,20 @@ static void wlibDrawFilled(
cairo_stroke(cairo);
}
gtkDrawDestroyCairoContext(cairo);
- if (bd->widget && !bd->delayUpdate)
- gtk_widget_queue_draw_area(GTK_WIDGET(bd->widget),min_x,min_y,max_x-min_y,max_y-min_y);
+ if (bd->widget && !bd->delayUpdate) {
+ gtk_widget_queue_draw_area(GTK_WIDGET(bd->widget),min_x,min_y,max_x-min_y,
+ max_y-min_y);
+ }
}
- void wDrawFilledCircle(
- wDraw_p bd,
- wPos_t x0,
- wPos_t y0,
- wPos_t r,
- wDrawColor color,
- wDrawOpts opt )
+void wDrawFilledCircle(
+ wDraw_p bd,
+ wDrawPix_t x0,
+ wDrawPix_t y0,
+ wDrawPix_t r,
+ wDrawColor color,
+ wDrawOpts opt )
{
int x, y, w, h;
@@ -820,22 +733,26 @@ static void wlibDrawFilled(
w = 2*r;
h = 2*r;
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color, opt);
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color,
+ opt);
cairo_arc(cairo, INMAPX(bd, x0), INMAPY(bd, y0), r, 0, 2 * M_PI);
wlibDrawFilled( cairo, color, opt );
gtkDrawDestroyCairoContext(cairo);
- if (bd->widget)
- gtk_widget_queue_draw_area(GTK_WIDGET(bd->widget),x,y,w,h);
+ if (bd->widget && !bd->delayUpdate) {
+ gtk_widget_queue_draw_area(GTK_WIDGET(bd->widget),x,y,w,h);
+ }
}
- void wDrawClearTemp(wDraw_p bd) {
+void wDrawClearTemp(wDraw_p bd)
+{
//Wipe out temp space with 0 alpha (transparent)
static long cDCT = 0;
- if ( iDrawLog )
+ if ( iDrawLog ) {
printf( "wDrawClearTemp %ld\n", cDCT++ );
+ }
cairo_t* cairo = cairo_create(bd->temp_surface);
cairo_set_source_rgba(cairo, 0.0, 0.0, 0.0, 0.0);
@@ -847,29 +764,32 @@ static void wlibDrawFilled(
cairo_fill(cairo);
cairo_destroy(cairo);
- if (bd->widget && !bd->delayUpdate)
+ if (bd->widget && !bd->delayUpdate) {
gtk_widget_queue_draw(bd->widget);
- }
+ }
+}
- void wDrawClear(
- wDraw_p bd )
+void wDrawClear(
+ wDraw_p bd )
{
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, wDrawColorWhite, 0);
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid,
+ wDrawColorWhite, 0);
cairo_move_to(cairo, 0, 0);
cairo_rel_line_to(cairo, bd->w, 0);
cairo_rel_line_to(cairo, 0, bd->h);
cairo_rel_line_to(cairo, -bd->w, 0);
cairo_fill(cairo);
- if (bd->widget)
+ if (bd->widget) {
gtk_widget_queue_draw(bd->widget);
+ }
gtkDrawDestroyCairoContext(cairo);
wDrawClearTemp(bd);
}
- void * wDrawGetContext(
- wDraw_p bd )
+void * wDrawGetContext(
+ wDraw_p bd )
{
return bd->context;
}
@@ -881,13 +801,13 @@ static void wlibDrawFilled(
*******************************************************************************/
- wDrawBitMap_p wDrawBitMapCreate(
- wDraw_p bd,
- int w,
- int h,
- int x,
- int y,
- const unsigned char * fbits )
+wDrawBitMap_p wDrawBitMapCreate(
+ wDraw_p bd,
+ int w,
+ int h,
+ int x,
+ int y,
+ const unsigned char * fbits )
{
wDrawBitMap_p bm;
@@ -902,23 +822,21 @@ static void wlibDrawFilled(
}
- void wDrawBitMap(
- wDraw_p bd,
- wDrawBitMap_p bm,
- wPos_t x, wPos_t y,
- wDrawColor color,
- wDrawOpts opts )
+void wDrawBitMap(
+ wDraw_p bd,
+ wDrawBitMap_p bm,
+ wDrawPix_t x, wDrawPix_t y,
+ wDrawColor color,
+ wDrawOpts opts )
{
int i, j, wb;
- wPos_t xx, yy;
- wControl_p b;
- wWin_p win;
- GdkDrawable * gdk_drawable, * cairo_surface;
+ wDrawPix_t xx, yy;
GtkWidget * widget = bd->widget;
-
+
static long cDBM = 0;
- if ( iDrawLog )
+ if ( iDrawLog ) {
printf( "wDrawBitMap %ld\n", cDBM++ );
+ }
x = INMAPX( bd, x-bm->x );
y = INMAPY( bd, y-bm->y )-bm->h;
@@ -926,32 +844,6 @@ static void wlibDrawFilled(
cairo_t* cairo;
-#ifdef CURSOR_SURFACE
- if (opts&wDrawOptCursorRmv) color = wDrawColorWhite; //Wipeout existing cursor draw (simplistic first)
-
-
- if ((opts&wDrawOptCursor) || (opts&wDrawOptCursorRmv) || (opts&wDrawOptCursorQuit)) {
-
- cairo = CreateCursorSurface((wControl_p)bd,&bd->cursor_surface, bd->w, bd->h, color, opts);
-
- if ((opts&wDrawOptCursorRmv) || (opts&wDrawOptCursorQuit)) {
- bd->cursor_surface.show = FALSE;
- } else bd->cursor_surface.show = TRUE;
-
- widget = bd->widget;
-
-
- } else {
- cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color, opts);
- widget = bd->widget;
- }
-
- GtkWidget * new_widget = widget;
- GdkGC * gc = NULL;
- GdkWindow * gdk_window = NULL;
-
- win = bd->parent;
-#endif
cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color, opts);
@@ -960,55 +852,15 @@ static void wlibDrawFilled(
if ( bm->bits[ j*wb+(i>>3) ] & (1<<(i&07)) ) {
xx = x+i;
yy = y+j;
-#ifdef CURSOR_SURFACE
- if ( 0 <= xx && xx < bd->w &&
- 0 <= yy && yy < bd->h ) {
- b = (wControl_p)bd;
- } else if ( (opts&wDrawOptNoClip) != 0 ) {
- xx += bd->realX;
- yy += bd->realY;
- b = wlibGetControlFromPos( bd->parent, xx, yy );
- if ( b) {
- xx -= b->realX;
- yy -= b->realY;
- new_widget = b->widget;
- } else {
- new_widget = bd->parent->widget;
- }
- } else {
- continue;
- }
-
- if (new_widget != widget) {
- if (cairo)
- cairo_destroy(cairo);
- cairo = NULL;
- if (widget && (widget != bd->parent->widget))
- gtk_widget_queue_draw(GTK_WIDGET(widget));
- if ( (opts&wDrawOptCursor) || (opts&wDrawOptCursorRmv) || (opts&wDrawOptCursorQuit)) {
- if (!b) b = (wControl_p)(bd->parent->widget);
- cairo = CreateCursorSurface(b,&b->cursor_surface, b->w, b->h, color, opts);
- widget = b->widget;
- gc = NULL;
- if ((opts&wDrawOptCursorRmv) || (opts&wDrawOptCursorQuit))
- b->cursor_surface.show = FALSE;
- else
- b->cursor_surface.show = TRUE;
- } else {
- continue;
- }
- widget = new_widget;
- }
- if ((opts&wDrawOptCursorQuit) || (opts&wDrawOptCursorQuit) ) continue;
-#endif
cairo_rectangle(cairo, xx, yy, 1, 1);
cairo_fill(cairo);
}
cairo_destroy(cairo);
- if (widget && !bd->delayUpdate)
+ if (widget && !bd->delayUpdate) {
gtk_widget_queue_draw_area(GTK_WIDGET(widget), x, y, bm->w, bm->h);
+ }
}
@@ -1021,8 +873,8 @@ static void wlibDrawFilled(
- void wDrawSaveImage(
- wDraw_p bd )
+void wDrawSaveImage(
+ wDraw_p bd )
{
cairo_t * cr;
if ( bd->pixmapBackup ) {
@@ -1032,7 +884,7 @@ static void wlibDrawFilled(
cr = gdk_cairo_create(bd->pixmapBackup);
gdk_cairo_set_source_pixmap(cr, bd->pixmap, 0, 0);
- cairo_paint(cr);
+ cairo_paint(cr);
cairo_destroy(cr);
cr = NULL;
@@ -1040,8 +892,8 @@ static void wlibDrawFilled(
}
- void wDrawRestoreImage(
- wDraw_p bd )
+void wDrawRestoreImage(
+ wDraw_p bd )
{
GdkRectangle update_rect;
if ( bd->pixmapBackup ) {
@@ -1054,7 +906,7 @@ static void wlibDrawFilled(
cr = NULL;
- if ( bd->delayUpdate || bd->widget == NULL ) return;
+ if ( bd->delayUpdate || bd->widget == NULL ) { return; }
update_rect.x = 0;
update_rect.y = 0;
update_rect.width = bd->w;
@@ -1064,10 +916,10 @@ static void wlibDrawFilled(
}
- void wDrawSetSize(
- wDraw_p bd,
- wPos_t w,
- wPos_t h , void * redraw)
+void wDrawSetSize(
+ wDraw_p bd,
+ wWinPix_t w,
+ wWinPix_t h, void * redraw)
{
wBool_t repaint;
if (bd == NULL) {
@@ -1076,37 +928,47 @@ static void wlibDrawFilled(
}
/* Negative values crashes the program */
- if (w < 0 || h < 0)
- return;
+ if ( w <= 0 || h <= 0 ) {
+ fprintf( stderr, "wDrawSetSize bad size %ldx%ld\n", w, h );
+ if ( w <= 0 ) {
+ w = 100;
+ }
+ if ( h <= 0 ) {
+ h = 100;
+ }
+ }
repaint = (w != bd->w || h != bd->h);
bd->w = w;
bd->h = h;
gtk_widget_set_size_request( bd->widget, w, h );
- if (repaint)
- {
- if (bd->pixmap)
+ if (repaint) {
+ if (bd->pixmap) {
gdk_pixmap_unref( bd->pixmap );
+ }
bd->pixmap = gdk_pixmap_new( bd->widget->window, w, h, -1 );
- if (bd->temp_surface)
+ if (bd->temp_surface) {
cairo_surface_destroy( bd->temp_surface);
+ }
bd->temp_surface = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, w,h );
wDrawClear( bd );
- if (!redraw)
+ if (!redraw) {
bd->redraw( bd, bd->context, w, h );
+ }
}
/*wRedraw( bd )*/;
}
- void wDrawGetSize(
- wDraw_p bd,
- wPos_t *w,
- wPos_t *h )
+void wDrawGetSize(
+ wDraw_p bd,
+ wWinPix_t *w,
+ wWinPix_t *h )
{
- if (bd->widget)
+ if (bd->widget) {
wlibControlGetSize( (wControl_p)bd );
+ }
*w = bd->w-2;
*h = bd->h-2;
}
@@ -1118,76 +980,68 @@ static void wlibDrawFilled(
* \return the resolution in dpi
*/
- double wDrawGetDPI(
- wDraw_p d )
+double wDrawGetDPI(
+ wDraw_p d )
{
//if (d == &psPrint_d)
- //return 1440.0;
+ //return 1440.0;
//else
- return d->dpi;
+ return d->dpi;
}
- double wDrawGetMaxRadius(
- wDraw_p d )
+double wDrawGetMaxRadius(
+ wDraw_p d )
{
- if (d == &psPrint_d)
+ if (d == &psPrint_d) {
return 10e9;
- else
+ } else {
return 32767.0;
+ }
}
- void wDrawClip(
- wDraw_p d,
- wPos_t x,
- wPos_t y,
- wPos_t w,
- wPos_t h )
+void wDrawClip(
+ wDraw_p d,
+ wDrawPix_t x,
+ wDrawPix_t y,
+ wDrawPix_t w,
+ wDrawPix_t h )
{
GdkRectangle rect;
- rect.width = w;
- rect.height = h;
- rect.x = INMAPX( d, x );
- rect.y = INMAPY( d, y ) - rect.height;
+ rect.width = (wWinPix_t)w;
+ rect.height = (wWinPix_t)h;
+ rect.x = (wWinPix_t)INMAPX( d, x );
+ rect.y = (wWinPix_t)INMAPY( d, y ) - rect.height;
gdk_gc_set_clip_rectangle( d->gc, &rect );
}
static gint draw_expose_event(
- GtkWidget *widget,
- GdkEventExpose *event,
- wDraw_p bd)
+ GtkWidget *widget,
+ GdkEventExpose *event,
+ wDraw_p bd)
{
static long cDEE = 0;
if ( iDrawLog )
- printf( "draw_expose_event %ld %dx%d+%dx%d %dx%d+%dx%d\n", cDEE++,
- event->area.x, event->area.y, event->area.width, event->area.height,
- 0, bd->w, 0, bd->h );
+ printf( "draw_expose_event %ld %dx%d+%dx%d %ldx%ld+%ldx%ld\n", cDEE++,
+ event->area.x, event->area.y, event->area.width, event->area.height,
+ 0L, bd->w, 0L, bd->h );
cairo_t* cairo = gdk_cairo_create (widget->window);
gdk_cairo_set_source_pixmap(cairo,bd->pixmap,0,0);
cairo_rectangle(cairo,event->area.x, event->area.y,
- event->area.width, event->area.height);
+ event->area.width, event->area.height);
cairo_set_operator(cairo,CAIRO_OPERATOR_SOURCE);
cairo_fill(cairo);
cairo_set_source_surface(cairo,bd->temp_surface,0,0);
cairo_rectangle(cairo,event->area.x, event->area.y,
- event->area.width, event->area.height);
+ event->area.width, event->area.height);
cairo_set_operator(cairo,CAIRO_OPERATOR_OVER);
cairo_fill(cairo);
-#ifdef CURSOR_SURFACE
- if (bd->cursor_surface.surface && bd->cursor_surface.show) {
- cairo_set_source_surface(cairo,bd->cursor_surface.surface,0,0);
- cairo_set_operator(cairo,CAIRO_OPERATOR_OVER);
- cairo_rectangle(cairo,event->area.x, event->area.y,
- event->area.width, event->area.height);
- cairo_fill(cairo);
- }
-#endif
cairo_destroy(cairo);
return TRUE;
@@ -1195,14 +1049,14 @@ static gint draw_expose_event(
static gint draw_configure_event(
- GtkWidget *widget,
- GdkEventConfigure *event,
- wDraw_p bd)
+ GtkWidget *widget,
+ GdkEventConfigure *event,
+ wDraw_p bd)
{
return TRUE;
}
-static const char * actionNames[] = { "None", "Move", "LDown", "LDrag", "LUp", "RDown", "RDrag", "RUp", "Text", "ExtKey", "WUp", "WDown", "DblL", "ModK", "ScrU", "ScrD", "ScrL", "ScrR" };
+static const char * actionNames[] = { "None", "Move", "LDown", "LDrag", "LUp", "RDown", "RDrag", "RUp", "Text", "ExtKey", "WUp", "WDown", "DblL", "ModK", "ScrU", "ScrD", "ScrL", "ScrR", "MDown", "MDrag", "MUp" };
/**
* Handler for scroll events, ie mouse wheel activity
@@ -1211,30 +1065,35 @@ static const char * actionNames[] = { "None", "Move", "LDown", "LDrag", "LUp", "
static int scrollTimer;
static int timer_busy_count;
static wAction_t lastAction;
+static int timer_interval = 500; // Start at 0.5 secs
-static int ScrollTimerPop(wDraw_p bd) {
+static int ScrollTimerPop(wDraw_p bd)
+{
- if (timer_busy_count>1) {
- timer_busy_count = 0;
- scrollTimer = 0;
- } else {
- timer_busy_count++;
- return TRUE;
- }
- if (drawVerbose >= 2)
- printf( "%s-Pop\n", actionNames[lastAction] );
- bd->action( bd, bd->context, lastAction, 0, 0 );
+ if (timer_busy_count>4)
+ timer_interval = 250; //If lots of events 0.25 secs next time
+ if (timer_busy_count<1)
+ timer_interval = 500; //If few events 0.5 secs next time
- return FALSE;
+
+ if (drawVerbose >= 2) {
+ printf( "%s-Pop\n", actionNames[lastAction] );
+ }
+ scrollTimer = 0;
+ timer_busy_count = 0;
+ // Don't do the action as may no longer be scrolling
+ // bd->action( bd, bd->context, lastAction, (wDrawPix_t)0, (wDrawPix_t)0 );
+
+ return FALSE; //Stops timer re-popping
}
static gint draw_scroll_event(
- GtkWidget *widget,
- GdkEventScroll *event,
- wDraw_p bd)
+ GtkWidget *widget,
+ GdkEventScroll *event,
+ wDraw_p bd)
{
- wAction_t action;
+ wAction_t action = 0;
static int oldEventX = 0;
static int oldEventY = 0;
static int newEventX = 0;
@@ -1248,44 +1107,34 @@ static gint draw_scroll_event(
oldEventY = OUTMAPX(bd, event->y_root);
switch( event->direction ) {
- case GDK_SCROLL_UP:
- if (event->state & GDK_CONTROL_MASK)
- action = wActionScrollRight;
- else
- action = wActionScrollUp;
- break;
- case GDK_SCROLL_DOWN:
- if (event->state & GDK_CONTROL_MASK)
- action = wActionScrollLeft;
- else
- action = wActionScrollDown;
- break;
- case GDK_SCROLL_LEFT:
- action = wActionScrollLeft;
- break;
- case GDK_SCROLL_RIGHT:
+ case GDK_SCROLL_UP:
+ if (event->state & GDK_CONTROL_MASK) {
action = wActionScrollRight;
- break;
- default:
- return TRUE;
- break;
+ } else {
+ action = wActionScrollUp;
+ }
+ break;
+ case GDK_SCROLL_DOWN:
+ if (event->state & GDK_CONTROL_MASK) {
+ action = wActionScrollLeft;
+ } else {
+ action = wActionScrollDown;
+ }
+ break;
+ case GDK_SCROLL_LEFT:
+ action = wActionScrollLeft;
+ break;
+ case GDK_SCROLL_RIGHT:
+ action = wActionScrollRight;
+ break;
+ default:
+ return TRUE;
+ break;
}
if (drawVerbose >= 2)
printf( "%sNew[%dx%d]Delta[%dx%d]\n", actionNames[action],
- newEventX, newEventY, oldEventX, oldEventY );
-
-
-
- if (scrollTimer) { // Already have a timer
- lastAction = action;
- return TRUE;
- } else {
- lastAction = action;
- timer_busy_count = 0;
- scrollTimer = g_timeout_add(25,(GSourceFunc)ScrollTimerPop,bd); // 25ms delay
- return TRUE;
- }
+ newEventX, newEventY, oldEventX, oldEventY );
} else {
@@ -1306,12 +1155,27 @@ static gint draw_scroll_event(
default:
break;
}
+
}
+ if (event->time < GDK_CURRENT_TIME) return TRUE; //Ignore past events
+
+ if (scrollTimer) { // Already have a timer
+ timer_busy_count++;
+ lastAction = action;
+ return TRUE;
+ } else {
+ lastAction = action;
+ timer_busy_count = 0;
+ scrollTimer = g_timeout_add(timer_interval,(GSourceFunc)ScrollTimerPop,bd); // 250ms delay
+ }
+
if (action != 0) {
- if (drawVerbose >= 2)
- printf( "%s[%dx%d]\n", actionNames[action], bd->lastX, bd->lastY );
- bd->action( bd, bd->context, action, bd->lastX, bd->lastY );
+ if (drawVerbose >= 2) {
+ printf( "%s[%ldx%ld]\n", actionNames[action], bd->lastX, bd->lastY );
+ }
+ bd->action( bd, bd->context, action, (wDrawPix_t)bd->lastX,
+ (wDrawPix_t)bd->lastY);
}
return TRUE;
@@ -1320,8 +1184,8 @@ static gint draw_scroll_event(
static gint draw_leave_event(
- GtkWidget *widget,
- GdkEvent * event )
+ GtkWidget *widget,
+ GdkEvent * event )
{
wlibHelpHideBalloon();
return TRUE;
@@ -1332,14 +1196,19 @@ static gint draw_leave_event(
* Handler for mouse button clicks.
*/
+
+
static gint draw_button_event(
- GtkWidget *widget,
- GdkEventButton *event,
- wDraw_p bd )
+ GtkWidget *widget,
+ GdkEventButton *event,
+ wDraw_p bd )
{
+
wAction_t action = 0;
- if (bd->action == NULL)
+
+ if (bd->action == NULL) {
return TRUE;
+ }
bd->lastX = OUTMAPX(bd, event->x);
bd->lastY = OUTMAPY(bd, event->y);
@@ -1347,35 +1216,43 @@ static gint draw_button_event(
switch ( event->button ) {
case 1: /* left mouse button */
action = event->type==GDK_BUTTON_PRESS?wActionLDown:wActionLUp;
- if (event->type==GDK_2BUTTON_PRESS) action = wActionLDownDouble;
- /*bd->action( bd, bd->context, event->type==GDK_BUTTON_PRESS?wActionLDown:wActionLUp, bd->lastX, bd->lastY );*/
+ if (event->type==GDK_2BUTTON_PRESS) { action = wActionLDownDouble; }
+ break;
+ case 2: /* middle mouse button */
+ action = event->type==GDK_BUTTON_PRESS?wActionMDown:wActionMUp;
+ /*bd->action( bd, bd->context, event->type==GDK_BUTTON_PRESS?wActionLDown:wActionLUp, (wDrawPix_t)bd->lastX, (wDrawPix_t)bd->lastY );*/
break;
case 3: /* right mouse button */
action = event->type==GDK_BUTTON_PRESS?wActionRDown:wActionRUp;
- /*bd->action( bd, bd->context, event->type==GDK_BUTTON_PRESS?wActionRDown:wActionRUp, bd->lastX, bd->lastY );*/
+ /*bd->action( bd, bd->context, event->type==GDK_BUTTON_PRESS?wActionRDown:wActionRUp, (wDrawPix_t)bd->lastX, (wDrawPix_t)bd->lastY );*/
break;
}
if (action != 0) {
- if (drawVerbose >= 2)
- printf( "%s[%dx%d]\n", actionNames[action], bd->lastX, bd->lastY );
- bd->action( bd, bd->context, action, bd->lastX, bd->lastY );
+ if (drawVerbose >= 2) {
+ printf( "%s[%ldx%ld]\n", actionNames[action], bd->lastX, bd->lastY );
+ }
+ bd->action( bd, bd->context, action, (wDrawPix_t)bd->lastX,
+ (wDrawPix_t)bd->lastY );
}
- if (!(bd->option & BD_NOFOCUS))
+
+ if (!(bd->option & BD_NOFOCUS)) {
gtk_widget_grab_focus( bd->widget );
+ }
return TRUE;
}
static gint draw_motion_event(
- GtkWidget *widget,
- GdkEventMotion *event,
- wDraw_p bd )
+ GtkWidget *widget,
+ GdkEventMotion *event,
+ wDraw_p bd )
{
int x, y;
GdkModifierType state;
wAction_t action;
- if (bd->action == NULL)
+ if (bd->action == NULL) {
return TRUE;
+ }
if (event->is_hint) {
gdk_window_get_pointer (event->window, &x, &y, &state);
@@ -1387,6 +1264,8 @@ static gint draw_motion_event(
if (state & GDK_BUTTON1_MASK) {
action = wActionLDrag;
+ } else if (state & GDK_BUTTON2_MASK) {
+ action = wActionMDrag;
} else if (state & GDK_BUTTON3_MASK) {
action = wActionRDrag;
} else {
@@ -1394,48 +1273,54 @@ static gint draw_motion_event(
}
bd->lastX = OUTMAPX(bd, x);
bd->lastY = OUTMAPY(bd, y);
- if (drawVerbose >= 2)
- printf( "%lx: %s[%dx%d] %s\n", (long)bd, actionNames[action], bd->lastX, bd->lastY, event->is_hint?"<Hint>":"<>" );
- bd->action( bd, bd->context, action, bd->lastX, bd->lastY );
- if (!(bd->option & BD_NOFOCUS))
+ if (drawVerbose >= 2) {
+ printf( "%lx: %s[%ldx%ld] %s\n", (long)bd, actionNames[action], bd->lastX,
+ bd->lastY, event->is_hint?"<Hint>":"<>" );
+ }
+ bd->action( bd, bd->context, action, (wDrawPix_t)bd->lastX,
+ (wDrawPix_t)bd->lastY );
+ if (!(bd->option & BD_NOFOCUS)) {
gtk_widget_grab_focus( bd->widget );
+ }
return TRUE;
}
static gint draw_char_release_event(
- GtkWidget * widget,
- GdkEventKey *event,
- wDraw_p bd )
+ GtkWidget * widget,
+ GdkEventKey *event,
+ wDraw_p bd )
{
- GdkModifierType modifiers;
- guint key = event->keyval;
- wModKey_e modKey = wModKey_None;
- switch (key) {
- case GDK_KEY_Alt_L: modKey = wModKey_Alt; break;
- case GDK_KEY_Alt_R: modKey = wModKey_Alt; break;
- case GDK_KEY_Shift_L: modKey = wModKey_Shift; break;
- case GDK_KEY_Shift_R: modKey = wModKey_Shift; break;
- case GDK_KEY_Control_L: modKey = wModKey_Ctrl; break;
- case GDK_KEY_Control_R: modKey = wModKey_Ctrl; break;
- default: ;
- }
+// GdkModifierType modifiers;
+ guint key = event->keyval;
+ wModKey_e modKey = wModKey_None;
+ switch (key) {
+ case GDK_KEY_Alt_L: modKey = wModKey_Alt; break;
+ case GDK_KEY_Alt_R: modKey = wModKey_Alt; break;
+ case GDK_KEY_Shift_L: modKey = wModKey_Shift; break;
+ case GDK_KEY_Shift_R: modKey = wModKey_Shift; break;
+ case GDK_KEY_Control_L: modKey = wModKey_Ctrl; break;
+ case GDK_KEY_Control_R: modKey = wModKey_Ctrl; break;
+ default: ;
+ }
- if (modKey!= wModKey_None && (bd->option & BD_MODKEYS)) {
- bd->action(bd, bd->context, wActionModKey+((int)modKey<<8), bd->lastX, bd->lastY );
- if (!(bd->option & BD_NOFOCUS))
- gtk_widget_grab_focus( bd->widget );
- return TRUE;
- } else {
- return FALSE;
+ if (modKey!= wModKey_None && (bd->option & BD_MODKEYS)) {
+ bd->action(bd, bd->context, wActionModKey+((int)modKey<<8),
+ (wDrawPix_t)bd->lastX, (wDrawPix_t)bd->lastY );
+ if (!(bd->option & BD_NOFOCUS)) {
+ gtk_widget_grab_focus( bd->widget );
}
+ return TRUE;
+ } else {
return FALSE;
+ }
+ return FALSE;
}
static gint draw_char_event(
- GtkWidget * widget,
- GdkEventKey *event,
- wDraw_p bd )
+ GtkWidget * widget,
+ GdkEventKey *event,
+ wDraw_p bd )
{
GdkModifierType modifiers;
guint key = event->keyval;
@@ -1444,9 +1329,12 @@ static gint draw_char_event(
switch (key) {
case GDK_KEY_Escape: key = 0x1B; break;
case GDK_KEY_Return:
+ case GDK_KP_Enter:
modifiers = gtk_accelerator_get_default_mod_mask();
- if (((event->state & modifiers)==GDK_CONTROL_MASK) || ((event->state & modifiers)==GDK_MOD1_MASK))
- extKey = wAccelKey_LineFeed; //If Return plus Control or Alt send in LineFeed
+ if (((event->state & modifiers)==GDK_CONTROL_MASK)
+ || ((event->state & modifiers)==GDK_MOD1_MASK)) {
+ extKey = wAccelKey_LineFeed; //If Return plus Control or Alt send in LineFeed
+ }
key = 0x0D;
break;
case GDK_KEY_Linefeed: key = 0x0A; break;
@@ -1480,31 +1368,40 @@ static gint draw_char_event(
case GDK_KEY_Shift_R: modKey = wModKey_Shift; break;
case GDK_KEY_Control_L: modKey = wModKey_Ctrl; break;
case GDK_KEY_Control_R: modKey = wModKey_Ctrl; break;
- default: ;
+ default: ;
}
if (extKey != wAccelKey_None) {
if ( wlibFindAccelKey( event ) == NULL ) {
- bd->action( bd, bd->context, wActionExtKey + ((int)extKey<<8), bd->lastX, bd->lastY );
+ bd->action( bd, bd->context, wActionExtKey + ((int)extKey<<8),
+ (wDrawPix_t)bd->lastX, (wDrawPix_t)bd->lastY );
+ }
+ if (!(bd->option & BD_NOFOCUS)) {
+ gtk_widget_grab_focus( bd->widget );
}
- if (!(bd->option & BD_NOFOCUS))
- gtk_widget_grab_focus( bd->widget );
return TRUE;
} else if ((key >=wAccelKey_Up) && (key<=wAccelKey_Left) && bd->action) {
- bd->action( bd, bd->context, wActionText+(key<<8), bd->lastX, bd->lastY );
- if (!(bd->option & BD_NOFOCUS))
+ bd->action( bd, bd->context, wActionText+(key<<8), (wDrawPix_t)bd->lastX,
+ (wDrawPix_t)bd->lastY );
+ if (!(bd->option & BD_NOFOCUS)) {
gtk_widget_grab_focus( bd->widget );
+ }
return TRUE;
- } else if (key <= 0xFF && (event->state&(GDK_CONTROL_MASK|GDK_MOD1_MASK)) == 0 && bd->action) {
- bd->action( bd, bd->context, wActionText+(key<<8), bd->lastX, bd->lastY );
- if (!(bd->option & BD_NOFOCUS))
- gtk_widget_grab_focus( bd->widget );
+ } else if (key <= 0xFF && (event->state&(GDK_CONTROL_MASK|GDK_MOD1_MASK)) == 0
+ && bd->action) {
+ bd->action( bd, bd->context, wActionText+(key<<8), (wDrawPix_t)bd->lastX,
+ (wDrawPix_t)bd->lastY );
+ if (!(bd->option & BD_NOFOCUS)) {
+ gtk_widget_grab_focus( bd->widget );
+ }
return TRUE;
} else if (modKey!= wModKey_None && (bd->option & BD_MODKEYS)) {
- bd->action(bd, bd->context, wActionModKey+((int)modKey<<8), bd->lastX, bd->lastY );
- if (!(bd->option & BD_NOFOCUS))
- gtk_widget_grab_focus( bd->widget );
- return TRUE;
+ bd->action(bd, bd->context, wActionModKey+((int)modKey<<8),
+ (wDrawPix_t)bd->lastX, (wDrawPix_t)bd->lastY );
+ if (!(bd->option & BD_NOFOCUS)) {
+ gtk_widget_grab_focus( bd->widget );
+ }
+ return TRUE;
} else {
return FALSE;
}
@@ -1523,17 +1420,17 @@ int XW = 0;
int XH = 0;
int xw, xh, cw, ch;
- wDraw_p wDrawCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- long option,
- wPos_t width,
- wPos_t height,
- void * context,
- wDrawRedrawCallBack_p redraw,
- wDrawActionCallBack_p action )
+wDraw_p wDrawCreate(
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ long option,
+ wWinPix_t width,
+ wWinPix_t height,
+ void * context,
+ wDrawRedrawCallBack_p redraw,
+ wDrawActionCallBack_p action )
{
wDraw_p bd;
@@ -1549,37 +1446,51 @@ int xw, xh, cw, ch;
gtk_drawing_area_size( GTK_DRAWING_AREA(bd->widget), width, height );
gtk_widget_set_size_request( GTK_WIDGET(bd->widget), width, height );
gtk_signal_connect (GTK_OBJECT (bd->widget), "expose_event",
- (GtkSignalFunc) draw_expose_event, bd);
+ (GtkSignalFunc) draw_expose_event, bd);
gtk_signal_connect (GTK_OBJECT(bd->widget),"configure_event",
- (GtkSignalFunc) draw_configure_event, bd);
+ (GtkSignalFunc) draw_configure_event, bd);
gtk_signal_connect (GTK_OBJECT (bd->widget), "motion_notify_event",
- (GtkSignalFunc) draw_motion_event, bd);
+ (GtkSignalFunc) draw_motion_event, bd);
gtk_signal_connect (GTK_OBJECT (bd->widget), "button_press_event",
- (GtkSignalFunc) draw_button_event, bd);
+ (GtkSignalFunc) draw_button_event, bd);
gtk_signal_connect (GTK_OBJECT (bd->widget), "button_release_event",
- (GtkSignalFunc) draw_button_event, bd);
+ (GtkSignalFunc) draw_button_event, bd);
gtk_signal_connect (GTK_OBJECT (bd->widget), "scroll_event",
- (GtkSignalFunc) draw_scroll_event, bd);
+ (GtkSignalFunc) draw_scroll_event, bd);
gtk_signal_connect_after (GTK_OBJECT (bd->widget), "key_press_event",
- (GtkSignalFunc) draw_char_event, bd);
+ (GtkSignalFunc) draw_char_event, bd);
gtk_signal_connect_after (GTK_OBJECT (bd->widget), "key_release_event",
- (GtkSignalFunc) draw_char_release_event, bd);
+ (GtkSignalFunc) draw_char_release_event, bd);
gtk_signal_connect (GTK_OBJECT (bd->widget), "leave_notify_event",
- (GtkSignalFunc) draw_leave_event, bd);
+ (GtkSignalFunc) draw_leave_event, bd);
gtk_widget_set_can_focus(bd->widget,!(option & BD_NOFOCUS));
//if (!(option & BD_NOFOCUS))
// GTK_WIDGET_SET_FLAGS(GTK_WIDGET(bd->widget), GTK_CAN_FOCUS);
gtk_widget_set_events (bd->widget, GDK_EXPOSURE_MASK
- | GDK_LEAVE_NOTIFY_MASK
- | GDK_BUTTON_PRESS_MASK
- | GDK_BUTTON_RELEASE_MASK
- | GDK_SCROLL_MASK
- | GDK_POINTER_MOTION_MASK
- | GDK_POINTER_MOTION_HINT_MASK
- | GDK_KEY_PRESS_MASK
- | GDK_KEY_RELEASE_MASK );
+ | GDK_LEAVE_NOTIFY_MASK
+ | GDK_BUTTON_PRESS_MASK
+ | GDK_BUTTON_RELEASE_MASK
+ | GDK_SCROLL_MASK
+ | GDK_POINTER_MOTION_MASK
+ | GDK_POINTER_MOTION_HINT_MASK
+ | GDK_KEY_PRESS_MASK
+ | GDK_KEY_RELEASE_MASK );
bd->lastColor = -1;
- bd->dpi = 75;
+
+ double dpi;
+
+ wPrefGetFloat(PREFSECTION, DPISET, &dpi, 96.0);
+
+ if ( width <= 0 || height <= 0 ) {
+ fprintf( stderr, "wDrawCreate bad size %ldx%ld\n", width, height );
+ if ( width <= 0 ) {
+ width = 100;
+ }
+ if ( height <= 0 ) {
+ height = 100;
+ }
+ }
+ bd->dpi = dpi;
bd->maxW = bd->w = width;
bd->maxH = bd->h = height;
@@ -1587,19 +1498,21 @@ int xw, xh, cw, ch;
wlibControlGetSize( (wControl_p)bd );
gtk_widget_realize( bd->widget );
bd->pixmap = gdk_pixmap_new( bd->widget->window, width, height, -1 );
- bd->temp_surface = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, width,height );
+ bd->temp_surface = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, width,
+ height );
wDrawClear(bd);
bd->gc = gdk_gc_new( parent->gtkwin->window );
gdk_gc_copy( bd->gc, parent->gtkwin->style->base_gc[GTK_STATE_NORMAL] );
-{
- GdkCursor * cursor;
- cursor = gdk_cursor_new ( GDK_TCROSS );
- gdk_window_set_cursor ( bd->widget->window, cursor);
- gdk_cursor_destroy (cursor);
-}
+ {
+ GdkCursor * cursor;
+ cursor = gdk_cursor_new ( GDK_TCROSS );
+ gdk_window_set_cursor ( bd->widget->window, cursor);
+ gdk_cursor_destroy (cursor);
+ }
#ifdef LATER
- if (labelStr)
+ if (labelStr) {
bd->labelW = gtkAddLabel( (wControl_p)bd, labelStr );
+ }
#endif
gtk_widget_show( bd->widget );
wlibAddButton( (wControl_p)bd );
@@ -1614,14 +1527,19 @@ int xw, xh, cw, ch;
*
*******************************************************************************/
-wDraw_p wBitMapCreate( wPos_t w, wPos_t h, int arg )
+wDraw_p wBitMapCreate( wWinPix_t w, wWinPix_t h, int arg )
{
wDraw_p bd;
bd = (wDraw_p)wlibAlloc( gtkMainW, B_DRAW, 0, 0, NULL, sizeof *bd, NULL );
bd->lastColor = -1;
- bd->dpi = 75;
+
+ double dpi;
+
+ wPrefGetFloat(PREFSECTION, DPISET, &dpi, 96.0);
+
+ bd->dpi = dpi;
bd->maxW = bd->w = w;
bd->maxH = bd->h = h;
@@ -1655,7 +1573,8 @@ wBool_t wBitMapDelete( wDraw_p d )
* Background
*
******************************************************************************/
-int wDrawSetBackground( wDraw_p bd, char * path, char ** error) {
+int wDrawSetBackground( wDraw_p bd, char * path, char ** error)
+{
GError *err = NULL;
@@ -1677,10 +1596,41 @@ int wDrawSetBackground( wDraw_p bd, char * path, char ** error) {
}
-void wDrawShowBackground( wDraw_p bd, wPos_t pos_x, wPos_t pos_y, wPos_t size, wAngle_t angle, int screen) {
+/**
+ * Use a loaded background in another context.
+ *
+ * \param from context with background
+ * \param to context to get a reference to the existing background
+ */
+
+void
+wDrawCloneBackground(wDraw_p from, wDraw_p to)
+{
+ if (from->background) {
+ to->background = from->background;
+ } else {
+ to->background = NULL;
+ }
+}
+
+/**
+* Draw background to screen. The background will be sized and rotated before being shown. The bitmap
+* is scaled so that the width is equal to size. The height is changed proportionally.
+*
+* \param bd drawing context
+* \param pos_x, pos_y bitmap position
+* \param size desired width after scaling
+* \param angle
+* \param screen visibility of bitmap in percent
+*/
+
+void wDrawShowBackground( wDraw_p bd, wWinPix_t pos_x, wWinPix_t pos_y,
+ wWinPix_t size, wAngle_t angle, int screen)
+{
if (bd->background) {
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, wDrawColorWhite, bd->bTempMode?wDrawOptTemp:0 );
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid,
+ wDrawColorWhite, bd->bTempMode?wDrawOptTemp:0 );
cairo_save(cairo);
int pixels_width = gdk_pixbuf_get_width(bd->background);
int pixels_height = gdk_pixbuf_get_height(bd->background);
@@ -1697,19 +1647,24 @@ void wDrawShowBackground( wDraw_p bd, wPos_t pos_x, wPos_t pos_y, wPos_t size, w
}
cairo_set_operator(cairo, CAIRO_OPERATOR_OVER);
double rad = M_PI*(angle/180);
- posy = (double)bd->h-((pixels_height*fabs(cos(rad))+pixels_width*fabs(sin(rad)))*scale)-posy;
+ posy = (double)bd->h-((pixels_height*fabs(cos(rad))+pixels_width*fabs(sin(
+ rad)))*scale)-posy;
//width = (double)(pixels_width*scale);
//height = (double)(pixels_height*scale);
cairo_translate(cairo,posx,posy);
cairo_scale(cairo, scale, scale);
- cairo_translate(cairo, fabs(pixels_width/2.0*cos(rad))+fabs(pixels_height/2.0*sin(rad)),
- fabs(pixels_width/2.0*sin(rad))+fabs(pixels_height/2.0*cos(rad)));
+ cairo_translate(cairo, fabs(pixels_width/2.0*cos(rad))+fabs(
+ pixels_height/2.0*sin(rad)),
+ fabs(pixels_width/2.0*sin(rad))+fabs(pixels_height/2.0*cos(rad)));
cairo_rotate(cairo, M_PI*(angle/180.0));
// We need to clip around the image, or cairo will paint garbage data
- cairo_rectangle(cairo, -pixels_width/2.0, -pixels_height/2.0, pixels_width, pixels_height);
+ cairo_rectangle(cairo, -pixels_width/2.0, -pixels_height/2.0, pixels_width,
+ pixels_height);
cairo_clip(cairo);
- gdk_cairo_set_source_pixbuf(cairo, bd->background, -pixels_width/2.0, -pixels_height/2.0);
- cairo_pattern_t *mask = cairo_pattern_create_rgba (1.0,1.0,1.0,(100.0-screen)/100.0);
+ gdk_cairo_set_source_pixbuf(cairo, bd->background, -pixels_width/2.0,
+ -pixels_height/2.0);
+ cairo_pattern_t *mask = cairo_pattern_create_rgba (1.0,1.0,1.0,
+ (100.0-screen)/100.0);
cairo_mask(cairo,mask);
cairo_pattern_destroy(mask);
cairo_restore(cairo);
diff --git a/app/wlib/gtklib/gtkint.h b/app/wlib/gtklib/gtkint.h
index 410fd7f..e3757a4 100644
--- a/app/wlib/gtklib/gtkint.h
+++ b/app/wlib/gtklib/gtkint.h
@@ -1,4 +1,4 @@
-/** \file gtkint.h
+/** \file gtkint.h
* Internal definitions for the gtk-library
*/
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef GTKINT_H
@@ -42,24 +42,16 @@
extern wWin_p gtkMainW;
-#ifdef CURSOR_SURFACE
-typedef struct {
- cairo_surface_t* surface;
- wPos_t width;
- wPos_t height;
- wBool_t show;
-} wCursorSurface_t, * wSurface_p;
-#endif
-
typedef enum {
- W_MAIN, W_POPUP,
- B_BUTTON, B_CANCEL, B_POPUP, B_TEXT, B_INTEGER, B_FLOAT,
- B_LIST, B_DROPLIST, B_COMBOLIST,
- B_RADIO, B_TOGGLE,
- B_DRAW, B_MENU, B_MULTITEXT, B_MESSAGE, B_LINES,
- B_MENUITEM, B_BOX,
- B_BITMAP, B_STATUS } wType_e;
+ W_MAIN, W_POPUP,
+ B_BUTTON, B_CANCEL, B_POPUP, B_TEXT, B_INTEGER, B_FLOAT,
+ B_LIST, B_DROPLIST, B_COMBOLIST,
+ B_RADIO, B_TOGGLE,
+ B_DRAW, B_MENU, B_MULTITEXT, B_MESSAGE, B_LINES,
+ B_MENUITEM, B_BOX,
+ B_BITMAP, B_STATUS
+} wType_e;
typedef void (*repaintProcCallback_p)( wControl_p );
typedef void (*doneProcCallback_p)( wControl_p b );
@@ -69,11 +61,10 @@ typedef void (*setTriggerCallback_p)( wControl_p b );
wControl_p next; \
wControl_p synonym; \
wWin_p parent; \
- wPos_t origX, origY; \
- wPos_t realX, realY; \
- wPos_t default_size_x, default_size_y; \
- wPos_t labelW; \
- wPos_t w, h; \
+ wWinPix_t origX, origY; \
+ wWinPix_t realX, realY; \
+ wWinPix_t labelW; \
+ wWinPix_t w, h; \
int maximize_initially; \
long option; \
const char * labelStr; \
@@ -81,74 +72,73 @@ typedef void (*setTriggerCallback_p)( wControl_p b );
GtkWidget * widget; \
GtkWidget * label; \
doneProcCallback_p doneProc; \
- /* CURSOR_SURFACE wCursorSurface_t cursor_surface;*/ \
wBool_t outline; \
void * data;
struct wWin_t {
- WOBJ_COMMON
- GtkWidget *gtkwin; /**< GTK window */
- wPos_t lastX, lastY;
- wControl_p first, last;
- wWinCallBack_p winProc; /**< window procedure */
- wBool_t shown; /**< visibility state */
- const char * nameStr; /**< window name (not title) */
- GtkWidget * menubar; /**< menubar handle (if exists) */
- int menu_height;
- GdkGC * gc; /**< graphics context */
- int gc_linewidth; /**< ??? */
- wBool_t busy;
- int resizeTimer; /** resizing **/
- int resizeW,resizeH;
- int timer_idle_count;
- int timer_busy_count;
- int modalLevel;
- };
+ WOBJ_COMMON
+ GtkWidget *gtkwin; /**< GTK window */
+ wWinPix_t lastX, lastY;
+ wControl_p first, last;
+ wWinCallBack_p winProc; /**< window procedure */
+ wBool_t shown; /**< visibility state */
+ const char * nameStr; /**< window name (not title) */
+ GtkWidget * menubar; /**< menubar handle (if exists) */
+ int menu_height;
+ GdkGC * gc; /**< graphics context */
+ int gc_linewidth; /**< ??? */
+ wBool_t busy;
+ int resizeTimer; /** resizing **/
+ int resizeW,resizeH;
+ int timer_idle_count;
+ int timer_busy_count;
+ int modalLevel;
+};
struct wControl_t {
- WOBJ_COMMON
- };
-
+ WOBJ_COMMON
+};
+
typedef struct wListItem_t * wListItem_p;
struct wList_t {
- WOBJ_COMMON
+ WOBJ_COMMON
// GtkWidget *list;
- int count;
- int number;
- int colCnt;
- wPos_t *colWidths;
- wBool_t *colRightJust;
- GtkListStore *listStore;
- GtkWidget *treeView;
- int last;
- wPos_t listX;
- long * valueP;
- wListCallBack_p action;
- int recursion;
- int editted;
- int editable;
- };
+ int count;
+ int number;
+ int colCnt;
+ wWinPix_t *colWidths;
+ wBool_t *colRightJust;
+ GtkListStore *listStore;
+ GtkWidget *treeView;
+ int last;
+ wWinPix_t listX;
+ long * valueP;
+ wListCallBack_p action;
+ int recursion;
+ int editted;
+ int editable;
+};
struct wListItem_t {
- wBool_t active;
- void * itemData;
- char * label;
- GtkLabel * labelG;
- wBool_t selected;
- wList_p listP;
- };
+ wBool_t active;
+ void * itemData;
+ char * label;
+ GtkLabel * labelG;
+ wBool_t selected;
+ wList_p listP;
+};
#define gtkIcon_bitmap (1)
#define gtkIcon_pixmap (2)
struct wIcon_t {
- int gtkIconType;
- wPos_t w;
- wPos_t h;
- wDrawColor color;
- const void * bits;
- };
+ int gtkIconType;
+ wWinPix_t w;
+ wWinPix_t h;
+ wDrawColor color;
+ const void * bits;
+};
extern char wConfigName[];
extern wDrawColor wDrawColorWhite;
@@ -157,36 +147,42 @@ extern wDrawColor wDrawColorBlack;
/* boxes.c */
-void wlibDrawBox(wWin_p win, wBoxType_e style, wPos_t x, wPos_t y, wPos_t w, wPos_t h);
+void wlibDrawBox(wWin_p win, wBoxType_e style, wWinPix_t x, wWinPix_t y,
+ wWinPix_t w, wWinPix_t h);
/* button.c */
-void wlibSetLabel(GtkWidget *widget, long option, const char *labelStr, GtkLabel **labelG, GtkWidget **imageG);
+void wlibSetLabel(GtkWidget *widget, long option, const char *labelStr,
+ GtkLabel **labelG, GtkWidget **imageG);
void wlibButtonDoAction(wButton_p bb);
struct wButton_t {
- WOBJ_COMMON
- GtkLabel * labelG;
- GtkWidget * imageG;
- wButtonCallBack_p action;
- int busy;
- int recursion;
+ WOBJ_COMMON
+ GtkLabel * labelG;
+ GtkWidget * imageG;
+ wButtonCallBack_p action;
+ int busy;
+ int recursion;
+ long timer_id;
+ int timer_count;
+ int timer_state;
};
/* color.c */
typedef struct {
- unsigned char red;
- unsigned char green;
- unsigned char blue;
- GdkColor normalColor;
- GdkColor invertColor;
- long rgb;
- int colorChar;
+ unsigned char red;
+ unsigned char green;
+ unsigned char blue;
+ GdkColor normalColor;
+ GdkColor invertColor;
+ long rgb;
+ int colorChar;
} colorMap_t;
GdkColor *wlibGetColor(wDrawColor color, wBool_t normal);
/* control.c */
-wBool_t wControlExpose (GtkWidget * widget, GdkEventExpose * event, wControl_p b);
+wBool_t wControlExpose (GtkWidget * widget, GdkEventExpose * event,
+ wControl_p b);
/* droplist.c */
enum columns {
@@ -201,13 +197,19 @@ void wDropListClear(wList_p b);
void *wDropListGetItemContext(wList_p b, wIndex_t inx);
void wDropListAddValue(wList_p b, char *text, wListItem_p data);
void wDropListSetIndex(wList_p b, int val);
-wBool_t wDropListSetValues(wList_p b, wIndex_t row, const char *labelStr, wIcon_p bm, void *itemData);
-wList_p wDropListCreate(wWin_p parent, wPos_t x, wPos_t y, const char *helpStr, const char *labelStr, long option, long number, wPos_t width, long *valueP, wListCallBack_p action, void *data);
+wBool_t wDropListSetValues(wList_p b, wIndex_t row, const char *labelStr,
+ wIcon_p bm, void *itemData);
+wList_p wDropListCreate(wWin_p parent, wWinPix_t x, wWinPix_t y,
+ const char *helpStr, const char *labelStr, long option, long number,
+ wWinPix_t width, long *valueP, wListCallBack_p action, void *data);
/* filesel.c */
/* font.c */
-PangoLayout *wlibFontCreatePangoLayout(GtkWidget *widget, void *cairo, wFont_p fp, wFontSize_t fs, const char *s, int *width_p, int *height_p, int *ascent_p, int *descent_p, int *baseline_p);
+PangoLayout *wlibFontCreatePangoLayout(GtkWidget *widget, void *cairo,
+ wFont_p fp, wFontSize_t fs, const char *s, wDrawPix_t *width_p,
+ wDrawPix_t *height_p, wDrawPix_t *ascent_p, wDrawPix_t *descent_p,
+ wDrawPix_t *baseline_p);
void wlibFontDestroyPangoLayout(PangoLayout *layout);
const char *wlibFontTranslate(wFont_p fp);
@@ -217,16 +219,20 @@ const char *wlibFontTranslate(wFont_p fp);
void wlibLineShow(wLine_p bl, wBool_t visible);
/* list.c */
-int CompareListData(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data);
+int CompareListData(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter,
+ gpointer data);
/* liststore.c */
wListItem_p wlibListItemGet(GtkListStore *ls, wIndex_t inx, GList **childR);
void *wlibListStoreGetContext(GtkListStore *ls, int inx);
void wlibListStoreClear(GtkListStore *listStore);
GtkListStore *wlibNewListStore(int colCnt);
-void wlibListStoreSetPixbuf(GtkListStore *ls, GtkTreeIter *iter, GdkPixbuf *pixbuf);
-int wlibListStoreAddData(GtkListStore *ls, GdkPixbuf *pixbuf, int cols, wListItem_p id);
-int wlibListStoreUpdateValues(GtkListStore *ls, int row, int cols, char *labels, wIcon_p bm);
+void wlibListStoreSetPixbuf(GtkListStore *ls, GtkTreeIter *iter,
+ GdkPixbuf *pixbuf);
+int wlibListStoreAddData(GtkListStore *ls, GdkPixbuf *pixbuf, int cols,
+ wListItem_p id);
+int wlibListStoreUpdateValues(GtkListStore *ls, int row, int cols, char *labels,
+ wIcon_p bm);
/* main.c */
char *wlibGetAppName(void);
@@ -236,20 +242,21 @@ int getMlistOrigin(wMenuList_p ml, GList **pChildren);
/* misc.c */
typedef struct accelData_t {
- wAccelKey_e key;
- int modifier;
- wAccelKeyCallBack_p action;
- void * data;
+ wAccelKey_e key;
+ int modifier;
+ wAccelKeyCallBack_p action;
+ void * data;
} accelData_t;
GdkPixbuf* wlibPixbufFromXBM(wIcon_p ip);
int wlibAddLabel(wControl_p b, const char *labelStr);
-void *wlibAlloc(wWin_p parent, wType_e type, wPos_t origX, wPos_t origY, const char *labelStr, int size, void *data);
+void *wlibAlloc(wWin_p parent, wType_e type, wWinPix_t origX, wWinPix_t origY,
+ const char *labelStr, int size, void *data);
void wlibComputePos(wControl_p b);
void wlibControlGetSize(wControl_p b);
void wlibAddButton(wControl_p b);
-wControl_p wlibGetControlFromPos(wWin_p win, wPos_t x, wPos_t y);
+wControl_p wlibGetControlFromPos(wWin_p win, wWinPix_t x, wWinPix_t y);
char *wlibConvertInput(const char *inString);
char *wlibConvertOutput(const char *inString);
struct accelData_t *wlibFindAccelKey(GdkEventKey *event);
@@ -264,48 +271,56 @@ GdkPixbuf *wlibMakePixbuf(wIcon_p ip);
/* print.c */
struct wDraw_t {
- WOBJ_COMMON
- void * context;
- wDrawActionCallBack_p action;
- wDrawRedrawCallBack_p redraw;
-
- GdkPixmap * pixmap;
- GdkPixmap * pixmapBackup;
- cairo_surface_t * temp_surface;
-
- double dpi;
-
- GdkGC * gc;
- wDrawWidth lineWidth;
- wDrawOpts opts;
- wPos_t maxW;
- wPos_t maxH;
- unsigned long lastColor;
- wBool_t lastColorInverted;
- const char * helpStr;
-
- wPos_t lastX;
- wPos_t lastY;
-
- wBool_t delayUpdate;
- cairo_t *printContext;
- cairo_surface_t *curPrintSurface;
- GdkPixbuf * background;
-
- wBool_t bTempMode;
- };
+ WOBJ_COMMON
+ void * context;
+ wDrawActionCallBack_p action;
+ wDrawRedrawCallBack_p redraw;
+
+ GdkPixmap * pixmap;
+ GdkPixmap * pixmapBackup;
+ cairo_surface_t * temp_surface;
+
+ double dpi;
+
+ GdkGC * gc;
+ wDrawWidth lineWidth;
+ wDrawOpts opts;
+ wWinPix_t maxW;
+ wWinPix_t maxH;
+ unsigned long lastColor;
+ wBool_t lastColorInverted;
+ const char * helpStr;
+
+ wWinPix_t lastX;
+ wWinPix_t lastY;
+
+ wBool_t delayUpdate;
+ cairo_t *printContext;
+ cairo_surface_t *curPrintSurface;
+ GdkPixbuf * background;
+
+ wBool_t bTempMode;
+};
void WlibApplySettings(GtkPrintOperation *op);
void WlibSaveSettings(GtkPrintOperation *op);
-void psPrintLine(wPos_t x0, wPos_t y0, wPos_t x1, wPos_t y1, wDrawWidth width, wDrawLineType_e lineType, wDrawColor color, wDrawOpts opts);
-void psPrintArc(wPos_t x0, wPos_t y0, wPos_t r, double angle0, double angle1, wBool_t drawCenter, wDrawWidth width, wDrawLineType_e lineType, wDrawColor color, wDrawOpts opts);
-void psPrintFillRectangle(wPos_t x0, wPos_t y0, wPos_t x1, wPos_t y1, wDrawColor color, wDrawOpts opts);
-void psPrintFillPolygon(wPos_t p[][2], wPolyLine_e type[], int cnt, wDrawColor color, wDrawOpts opts, int fill, int open);
-void psPrintFillCircle(wPos_t x0, wPos_t y0, wPos_t r, wDrawColor color, wDrawOpts opts);
-void psPrintString(wPos_t x, wPos_t y, double a, char *s, wFont_p fp, double fs, wDrawColor color, wDrawOpts opts);
-static void WlibGetPaperSize(void);
+void psPrintLine(wDrawPix_t x0, wDrawPix_t y0, wDrawPix_t x1, wDrawPix_t y1,
+ wDrawWidth width, wDrawLineType_e lineType, wDrawColor color, wDrawOpts opts);
+void psPrintArc(wDrawPix_t x0, wDrawPix_t y0, wDrawPix_t r, double angle0,
+ double angle1, wBool_t drawCenter, wDrawWidth width, wDrawLineType_e lineType,
+ wDrawColor color, wDrawOpts opts);
+void psPrintFillRectangle(wDrawPix_t x0, wDrawPix_t y0, wDrawPix_t x1,
+ wDrawPix_t y1, wDrawColor color, wDrawOpts opts);
+void psPrintFillPolygon(wDrawPix_t p[][2], wPolyLine_e type[], int cnt,
+ wDrawColor color, wDrawOpts opts, int fill, int open);
+void psPrintFillCircle(wDrawPix_t x0, wDrawPix_t y0, wDrawPix_t r,
+ wDrawColor color, wDrawOpts opts);
+void psPrintString(wDrawPix_t x, wDrawPix_t y, double a, char *s, wFont_p fp,
+ double fs, wDrawColor color, wDrawOpts opts);
+//static void WlibGetPaperSize(void);
/* single.c */
+void wlibStringUpdate();
/* splash.c */
@@ -321,12 +336,15 @@ void wlibHelpHideBalloon();
/* treeview.c */
void wlibTreeViewSetSelected(wList_p b, int index);
-GtkWidget *wlibNewTreeView(GtkListStore *ls, int showTitles, int multiSelection);
+GtkWidget *wlibNewTreeView(GtkListStore *ls, int showTitles,
+ int multiSelection);
int wlibTreeViewAddColumns(GtkWidget *tv, int count);
int wlibAddColumnTitles(GtkWidget *tv, const char **titles);
-int wlibTreeViewAddData(GtkWidget *tv, int cols, char *label, GdkPixbuf *pixbuf, wListItem_p userData);
+int wlibTreeViewAddData(GtkWidget *tv, int cols, char *label, GdkPixbuf *pixbuf,
+ wListItem_p userData);
void wlibTreeViewAddRow(wList_p b, char *label, wIcon_p bm, wListItem_p id_p);
-gboolean changeSelection(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer data);
+gboolean changeSelection(GtkTreeSelection *selection, GtkTreeModel *model,
+ GtkTreePath *path, gboolean path_currently_selected, gpointer data);
int wTreeViewGetCount(wList_p b);
void wTreeViewClear(wList_p b);
@@ -334,7 +352,8 @@ void *wTreeViewGetItemContext(wList_p b, int row);
/* window.c */
void wlibDoModal(wWin_p win0, wBool_t modal);
-wBool_t catch_shift_ctrl_alt_keys(GtkWidget *widget, GdkEventKey *event, void *data);
+wBool_t catch_shift_ctrl_alt_keys(GtkWidget *widget, GdkEventKey *event,
+ void *data);
/* wpref.c */
diff --git a/app/wlib/gtklib/help.c b/app/wlib/gtklib/help.c
index 8f2766d..f062b83 100644
--- a/app/wlib/gtklib/help.c
+++ b/app/wlib/gtklib/help.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#define GTK_DISABLE_SINGLE_INCLUDES
@@ -28,7 +28,8 @@
#include <gtk/gtk.h>
#include <gdk/gdk.h>
-#include "misc.h"
+//#include "misc.h"
+extern const char * GetCurCommandName();
#include "gtkint.h"
#include "i18n.h"
@@ -45,29 +46,31 @@
static void
DoHelpMenu(void *data)
{
- int func = (intptr_t)data;
+ int func = (intptr_t)data;
- const char * topic;
+ const char * topic;
- switch (func) {
- case 1:
- wHelp("index");
- break;
+ switch (func) {
+ case 1:
+ wHelp("contents");
+ break;
- case 3:
- topic = GetCurCommandName();
- if (topic && topic[0])
- wHelp(topic);
- break;
+ case 3:
+ topic = GetCurCommandName();
+ if (topic && topic[0]) {
+ wHelp(topic);
+ }
+ break;
- default:
- break;
- }
+ default:
+ break;
+ }
- return;
+ return;
}
-void wDoAccelHelp(wAccelKey_e key, void * context) {
+void wDoAccelHelp(wAccelKey_e key, void * context)
+{
DoHelpMenu(context);
}
@@ -80,6 +83,6 @@ void wDoAccelHelp(wAccelKey_e key, void * context) {
void wMenuAddHelp(wMenu_p m)
{
- wMenuPushCreate(m, NULL, _("&Contents"), 0, DoHelpMenu, (void*)1);
- wMenuPushCreate(m, NULL, _("Co&mmand Context help"), 0, DoHelpMenu, (void*)3);
+ wMenuPushCreate(m, NULL, _("&Contents"), 0, DoHelpMenu, (void*)1);
+ wMenuPushCreate(m, NULL, _("Co&mmand Context help"), 0, DoHelpMenu, (void*)3);
}
diff --git a/app/wlib/gtklib/ixhelp.c b/app/wlib/gtklib/ixhelp.c
index 5079f61..80b579c 100644
--- a/app/wlib/gtklib/ixhelp.c
+++ b/app/wlib/gtklib/ixhelp.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
@@ -77,34 +77,34 @@ static GtkWidget *contents_view; /** handle for the help contents pane */
static GtkWidget*
lookup_widget(GtkWidget *widget, const gchar *widget_name)
{
- GtkWidget *parent, *found_widget;
+ GtkWidget *parent, *found_widget;
- for (;;) {
- if (GTK_IS_MENU(widget)) {
- parent = gtk_menu_get_attach_widget(GTK_MENU(widget));
- } else {
- parent = widget->parent;
- }
+ for (;;) {
+ if (GTK_IS_MENU(widget)) {
+ parent = gtk_menu_get_attach_widget(GTK_MENU(widget));
+ } else {
+ parent = widget->parent;
+ }
- if (!parent) {
- parent = (GtkWidget*) g_object_get_data(G_OBJECT(widget), "GladeParentKey");
- }
+ if (!parent) {
+ parent = (GtkWidget*) g_object_get_data(G_OBJECT(widget), "GladeParentKey");
+ }
- if (parent == NULL) {
- break;
- }
+ if (parent == NULL) {
+ break;
+ }
- widget = parent;
- }
+ widget = parent;
+ }
- found_widget = (GtkWidget*) g_object_get_data(G_OBJECT(widget),
- widget_name);
+ found_widget = (GtkWidget*) g_object_get_data(G_OBJECT(widget),
+ widget_name);
- if (!found_widget) {
- g_warning("Widget not found: %s", widget_name);
- }
+ if (!found_widget) {
+ g_warning("Widget not found: %s", widget_name);
+ }
- return found_widget;
+ return found_widget;
}
@@ -124,21 +124,21 @@ lookup_widget(GtkWidget *widget, const gchar *widget_name)
GtkWidget *
CreateHPaned(GtkBox *container, char *property)
{
- GtkWidget *hpaned;
- long posSlider;
+ GtkWidget *hpaned;
+ long posSlider;
- /* the horizontal slider */
- hpaned = gtk_hpaned_new();
- gtk_container_set_border_width(GTK_CONTAINER(hpaned), 6);
+ /* the horizontal slider */
+ hpaned = gtk_hpaned_new();
+ gtk_container_set_border_width(GTK_CONTAINER(hpaned), 6);
- wPrefGetInteger(HTMLHELPSECTION, SLIDERPREFNAME, &posSlider, SLIDERPOSDEFAULT);
- gtk_paned_set_position(GTK_PANED(hpaned), (int)posSlider);
+ wPrefGetInteger(HTMLHELPSECTION, SLIDERPREFNAME, &posSlider, SLIDERPOSDEFAULT);
+ gtk_paned_set_position(GTK_PANED(hpaned), (int)posSlider);
- /* pack the horizontal slider into the main window */
- gtk_box_pack_start(container, hpaned, TRUE, TRUE, 0);
- gtk_widget_show(hpaned);
+ /* pack the horizontal slider into the main window */
+ gtk_box_pack_start(container, hpaned, TRUE, TRUE, 0);
+ gtk_widget_show(hpaned);
- return (hpaned);
+ return (hpaned);
}
/**
@@ -155,69 +155,69 @@ CreateHPaned(GtkBox *container, char *property)
static gboolean
DestroyHelpWindow(GtkWidget *win, GdkEvent *event, void *ptr)
{
- int i;
- GtkWidget *widget;
- char tmp[ 20 ];
+ int i;
+ GtkWidget *widget;
+ char tmp[ 20 ];
- gint x, y;
+ gint x, y;
- /* get the slider position and save it */
- widget = lookup_widget(win, PANED);
- i = gtk_paned_get_position(GTK_PANED(widget));
- wPrefSetInteger(HTMLHELPSECTION, SLIDERPREFNAME, i);
+ /* get the slider position and save it */
+ widget = lookup_widget(win, PANED);
+ i = gtk_paned_get_position(GTK_PANED(widget));
+ wPrefSetInteger(HTMLHELPSECTION, SLIDERPREFNAME, i);
- /* get the window position */
- gtk_window_get_position((GtkWindow *)win, &x, &y);
- sprintf(tmp, "%d %d", x, y);
- wPrefSetString(HTMLHELPSECTION, WINDOWPOSPREFNAME, tmp);
+ /* get the window position */
+ gtk_window_get_position((GtkWindow *)win, &x, &y);
+ sprintf(tmp, "%d %d", x, y);
+ wPrefSetString(HTMLHELPSECTION, WINDOWPOSPREFNAME, tmp);
- /* get the window size */
- gtk_window_get_size((GtkWindow *)win , &x, &y);
- sprintf(tmp, "%d %d", x, y);
- wPrefSetString(HTMLHELPSECTION, WINDOWSIZEPREFNAME, tmp);
+ /* get the window size */
+ gtk_window_get_size((GtkWindow *)win, &x, &y);
+ sprintf(tmp, "%d %d", x, y);
+ wPrefSetString(HTMLHELPSECTION, WINDOWSIZEPREFNAME, tmp);
- gtk_widget_hide(win);
- return TRUE;
+ gtk_widget_hide(win);
+ return TRUE;
}
void back_button_clicked(GtkWidget *widget, gpointer data)
{
- webkit_web_view_go_back(WEBKIT_WEB_VIEW(data));
+ webkit_web_view_go_back(WEBKIT_WEB_VIEW(data));
}
void forward_button_clicked(GtkWidget *widget, gpointer data)
{
- webkit_web_view_go_forward(WEBKIT_WEB_VIEW(data));
+ webkit_web_view_go_forward(WEBKIT_WEB_VIEW(data));
}
void home_button_clicked(GtkWidget *widget, gpointer data)
{
- load_into_view("index.html", MAIN_VIEW);
+ load_into_view("index.html", MAIN_VIEW);
}
/* Toggles the contents pane */
void contents_button_clicked(GtkWidget *widget, gpointer data)
{
- if (gtk_paned_get_position(GTK_PANED(data)) < 50) {
- gtk_paned_set_position(GTK_PANED(data), 370);
- } else {
- gtk_paned_set_position(GTK_PANED(data), 0);
- }
+ if (gtk_paned_get_position(GTK_PANED(data)) < 50) {
+ gtk_paned_set_position(GTK_PANED(data), 370);
+ } else {
+ gtk_paned_set_position(GTK_PANED(data), 0);
+ }
}
gboolean contents_click_handler(
- WebKitWebView *web_view,
- WebKitWebFrame *frame,
- WebKitNetworkRequest *request,
- WebKitWebNavigationAction *navigation_action,
- WebKitWebPolicyDecision *policy_decision,
- gpointer data)
+ WebKitWebView *web_view,
+ WebKitWebFrame *frame,
+ WebKitNetworkRequest *request,
+ WebKitWebNavigationAction *navigation_action,
+ WebKitWebPolicyDecision *policy_decision,
+ gpointer data)
{
- webkit_web_view_load_uri(WEBKIT_WEB_VIEW(data),
- webkit_network_request_get_uri(request));
+ webkit_web_view_load_uri(WEBKIT_WEB_VIEW(data),
+ webkit_network_request_get_uri(request));
- return TRUE;
+ return TRUE;
}
/**
@@ -225,45 +225,45 @@ gboolean contents_click_handler(
*/
void initialize_buttons(GtkWidget *main_vbox, GtkWidget *content_hpane)
{
- GtkWidget *buttons_hbuttonbox;
- GtkWidget *back_button;
- GtkWidget *forward_button;
- GtkWidget *home_button;
- GtkWidget *contents_button;
-
- // define and attach signals to buttons
- back_button = gtk_button_new_with_label(_("Back"));
- g_signal_connect(back_button, "clicked", G_CALLBACK(back_button_clicked),
- G_OBJECT(main_view));
-
- forward_button = gtk_button_new_with_label(_("Forward"));
- g_signal_connect(forward_button, "clicked", G_CALLBACK(forward_button_clicked),
- G_OBJECT(main_view));
-
- home_button = gtk_button_new_with_label(_("Home"));
- g_signal_connect(home_button, "clicked", G_CALLBACK(home_button_clicked),
- G_OBJECT(main_view));
-
- contents_button = gtk_button_new_with_label(_("Contents"));
- g_signal_connect(contents_button, "clicked",
- G_CALLBACK(contents_button_clicked), G_OBJECT(content_hpane));
-
- // button layout
- buttons_hbuttonbox = gtk_hbutton_box_new();
- gtk_container_add(GTK_CONTAINER(buttons_hbuttonbox), back_button);
- gtk_container_add(GTK_CONTAINER(buttons_hbuttonbox), forward_button);
- gtk_container_add(GTK_CONTAINER(buttons_hbuttonbox), home_button);
- gtk_container_add(GTK_CONTAINER(buttons_hbuttonbox), contents_button);
- gtk_box_pack_start(GTK_BOX(main_vbox), buttons_hbuttonbox, FALSE, TRUE, 0);
- gtk_box_set_spacing(GTK_BOX(buttons_hbuttonbox), 6);
- gtk_button_box_set_layout(GTK_BUTTON_BOX(buttons_hbuttonbox),
- GTK_BUTTONBOX_START);
-
- /* Store pointers to all widgets, for use by lookup_widget(). */
- GLADE_HOOKUP_OBJECT(main_view, back_button, BACKBUTTON);
- GLADE_HOOKUP_OBJECT(main_view, forward_button, FORWARDBUTTON);
- GLADE_HOOKUP_OBJECT(main_view, home_button, HOMEBUTTON);
- GLADE_HOOKUP_OBJECT(main_view, contents_button, CONTENTBUTTON);
+ GtkWidget *buttons_hbuttonbox;
+ GtkWidget *back_button;
+ GtkWidget *forward_button;
+ GtkWidget *home_button;
+ GtkWidget *contents_button;
+
+ // define and attach signals to buttons
+ back_button = gtk_button_new_with_label(_("Back"));
+ g_signal_connect(back_button, "clicked", G_CALLBACK(back_button_clicked),
+ G_OBJECT(main_view));
+
+ forward_button = gtk_button_new_with_label(_("Forward"));
+ g_signal_connect(forward_button, "clicked", G_CALLBACK(forward_button_clicked),
+ G_OBJECT(main_view));
+
+ home_button = gtk_button_new_with_label(_("Home"));
+ g_signal_connect(home_button, "clicked", G_CALLBACK(home_button_clicked),
+ G_OBJECT(main_view));
+
+ contents_button = gtk_button_new_with_label(_("Contents"));
+ g_signal_connect(contents_button, "clicked",
+ G_CALLBACK(contents_button_clicked), G_OBJECT(content_hpane));
+
+ // button layout
+ buttons_hbuttonbox = gtk_hbutton_box_new();
+ gtk_container_add(GTK_CONTAINER(buttons_hbuttonbox), back_button);
+ gtk_container_add(GTK_CONTAINER(buttons_hbuttonbox), forward_button);
+ gtk_container_add(GTK_CONTAINER(buttons_hbuttonbox), home_button);
+ gtk_container_add(GTK_CONTAINER(buttons_hbuttonbox), contents_button);
+ gtk_box_pack_start(GTK_BOX(main_vbox), buttons_hbuttonbox, FALSE, TRUE, 0);
+ gtk_box_set_spacing(GTK_BOX(buttons_hbuttonbox), 6);
+ gtk_button_box_set_layout(GTK_BUTTON_BOX(buttons_hbuttonbox),
+ GTK_BUTTONBOX_START);
+
+ /* Store pointers to all widgets, for use by lookup_widget(). */
+ GLADE_HOOKUP_OBJECT(main_view, back_button, BACKBUTTON);
+ GLADE_HOOKUP_OBJECT(main_view, forward_button, FORWARDBUTTON);
+ GLADE_HOOKUP_OBJECT(main_view, home_button, HOMEBUTTON);
+ GLADE_HOOKUP_OBJECT(main_view, contents_button, CONTENTBUTTON);
}
/**
@@ -275,123 +275,123 @@ void initialize_buttons(GtkWidget *main_vbox, GtkWidget *content_hpane)
GtkWidget*
CreateHelpWindow(void)
{
- GtkWidget *main_vbox;
- GtkWidget *main_view_scroller;
- GtkWidget *contents_view_scroller;
- GtkWidget *content_hpane;
+ GtkWidget *main_vbox;
+ GtkWidget *main_view_scroller;
+ GtkWidget *contents_view_scroller;
+ GtkWidget *content_hpane;
- int width;
- int height;
- int x, y;
- int w = 0, h = 0;
- const char *pref;
+ int width;
+ int height;
+ int x, y;
+ int w = 0, h = 0;
+ const char *pref;
- wHelpWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ wHelpWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- width = gdk_screen_get_width(gtk_window_get_screen((GtkWindow *)wHelpWindow));
- height = gdk_screen_get_height(gtk_window_get_screen((GtkWindow *)wHelpWindow));
+ width = gdk_screen_get_width(gtk_window_get_screen((GtkWindow *)wHelpWindow));
+ height = gdk_screen_get_height(gtk_window_get_screen((GtkWindow *)wHelpWindow));
- pref = wPrefGetString(HTMLHELPSECTION, WINDOWSIZEPREFNAME);
+ pref = wPrefGetString(HTMLHELPSECTION, WINDOWSIZEPREFNAME);
- if (pref) {
- sscanf(pref, "%d %d", &w, &h);
+ if (pref) {
+ sscanf(pref, "%d %d", &w, &h);
- if (w > width) {
- w = width;
- }
+ if (w > width) {
+ w = width;
+ }
- if (h > height) {
- h = height;
- }
- } else {
- w = (width * 2)/ 5;
- h = height - 100;
- }
+ if (h > height) {
+ h = height;
+ }
+ } else {
+ w = (width * 2)/ 5;
+ h = height - 100;
+ }
- pref = wPrefGetString(HTMLHELPSECTION, WINDOWPOSPREFNAME);
+ pref = wPrefGetString(HTMLHELPSECTION, WINDOWPOSPREFNAME);
- if (pref) {
- sscanf(pref, "%d %d", &x, &y);
+ if (pref) {
+ sscanf(pref, "%d %d", &x, &y);
- if (y > height - h) {
- y = height - h;
- }
+ if (y > height - h) {
+ y = height - h;
+ }
- if (x > width - w) {
- x = width - w;
- }
- } else {
- x = (width * 3) / 5 - 10;
- y = 70;
- }
+ if (x > width - w) {
+ x = width - w;
+ }
+ } else {
+ x = (width * 3) / 5 - 10;
+ y = 70;
+ }
- gtk_window_resize((GtkWindow *)wHelpWindow, w, h);
- gtk_window_move((GtkWindow *)wHelpWindow, x, y);
+ gtk_window_resize((GtkWindow *)wHelpWindow, w, h);
+ gtk_window_move((GtkWindow *)wHelpWindow, x, y);
- gtk_window_set_title(GTK_WINDOW(wHelpWindow), "XTrkCad Help");
+ gtk_window_set_title(GTK_WINDOW(wHelpWindow), "XTrkCad Help");
- g_signal_connect(G_OBJECT(wHelpWindow), "delete-event",
- G_CALLBACK(DestroyHelpWindow), NULL);
+ g_signal_connect(G_OBJECT(wHelpWindow), "delete-event",
+ G_CALLBACK(DestroyHelpWindow), NULL);
- main_view_scroller = gtk_scrolled_window_new(NULL, NULL);
- contents_view_scroller = gtk_scrolled_window_new(NULL, NULL);
- main_view = webkit_web_view_new();
- contents_view = webkit_web_view_new();
- // must be done here as it gets locked down later
- load_into_view("contents.html", CONTENTS_VIEW);
- gtk_widget_set_size_request(GTK_WIDGET(wHelpWindow), x, y);
+ main_view_scroller = gtk_scrolled_window_new(NULL, NULL);
+ contents_view_scroller = gtk_scrolled_window_new(NULL, NULL);
+ main_view = webkit_web_view_new();
+ contents_view = webkit_web_view_new();
+ // must be done here as it gets locked down later
+ load_into_view("contents.html", CONTENTS_VIEW);
+ gtk_widget_set_size_request(GTK_WIDGET(wHelpWindow), x, y);
- main_vbox = gtk_vbox_new(FALSE, 5);
- gtk_container_add(GTK_CONTAINER(wHelpWindow), main_vbox);
+ main_vbox = gtk_vbox_new(FALSE, 5);
+ gtk_container_add(GTK_CONTAINER(wHelpWindow), main_vbox);
- gtk_container_add(GTK_CONTAINER(main_view_scroller), main_view);
+ gtk_container_add(GTK_CONTAINER(main_view_scroller), main_view);
- gtk_container_add(GTK_CONTAINER(contents_view_scroller), contents_view);
+ gtk_container_add(GTK_CONTAINER(contents_view_scroller), contents_view);
- content_hpane = gtk_hpaned_new();
- initialize_buttons(main_vbox, content_hpane);
- gtk_container_add(GTK_CONTAINER(content_hpane), contents_view_scroller);
- gtk_container_add(GTK_CONTAINER(content_hpane), main_view_scroller);
- gtk_box_pack_start(GTK_BOX(main_vbox), content_hpane, TRUE, TRUE, 0);
+ content_hpane = gtk_hpaned_new();
+ initialize_buttons(main_vbox, content_hpane);
+ gtk_container_add(GTK_CONTAINER(content_hpane), contents_view_scroller);
+ gtk_container_add(GTK_CONTAINER(content_hpane), main_view_scroller);
+ gtk_box_pack_start(GTK_BOX(main_vbox), content_hpane, TRUE, TRUE, 0);
- gtk_paned_set_position(GTK_PANED(content_hpane), 370);
+ gtk_paned_set_position(GTK_PANED(content_hpane), 370);
- g_signal_connect(contents_view, "navigation-policy-decision-requested",
- G_CALLBACK(contents_click_handler), G_OBJECT(main_view));
+ g_signal_connect(contents_view, "navigation-policy-decision-requested",
+ G_CALLBACK(contents_click_handler), G_OBJECT(main_view));
- /* Store pointers to all widgets, for use by lookup_widget(). */
- GLADE_HOOKUP_OBJECT_NO_REF(wHelpWindow, wHelpWindow, "wHelpWindow");
- GLADE_HOOKUP_OBJECT(wHelpWindow, content_hpane, PANED);
- GLADE_HOOKUP_OBJECT(wHelpWindow, contents_view, TOCVIEW);
- GLADE_HOOKUP_OBJECT(wHelpWindow, main_view, CONTENTSVIEW);
+ /* Store pointers to all widgets, for use by lookup_widget(). */
+ GLADE_HOOKUP_OBJECT_NO_REF(wHelpWindow, wHelpWindow, "wHelpWindow");
+ GLADE_HOOKUP_OBJECT(wHelpWindow, content_hpane, PANED);
+ GLADE_HOOKUP_OBJECT(wHelpWindow, contents_view, TOCVIEW);
+ GLADE_HOOKUP_OBJECT(wHelpWindow, main_view, CONTENTSVIEW);
- return wHelpWindow;
+ return wHelpWindow;
}
void load_into_view(char *file, int requested_view)
{
- GtkWidget *view;
+ GtkWidget *view;
- switch (requested_view) {
- case MAIN_VIEW:
- view = main_view;
- break;
+ switch (requested_view) {
+ case MAIN_VIEW:
+ view = main_view;
+ break;
- case CONTENTS_VIEW:
- view = contents_view;
- break;
+ case CONTENTS_VIEW:
+ view = contents_view;
+ break;
- default:
- printf("*** error, could not find view");
- break;
- }
+ default:
+ printf("*** error, could not find view");
+ break;
+ }
- char fileToLoad[250] = "file://";
- strcat(fileToLoad,directory);
- strcat(fileToLoad,file);
+ char fileToLoad[250] = "file://";
+ strcat(fileToLoad,directory);
+ strcat(fileToLoad,file);
- //debug printf("*** loading %s into pane %d.\n", fileToLoad, requested_view);
- webkit_web_view_load_uri(WEBKIT_WEB_VIEW(view), fileToLoad);
+ //debug printf("*** loading %s into pane %d.\n", fileToLoad, requested_view);
+ webkit_web_view_load_uri(WEBKIT_WEB_VIEW(view), fileToLoad);
}
/**
@@ -402,36 +402,36 @@ void load_into_view(char *file, int requested_view)
void wHelp(const char * topic)
{
- char *htmlFile;
+ char *htmlFile;
- //Take off any topic characters after a '-'
+ //Take off any topic characters after a '-'
- if (!topic || !topic[0]) return;
+ if (!topic || !topic[0]) { return; }
- if (!CheckHelpTopicExists(topic)) return;
+ if (!CheckHelpTopicExists(topic)) { return; }
- if (!wHelpWindow) {
- directory = malloc(BUFSIZ);
- assert(directory != NULL);
+ if (!wHelpWindow) {
+ directory = malloc(BUFSIZ);
+ assert(directory != NULL);
- sprintf(directory, "%s/html/", wGetAppLibDir());
+ sprintf(directory, "%s/html/", wGetAppLibDir());
- wHelpWindow = CreateHelpWindow();
- /* load the default content */
- load_into_view("index.html", MAIN_VIEW);
- }
+ wHelpWindow = CreateHelpWindow();
+ /* load the default content */
+ load_into_view("index.html", MAIN_VIEW);
+ }
- /* need space for the 'html' extension plus dot plus \0 */
- htmlFile = malloc(strlen(topic) + 6);
+ /* need space for the 'html' extension plus dot plus \0 */
+ htmlFile = malloc(strlen(topic) + 6);
- assert(htmlFile != NULL);
+ assert(htmlFile != NULL);
- sprintf(htmlFile, "%s.html", topic);
+ sprintf(htmlFile, "%s.html", topic);
- load_into_view(htmlFile, MAIN_VIEW);
- gtk_widget_show_all(wHelpWindow);
- gtk_window_present(GTK_WINDOW(wHelpWindow));
+ load_into_view(htmlFile, MAIN_VIEW);
+ gtk_widget_show_all(wHelpWindow);
+ gtk_window_present(GTK_WINDOW(wHelpWindow));
- free(htmlFile);
+ free(htmlFile);
}
diff --git a/app/wlib/gtklib/lines.c b/app/wlib/gtklib/lines.c
index bd787a6..6ce7ac1 100644
--- a/app/wlib/gtklib/lines.c
+++ b/app/wlib/gtklib/lines.c
@@ -44,10 +44,10 @@
*/
struct wLine_t {
- WOBJ_COMMON
- wBool_t visible;
- int count;
- wLines_t * lines;
+ WOBJ_COMMON
+ wBool_t visible;
+ int count;
+ wLines_t * lines;
};
/**
@@ -59,30 +59,30 @@ struct wLine_t {
static void linesRepaint(wControl_p b)
{
- wLine_p bl = (wLine_p)(b);
- int i;
- wWin_p win = (wWin_p)(bl->parent);
- GdkDrawable * window;
- cairo_t *cr;
-
- if (!bl->visible) {
- return;
- }
-
- window = gtk_widget_get_window(win->widget);
- cr = gdk_cairo_create(window);
- cairo_set_source_rgb(cr, 0, 0, 0);
- cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
- cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
-
- for (i=0; i<bl->count; i++) {
- cairo_set_line_width(cr, bl->lines[i].width);
- cairo_move_to(cr, bl->lines[i].x0, bl->lines[i].y0);
- cairo_line_to(cr, bl->lines[i].x1, bl->lines[i].y1);
- cairo_stroke(cr);
- }
-
- cairo_destroy(cr);
+ wLine_p bl = (wLine_p)(b);
+ int i;
+ wWin_p win = (wWin_p)(bl->parent);
+ GdkDrawable * window;
+ cairo_t *cr;
+
+ if (!bl->visible) {
+ return;
+ }
+
+ window = gtk_widget_get_window(win->widget);
+ cr = gdk_cairo_create(window);
+ cairo_set_source_rgb(cr, 0, 0, 0);
+ cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
+ cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
+
+ for (i=0; i<bl->count; i++) {
+ cairo_set_line_width(cr, bl->lines[i].width);
+ cairo_move_to(cr, bl->lines[i].x0, bl->lines[i].y0);
+ cairo_line_to(cr, bl->lines[i].x1, bl->lines[i].y1);
+ cairo_stroke(cr);
+ }
+
+ cairo_destroy(cr);
}
/**
@@ -94,10 +94,10 @@ static void linesRepaint(wControl_p b)
*/
void wlibLineShow(
- wLine_p bl,
- wBool_t visible)
+ wLine_p bl,
+ wBool_t visible)
{
- bl->visible = visible;
+ bl->visible = visible;
}
/**
@@ -111,40 +111,40 @@ void wlibLineShow(
*/
wLine_p wLineCreate(
- wWin_p parent,
- const char * labelStr,
- int count,
- wLines_t * lines)
+ wWin_p parent,
+ const char * labelStr,
+ int count,
+ wLines_t * lines)
{
- wLine_p linesWindow;
- int i;
- linesWindow = (wLine_p)wlibAlloc(parent, B_LINES, 0, 0, labelStr,
- sizeof *linesWindow, NULL);
- linesWindow->visible = TRUE;
- linesWindow->count = count;
- linesWindow->lines = lines;
- linesWindow->w = linesWindow->h = 0;
-
- for (i=0; i<count; i++) {
- if (lines[i].x0 > linesWindow->w) {
- linesWindow->w = lines[i].x0;
- }
-
- if (lines[i].y0 > linesWindow->h) {
- linesWindow->h = lines[i].y0;
- }
-
- if (lines[i].x1 > linesWindow->w) {
- linesWindow->w = lines[i].x1;
- }
-
- if (lines[i].y1 > linesWindow->h) {
- linesWindow->h = lines[i].y1;
- }
- }
-
- linesWindow->repaintProc = linesRepaint;
- wlibAddButton((wControl_p)linesWindow);
- linesWindow->widget = NULL;
- return linesWindow;
+ wLine_p linesWindow;
+ int i;
+ linesWindow = (wLine_p)wlibAlloc(parent, B_LINES, 0, 0, labelStr,
+ sizeof *linesWindow, NULL);
+ linesWindow->visible = TRUE;
+ linesWindow->count = count;
+ linesWindow->lines = lines;
+ linesWindow->w = linesWindow->h = 0;
+
+ for (i=0; i<count; i++) {
+ if (lines[i].x0 > linesWindow->w) {
+ linesWindow->w = lines[i].x0;
+ }
+
+ if (lines[i].y0 > linesWindow->h) {
+ linesWindow->h = lines[i].y0;
+ }
+
+ if (lines[i].x1 > linesWindow->w) {
+ linesWindow->w = lines[i].x1;
+ }
+
+ if (lines[i].y1 > linesWindow->h) {
+ linesWindow->h = lines[i].y1;
+ }
+ }
+
+ linesWindow->repaintProc = linesRepaint;
+ wlibAddButton((wControl_p)linesWindow);
+ linesWindow->widget = NULL;
+ return linesWindow;
}
diff --git a/app/wlib/gtklib/list.c b/app/wlib/gtklib/list.c
index ac66aba..92977dc 100644
--- a/app/wlib/gtklib/list.c
+++ b/app/wlib/gtklib/list.c
@@ -16,7 +16,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -37,9 +37,9 @@
#include "i18n.h"
struct listSearch {
- const char *search;
- char *result;
- int row;
+ const char *search;
+ char *result;
+ int row;
};
@@ -59,21 +59,21 @@ struct listSearch {
*/
void wListClear(
- wList_p b)
+ wList_p b)
{
- assert(b!= NULL);
+ assert(b!= NULL);
- b->recursion++;
+ b->recursion++;
- if (b->type == B_DROPLIST) {
- wDropListClear(b);
- } else {
- wTreeViewClear(b);
- }
+ if (b->type == B_DROPLIST) {
+ wDropListClear(b);
+ } else {
+ wTreeViewClear(b);
+ }
- b->recursion--;
- b->last = -1;
- b->count = 0;
+ b->recursion--;
+ b->last = -1;
+ b->count = 0;
}
/**
@@ -84,23 +84,23 @@ void wListClear(
*/
void wListSetIndex(
- wList_p b,
- int element)
+ wList_p b,
+ int element)
{
- if (b->widget == 0) {
- abort();
- }
+ if (b->widget == 0) {
+ abort();
+ }
- b->recursion++;
+ b->recursion++;
- if (b->type == B_DROPLIST) {
- wDropListSetIndex(b, element);
- } else {
- wlibTreeViewSetSelected(b, element);
- }
+ if (b->type == B_DROPLIST) {
+ wDropListSetIndex(b, element);
+ } else {
+ wlibTreeViewSetSelected(b, element);
+ }
- b->last = element;
- b->recursion--;
+ b->last = element;
+ b->recursion--;
}
/**
@@ -121,23 +121,23 @@ int
CompareListData(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter,
gpointer data)
{
- wListItem_p id_p;
- struct listSearch *search = (struct listSearch *)data;
-
- gtk_tree_model_get(model,
- iter,
- LISTCOL_DATA,
- &id_p,
- -1);
-
- if (id_p && id_p->label && !strcmp(id_p->label, search->search)) {
- search->result = (char *)id_p->label;
- return TRUE;
- } else {
- search->result = NULL;
- search->row++;
- return FALSE;
- }
+ wListItem_p id_p;
+ struct listSearch *search = (struct listSearch *)data;
+
+ gtk_tree_model_get(model,
+ iter,
+ LISTCOL_DATA,
+ &id_p,
+ -1);
+
+ if (id_p && id_p->label && !strcmp(id_p->label, search->search)) {
+ search->result = (char *)id_p->label;
+ return TRUE;
+ } else {
+ search->result = NULL;
+ search->row++;
+ return FALSE;
+ }
}
/**
@@ -149,25 +149,25 @@ CompareListData(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter,
*/
wIndex_t wListFindValue(
- wList_p b,
- const char * val)
+ wList_p b,
+ const char * val)
{
- struct listSearch thisSearch;
+ struct listSearch thisSearch;
- assert(b!=NULL);
- assert(b->listStore!=NULL);
+ assert(b!=NULL);
+ assert(b->listStore!=NULL);
- thisSearch.search = val;
- thisSearch.row = 0;
+ thisSearch.search = val;
+ thisSearch.row = 0;
- gtk_tree_model_foreach(GTK_TREE_MODEL(b->listStore), CompareListData,
- (void *)&thisSearch);
+ gtk_tree_model_foreach(GTK_TREE_MODEL(b->listStore), CompareListData,
+ (void *)&thisSearch);
- if (!thisSearch.result) {
- return -1;
- } else {
- return thisSearch.row;
- }
+ if (!thisSearch.result) {
+ return -1;
+ } else {
+ return thisSearch.row;
+ }
}
/**
@@ -178,13 +178,13 @@ wIndex_t wListFindValue(
*/
wIndex_t wListGetCount(
- wList_p b)
+ wList_p b)
{
- if (b->type == B_DROPLIST) {
- return wDropListGetCount(b);
- } else {
- return wTreeViewGetCount(b);
- }
+ if (b->type == B_DROPLIST) {
+ return wDropListGetCount(b);
+ } else {
+ return wTreeViewGetCount(b);
+ }
}
/**
@@ -196,18 +196,18 @@ wIndex_t wListGetCount(
*/
void * wListGetItemContext(
- wList_p b,
- wIndex_t inx)
+ wList_p b,
+ wIndex_t inx)
{
- if (inx < 0) {
- return NULL;
- }
-
- if (b->type == B_DROPLIST) {
- return wDropListGetItemContext(b, inx);
- } else {
- return wTreeViewGetItemContext(b, inx);
- }
+ if (inx < 0) {
+ return NULL;
+ }
+
+ if (b->type == B_DROPLIST) {
+ return wDropListGetItemContext(b, inx);
+ } else {
+ return wTreeViewGetItemContext(b, inx);
+ }
}
/**
@@ -221,53 +221,57 @@ void * wListGetItemContext(
*/
wIndex_t wListGetValues(
- wList_p bl,
- char * labelStr,
- int labelSize,
- void * * listDataRet,
- void * * itemDataRet)
+ wList_p bl,
+ char * labelStr,
+ int labelSize,
+ void * * listDataRet,
+ void * * itemDataRet)
{
- wListItem_p id_p;
- wIndex_t inx = bl->last;
- const char * entry_value = "";
- void * item_data = NULL;
-
- assert(bl != NULL);
- assert(bl->listStore != NULL);
-
- if (bl->type == B_DROPLIST && bl->editted) {
- entry_value = gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(
- bl->widget))));
- item_data = NULL;
- inx = bl->last = -1;
- } else {
- inx = bl->last;
-
- if (inx >= 0) {
- id_p = wlibListStoreGetContext(bl->listStore, inx);
-
- if (id_p==NULL) {
- fprintf(stderr, "wListGetValues - id_p == NULL\n");
- } else {
- entry_value = id_p->label;
- item_data = id_p->itemData;
- }
- }
- }
-
- if (labelStr) {
- strncpy(labelStr, entry_value, labelSize);
- }
-
- if (listDataRet) {
- *listDataRet = bl->data;
- }
-
- if (itemDataRet) {
- *itemDataRet = item_data;
- }
-
- return bl->last;
+ wListItem_p id_p;
+ wIndex_t inx = bl->last;
+ const char * entry_value = "";
+ void * item_data = NULL;
+
+ assert(bl != NULL);
+ assert(bl->listStore != NULL);
+
+ if (bl->type == B_DROPLIST && bl->editted) {
+ entry_value = gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(
+ bl->widget))));
+ item_data = NULL;
+ inx = bl->last = -1;
+ } else {
+ //Make sure in range
+ if (bl->last > bl->count-1) { bl->last = bl->count-1; }
+ inx = bl->last;
+
+
+ if (inx >= 0) {
+ id_p = wlibListStoreGetContext(bl->listStore, inx);
+
+ if (id_p==NULL) {
+ fprintf(stderr, "wListGetValues - id_p == NULL\n");
+ bl->last = -1;
+ } else {
+ entry_value = id_p->label;
+ item_data = id_p->itemData;
+ }
+ }
+ }
+
+ if (labelStr) {
+ strncpy(labelStr, entry_value, labelSize);
+ }
+
+ if (listDataRet) {
+ *listDataRet = bl->data;
+ }
+
+ if (itemDataRet) {
+ *itemDataRet = item_data;
+ }
+
+ return bl->last;
}
/**
@@ -278,22 +282,22 @@ wIndex_t wListGetValues(
*/
wBool_t wListGetItemSelected(
- wList_p b,
- wIndex_t inx)
+ wList_p b,
+ wIndex_t inx)
{
- wListItem_p id_p;
+ wListItem_p id_p;
- if (inx < 0) {
- return FALSE;
- }
+ if (inx < 0) {
+ return FALSE;
+ }
- id_p = wlibListStoreGetContext(b->listStore, inx);
+ id_p = wlibListStoreGetContext(b->listStore, inx);
- if (id_p) {
- return id_p->selected;
- } else {
- return FALSE;
- }
+ if (id_p) {
+ return id_p->selected;
+ } else {
+ return FALSE;
+ }
}
/**
@@ -304,16 +308,16 @@ wBool_t wListGetItemSelected(
*/
wIndex_t wListGetSelectedCount(
- wList_p b)
+ wList_p b)
{
- wIndex_t selcnt, inx;
+ wIndex_t selcnt, inx;
- for (selcnt=inx=0; inx<b->count; inx++)
- if (wListGetItemSelected(b, inx)) {
- selcnt++;
- }
+ for (selcnt=inx=0; inx<b->count; inx++)
+ if (wListGetItemSelected(b, inx)) {
+ selcnt++;
+ }
- return selcnt;
+ return selcnt;
}
/**
@@ -325,26 +329,26 @@ wIndex_t wListGetSelectedCount(
void wListSelectAll(wList_p bl)
{
- wIndex_t inx;
- GtkTreeSelection *selection;
+ wIndex_t inx;
+ GtkTreeSelection *selection;
- assert(bl != NULL);
- // mark all items selected
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(bl->treeView));
- gtk_tree_selection_select_all(selection);
+ assert(bl != NULL);
+ // mark all items selected
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(bl->treeView));
+ gtk_tree_selection_select_all(selection);
- // and synchronize the internal data structures
- wListGetCount(bl);
+ // and synchronize the internal data structures
+ wListGetCount(bl);
- for (inx=0; inx<bl->count; inx++) {
- wListItem_p ldp;
+ for (inx=0; inx<bl->count; inx++) {
+ wListItem_p ldp;
- ldp = wlibListStoreGetContext(bl->listStore, inx);
+ ldp = wlibListStoreGetContext(bl->listStore, inx);
- if (ldp) {
- ldp->selected = TRUE;
- }
- }
+ if (ldp) {
+ ldp->selected = TRUE;
+ }
+ }
}
/**
@@ -359,25 +363,25 @@ void wListSelectAll(wList_p bl)
*/
wBool_t wListSetValues(
- wList_p b,
- wIndex_t row,
- const char * labelStr,
- wIcon_p bm,
- void *itemData)
+ wList_p b,
+ wIndex_t row,
+ const char * labelStr,
+ wIcon_p bm,
+ void *itemData)
{
- assert(b->listStore != NULL);
+ assert(b->listStore != NULL);
- b->recursion++;
+ b->recursion++;
- if (b->type == B_DROPLIST) {
- wDropListSetValues(b, row, labelStr, bm, itemData);
- } else {
- wlibListStoreUpdateValues(b->listStore, row, b->colCnt, (char *)labelStr, bm);
- }
+ if (b->type == B_DROPLIST) {
+ wDropListSetValues(b, row, labelStr, bm, itemData);
+ } else {
+ wlibListStoreUpdateValues(b->listStore, row, b->colCnt, (char *)labelStr, bm);
+ }
- b->recursion--;
- return TRUE;
+ b->recursion--;
+ return TRUE;
}
/**
@@ -387,31 +391,34 @@ wBool_t wListSetValues(
*/
void wListDelete(
- wList_p b,
- wIndex_t inx)
+ wList_p b,
+ wIndex_t inx)
{
- GtkTreeIter iter;
+ GtkTreeIter iter;
- assert(b->listStore != 0);
- assert(b->type != B_DROPLIST);
- b->recursion++;
+ assert(b->listStore != 0);
+ assert(b->type != B_DROPLIST);
+ b->recursion++;
- if (b->type == B_DROPLIST) {
- wNotice("Deleting from dropboxes is not implemented!", "Continue", NULL);
- } else {
- gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(b->listStore),
- &iter,
- NULL,
- inx);
- gtk_list_store_remove(b->listStore, &iter);
+ if (b->type == B_DROPLIST) {
+ wNotice("Deleting from dropboxes is not implemented!", "Continue", NULL);
+ } else {
+ gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(b->listStore),
+ &iter,
+ NULL,
+ inx);
+ gtk_list_store_remove(b->listStore, &iter);
- b->count--;
- }
+ b->count--;
+ }
- b->recursion--;
- return;
+ if (b->last == inx-1) { b->last = -1; }
+ else if (b->last >= inx) { b->last = -1; }
+
+ b->recursion--;
+ return;
}
/**
@@ -424,29 +431,29 @@ void wListDelete(
*/
int wListGetColumnWidths(
- wList_p bl,
- int colCnt,
- wPos_t * colWidths)
+ wList_p bl,
+ int colCnt,
+ wWinPix_t * colWidths)
{
- int inx;
+ int inx;
- if (bl->type != B_LIST) {
- return 0;
- }
+ if (bl->type != B_LIST) {
+ return 0;
+ }
- if (bl->colWidths == NULL) {
- return 0;
- }
+ if (bl->colWidths == NULL) {
+ return 0;
+ }
- for (inx=0; inx<colCnt; inx++) {
- if (inx < bl->colCnt) {
- colWidths[inx] = bl->colWidths[inx];
- } else {
- colWidths[inx] = 0;
- }
- }
+ for (inx=0; inx<colCnt; inx++) {
+ if (inx < bl->colCnt) {
+ colWidths[inx] = bl->colWidths[inx];
+ } else {
+ colWidths[inx] = 0;
+ }
+ }
- return bl->colCnt;
+ return bl->colCnt;
}
/**
@@ -460,45 +467,45 @@ int wListGetColumnWidths(
*/
wIndex_t wListAddValue(
- wList_p b,
- const char * labelStr,
- wIcon_p bm,
- void * itemData)
+ wList_p b,
+ const char * labelStr,
+ wIcon_p bm,
+ void * itemData)
{
- wListItem_p id_p;
+ wListItem_p id_p;
- assert(b != NULL);
+ assert(b != NULL);
- b->recursion++;
+ b->recursion++;
- id_p = (wListItem_p)g_malloc(sizeof *id_p);
- memset(id_p, 0, sizeof *id_p);
- id_p->itemData = itemData;
- id_p->active = TRUE;
+ id_p = (wListItem_p)g_malloc(sizeof *id_p);
+ memset(id_p, 0, sizeof *id_p);
+ id_p->itemData = itemData;
+ id_p->active = TRUE;
- if (labelStr == NULL) {
- labelStr = "";
- }
+ if (labelStr == NULL) {
+ labelStr = "";
+ }
- id_p->label = strdup(labelStr);
- id_p->listP = b;
+ id_p->label = strdup(labelStr);
+ id_p->listP = b;
- if (b->type == B_DROPLIST) {
- wDropListAddValue(b, (char *)labelStr, id_p);
- } else {
- wlibTreeViewAddRow(b, (char *)labelStr, bm, id_p);
- }
+ if (b->type == B_DROPLIST) {
+ wDropListAddValue(b, (char *)labelStr, id_p);
+ } else {
+ wlibTreeViewAddRow(b, (char *)labelStr, bm, id_p);
+ }
- //free(id_p->label);
+ //free(id_p->label);
- b->count++;
- b->recursion--;
+ b->count++;
+ b->recursion--;
- if (b->count == 1) {
- b->last = 0;
- }
+ if (b->count == 1) {
+ b->last = 0;
+ }
- return b->count-1;
+ return b->count-1;
}
@@ -510,16 +517,16 @@ wIndex_t wListAddValue(
* \param h IN height (ignored for droplist)
*/
-void wListSetSize(wList_p bl, wPos_t w, wPos_t h)
+void wListSetSize(wList_p bl, wWinPix_t w, wWinPix_t h)
{
- if (bl->type == B_DROPLIST) {
- gtk_widget_set_size_request(bl->widget, w, -1);
- } else {
- gtk_widget_set_size_request(bl->widget, w, h);
- }
-
- bl->w = w;
- bl->h = h;
+ if (bl->type == B_DROPLIST) {
+ gtk_widget_set_size_request(bl->widget, w, -1);
+ } else {
+ gtk_widget_set_size_request(bl->widget, w, h);
+ }
+
+ bl->w = w;
+ bl->h = h;
}
/**
@@ -533,20 +540,20 @@ void wListSetSize(wList_p bl, wPos_t w, wPos_t h)
*/
wList_p wComboListCreate(
- wWin_p parent, /* Parent window */
- wPos_t x, /* X-position */
- wPos_t y, /* Y-position */
- const char * helpStr, /* Help string */
- const char * labelStr, /* Label */
- long option, /* Options */
- long number, /* Number of displayed list entries */
- wPos_t width, /* Width */
- long *valueP, /* Selected index */
- wListCallBack_p action, /* Callback */
- void *data) /* Context */
+ wWin_p parent, /* Parent window */
+ wWinPix_t x, /* X-position */
+ wWinPix_t y, /* Y-position */
+ const char * helpStr, /* Help string */
+ const char * labelStr, /* Label */
+ long option, /* Options */
+ long number, /* Number of displayed list entries */
+ wWinPix_t width, /* Width */
+ long *valueP, /* Selected index */
+ wListCallBack_p action, /* Callback */
+ void *data) /* Context */
{
- wNotice("ComboLists are not implemented!", "Abort", NULL);
- abort();
+ wNotice("ComboLists are not implemented!", "Abort", NULL);
+ abort();
}
diff --git a/app/wlib/gtklib/liststore.c b/app/wlib/gtklib/liststore.c
index 088bf33..b1b0f8a 100644
--- a/app/wlib/gtklib/liststore.c
+++ b/app/wlib/gtklib/liststore.c
@@ -47,25 +47,25 @@
*/
wListItem_p wlibListItemGet(
- GtkListStore *ls,
- wIndex_t inx,
- GList ** childR)
+ GtkListStore *ls,
+ wIndex_t inx,
+ GList ** childR)
{
- wListItem_p id_p;
+ wListItem_p id_p;
- assert(ls != NULL);
+ assert(ls != NULL);
- if (childR) {
- *childR = NULL;
- }
+ if (childR) {
+ *childR = NULL;
+ }
- if (inx < 0) {
- return NULL;
- }
+ if (inx < 0) {
+ return NULL;
+ }
- id_p = wlibListStoreGetContext(ls, inx);
+ id_p = wlibListStoreGetContext(ls, inx);
- return id_p;
+ return id_p;
}
/**
@@ -79,33 +79,33 @@ wListItem_p wlibListItemGet(
void *
wlibListStoreGetContext(GtkListStore *ls, int inx)
{
- GtkTreeIter iter;
- gchar *string = NULL;
- gboolean result;
- gint childs;
-
- childs = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(ls),
- NULL);
-
- if (inx < childs) {
- result = gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(ls),
- &iter,
- NULL,
- inx);
-
- if (result) {
- gtk_tree_model_get(GTK_TREE_MODEL(ls),
- &iter,
- LISTCOL_DATA,
- &string,
- -1);
- } else {
- printf("Invalid index %d for list!\n", inx);
-
- }
- }
-
- return (string);
+ GtkTreeIter iter;
+ gchar *string = NULL;
+ gboolean result;
+ gint childs;
+
+ childs = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(ls),
+ NULL);
+
+ if (inx < childs) {
+ result = gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(ls),
+ &iter,
+ NULL,
+ inx);
+
+ if (result) {
+ gtk_tree_model_get(GTK_TREE_MODEL(ls),
+ &iter,
+ LISTCOL_DATA,
+ &string,
+ -1);
+ } else {
+ printf("Invalid index %d for list!\n", inx);
+
+ }
+ }
+
+ return (string);
}
@@ -119,21 +119,22 @@ wlibListStoreGetContext(GtkListStore *ls, int inx)
void
wlibListStoreClear(GtkListStore *listStore)
{
- wListItem_p id_p;
- int i = 0;
+ wListItem_p id_p;
+ int i = 0;
- assert(listStore != NULL);
+ assert(listStore != NULL);
- id_p = wlibListStoreGetContext(listStore, i++);
+ id_p = wlibListStoreGetContext(listStore, i++);
- while (id_p) {
- if (id_p->label)
- g_free(id_p->label);
- g_free(id_p);
- id_p = wlibListStoreGetContext(listStore, i++);
- }
+ while (id_p) {
+ if (id_p->label) {
+ g_free(id_p->label);
+ }
+ g_free(id_p);
+ id_p = wlibListStoreGetContext(listStore, i++);
+ }
- gtk_list_store_clear(listStore);
+ gtk_list_store_clear(listStore);
}
/**
@@ -148,23 +149,23 @@ wlibListStoreClear(GtkListStore *listStore)
GtkListStore *
wlibNewListStore(int colCnt)
{
- GtkListStore *ls;
- GType *colTypes;
- int i;
+ GtkListStore *ls;
+ GType *colTypes;
+ int i;
- /* create the list store, using strings for all columns */
- colTypes = g_malloc(sizeof(GType) * (colCnt + LISTCOL_TEXT));
- colTypes[ LISTCOL_BITMAP ] = GDK_TYPE_PIXBUF;
- colTypes[ LISTCOL_DATA ] = G_TYPE_POINTER;
+ /* create the list store, using strings for all columns */
+ colTypes = g_malloc(sizeof(GType) * (colCnt + LISTCOL_TEXT));
+ colTypes[ LISTCOL_BITMAP ] = GDK_TYPE_PIXBUF;
+ colTypes[ LISTCOL_DATA ] = G_TYPE_POINTER;
- for (i = 0; i < colCnt; i++) {
- colTypes[ LISTCOL_TEXT + i ] = G_TYPE_STRING;
- }
+ for (i = 0; i < colCnt; i++) {
+ colTypes[ LISTCOL_TEXT + i ] = G_TYPE_STRING;
+ }
- ls = gtk_list_store_newv(colCnt + LISTCOL_TEXT, colTypes);
- g_free(colTypes);
+ ls = gtk_list_store_newv(colCnt + LISTCOL_TEXT, colTypes);
+ g_free(colTypes);
- return (ls);
+ return (ls);
}
/**
@@ -179,26 +180,26 @@ wlibNewListStore(int colCnt)
static int
wlibListStoreUpdateIter(GtkListStore *ls, GtkTreeIter *iter, char *labels)
{
- char *convertedLabels;
- char *text;
- char *start;
- int current = 0;
-
- convertedLabels = strdup(wlibConvertInput(labels));
- start = convertedLabels;
-
- while ((text = strchr(start, '\t')) != NULL) {
- *text = '\0';
- gtk_list_store_set(ls, iter, LISTCOL_TEXT + current, start, -1);
- start = text + 1;
- current++;
- }
-
- /* add the last piece of the string */
- gtk_list_store_set(ls, iter, LISTCOL_TEXT + current, start, -1);
-
- free(convertedLabels);
- return (current+1);
+ char *convertedLabels;
+ char *text;
+ char *start;
+ int current = 0;
+
+ convertedLabels = strdup(wlibConvertInput(labels));
+ start = convertedLabels;
+
+ while ((text = strchr(start, '\t')) != NULL) {
+ *text = '\0';
+ gtk_list_store_set(ls, iter, LISTCOL_TEXT + current, start, -1);
+ start = text + 1;
+ current++;
+ }
+
+ /* add the last piece of the string */
+ gtk_list_store_set(ls, iter, LISTCOL_TEXT + current, start, -1);
+
+ free(convertedLabels);
+ return (current+1);
}
/**
@@ -213,9 +214,9 @@ wlibListStoreUpdateIter(GtkListStore *ls, GtkTreeIter *iter, char *labels)
void
wlibListStoreSetPixbuf(GtkListStore *ls, GtkTreeIter *iter, GdkPixbuf *pixbuf)
{
- gtk_list_store_set(ls, iter, LISTCOL_BITMAP, pixbuf, -1);
- g_object_ref_sink(pixbuf);
- g_object_unref(pixbuf);
+ gtk_list_store_set(ls, iter, LISTCOL_BITMAP, pixbuf, -1);
+ g_object_ref_sink(pixbuf);
+ g_object_unref(pixbuf);
}
/**
* Add a row to the list store
@@ -230,19 +231,19 @@ int
wlibListStoreAddData(GtkListStore *ls, GdkPixbuf *pixbuf, int cols,
wListItem_p id)
{
- GtkTreeIter iter;
- int count;
+ GtkTreeIter iter;
+ int count;
- gtk_list_store_append(ls, &iter);
- gtk_list_store_set(ls, &iter, LISTCOL_DATA, id, -1);
+ gtk_list_store_append(ls, &iter);
+ gtk_list_store_set(ls, &iter, LISTCOL_DATA, id, -1);
- if (pixbuf) {
- wlibListStoreSetPixbuf(ls, &iter, pixbuf);
- }
+ if (pixbuf) {
+ wlibListStoreSetPixbuf(ls, &iter, pixbuf);
+ }
- count = wlibListStoreUpdateIter(ls, &iter, (char *)id->label);
+ count = wlibListStoreUpdateIter(ls, &iter, (char *)id->label);
- return (count);
+ return (count);
}
/**
@@ -261,23 +262,23 @@ int
wlibListStoreUpdateValues(GtkListStore *ls, int row, int cols, char *labels,
wIcon_p bm)
{
- GtkTreeIter iter;
- int count;
+ GtkTreeIter iter;
+ int count;
- gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(ls),
- &iter,
- NULL,
- row);
+ gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(ls),
+ &iter,
+ NULL,
+ row);
- count = wlibListStoreUpdateIter(ls, &iter, labels);
+ count = wlibListStoreUpdateIter(ls, &iter, labels);
- if (bm) {
- GdkPixbuf *pixbuf;
+ if (bm) {
+ GdkPixbuf *pixbuf;
- pixbuf = wlibMakePixbuf(bm);
- wlibListStoreSetPixbuf(ls, &iter, pixbuf);
- }
+ pixbuf = wlibMakePixbuf(bm);
+ wlibListStoreSetPixbuf(ls, &iter, pixbuf);
+ }
- return (count);
+ return (count);
}
diff --git a/app/wlib/gtklib/main.c b/app/wlib/gtklib/main.c
index 470f17b..7022a0a 100644
--- a/app/wlib/gtklib/main.c
+++ b/app/wlib/gtklib/main.c
@@ -18,7 +18,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -46,10 +46,10 @@ char *wExecutableName;
* Initialize the application name for later use
*
* \param _appName IN Name of application
- * \return
+ * \return
*/
-
-void
+
+void
wInitAppName(char *_appName)
{
appName = g_strdup( _appName );
@@ -59,7 +59,7 @@ char *
wlibGetAppName()
{
return( appName );
-}
+}
/*
*******************************************************************************
@@ -76,17 +76,19 @@ int main( int argc, char *argv[] )
wWin_p win;
const char *ld;
- if ( getenv( "GTKLIB_NOLOCALE" ) == 0 )
+ if ( getenv( "GTKLIB_NOLOCALE" ) == 0 ) {
setlocale( LC_ALL, "en_US" );
+ }
gtk_init( &argc, &argv );
- if ((win=wMain( argc, argv )) == NULL)
+ if ((win=wMain( argc, argv )) == NULL) {
exit(1);
- wExecutableName = argv[ 0 ];
+ }
+ wExecutableName = argv[ 0 ];
ld = wGetAppLibDir();
-
+
#ifdef WINDOWS
-
+
#else
// set up help search path on unix boxes
if (ld != NULL) {
@@ -94,14 +96,16 @@ int main( int argc, char *argv[] )
const char *hp;
sprintf( buff, "HELPPATH=/usr/lib/help:%s:", ld );
- if ( (hp = getenv("HELPPATH")) != NULL )
+ if ( (hp = getenv("HELPPATH")) != NULL ) {
strcat( buff, hp );
+ }
putenv( buff );
}
#endif
-
- if (!win->shown)
+
+ if (!win->shown) {
wWinShow( win, TRUE );
+ }
gtk_main();
exit(0);
diff --git a/app/wlib/gtklib/menu.c b/app/wlib/gtklib/menu.c
index 79695d4..8646f15 100644
--- a/app/wlib/gtklib/menu.c
+++ b/app/wlib/gtklib/menu.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -50,28 +50,29 @@
typedef enum { M_MENU, M_SEPARATOR, M_PUSH, M_LIST, M_LISTITEM, M_TOGGLE, M_RADIO } mtype_e;
typedef enum { MM_BUTT, MM_MENU, MM_BAR, MM_POPUP } mmtype_e;
-typedef struct{ mtype_e mtype; /**< menu entry type */
- GtkWidget *menu_item;
- wMenu_p parentMenu;
- int recursion; /**< recursion counter */
- } MOBJ_COMMON; /**< menu item specific data */
-
-
+typedef struct {
+ mtype_e mtype; /**< menu entry type */
+ GtkWidget *menu_item;
+ wMenu_p parentMenu;
+ int recursion; /**< recursion counter */
+} MOBJ_COMMON; /**< menu item specific data */
+
+
struct wMenuItem_t {
WOBJ_COMMON
MOBJ_COMMON m;
- };
+};
typedef struct wMenuItem_t * wMenuItem_p;
-// a few macros to make access to members easier
-//#define PTR2M( ptr ) ((ptr)->m)
-#define MMENUITEM( ptr ) (((ptr)->m).menu_item)
+// a few macros to make access to members easier
+//#define PTR2M( ptr ) ((ptr)->m)
+#define MMENUITEM( ptr ) (((ptr)->m).menu_item)
#define MPARENT( ptr ) (((ptr)->m).parentMenu)
#define MITEMTYPE( ptr ) (((ptr)->m).mtype)
-#define MRECURSION( ptr ) (((ptr)->m).recursion)
-
-
+#define MRECURSION( ptr ) (((ptr)->m).recursion)
+
+
struct wMenu_t {
WOBJ_COMMON
MOBJ_COMMON m;
@@ -83,21 +84,21 @@ struct wMenu_t {
void * traceData;
GtkLabel * labelG;
GtkWidget * imageG;
- };
+};
struct wMenuPush_t {
WOBJ_COMMON
MOBJ_COMMON m;
wMenuCallBack_p action;
wBool_t enabled;
- };
+};
struct wMenuRadio_t {
WOBJ_COMMON
MOBJ_COMMON m;
wMenuCallBack_p action;
wBool_t enabled;
- };
+};
struct wMenuList_t {
WOBJ_COMMON
@@ -105,44 +106,45 @@ struct wMenuList_t {
int max;
int count;
wMenuListCallBack_p action;
- };
+};
struct wMenuListItem_t {
WOBJ_COMMON
MOBJ_COMMON m;
wMenuList_p mlist;
- };
+};
typedef struct wMenuListItem_t * wMenuListItem_p;
-
+
struct wMenuToggle_t {
WOBJ_COMMON
MOBJ_COMMON m;
- wMenuToggleCallBack_p action;
+ wMenuCallBack_p action;
wBool_t enabled;
wBool_t set;
- };
+};
/*-----------------------------------------------------------------*/
-
+
/**
* Handle activate event for menu items.
*
* \param widget IN widget that emitted the signal
* \param value IN application data
- * \return
+ * \return
*/
-
+
static void pushMenuItem(
- GtkWidget * widget,
- gpointer value )
+ GtkWidget * widget,
+ gpointer value )
{
wMenuItem_p m = (wMenuItem_p)value;
wMenuToggle_p mt;
- if (MRECURSION( m ))
+ if (MRECURSION( m )) {
return;
+ }
switch MITEMTYPE( m ) {
case M_PUSH:
@@ -151,13 +153,14 @@ static void pushMenuItem(
case M_TOGGLE:
mt = (wMenuToggle_p)m;
wMenuToggleSet( mt, !mt->set );
- mt->action( mt->set, mt->data );
+ mt->action( mt->data );
break;
case M_RADIO:
/* NOTE: action is only called when radio button is activated, not when deactivated */
- if( gtk_check_menu_item_get_active((GtkCheckMenuItem *)widget ) == TRUE )
+ if( gtk_check_menu_item_get_active((GtkCheckMenuItem *)widget ) == TRUE ) {
((wMenuRadio_p)m)->action( ((wMenuRadio_p)m)->data );
- break;
+ }
+ break;
case M_MENU:
return;
default:
@@ -167,57 +170,63 @@ static void pushMenuItem(
if( MPARENT(m)->traceFunc ) {
MPARENT(m)->traceFunc( MPARENT( m ), m->labelStr, MPARENT(m)->traceData );
}
-}
+}
/**
* Create a new menu element, add to the parent menu and to help
*
* \param m IN parent menu
* \param mtype IN type of new entry
- * \param helpStr IN help topic
+ * \param helpStr IN help topic
* \param labelStr IN display label
* \param size IN size of additional data?
* \return the newly created menu element
*/
static wMenuItem_p createMenuItem(
- wMenu_p m,
- mtype_e mtype,
- const char * helpStr,
- const char * labelStr,
- int size )
+ wMenu_p m,
+ mtype_e mtype,
+ const char * helpStr,
+ const char * labelStr,
+ int size )
{
wMenuItem_p mi;
mi = (wMenuItem_p)wlibAlloc( NULL, B_MENUITEM, 0, 0, labelStr, size, NULL );
MITEMTYPE( mi )= mtype;
-
+
switch ( mtype ) {
case M_LIST:
- MMENUITEM( mi ) = gtk_menu_item_new_with_mnemonic(wlibConvertInput(mi->labelStr)); // NULL; //PTR2M(m).menu_item
+ MMENUITEM( mi ) = gtk_menu_item_new_with_mnemonic(wlibConvertInput(
+ mi->labelStr)); // NULL; //PTR2M(m).menu_item
break;
case M_SEPARATOR:
MMENUITEM( mi ) = gtk_separator_menu_item_new();
break;
case M_TOGGLE:
- MMENUITEM( mi ) = gtk_check_menu_item_new_with_mnemonic(wlibConvertInput(mi->labelStr));
+ MMENUITEM( mi ) = gtk_check_menu_item_new_with_mnemonic(wlibConvertInput(
+ mi->labelStr));
break;
case M_RADIO:
- MMENUITEM( mi ) = gtk_radio_menu_item_new_with_mnemonic(m->radioGroup, wlibConvertInput(mi->labelStr));
- m->radioGroup = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (MMENUITEM( mi )));
- break;
+ MMENUITEM( mi ) = gtk_radio_menu_item_new_with_mnemonic(m->radioGroup,
+ wlibConvertInput(mi->labelStr));
+ m->radioGroup = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (MMENUITEM(
+ mi )));
+ break;
default:
- MMENUITEM( mi ) = gtk_menu_item_new_with_mnemonic(wlibConvertInput(mi->labelStr));
+ MMENUITEM( mi ) = gtk_menu_item_new_with_mnemonic(wlibConvertInput(
+ mi->labelStr));
break;
}
if (MMENUITEM( mi )) {
- if (m)
+ if (m) {
gtk_menu_shell_append( (GtkMenuShell *)(m->menu), MMENUITEM( mi ) );
+ }
g_signal_connect( GTK_OBJECT(MMENUITEM( mi )), "activate",
- G_CALLBACK(pushMenuItem), mi );
- gtk_widget_show(MMENUITEM( mi ));
+ G_CALLBACK(pushMenuItem), mi );
+ gtk_widget_show(MMENUITEM( mi ));
}
-
+
// this is a link list of all menu items belonging to a specific menu
// is used in automatic processing (macro)??
if (m) {
@@ -229,8 +238,8 @@ static wMenuItem_p createMenuItem(
m->last = mi;
}
mi->next = NULL;
-
-
+
+
if (helpStr != NULL) {
wlibAddHelpString( MMENUITEM( mi ), helpStr );
}
@@ -240,13 +249,14 @@ static wMenuItem_p createMenuItem(
/**
* Add a accelerator key to a widget
- *
+ *
* @param w IN unused(?)
* @param menu IN unused(?)
* @param menu_item IN owning widget
* @param acclKey IN the accelerator key
*/
-static void setAcclKey( wWin_p w, GtkWidget * menu, GtkWidget * menu_item, int acclKey )
+static void setAcclKey( wWin_p w, GtkWidget * menu, GtkWidget * menu_item,
+ int acclKey )
{
int mask;
static GtkAccelGroup * accel_alpha_group = NULL;
@@ -267,10 +277,10 @@ static void setAcclKey( wWin_p w, GtkWidget * menu, GtkWidget * menu_item, int a
gtk_window_add_accel_group(GTK_WINDOW(gtkMainW->gtkwin), accel_nonalpha_group );
gtk_accelerator_set_default_mod_mask( oldmods );
}
-
+
mask = 0;
if (acclKey) {
-
+
if (acclKey&WALT) {
mask |= GDK_MOD1_MASK;
}
@@ -305,38 +315,38 @@ static void setAcclKey( wWin_p w, GtkWidget * menu, GtkWidget * menu_item, int a
mask |= GDK_CONTROL_MASK;
}
gtk_widget_add_accelerator( menu_item, "activate",
- (isalpha(acclKey&0xFF)?accel_alpha_group:accel_nonalpha_group),
- toupper(acclKey&0xFF), mask, GTK_ACCEL_VISIBLE|GTK_ACCEL_LOCKED );
+ (isalpha(acclKey&0xFF)?accel_alpha_group:accel_nonalpha_group),
+ toupper(acclKey&0xFF), mask, GTK_ACCEL_VISIBLE|GTK_ACCEL_LOCKED );
}
}
/*-----------------------------------------------------------------*/
/**
- * Create a radio button as a menu entry
+ * Create a radio button as a menu entry
*
* \param m IN menu to be extended
* \param helpStr IN reference into help
* \param labelStr IN text for entry
* \param acclKey IN accelerator key to add
- * \param action IN callback function
+ * \param action IN callback function
* \param data IN application data
* \param helpStr IN
* \return menu entry
*/
wMenuRadio_p wMenuRadioCreate(
- wMenu_p m,
- const char * helpStr,
- const char * labelStr,
- long acclKey,
- wMenuCallBack_p action,
- void *data )
+ wMenu_p m,
+ const char * helpStr,
+ const char * labelStr,
+ long acclKey,
+ wMenuCallBack_p action,
+ void *data )
{
wMenuRadio_p mi;
mi = (wMenuRadio_p)createMenuItem( m, M_RADIO, helpStr, labelStr, sizeof *mi );
//~ if (m->mmtype == MM_POPUP && !testMenuPopup)
- //~ return mi;
+ //~ return mi;
setAcclKey( m->parent, m->menu, MMENUITEM( mi ), acclKey );
mi->action = action;
mi->data = data;
@@ -351,37 +361,38 @@ wMenuRadio_p wMenuRadioCreate(
* \return
*/
-void wMenuRadioSetActive(
- wMenuRadio_p mi )
+void wMenuRadioSetActive(
+ wMenuRadio_p mi )
{
- gtk_check_menu_item_set_active( (GtkCheckMenuItem *)MMENUITEM(mi), TRUE );
-}
+ gtk_check_menu_item_set_active( (GtkCheckMenuItem *)MMENUITEM(mi), TRUE );
+}
/*-----------------------------------------------------------------*/
/**
- * Create a menu entry
+ * Create a menu entry
*
* \param m IN menu to be extended
* \param helpStr IN reference into help
* \param labelStr IN text for entry
* \param acclKey IN acceleratoor key to add
- * \param action IN callback function
+ * \param action IN callback function
* \param data IN application data
* \return menu entry
*/
wMenuPush_p wMenuPushCreate(
- wMenu_p m,
- const char * helpStr,
- const char * labelStr,
- long acclKey,
- wMenuCallBack_p action,
- void *data )
+ wMenu_p m,
+ const char * helpStr,
+ const char * labelStr,
+ long acclKey,
+ wMenuCallBack_p action,
+ void *data )
{
wMenuPush_p mi;
- mi = (wMenuPush_p)createMenuItem( m, M_PUSH, helpStr, labelStr, sizeof( struct wMenuPush_t ));
+ mi = (wMenuPush_p)createMenuItem( m, M_PUSH, helpStr, labelStr,
+ sizeof( struct wMenuPush_t ));
setAcclKey( m->parent, m->menu, MMENUITEM( mi ), acclKey );
@@ -395,13 +406,13 @@ wMenuPush_p wMenuPushCreate(
* Enable menu entry
*
* \param mi IN menu entry
- * \param enable IN new state
+ * \param enable IN new state
* \return
*/
void wMenuPushEnable(
- wMenuPush_p mi,
- wBool_t enable )
+ wMenuPush_p mi,
+ wBool_t enable )
{
mi->enabled = enable;
gtk_widget_set_sensitive( GTK_WIDGET(MMENUITEM( mi )), enable );
@@ -419,12 +430,13 @@ void wMenuPushEnable(
*/
wMenu_p wMenuMenuCreate(
- wMenu_p m,
- const char * helpStr,
- const char * labelStr )
+ wMenu_p m,
+ const char * helpStr,
+ const char * labelStr )
{
wMenu_p mi;
- mi = (wMenu_p)createMenuItem( m, M_MENU, helpStr, labelStr, sizeof( struct wMenu_t ));
+ mi = (wMenu_p)createMenuItem( m, M_MENU, helpStr, labelStr,
+ sizeof( struct wMenu_t ));
mi->mmtype = MM_MENU;
mi->menu = gtk_menu_new();
@@ -442,7 +454,7 @@ wMenu_p wMenuMenuCreate(
*/
void wMenuSeparatorCreate(
- wMenu_p m )
+ wMenu_p m )
{
createMenuItem( m, M_SEPARATOR, NULL, "", sizeof( struct wMenuItem_t ));
}
@@ -464,46 +476,48 @@ int getMlistOrigin( wMenuList_p ml, GList **pChildren )
int count = 0;
int found = -1;
GtkWidget *mitem = MMENUITEM( ml );
-
+
*pChildren = gtk_container_get_children( GTK_CONTAINER( MPARENT( ml )->menu ));
- if( !*pChildren )
+ if( !*pChildren ) {
return( -1 );
-
+ }
+
while( (mi = g_list_nth_data( *pChildren, count ))) {
if( mi == mitem ) {
found = TRUE;
break;
- }
- else {
+ } else {
count++;
- }
+ }
}
-
- if( found )
+
+ if( found ) {
return( count );
- else
+ } else {
return( -1 );
+ }
}
/**
- * Signal handler for clicking onto a menu list item.
+ * Signal handler for clicking onto a menu list item.
* Parameters are the GtkWidget as expected and the pointer to the MenuListItem
*
* \param widget IN the GtkWidget
- * \param value IN the menu list item
+ * \param value IN the menu list item
* \return
*/
static void pushMenuList(
- GtkWidget * widget,
- gpointer value )
+ GtkWidget * widget,
+ gpointer value )
{
// pointer to the list item
wMenuListItem_p ml = (wMenuListItem_p)value;
- if (MRECURSION( ml ))
+ if (MRECURSION( ml )) {
return;
-
+ }
+
if (ml->mlist->count <= 0) {
// this should never happen
fprintf( stderr, "pushMenuItem: empty list\n" );
@@ -514,31 +528,32 @@ static void pushMenuList(
const char * itemLabel;
itemLabel = gtk_menu_item_get_label( GTK_MENU_ITEM( widget ));
-
- ml->mlist->action( 0, itemLabel, ml->data );
+
+ ml->mlist->action( 0, itemLabel, ml->data );
return;
}
fprintf( stderr, "pushMenuItem: item (%lx) not found\n", (long)widget );
}
/**
- * Create a list menu entry
+ * Create a list menu entry
*
* \param m IN menu to be extended
* \param helpStr IN reference into help
* \param max IN maximum number of elements
- * \param action IN callback function
+ * \param action IN callback function
* \return menu entry
*/
wMenuList_p wMenuListCreate(
- wMenu_p m,
- const char * helpStr,
- int max,
- wMenuListCallBack_p action )
+ wMenu_p m,
+ const char * helpStr,
+ int max,
+ wMenuListCallBack_p action )
{
wMenuList_p mi;
- mi = (wMenuList_p)createMenuItem( m, M_LIST, NULL, _("<Empty List>"), sizeof( struct wMenuList_t ));
+ mi = (wMenuList_p)createMenuItem( m, M_LIST, NULL, _("<Empty List>"),
+ sizeof( struct wMenuList_t ));
gtk_widget_set_sensitive( GTK_WIDGET(MMENUITEM( mi )), FALSE );
mi->next = NULL;
mi->count = 0;
@@ -551,90 +566,96 @@ wMenuList_p wMenuListCreate(
/**
* Add a new item to a list of menu entries
- * The placeholder for the list is looked up. Then the new item is added immediately
+ * The placeholder for the list is looked up. Then the new item is added immediately
* behind it. In case the maximum number of items is reached the last item is removed.
*
* \param ml IN handle for the menu list - the placeholder item
* \param index IN position of new menu item
- * \param labelStr IN the menu label for the new item
+ * \param labelStr IN the menu label for the new item
* \param data IN application data for the new item
- * \return
+ * \return
*/
void wMenuListAdd(
- wMenuList_p ml,
- int index,
- const char * labelStr,
- const void * data )
+ wMenuList_p ml,
+ int index,
+ const char * labelStr,
+ const void * data )
{
int i = 0;
GList * children;
i = getMlistOrigin( ml, &children );
-
+
if( i > -1 ) {
wMenuListItem_p mi;
// we're adding an item, so hide the default placeholder
gtk_widget_hide( MMENUITEM( ml ));
-
+
// delete an earlier entry with the same label
- wMenuListDelete( ml, labelStr );
+ wMenuListDelete( ml, labelStr );
// a new item
ml->count ++;
-
+
// is there a maximum number of items set and reached with the new item?
if(( ml->max != -1 ) && ( ml->count > ml-> max )) {
wMenuListItem_p mold;
GtkWidget * item;
-
+
// get the last item in the list
item = g_list_nth_data( children, i + ml->max );
// get the pointer to the data structure
mold = g_object_get_data( G_OBJECT( item ), WLISTITEM );
// kill the menu entry
gtk_widget_destroy( item );
- // free the data
+ // free the data
free( (void *)mold->labelStr );
free( (void *)mold );
ml->count--;
- }
-
+ }
+
// create the new menu item and initialize the data fields
- mi = (wMenuListItem_p)wlibAlloc( NULL, B_MENUITEM, 0, 0, labelStr, sizeof( struct wMenuListItem_t ), NULL );
+ mi = (wMenuListItem_p)wlibAlloc( NULL, B_MENUITEM, 0, 0, labelStr,
+ sizeof( struct wMenuListItem_t ), NULL );
MITEMTYPE( mi ) = M_LISTITEM;
MMENUITEM( mi ) = gtk_menu_item_new_with_label(wlibConvertInput(mi->labelStr));
mi->data = (void *)data;
mi->mlist = ml;
g_object_set_data( G_OBJECT(MMENUITEM( mi )), WLISTITEM, mi );
-
+
// add the item to the menu
- if ( index < 0 )
+ if ( index < 0 ) {
index = 0;
- if ( index >= ml->count )
+ }
+ if ( index >= ml->count ) {
index = ml->count - 1;
- gtk_menu_shell_insert((GtkMenuShell *)(MPARENT( ml )->menu), MMENUITEM( mi ), i + index + 1 );
- g_signal_connect( GTK_OBJECT(MMENUITEM( mi )), "activate", G_CALLBACK(pushMenuList), mi );
-
+ }
+ gtk_menu_shell_insert((GtkMenuShell *)(MPARENT( ml )->menu), MMENUITEM( mi ),
+ i + index + 1 );
+ g_signal_connect( GTK_OBJECT(MMENUITEM( mi )), "activate",
+ G_CALLBACK(pushMenuList), mi );
+
gtk_widget_show(MMENUITEM( mi ));
}
-
- if( children )
+
+ if( children ) {
g_list_free( children );
+ }
}
/**
* Remove the menu entry identified by a given label.
*
* \param ml IN menu list
- * \param labelStr IN label string of item
+ * \param labelStr IN label string of item
*/
void wMenuListDelete(
- wMenuList_p ml,
- const char * labelStr )
+ wMenuList_p ml,
+ const char * labelStr )
{
int i;
int found = FALSE;
@@ -642,30 +663,31 @@ void wMenuListDelete(
// find the placeholder for the list in the menu
i = getMlistOrigin( ml, &children );
-
+
if( i > -1 ) {
int origin;
- GtkWidget * item;
+ GtkWidget * item;
char * labelStrConverted;
-
+
// starting from the placeholder, find the menu item with the correct text
found = FALSE;
labelStrConverted = wlibConvertInput( labelStr );
origin = i;
-
+
// get menu item
// get label of item
// compare items
// if identical, leave loop
while( i <= origin + ml->count && !found ) {
const char * itemLabel;
-
+
item = g_list_nth_data( children, i );
itemLabel = gtk_menu_item_get_label( GTK_MENU_ITEM( item ));
- if( !g_utf8_collate (itemLabel, labelStrConverted ))
+ if( !g_utf8_collate (itemLabel, labelStrConverted )) {
found = TRUE;
- else
+ } else {
i++;
+ }
}
if( found ) {
wMenuListItem_p mold;
@@ -673,45 +695,47 @@ void wMenuListDelete(
mold = g_object_get_data( G_OBJECT( item ), WLISTITEM );
// kill the menu entry
gtk_widget_destroy( item );
- // free the data
+ // free the data
free( (void *)mold->labelStr );
free( (void *)mold );
- ml->count--;
+ ml->count--;
}
- }
-
- if( children )
+ }
+
+ if( children ) {
g_list_free( children );
+ }
}
/**
* Get the label and the application data of a specific menu list item
*
- * \param ml IN menu list
+ * \param ml IN menu list
* \param index IN item within list
* \param data OUT application data
* \return item label
*/
-const char *
+const char *
wMenuListGet( wMenuList_p ml, int index, void ** data )
{
int i;
GList * children;
const char * itemLabel = NULL;
-
+
// check whether index is in range, if not return immediately
if ( index >= ml->count || ml->count <= 0 ) {
- if (data)
+ if (data) {
*data = NULL;
+ }
return NULL;
}
-
+
// find the placeholder for the list in the menu
i = getMlistOrigin( ml, &children );
-
+
if( i > -1 ) {
GtkWidget * item;
wMenuListItem_p mold;
@@ -721,10 +745,11 @@ wMenuListGet( wMenuList_p ml, int index, void ** data )
mold = g_object_get_data( G_OBJECT( GTK_MENU_ITEM( item ) ), WLISTITEM );
*data = mold->data;
}
-
- if( children )
+
+ if( children ) {
g_list_free( children );
-
+ }
+
return itemLabel;
}
@@ -735,16 +760,17 @@ wMenuListGet( wMenuList_p ml, int index, void ** data )
*/
void wMenuListClear(
- wMenuList_p ml )
+ wMenuList_p ml )
{
int origin;
GList * children;
- if (ml->count == 0)
+ if (ml->count == 0) {
return;
+ }
origin = getMlistOrigin( ml, &children );
-
+
if( origin > -1 ) {
int i;
@@ -752,23 +778,24 @@ void wMenuListClear(
while( i < origin + ml->count ) {
wMenuListItem_p mold;
GtkWidget * item;
-
+
item = g_list_nth_data( children, i + 1 );
mold = g_object_get_data( G_OBJECT( item ), WLISTITEM );
// kill the menu entry
gtk_widget_destroy( item );
- // free the data
+ // free the data
free( (void *)mold->labelStr );
free( (void *)mold );
i++;
- }
- }
+ }
+ }
ml->count = 0;
gtk_widget_show( MMENUITEM( ml ));
-
- if( children )
+
+ if( children ) {
g_list_free( children );
+ }
}
/*-----------------------------------------------------------------*/
/**
@@ -779,30 +806,31 @@ void wMenuListClear(
* \param labelStr IN text for entry
* \param acclKey IN acceleratoor key to add
* \param set IN initial state
- * \param action IN callback function
+ * \param action IN callback function
* \param data IN application data
* \return menu entry
*/
wMenuToggle_p wMenuToggleCreate(
- wMenu_p m,
- const char * helpStr,
- const char * labelStr,
- long acclKey,
- wBool_t set,
- wMenuToggleCallBack_p action,
- void * data )
+ wMenu_p m,
+ const char * helpStr,
+ const char * labelStr,
+ long acclKey,
+ wBool_t set,
+ wMenuCallBack_p action,
+ void * data )
{
wMenuToggle_p mt;
- mt = (wMenuToggle_p)createMenuItem( m, M_TOGGLE, helpStr, labelStr, sizeof( struct wMenuToggle_t ));
+ mt = (wMenuToggle_p)createMenuItem( m, M_TOGGLE, helpStr, labelStr,
+ sizeof( struct wMenuToggle_t ));
setAcclKey( m->parent, m->menu, MMENUITEM( mt ), acclKey );
mt->action = action;
mt->data = data;
mt->enabled = TRUE;
MPARENT( mt ) = m;
wMenuToggleSet( mt, set );
-
+
return mt;
}
@@ -814,7 +842,7 @@ wMenuToggle_p wMenuToggleCreate(
*/
wBool_t wMenuToggleGet(
- wMenuToggle_p mt )
+ wMenuToggle_p mt )
{
return mt->set;
}
@@ -828,11 +856,11 @@ wBool_t wMenuToggleGet(
*/
wBool_t wMenuToggleSet(
- wMenuToggle_p mt,
- wBool_t set )
+ wMenuToggle_p mt,
+ wBool_t set )
{
wBool_t rc;
- if (mt==NULL) return 0;
+ if (mt==NULL) { return 0; }
MRECURSION( mt )++;
gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(MMENUITEM( mt )), set );
MRECURSION( mt )--;
@@ -845,13 +873,13 @@ wBool_t wMenuToggleSet(
* Enable menu entry containing a check box
*
* \param mi IN menu entry
- * \param enable IN new state
+ * \param enable IN new state
* \return
*/
void wMenuToggleEnable(
- wMenuToggle_p mt,
- wBool_t enable )
+ wMenuToggle_p mt,
+ wBool_t enable )
{
mt->enabled = enable;
}
@@ -860,29 +888,30 @@ void wMenuToggleEnable(
/*-----------------------------------------------------------------*/
/**
- * Set the text for a menu
+ * Set the text for a menu
*
* \param m IN menu entry
* \param labelStr IN new text
* \return
*/
-void wMenuSetLabel( wMenu_p m, const char * labelStr) {
+void wMenuSetLabel( wMenu_p m, const char * labelStr)
+{
wlibSetLabel( m->widget, m->option, labelStr, &m->labelG, &m->imageG );
}
/**
- * Signal handler for menu items. Parameters are the GtkWidget as
+ * Signal handler for menu items. Parameters are the GtkWidget as
* expected and the pointer to the MenuListItem
*
* \param widget IN the GtkWidget
- * \param value IN the menu list item
+ * \param value IN the menu list item
* \return
*/
static gint pushMenu(
- GtkWidget * widget,
- wMenu_p m )
+ GtkWidget * widget,
+ wMenu_p m )
{
gtk_menu_popup( GTK_MENU(m->menu), NULL, NULL, NULL, NULL, 0, 0 );
/* Tell calling code that we have handled this event; the buck
@@ -903,12 +932,12 @@ static gint pushMenu(
*/
wMenu_p wMenuCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- const char * labelStr,
- long option )
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option )
{
wMenu_p m;
m = wlibAlloc( parent, B_MENU, x, y, labelStr, sizeof( struct wMenu_t ), NULL );
@@ -920,12 +949,12 @@ wMenu_p wMenuCreate(
m->widget = gtk_button_new();
g_signal_connect (GTK_OBJECT(m->widget), "clicked",
- G_CALLBACK(pushMenu), m );
+ G_CALLBACK(pushMenu), m );
m->menu = gtk_menu_new();
wMenuSetLabel( m, labelStr );
-
+
gtk_fixed_put( GTK_FIXED(parent->widget), m->widget, m->realX, m->realY );
wlibControlGetSize( (wControl_p)m );
if ( m->w < 80 && (m->option&BO_ICON)==0) {
@@ -939,27 +968,27 @@ wMenu_p wMenuCreate(
}
/**
- * Add a drop-down menu to the menu bar.
+ * Add a drop-down menu to the menu bar.
*
- * \param w IN main window handle
+ * \param w IN main window handle
* \param helpStr IN unused (should be help topic )
- * \param labelStr IN label for the drop-down menu
+ * \param labelStr IN label for the drop-down menu
* \return pointer to the created drop-down menu
*/
wMenu_p wMenuBarAdd(
- wWin_p w,
- const char * helpStr,
- const char * labelStr )
+ wWin_p w,
+ const char * helpStr,
+ const char * labelStr )
{
wMenu_p m;
GtkWidget * menuItem;
-
+
m = wlibAlloc( w, B_MENU, 0, 0, labelStr, sizeof( struct wMenu_t ), NULL );
m->mmtype = MM_BAR;
m->realX = 0;
m->realY = 0;
-
+
menuItem = gtk_menu_item_new_with_mnemonic( wlibConvertInput(m->labelStr) );
m->menu = gtk_menu_new();
gtk_menu_item_set_submenu( GTK_MENU_ITEM(menuItem), m->menu );
@@ -968,10 +997,10 @@ wMenu_p wMenuBarAdd(
m->w = 0;
m->h = 0;
-
+
/* TODO: why is help not supported here? */
/*gtkAddHelpString( m->panel_item, helpStr );*/
-
+
return m;
}
@@ -982,13 +1011,13 @@ wMenu_p wMenuBarAdd(
* Create a popup menu (context menu)
*
* \param w IN parent window
- * \param labelStr IN label
+ * \param labelStr IN label
* \return the created menu
*/
wMenu_p wMenuPopupCreate(
- wWin_p w,
- const char * labelStr )
+ wWin_p w,
+ const char * labelStr )
{
wMenu_p b;
b = wlibAlloc( w, B_MENU, 0, 0, labelStr, sizeof *b, NULL );
@@ -999,10 +1028,11 @@ wMenu_p wMenuPopupCreate(
b->w = 0;
b->h = 0;
g_signal_connect( GTK_OBJECT (b->menu), "key_press_event",
- G_CALLBACK(catch_shift_ctrl_alt_keys), b);
+ G_CALLBACK(catch_shift_ctrl_alt_keys), b);
g_signal_connect( GTK_OBJECT (b->menu), "key_release_event",
- G_CALLBACK (catch_shift_ctrl_alt_keys), b);
- gtk_widget_set_events ( GTK_WIDGET(b->menu), GDK_EXPOSURE_MASK|GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK );
+ G_CALLBACK (catch_shift_ctrl_alt_keys), b);
+ gtk_widget_set_events ( GTK_WIDGET(b->menu),
+ GDK_EXPOSURE_MASK|GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK );
return b;
}
@@ -1023,30 +1053,30 @@ void wMenuPopupShow( wMenu_p mp )
/**
* ?? Seems to be related to macro / automatic playback functionality
*
- * \param m IN
- * \param func IN
- * \param data IN
+ * \param m IN
+ * \param func IN
+ * \param data IN
*/
void wMenuSetTraceCallBack(
- wMenu_p m,
- wMenuTraceCallBack_p func,
- void * data )
+ wMenu_p m,
+ wMenuTraceCallBack_p func,
+ void * data )
{
m->traceFunc = func;
m->traceData = data;
}
/**
- * ??? same as above
- * \param m IN
- * \param label IN
+ * ??? same as above
+ * \param m IN
+ * \param label IN
* \return describe the return value
*/
wBool_t wMenuAction(
- wMenu_p m,
- const char * label )
+ wMenu_p m,
+ const char * label )
{
wMenuItem_p mi;
wMenuToggle_p mt;
@@ -1056,10 +1086,11 @@ wBool_t wMenuAction(
case M_SEPARATOR:
break;
case M_PUSH:
- if ( ((wMenuPush_p)mi)->enabled == FALSE )
+ if ( ((wMenuPush_p)mi)->enabled == FALSE ) {
wBeep();
- else
+ } else {
((wMenuPush_p)mi)->action( ((wMenuPush_p)mi)->data );
+ }
break;
case M_TOGGLE:
mt = (wMenuToggle_p)mi;
@@ -1067,7 +1098,7 @@ wBool_t wMenuAction(
wBeep();
} else {
wMenuToggleSet( mt, !mt->set );
- mt->action( mt->set, mt->data );
+ mt->action( mt->data );
}
break;
case M_MENU:
@@ -1076,7 +1107,7 @@ wBool_t wMenuAction(
break;
default:
/*fprintf(stderr, "Oops: wMenuAction\n");*/
- break;
+ break;
}
return TRUE;
}
diff --git a/app/wlib/gtklib/message.c b/app/wlib/gtklib/message.c
index af37d22..6a63434 100644
--- a/app/wlib/gtklib/message.c
+++ b/app/wlib/gtklib/message.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
@@ -42,10 +42,10 @@
*/
struct wMessage_t {
- WOBJ_COMMON
- GtkWidget * labelWidget;
- const char * message;
- wPos_t labelWidth;
+ WOBJ_COMMON
+ GtkWidget * labelWidget;
+ const char * message;
+ wWinPix_t labelWidth;
};
/**
@@ -57,14 +57,14 @@ struct wMessage_t {
*/
void wMessageSetValue(
- wMessage_p b,
- const char * arg)
+ wMessage_p b,
+ const char * arg)
{
- if (b->widget == 0) {
- abort();
- }
+ if (b->widget == 0) {
+ abort();
+ }
- gtk_label_set_text(GTK_LABEL(b->labelWidget), wlibConvertInput(arg));
+ gtk_label_set_text(GTK_LABEL(b->labelWidget), wlibConvertInput(arg));
}
/**
@@ -76,11 +76,11 @@ void wMessageSetValue(
*/
void wMessageSetWidth(
- wMessage_p b,
- wPos_t width)
+ wMessage_p b,
+ wWinPix_t width)
{
- b->labelWidth = width;
- gtk_widget_set_size_request(b->widget, width, -1);
+ b->labelWidth = width;
+ gtk_widget_set_size_request(b->widget, width, -1);
}
/**
@@ -90,48 +90,48 @@ void wMessageSetWidth(
* \return text height
*/
-wPos_t wMessageGetHeight(
- long flags)
+wWinPix_t wMessageGetHeight(
+ long flags)
{
- GtkWidget * temp;
+ GtkWidget * temp;
- if (!(flags&COMBOBOX)) {
+ if (!(flags&COMBOBOX)) {
temp = gtk_label_new("Test"); //To get size of text itself
- } else {
- temp = gtk_combo_box_text_new(); //to get max size of an object in infoBar
- }
-
- if (wMessageSetFont(flags)) {
- GtkStyle *style;
- PangoFontDescription *fontDesc;
- int fontSize;
- /* get the current font descriptor */
- style = gtk_widget_get_style(temp);
- fontDesc = style->font_desc;
- /* get the current font size */
- fontSize = PANGO_PIXELS(pango_font_description_get_size(fontDesc));
-
- /* calculate the new font size */
- if (flags & BM_LARGE) {
- pango_font_description_set_size(fontDesc, fontSize * 1.4 * PANGO_SCALE);
- } else {
- pango_font_description_set_size(fontDesc, fontSize * 0.7 * PANGO_SCALE);
- }
-
- /* set the new font size */
- gtk_widget_modify_font(temp, fontDesc);
- }
-
- if (flags&1L) {
- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(temp),"Test");
- }
-
- GtkRequisition temp_requisition;
- gtk_widget_size_request(temp,&temp_requisition);
- g_object_ref_sink(temp);
- gtk_widget_destroy(temp);
- g_object_unref(temp);
- return temp_requisition.height;
+ } else {
+ temp = gtk_combo_box_text_new(); //to get max size of an object in infoBar
+ }
+
+ if (wMessageSetFont(flags)) {
+ GtkStyle *style;
+ PangoFontDescription *fontDesc;
+ int fontSize;
+ /* get the current font descriptor */
+ style = gtk_widget_get_style(temp);
+ fontDesc = style->font_desc;
+ /* get the current font size */
+ fontSize = PANGO_PIXELS(pango_font_description_get_size(fontDesc));
+
+ /* calculate the new font size */
+ if (flags & BM_LARGE) {
+ pango_font_description_set_size(fontDesc, fontSize * 1.4 * PANGO_SCALE);
+ } else {
+ pango_font_description_set_size(fontDesc, fontSize * 0.7 * PANGO_SCALE);
+ }
+
+ /* set the new font size */
+ gtk_widget_modify_font(temp, fontDesc);
+ }
+
+ if (flags&1L) {
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(temp),"Test");
+ }
+
+ GtkRequisition temp_requisition;
+ gtk_widget_size_request(temp,&temp_requisition);
+ g_object_ref_sink(temp);
+ gtk_widget_destroy(temp);
+ g_object_unref(temp);
+ return temp_requisition.height;
}
/**
@@ -148,61 +148,61 @@ wPos_t wMessageGetHeight(
*/
wMessage_p wMessageCreateEx(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * labelStr,
- wPos_t width,
- const char *message,
- long flags)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * labelStr,
+ wWinPix_t width,
+ const char *message,
+ long flags)
{
- wMessage_p b;
- GtkRequisition requisition;
- GtkStyle *style;
- PangoFontDescription *fontDesc;
- int fontSize;
- b = (wMessage_p)wlibAlloc(parent, B_MESSAGE, x, y, NULL, sizeof *b, NULL);
- wlibComputePos((wControl_p)b);
- b->message = message;
- b->labelWidth = width;
- b->labelWidget = gtk_label_new(message?wlibConvertInput(message):"");
-
- /* do we need to set a special font? */
- if (wMessageSetFont(flags)) {
- /* get the current font descriptor */
- style = gtk_widget_get_style(GTK_WIDGET(b->labelWidget));
- fontDesc = style->font_desc;
- /* get the current font size */
- fontSize = PANGO_PIXELS(pango_font_description_get_size(fontDesc));
-
- /* calculate the new font size */
- if (flags & BM_LARGE) {
- pango_font_description_set_size(fontDesc, fontSize * 1.4 * PANGO_SCALE);
- } else {
- pango_font_description_set_size(fontDesc, fontSize * 0.7 * PANGO_SCALE);
- }
-
- /* set the new font size */
- gtk_widget_modify_font((GtkWidget *)b->labelWidget, fontDesc);
- }
-
- b->widget = gtk_fixed_new();
- gtk_widget_size_request(GTK_WIDGET(b->labelWidget), &requisition);
- gtk_container_add(GTK_CONTAINER(b->widget), b->labelWidget);
- gtk_widget_set_size_request(b->widget, width?width:requisition.width,
- requisition.height);
- wlibControlGetSize((wControl_p)b);
- gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
- gtk_widget_show(b->widget);
- gtk_widget_show(b->labelWidget);
- wlibAddButton((wControl_p)b);
-
- /* Reset font size to normal */
- if (wMessageSetFont(flags)) {
- pango_font_description_set_size(fontDesc, fontSize * PANGO_SCALE);
- }
-
- return b;
+ wMessage_p b;
+ GtkRequisition requisition;
+ GtkStyle *style;
+ PangoFontDescription *fontDesc;
+ int fontSize;
+ b = (wMessage_p)wlibAlloc(parent, B_MESSAGE, x, y, NULL, sizeof *b, NULL);
+ wlibComputePos((wControl_p)b);
+ b->message = message;
+ b->labelWidth = width;
+ b->labelWidget = gtk_label_new(message?wlibConvertInput(message):"");
+
+ /* do we need to set a special font? */
+ if (wMessageSetFont(flags)) {
+ /* get the current font descriptor */
+ style = gtk_widget_get_style(GTK_WIDGET(b->labelWidget));
+ fontDesc = style->font_desc;
+ /* get the current font size */
+ fontSize = PANGO_PIXELS(pango_font_description_get_size(fontDesc));
+
+ /* calculate the new font size */
+ if (flags & BM_LARGE) {
+ pango_font_description_set_size(fontDesc, fontSize * 1.4 * PANGO_SCALE);
+ } else {
+ pango_font_description_set_size(fontDesc, fontSize * 0.7 * PANGO_SCALE);
+ }
+
+ /* set the new font size */
+ gtk_widget_modify_font((GtkWidget *)b->labelWidget, fontDesc);
+ }
+
+ b->widget = gtk_fixed_new();
+ gtk_widget_size_request(GTK_WIDGET(b->labelWidget), &requisition);
+ gtk_container_add(GTK_CONTAINER(b->widget), b->labelWidget);
+ gtk_widget_set_size_request(b->widget, width?width:requisition.width,
+ requisition.height);
+ wlibControlGetSize((wControl_p)b);
+ gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
+ gtk_widget_show(b->widget);
+ gtk_widget_show(b->labelWidget);
+ wlibAddButton((wControl_p)b);
+
+ /* Reset font size to normal */
+ if (wMessageSetFont(flags)) {
+ pango_font_description_set_size(fontDesc, fontSize * PANGO_SCALE);
+ }
+
+ return b;
}
/**
@@ -212,13 +212,13 @@ wMessage_p wMessageCreateEx(
* \return expected width of message box
*/
-wPos_t
+wWinPix_t
wMessageGetWidth(const char *testString)
{
- GtkWidget *entry;
- GtkRequisition requisition;
+// GtkWidget *entry;
+// GtkRequisition requisition;
- return( wLabelWidth(testString));
+ return( wLabelWidth(testString));
// entry = gtk_entry_new();
// g_object_ref_sink(entry);
//
diff --git a/app/wlib/gtklib/notice.c b/app/wlib/gtklib/notice.c
index 0134b4f..5ab352b 100644
--- a/app/wlib/gtklib/notice.c
+++ b/app/wlib/gtklib/notice.c
@@ -41,9 +41,9 @@
static char * wlibChgMnemonic(char *label);
typedef struct {
- GtkWidget * win;
- GtkWidget * label;
- GtkWidget * butt[3];
+ GtkWidget * win;
+ GtkWidget * label;
+ GtkWidget * butt[3];
} notice_win;
static notice_win noticeW;
static long noticeValue;
@@ -55,17 +55,17 @@ static long noticeValue;
*/
static void doNotice(
- GtkWidget * widget,
- long value)
+ GtkWidget * widget,
+ long value)
{
- if (value != 2) {
- // event not from from closing the window but from a button press
- // Close the Notice dialog
- gtk_widget_destroy(noticeW.win);
- // Remember the button
- noticeValue = value;
- }
- wlibDoModal(NULL, FALSE);
+ if (value != 2) {
+ // event not from from closing the window but from a button press
+ // Close the Notice dialog
+ gtk_widget_destroy(noticeW.win);
+ // Remember the button
+ noticeValue = value;
+ }
+ wlibDoModal(NULL, FALSE);
}
/**
@@ -84,48 +84,48 @@ int wNoticeEx(int type,
const char * no)
{
- int res;
- unsigned flag;
- char *headline;
- GtkWidget *dialog;
- GtkWindow *parent = NULL;
+ int res;
+ unsigned flag = GTK_MESSAGE_ERROR;
+ char *headline = _("Error");
+ GtkWidget *dialog;
+ GtkWindow *parent = NULL;
- switch (type) {
- case NT_INFORMATION:
- flag = GTK_MESSAGE_INFO;
- headline = _("Information");
- break;
+ switch (type) {
+ case NT_INFORMATION:
+ flag = GTK_MESSAGE_INFO;
+ headline = _("Information");
+ break;
- case NT_WARNING:
- flag = GTK_MESSAGE_WARNING;
- headline = _("Warning");
- break;
+ case NT_WARNING:
+ flag = GTK_MESSAGE_WARNING;
+ headline = _("Warning");
+ break;
- case NT_ERROR:
- flag = GTK_MESSAGE_ERROR;
- headline = _("Error");
- break;
- }
+ case NT_ERROR:
+ flag = GTK_MESSAGE_ERROR;
+ headline = _("Error");
+ break;
+ }
- if (gtkMainW) {
- parent = GTK_WINDOW(gtkMainW->gtkwin);
- }
+ if (gtkMainW) {
+ parent = GTK_WINDOW(gtkMainW->gtkwin);
+ }
- wDestroySplash();
+ wDestroySplash();
- dialog = gtk_message_dialog_new(parent,
- GTK_DIALOG_DESTROY_WITH_PARENT,
- flag,
- ((no==NULL)?GTK_BUTTONS_OK:GTK_BUTTONS_YES_NO),
- "%s", msg);
- gtk_window_set_title(GTK_WINDOW(dialog), headline);
+ dialog = gtk_message_dialog_new(parent,
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ flag,
+ ((no==NULL)?GTK_BUTTONS_OK:GTK_BUTTONS_YES_NO),
+ "%s", msg);
+ gtk_window_set_title(GTK_WINDOW(dialog), headline);
- gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
+ gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
- res = gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
+ res = gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
- return res == GTK_RESPONSE_OK || res == GTK_RESPONSE_YES;
+ return res == GTK_RESPONSE_OK || res == GTK_RESPONSE_YES;
}
@@ -141,11 +141,11 @@ int wNoticeEx(int type,
*/
int wNotice(
- const char * msg, /* Message */
- const char * yes, /* First button label */
- const char * no) /* Second label (or 'NULL') */
+ const char * msg, /* Message */
+ const char * yes, /* First button label */
+ const char * no) /* Second label (or 'NULL') */
{
- return wNotice3(msg, yes, no, NULL);
+ return wNotice3(msg, yes, no, NULL);
}
/** \brief Popup a notice box with three buttons.
@@ -167,121 +167,121 @@ int wNotice(
*/
int wNotice3(
- const char * msg, /* Message */
- const char * affirmative, /* First button label */
- const char * cancel, /* Second label (or 'NULL') */
- const char * alternate)
+ const char * msg, /* Message */
+ const char * affirmative, /* First button label */
+ const char * cancel, /* Second label (or 'NULL') */
+ const char * alternate)
{
- notice_win *nw;
- GtkWidget * vbox;
- GtkWidget * hbox;
- GtkWidget * hbox1;
- GtkWidget * image;
- nw = &noticeW;
-
- char *aff = NULL;
- char *can = NULL;
- char *alt = NULL;
-
- wDestroySplash();
-
- nw->win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-
- gtk_window_set_position(GTK_WINDOW(nw->win), GTK_WIN_POS_CENTER);
- gtk_container_set_border_width(GTK_CONTAINER(nw->win), 0);
- gtk_window_set_resizable(GTK_WINDOW(nw->win), FALSE);
- gtk_window_set_modal(GTK_WINDOW(nw->win), TRUE);
- gtk_window_set_type_hint(GTK_WINDOW(nw->win), GDK_WINDOW_TYPE_HINT_DIALOG);
-
- vbox = gtk_vbox_new(FALSE, 12);
- gtk_widget_show(vbox);
- gtk_container_add(GTK_CONTAINER(nw->win), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
-
- hbox = gtk_hbox_new(FALSE, 12);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
- gtk_widget_show(hbox);
-
- image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_WARNING,
- GTK_ICON_SIZE_DIALOG);
- gtk_widget_show(image);
- gtk_box_pack_start(GTK_BOX(hbox), image, TRUE, TRUE, 0);
- gtk_misc_set_alignment(GTK_MISC(image), 0, 0);
-
- /* create the text label, allow GTK to wrap and allow for markup (for future enhancements) */
- nw->label = gtk_label_new(msg);
- gtk_widget_show(nw->label);
- gtk_box_pack_end(GTK_BOX(hbox), nw->label, TRUE, TRUE, 0);
- gtk_label_set_use_markup(GTK_LABEL(nw->label), FALSE);
- gtk_label_set_line_wrap(GTK_LABEL(nw->label), TRUE);
- gtk_misc_set_alignment(GTK_MISC(nw->label), 0, 0);
-
- /* this hbox will include the button bar */
- hbox1 = gtk_hbox_new(TRUE, 0);
- gtk_widget_show(hbox1);
- gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, TRUE, 0);
-
- /* add the respective buttons */
- aff = wlibChgMnemonic((char *) affirmative);
- nw->butt[ 0 ] = gtk_button_new_with_mnemonic(aff);
- gtk_widget_show(nw->butt[ 0 ]);
- gtk_box_pack_end(GTK_BOX(hbox1), nw->butt[ 0 ], TRUE, TRUE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(nw->butt[ 0 ]), 3);
- g_signal_connect(GTK_OBJECT(nw->butt[0]), "clicked", G_CALLBACK(doNotice),
- (void*)1);
- gtk_widget_set_can_default(nw->butt[ 0 ], TRUE);
-
- if (cancel) {
- can = wlibChgMnemonic((char *) cancel);
- nw->butt[ 1 ] = gtk_button_new_with_mnemonic(can);
- gtk_widget_show(nw->butt[ 1 ]);
- gtk_box_pack_end(GTK_BOX(hbox1), nw->butt[ 1 ], TRUE, TRUE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(nw->butt[ 1 ]), 3);
- g_signal_connect(GTK_OBJECT(nw->butt[1]), "clicked", G_CALLBACK(doNotice),
- (void*)0);
- gtk_widget_set_can_default(nw->butt[ 1 ], TRUE);
-
- if (alternate) {
- alt = wlibChgMnemonic((char *) alternate);
- nw->butt[ 2 ] = gtk_button_new_with_mnemonic(alt);
- gtk_widget_show(nw->butt[ 2 ]);
- gtk_box_pack_start(GTK_BOX(hbox1), nw->butt[ 2 ], TRUE, TRUE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(nw->butt[ 2 ]), 3);
- g_signal_connect(GTK_OBJECT(nw->butt[2]), "clicked", G_CALLBACK(doNotice),
- (void*)-1);
- gtk_widget_set_can_default(nw->butt[ 2 ], TRUE);
- }
- }
-
- g_signal_connect(GTK_WINDOW(nw->win),
- "destroy", G_CALLBACK(doNotice), (void*)2);
-
- gtk_widget_grab_default(nw->butt[ 0 ]);
- gtk_widget_grab_focus(nw->butt[ 0 ]);
-
- gtk_widget_show(nw->win);
-
- if (gtkMainW) {
- gtk_window_set_transient_for(GTK_WINDOW(nw->win), GTK_WINDOW(gtkMainW->gtkwin));
- /* gdk_window_set_group( nw->win->window, gtkMainW->gtkwin->window ); */
- }
-
- noticeValue = 0; // Default: Cancel
- wlibDoModal(NULL, TRUE);
-
- if (aff) {
- free(aff);
- }
-
- if (can) {
- free(can);
- }
-
- if (alt) {
- free(alt);
- }
-
- return noticeValue;
+ notice_win *nw;
+ GtkWidget * vbox;
+ GtkWidget * hbox;
+ GtkWidget * hbox1;
+ GtkWidget * image;
+ nw = &noticeW;
+
+ char *aff = NULL;
+ char *can = NULL;
+ char *alt = NULL;
+
+ wDestroySplash();
+
+ nw->win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
+ gtk_window_set_position(GTK_WINDOW(nw->win), GTK_WIN_POS_CENTER);
+ gtk_container_set_border_width(GTK_CONTAINER(nw->win), 0);
+ gtk_window_set_resizable(GTK_WINDOW(nw->win), FALSE);
+ gtk_window_set_modal(GTK_WINDOW(nw->win), TRUE);
+ gtk_window_set_type_hint(GTK_WINDOW(nw->win), GDK_WINDOW_TYPE_HINT_DIALOG);
+
+ vbox = gtk_vbox_new(FALSE, 12);
+ gtk_widget_show(vbox);
+ gtk_container_add(GTK_CONTAINER(nw->win), vbox);
+ gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
+
+ hbox = gtk_hbox_new(FALSE, 12);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+ gtk_widget_show(hbox);
+
+ image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_WARNING,
+ GTK_ICON_SIZE_DIALOG);
+ gtk_widget_show(image);
+ gtk_box_pack_start(GTK_BOX(hbox), image, TRUE, TRUE, 0);
+ gtk_misc_set_alignment(GTK_MISC(image), 0, 0);
+
+ /* create the text label, allow GTK to wrap and allow for markup (for future enhancements) */
+ nw->label = gtk_label_new(msg);
+ gtk_widget_show(nw->label);
+ gtk_box_pack_end(GTK_BOX(hbox), nw->label, TRUE, TRUE, 0);
+ gtk_label_set_use_markup(GTK_LABEL(nw->label), FALSE);
+ gtk_label_set_line_wrap(GTK_LABEL(nw->label), TRUE);
+ gtk_misc_set_alignment(GTK_MISC(nw->label), 0, 0);
+
+ /* this hbox will include the button bar */
+ hbox1 = gtk_hbox_new(TRUE, 0);
+ gtk_widget_show(hbox1);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, TRUE, 0);
+
+ /* add the respective buttons */
+ aff = wlibChgMnemonic((char *) affirmative);
+ nw->butt[ 0 ] = gtk_button_new_with_mnemonic(aff);
+ gtk_widget_show(nw->butt[ 0 ]);
+ gtk_box_pack_end(GTK_BOX(hbox1), nw->butt[ 0 ], TRUE, TRUE, 0);
+ gtk_container_set_border_width(GTK_CONTAINER(nw->butt[ 0 ]), 3);
+ g_signal_connect(GTK_OBJECT(nw->butt[0]), "clicked", G_CALLBACK(doNotice),
+ (void*)1);
+ gtk_widget_set_can_default(nw->butt[ 0 ], TRUE);
+
+ if (cancel) {
+ can = wlibChgMnemonic((char *) cancel);
+ nw->butt[ 1 ] = gtk_button_new_with_mnemonic(can);
+ gtk_widget_show(nw->butt[ 1 ]);
+ gtk_box_pack_end(GTK_BOX(hbox1), nw->butt[ 1 ], TRUE, TRUE, 0);
+ gtk_container_set_border_width(GTK_CONTAINER(nw->butt[ 1 ]), 3);
+ g_signal_connect(GTK_OBJECT(nw->butt[1]), "clicked", G_CALLBACK(doNotice),
+ (void*)0);
+ gtk_widget_set_can_default(nw->butt[ 1 ], TRUE);
+
+ if (alternate) {
+ alt = wlibChgMnemonic((char *) alternate);
+ nw->butt[ 2 ] = gtk_button_new_with_mnemonic(alt);
+ gtk_widget_show(nw->butt[ 2 ]);
+ gtk_box_pack_start(GTK_BOX(hbox1), nw->butt[ 2 ], TRUE, TRUE, 0);
+ gtk_container_set_border_width(GTK_CONTAINER(nw->butt[ 2 ]), 3);
+ g_signal_connect(GTK_OBJECT(nw->butt[2]), "clicked", G_CALLBACK(doNotice),
+ (void*)-1);
+ gtk_widget_set_can_default(nw->butt[ 2 ], TRUE);
+ }
+ }
+
+ g_signal_connect(GTK_WINDOW(nw->win),
+ "destroy", G_CALLBACK(doNotice), (void*)2);
+
+ gtk_widget_grab_default(nw->butt[ 0 ]);
+ gtk_widget_grab_focus(nw->butt[ 0 ]);
+
+ gtk_widget_show(nw->win);
+
+ if (gtkMainW) {
+ gtk_window_set_transient_for(GTK_WINDOW(nw->win), GTK_WINDOW(gtkMainW->gtkwin));
+ /* gdk_window_set_group( nw->win->window, gtkMainW->gtkwin->window ); */
+ }
+
+ noticeValue = 0; // Default: Cancel
+ wlibDoModal(NULL, TRUE);
+
+ if (aff) {
+ free(aff);
+ }
+
+ if (can) {
+ free(can);
+ }
+
+ if (alt) {
+ free(alt);
+ }
+
+ return noticeValue;
}
/* \brief Convert label string from Windows mnemonic to GTK
@@ -295,18 +295,18 @@ int wNotice3(
static
char * wlibChgMnemonic(char *label)
{
- char *ptr;
- char *cp;
+ char *ptr;
+ char *cp;
- cp = strdup(label);
+ cp = strdup(label);
- ptr = strchr(cp, '&');
+ ptr = strchr(cp, '&');
- if (ptr) {
- *ptr = '_';
- }
+ if (ptr) {
+ *ptr = '_';
+ }
- return (cp);
+ return (cp);
}
diff --git a/app/wlib/gtklib/opendocument.c b/app/wlib/gtklib/opendocument.c
index c03f9cb..5c057ec 100644
--- a/app/wlib/gtklib/opendocument.c
+++ b/app/wlib/gtklib/opendocument.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
@@ -55,24 +55,24 @@
static char *
ExtendPath(void)
{
- char *path = strdup(getenv("PATH"));
- DynString newPath;
- DynStringMalloc(&newPath, 16);
+ char *path = strdup(getenv("PATH"));
+ DynString newPath;
+ DynStringMalloc(&newPath, 16);
- // append XTrackCAD's directory to the path as a fallback
- DynStringCatCStrs(&newPath,
- path,
- ":",
- wGetAppLibDir(),
- NULL);
+ // append XTrackCAD's directory to the path as a fallback
+ DynStringCatCStrs(&newPath,
+ path,
+ ":",
+ wGetAppLibDir(),
+ NULL);
- setenv("PATH",
- DynStringToCStr(&newPath),
- TRUE);
+ setenv("PATH",
+ DynStringToCStr(&newPath),
+ TRUE);
- DynStringFree(&newPath);
+ DynStringFree(&newPath);
- return (path);
+ return (path);
}
/**
@@ -85,33 +85,33 @@ ExtendPath(void)
unsigned wOpenFileExternal(char * filename)
{
- int rc;
- DynString commandLine;
- char *currentPath;
-
- assert(filename != NULL);
- assert(strlen(filename));
-
- currentPath = ExtendPath();
-
- DynStringMalloc(&commandLine, 16);
- DynStringCatCStrs(&commandLine,
- DEFAULTOPENCOMMAND,
- " \"",
- filename,
- "\"",
- NULL);
-
- // the command should be found via the PATH
- rc = system(DynStringToCStr(&commandLine));
-
- // restore the PATH
- setenv("PATH",
- currentPath,
- TRUE);
-
- free(currentPath);
- DynStringFree(&commandLine);
-
- return(rc==0);
+ int rc;
+ DynString commandLine;
+ char *currentPath;
+
+ assert(filename != NULL);
+ assert(strlen(filename));
+
+ currentPath = ExtendPath();
+
+ DynStringMalloc(&commandLine, 16);
+ DynStringCatCStrs(&commandLine,
+ DEFAULTOPENCOMMAND,
+ " \"",
+ filename,
+ "\"",
+ NULL);
+
+ // the command should be found via the PATH
+ rc = system(DynStringToCStr(&commandLine));
+
+ // restore the PATH
+ setenv("PATH",
+ currentPath,
+ TRUE);
+
+ free(currentPath);
+ DynStringFree(&commandLine);
+
+ return(rc==0);
}
diff --git a/app/wlib/gtklib/osxhelp.c b/app/wlib/gtklib/osxhelp.c
index 4ec1f5e..b508961 100644
--- a/app/wlib/gtklib/osxhelp.c
+++ b/app/wlib/gtklib/osxhelp.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -28,7 +28,6 @@
#include <errno.h>
#include <fcntl.h>
-#include "misc.h"
#include "gtkint.h"
#include "i18n.h"
@@ -40,6 +39,7 @@ static pid_t pidOfChild;
static int handleOfPipe;
extern char *wExecutableName;
+extern wBool_t CheckHelpTopicExists(const char *);
/**
* Create the fully qualified filename for the help helper
@@ -51,15 +51,15 @@ extern char *wExecutableName;
static
char *ChildProgramFile(char *parentProgram)
{
- char *startOfFilename;
- char *childProgram;
+ char *startOfFilename;
+ char *childProgram;
- childProgram = malloc(strlen(parentProgram)+ sizeof(HELPERPROGRAM) + 1);
- strcpy(childProgram, parentProgram);
- startOfFilename = strrchr(childProgram, '/');
- strcpy(startOfFilename + 1, HELPERPROGRAM);
+ childProgram = malloc(strlen(parentProgram)+ sizeof(HELPERPROGRAM) + 1);
+ strcpy(childProgram, parentProgram);
+ startOfFilename = strrchr(childProgram, '/');
+ strcpy(startOfFilename + 1, HELPERPROGRAM);
- return (childProgram);
+ return (childProgram);
}
@@ -71,92 +71,93 @@ char *ChildProgramFile(char *parentProgram)
void wHelp(const char * topic)
{
- pid_t newPid;
- int status;
- const char html[] = ".html";
- static char *directory; /**< base directory for HTML files */
- char * htmlFile;
-
- struct {
- int length;
- char *page;
- } buffer;
-
- if (!CheckHelpTopicExists(topic)) return;
-
- // check whether child already exists
- if (pidOfChild != 0) {
- if (waitpid(pidOfChild, &status, WNOHANG) < 0) {
- // child exited -> clean up
- close(handleOfPipe);
- unlink(HELPCOMMANDPIPE);
- handleOfPipe = 0;
- pidOfChild = 0; // child exited
- }
- }
-
- // (re)start child
- if (pidOfChild == 0) {
- unlink(HELPCOMMANDPIPE);
- int rc = mkfifo(HELPCOMMANDPIPE, 0666);
- newPid = fork(); /* New process starts here */
-
- if (newPid > 0) {
- pidOfChild = newPid;
- } else if (newPid == 0) {
+ pid_t newPid;
+ int status;
+ const char html[] = ".html";
+ static char *directory; /**< base directory for HTML files */
+ char * htmlFile;
+
+ struct {
+ int length;
+ char *page;
+ } buffer;
+
+ if (!CheckHelpTopicExists(topic)) { return; }
+
+ // check whether child already exists
+ if (pidOfChild != 0) {
+ if (waitpid(pidOfChild, &status, WNOHANG) < 0) {
+ // child exited -> clean up
+ close(handleOfPipe);
+ unlink(HELPCOMMANDPIPE);
+ handleOfPipe = 0;
+ pidOfChild = 0; // child exited
+ }
+ }
+
+ // (re)start child
+ if (pidOfChild == 0) {
+ unlink(HELPCOMMANDPIPE);
+ int rc = mkfifo(HELPCOMMANDPIPE, 0666);
+ newPid = fork(); /* New process starts here */
+
+ if (newPid > 0) {
+ pidOfChild = newPid;
+ } else if (newPid == 0) {
char *child = ChildProgramFile(wExecutableName);
-
- if (execlp(child, child, NULL) < 0) { /* never normally returns */
- exit(8);
- }
-
- free(child);
- } else { /* -1 signifies fork failure */
- pidOfChild = 0;
- return;
- }
- }
-
- buffer.page = malloc(sizeof(int)+strlen(topic) + strlen(html) + 1);
-
- if (!buffer.page) {
- return;
- }
-
- strcpy(buffer.page, topic);
- strcat(buffer.page, html);
- buffer.length = strlen(buffer.page);
-
- if (buffer.length>255) {
- printf("Help Topic too long %s", buffer.page);
- return;
- }
-
- if (!handleOfPipe) {
+
+ if (execlp(child, child, NULL) < 0) { /* never normally returns */
+ exit(8);
+ }
+
+ free(child);
+ } else { /* -1 signifies fork failure */
+ pidOfChild = 0;
+ return;
+ }
+ }
+
+ buffer.page = malloc(sizeof(int)+strlen(topic) + strlen(html) + 1);
+
+ if (!buffer.page) {
+ return;
+ }
+
+ strcpy(buffer.page, topic);
+ strcat(buffer.page, html);
+ buffer.length = strlen(buffer.page);
+
+ if (buffer.length>255) {
+ printf("Help Topic too long %s", buffer.page);
+ return;
+ }
+
+ if (!handleOfPipe) {
handleOfPipe = open(HELPCOMMANDPIPE, O_WRONLY);
if (handleOfPipe < 0) {
- if (pidOfChild)
- kill(pidOfChild, SIGKILL); /* tidy up on next call */
+ if (pidOfChild) {
+ kill(pidOfChild, SIGKILL); /* tidy up on next call */
+ }
handleOfPipe = 0;
return;
}
}
- int written = 0;
- int towrite = sizeof(int);
+ int written = 0;
+ int towrite = sizeof(int);
- while (written < towrite){
- written += write(handleOfPipe, &buffer.length, sizeof(int));
- }
- written =0;
- towrite = strlen(buffer.page);
- while (written < towrite){
- written += write(handleOfPipe, buffer.page+written, towrite-written);
- }
+ while (written < towrite) {
+ written += write(handleOfPipe, &buffer.length, sizeof(int));
+ }
+ written =0;
+ towrite = strlen(buffer.page);
+ while (written < towrite) {
+ written += write(handleOfPipe, buffer.page+written, towrite-written);
+ }
- fsync(handleOfPipe);
+ fsync(handleOfPipe);
- free(buffer.page);
+ free(buffer.page);
}
diff --git a/app/wlib/gtklib/pixbuf.c b/app/wlib/gtklib/pixbuf.c
index 7b8d7d1..0d6e8b7 100644
--- a/app/wlib/gtklib/pixbuf.c
+++ b/app/wlib/gtklib/pixbuf.c
@@ -45,55 +45,55 @@
*/
GdkPixbuf* wlibMakePixbuf(
- wIcon_p ip)
+ wIcon_p ip)
{
- GdkPixbuf * pixbuf;
- char line0[40];
- char line2[40];
-
- assert(ip != NULL);
-
- if (ip->gtkIconType == gtkIcon_pixmap) {
- pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)ip->bits);
- } else {
- const char * bits;
- long rgb;
- int row,col,wb;
- char ** pixmapData;
-
- wb = (ip->w+7)/8;
- pixmapData = (char**)g_malloc((3+ip->h) * sizeof *pixmapData);
- pixmapData[0] = line0;
- rgb = wDrawGetRGB(ip->color);
- sprintf(line0, " %d %d 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*)g_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] = '.';
- }
- }
-
- pixmapData[row+3][ip->w] = 0;
- }
-
- pixbuf = gdk_pixbuf_new_from_xpm_data((const char **)pixmapData);
-
- for (row = 0; row<ip->h; row++) {
- g_free(pixmapData[row+3]);
- }
- }
-
- return pixbuf;
+ GdkPixbuf * pixbuf;
+ char line0[40];
+ char line2[40];
+
+ assert(ip != NULL);
+
+ if (ip->gtkIconType == gtkIcon_pixmap) {
+ pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)ip->bits);
+ } else {
+ const char * bits;
+ long rgb;
+ int row,col,wb;
+ char ** pixmapData;
+
+ wb = (ip->w+7)/8;
+ pixmapData = (char**)g_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*)g_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] = '.';
+ }
+ }
+
+ pixmapData[row+3][ip->w] = 0;
+ }
+
+ pixbuf = gdk_pixbuf_new_from_xpm_data((const char **)pixmapData);
+
+ for (row = 0; row<ip->h; row++) {
+ g_free(pixmapData[row+3]);
+ }
+ }
+
+ return pixbuf;
}
diff --git a/app/wlib/gtklib/png.c b/app/wlib/gtklib/png.c
deleted file mode 100644
index 809de6a..0000000
--- a/app/wlib/gtklib/png.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/** \file png.c
- * PNG creation
- */
-
-/* XTrackCad - Model Railroad CAD
- * Copyright (C) 2015 Martin Fischer
- *
- * 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.
- */
-
-#define GTK_DISABLE_SINGLE_INCLUDES
-#define GDK_DISABLE_DEPRECATED
-#define GTK_DISABLE_DEPRECATED
-#define GSEAL_ENABLE
-
-#include <gtk/gtk.h>
-#include "gtkint.h"
-
-#define BITMAPFILEFORMAT "png"
-
-/**
-* Export as bitmap file.
-*
-* \param d IN the drawing area ?
-* \param fileName IN fully qualified filename for the bitmap file.
-* \return TRUE on success, FALSE on error
-*/
-
-wBool_t wBitMapWriteFile(wDraw_p d, const char * fileName)
-{
- GdkPixbuf *pixbuf;
- GError *error;
- gboolean res;
- pixbuf = gdk_pixbuf_get_from_drawable(NULL, (GdkWindow*)d->pixmap, NULL, 0, 0,
- 0, 0, d->w, d->h);
-
- if (!pixbuf) {
- wNoticeEx(NT_ERROR, "WriteBitMap: pixbuf_get failed", "Ok", NULL);
- return FALSE;
- }
-
- error = NULL;
- res = gdk_pixbuf_save(pixbuf, fileName, BITMAPFILEFORMAT, &error, NULL);
-
- if (res == FALSE) {
- wNoticeEx(NT_ERROR, "WriteBitMap: pixbuf_save failed", "Ok", NULL);
- return FALSE;
- }
-
- g_object_ref_sink(pixbuf);
- g_object_unref(pixbuf);
- return TRUE;
-}
diff --git a/app/wlib/gtklib/print.c b/app/wlib/gtklib/print.c
index 860a7c7..609efa9 100644
--- a/app/wlib/gtklib/print.c
+++ b/app/wlib/gtklib/print.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
@@ -79,8 +79,7 @@ extern struct wDraw_t psPrint_d;
static wBool_t printContinue; /**< control print job, FALSE for cancelling */
static wIndex_t pageCount; /**< unused, could be used for progress indicator */
-static wIndex_t
-totalPageCount; /**< unused, could be used for progress indicator */
+//static wIndex_t totalPageCount; /**< unused, could be used for progress indicator */
static double paperWidth; /**< physical paper width */
static double paperHeight; /**< physical paper height */
@@ -92,7 +91,7 @@ static double bBorder; /**< bottom margin */
static double scale_adjust = 1.0;
static double scale_text = 1.0;
-static long printFormat = PRINT_LANDSCAPE;
+//static long printFormat = PRINT_LANDSCAPE;
/*****************************************************************************
*
@@ -112,61 +111,61 @@ static void WlibGetPaperSize(void);
void
WlibApplySettings(GtkPrintOperation *op)
{
- gchar *filename;
- GError *err = NULL;
- GtkWidget *dialog;
-
- filename = g_build_filename(wGetAppWorkDir(), PRINTSETTINGS, NULL);
-
- if (!(settings = gtk_print_settings_new_from_file(filename, &err))) {
- if (err->code != G_FILE_ERROR_NOENT) {
- // ignore file not found error as defaults will be used
- dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- "%s",err->message);
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- } else {
- // create default print settings
- settings = gtk_print_settings_new();
- }
- g_error_free(err);
- }
-
- g_free(filename);
-
- if (settings && op) {
- gtk_print_operation_set_print_settings(op, settings);
- }
-
- err = NULL;
- filename = g_build_filename(wGetAppWorkDir(), PAGESETTINGS, NULL);
-
- if (!(page_setup = gtk_page_setup_new_from_file(filename, &err))) {
- // ignore file not found error as defaults will be used
- if (err->code != G_FILE_ERROR_NOENT) {
- dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- "%s",err->message);
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- } else {
- page_setup = gtk_page_setup_new();
- }
-
- g_error_free(err);
- } else {
- // on success get the paper dimensions
- WlibGetPaperSize();
- }
-
- g_free(filename);
-
- if (page_setup && op) {
- gtk_print_operation_set_default_page_setup(op, page_setup);
- }
+ gchar *filename;
+ GError *err = NULL;
+ GtkWidget *dialog;
+
+ filename = g_build_filename(wGetAppWorkDir(), PRINTSETTINGS, NULL);
+
+ if (!(settings = gtk_print_settings_new_from_file(filename, &err))) {
+ if (err->code != G_FILE_ERROR_NOENT) {
+ // ignore file not found error as defaults will be used
+ dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+ "%s",err->message);
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ } else {
+ // create default print settings
+ settings = gtk_print_settings_new();
+ }
+ g_error_free(err);
+ }
+
+ g_free(filename);
+
+ if (settings && op) {
+ gtk_print_operation_set_print_settings(op, settings);
+ }
+
+ err = NULL;
+ filename = g_build_filename(wGetAppWorkDir(), PAGESETTINGS, NULL);
+
+ if (!(page_setup = gtk_page_setup_new_from_file(filename, &err))) {
+ // ignore file not found error as defaults will be used
+ if (err->code != G_FILE_ERROR_NOENT) {
+ dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+ "%s",err->message);
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ } else {
+ page_setup = gtk_page_setup_new();
+ }
+
+ g_error_free(err);
+ } else {
+ // on success get the paper dimensions
+ WlibGetPaperSize();
+ }
+
+ g_free(filename);
+
+ if (page_setup && op) {
+ gtk_print_operation_set_default_page_setup(op, page_setup);
+ }
}
@@ -180,55 +179,55 @@ WlibApplySettings(GtkPrintOperation *op)
void
WlibSaveSettings(GtkPrintOperation *op)
{
- GError *err = NULL;
- gchar *filename;
- GtkWidget *dialog;
+ GError *err = NULL;
+ gchar *filename;
+ GtkWidget *dialog;
- if (op) {
- if (settings != NULL) {
- g_object_unref(settings);
- }
+ if (op) {
+ if (settings != NULL) {
+ g_object_unref(settings);
+ }
- settings = g_object_ref(gtk_print_operation_get_print_settings(op));
- }
+ settings = g_object_ref(gtk_print_operation_get_print_settings(op));
+ }
- filename = g_build_filename(wGetAppWorkDir(), PRINTSETTINGS, NULL);
+ filename = g_build_filename(wGetAppWorkDir(), PRINTSETTINGS, NULL);
- if (!gtk_print_settings_to_file(settings, filename, &err)) {
- dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- "%s",err->message);
+ if (!gtk_print_settings_to_file(settings, filename, &err)) {
+ dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+ "%s",err->message);
- g_error_free(err);
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- }
+ g_error_free(err);
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ }
- g_free(filename);
+ g_free(filename);
- if (op) {
- if (page_setup != NULL) {
- g_object_unref(page_setup);
- }
+ if (op) {
+ if (page_setup != NULL) {
+ g_object_unref(page_setup);
+ }
- page_setup = g_object_ref(gtk_print_operation_get_default_page_setup(op));
- }
+ page_setup = g_object_ref(gtk_print_operation_get_default_page_setup(op));
+ }
- filename = g_build_filename(wGetAppWorkDir(), PAGESETTINGS, NULL);
+ filename = g_build_filename(wGetAppWorkDir(), PAGESETTINGS, NULL);
- if (!gtk_page_setup_to_file(page_setup, filename, &err)) {
- dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- "%s",err->message);
+ if (!gtk_page_setup_to_file(page_setup, filename, &err)) {
+ dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+ "%s",err->message);
- g_error_free(err);
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- }
+ g_error_free(err);
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ }
- g_free(filename);
+ g_free(filename);
}
@@ -241,30 +240,32 @@ WlibSaveSettings(GtkPrintOperation *op)
void wPrintSetup(wPrintSetupCallBack_p callback)
{
- GtkPageSetup *new_page_setup;
- gchar *filename;
- GError *err;
- GtkWidget *dialog;
+ GtkPageSetup *new_page_setup;
+// gchar *filename;
+// GError *err;
+// GtkWidget *dialog;
- if ( !settings )
- WlibApplySettings(NULL);
+ if ( !settings ) {
+ WlibApplySettings(NULL);
+ }
- new_page_setup = gtk_print_run_page_setup_dialog(GTK_WINDOW(gtkMainW->gtkwin),
- page_setup, settings);
+ new_page_setup = gtk_print_run_page_setup_dialog(GTK_WINDOW(gtkMainW->gtkwin),
+ page_setup, settings);
- if (page_setup && (page_setup != new_page_setup)) { //Can be the same if no mods...
- g_object_unref(page_setup);
- }
+ if (page_setup
+ && (page_setup != new_page_setup)) { //Can be the same if no mods...
+ g_object_unref(page_setup);
+ }
- page_setup = new_page_setup;
+ page_setup = new_page_setup;
- WlibGetPaperSize();
- WlibSaveSettings(NULL);
+ WlibGetPaperSize();
+ WlibSaveSettings(NULL);
}
/*****************************************************************************
*
- *
+ *
*
*/
@@ -272,7 +273,7 @@ void wPrintSetup(wPrintSetupCallBack_p callback)
static GtkPrinter * pDefaultPrinter = NULL;
gboolean isDefaultPrinter( GtkPrinter * printer, gpointer data )
{
-const char * pPrinterName = gtk_printer_get_name( printer );
+//const char * pPrinterName = gtk_printer_get_name( printer );
if ( gtk_printer_is_default( printer ) ) {
pDefaultPrinter = printer;
return TRUE;
@@ -284,18 +285,19 @@ static void getDefaultPrinter()
{
pDefaultPrinter = NULL;
gtk_enumerate_printers( isDefaultPrinter, NULL, NULL, TRUE );
-}
+}
const char * wPrintGetName()
{
static char sPrinterName[100];
WlibApplySettings( NULL );
- const char * pPrinterName =
- gtk_print_settings_get( settings, "format-for-printer" );
+ const char * pPrinterName =
+ gtk_print_settings_get( settings, "format-for-printer" );
if ( pPrinterName == NULL ) {
getDefaultPrinter();
- if ( pDefaultPrinter )
+ if ( pDefaultPrinter ) {
pPrinterName = gtk_printer_get_name( pDefaultPrinter );
+ }
}
if ( pPrinterName == NULL ) {
pPrinterName = "";
@@ -303,8 +305,9 @@ const char * wPrintGetName()
strncpy (sPrinterName, pPrinterName, sizeof sPrinterName - 1 );
sPrinterName[ sizeof sPrinterName - 1 ] = '\0';
for ( char * cp = sPrinterName; *cp; cp++ )
- if ( *cp == ':' )
+ if ( *cp == ':' ) {
*cp = '-';
+ }
return sPrinterName;
}
/*****************************************************************************
@@ -325,71 +328,65 @@ const char * wPrintGetName()
static void setLineType(
- double lineWidth,
- wDrawLineType_e lineType,
- wDrawOpts opts)
+ double lineWidth,
+ wDrawLineType_e lineType,
+ wDrawOpts opts)
{
- cairo_t *cr = psPrint_d.printContext;
-
- double dashes[] = { DASH_LENGTH, 3 }; //Reduce gap in between dashes
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
-
- if (lineWidth < 0.0) {
- lineWidth = P2I(-lineWidth)*2.0/scale_adjust;
- }
-
- // make sure that there is a minimum line width used
- if (lineWidth <= 0.09) {
- lineWidth = 0.1/scale_adjust;
- }
-
- cairo_set_line_width(cr, lineWidth);
- switch(lineType) {
- case wDrawLineDot:
- {
- double dashes[] = { 1, 2 , 1, 2};
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cr, dashes, len_dashes, 0.0);
- break;
- }
- case wDrawLineDash:
- {
- double dashes[] = { DASH_LENGTH, 3 }; //Reduce gap in between dashes
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cr, dashes, len_dashes, 0.0);
- break;
- }
- case wDrawLineDashDot:
- {
- double dashes[] = { 3, 2, 1, 2};
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cr, dashes, len_dashes, 0.0);
- break;
- }
- case wDrawLineDashDotDot:
- {
- double dashes[] = { 3, 2, 1, 2, 1, 2};
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cr, dashes, len_dashes, 0.0);
- break;
- }
- case wDrawLineCenter:
- {
- double dashes[] = { 1.5*DASH_LENGTH, 3, DASH_LENGTH, 3};
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cr, dashes, len_dashes, 0.0);
- break;
- }
- case wDrawLinePhantom:
- {
- double dashes[] = { 1.5*DASH_LENGTH, 3, DASH_LENGTH, 3, DASH_LENGTH, 3};
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cr, dashes, len_dashes, 0.0);
- break;
- }
- default:
- cairo_set_dash(cr, NULL, 0, 0.0);
- }
+ cairo_t *cr = psPrint_d.printContext;
+
+// double dashes[] = { DASH_LENGTH, 3 }; //Reduce gap in between dashes
+// static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+
+ if (lineWidth < 0.0) {
+ lineWidth = P2I(-lineWidth)*2.0/scale_adjust;
+ }
+
+ // make sure that there is a minimum line width used
+ if (lineWidth <= 0.09) {
+ lineWidth = 0.1/scale_adjust;
+ }
+
+ cairo_set_line_width(cr, lineWidth);
+ switch(lineType) {
+ case wDrawLineDot: {
+ double dashes[] = { 1, 2, 1, 2};
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cr, dashes, len_dashes, 0.0);
+ break;
+ }
+ case wDrawLineDash: {
+ double dashes[] = { DASH_LENGTH, 3 }; //Reduce gap in between dashes
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cr, dashes, len_dashes, 0.0);
+ break;
+ }
+ case wDrawLineDashDot: {
+ double dashes[] = { 3, 2, 1, 2};
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cr, dashes, len_dashes, 0.0);
+ break;
+ }
+ case wDrawLineDashDotDot: {
+ double dashes[] = { 3, 2, 1, 2, 1, 2};
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cr, dashes, len_dashes, 0.0);
+ break;
+ }
+ case wDrawLineCenter: {
+ double dashes[] = { 1.5*DASH_LENGTH, 3, DASH_LENGTH, 3};
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cr, dashes, len_dashes, 0.0);
+ break;
+ }
+ case wDrawLinePhantom: {
+ double dashes[] = { 1.5*DASH_LENGTH, 3, DASH_LENGTH, 3, DASH_LENGTH, 3};
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cr, dashes, len_dashes, 0.0);
+ break;
+ }
+ default:
+ cairo_set_dash(cr, NULL, 0, 0.0);
+ }
}
@@ -401,14 +398,14 @@ static void setLineType(
*/
static void psSetColor(
- wDrawColor color)
+ wDrawColor color)
{
- cairo_t *cr = psPrint_d.printContext;
- GdkColor* const gcolor = wlibGetColor(color, TRUE);
+ cairo_t *cr = psPrint_d.printContext;
+ GdkColor* const gcolor = wlibGetColor(color, TRUE);
- cairo_set_source_rgb(cr, gcolor->red / 65535.0,
- gcolor->green / 65535.0,
- gcolor->blue / 65535.0);
+ cairo_set_source_rgb(cr, gcolor->red / 65535.0,
+ gcolor->green / 65535.0,
+ gcolor->blue / 65535.0);
}
/**
@@ -423,29 +420,29 @@ static void psSetColor(
*/
void psPrintLine(
- wPos_t x0, wPos_t y0,
- wPos_t x1, wPos_t y1,
- wDrawWidth width,
- wDrawLineType_e lineType,
- wDrawColor color,
- wDrawOpts opts)
+ wDrawPix_t x0, wDrawPix_t y0,
+ wDrawPix_t x1, wDrawPix_t y1,
+ wDrawWidth width,
+ wDrawLineType_e lineType,
+ wDrawColor color,
+ wDrawOpts opts)
{
- if (color == wDrawColorWhite) {
- return;
- }
-
- if (opts&wDrawOptTemp) {
- return;
- }
-
- psSetColor(color);
- setLineType(width, lineType, opts);
-
- cairo_move_to(psPrint_d.printContext,
- x0, y0);
- cairo_line_to(psPrint_d.printContext,
- x1, y1);
- cairo_stroke(psPrint_d.printContext);
+ if (color == wDrawColorWhite) {
+ return;
+ }
+
+ if (opts&wDrawOptTemp) {
+ return;
+ }
+
+ psSetColor(color);
+ setLineType(width, lineType, opts);
+
+ cairo_move_to(psPrint_d.printContext,
+ x0, y0);
+ cairo_line_to(psPrint_d.printContext,
+ x1, y1);
+ cairo_stroke(psPrint_d.printContext);
}
/**
@@ -462,65 +459,65 @@ void psPrintLine(
*/
void psPrintArc(
- wPos_t x0, wPos_t y0,
- wPos_t r,
- double angle0,
- double angle1,
- wBool_t drawCenter,
- wDrawWidth width,
- wDrawLineType_e lineType,
- wDrawColor color,
- wDrawOpts opts)
+ wDrawPix_t x0, wDrawPix_t y0,
+ wDrawPix_t r,
+ double angle0,
+ double angle1,
+ wBool_t drawCenter,
+ wDrawWidth width,
+ wDrawLineType_e lineType,
+ wDrawColor color,
+ wDrawOpts opts)
{
- cairo_t *cr = psPrint_d.printContext;
+ cairo_t *cr = psPrint_d.printContext;
- if (color == wDrawColorWhite) {
- return;
- }
+ if (color == wDrawColorWhite) {
+ return;
+ }
- if (opts&wDrawOptTemp) {
- return;
- }
+ if (opts&wDrawOptTemp) {
+ return;
+ }
- psSetColor(color);
- setLineType(width, lineType, opts);
+ psSetColor(color);
+ setLineType(width, lineType, opts);
- if (angle1 >= 360.0) {
- angle1 = 359.999;
- }
+ if (angle1 >= 360.0) {
+ angle1 = 359.999;
+ }
- angle1 = 90.0-(angle0+angle1);
+ angle1 = 90.0-(angle0+angle1);
- while (angle1 < 0.0) {
- angle1 += 360.0;
- }
+ while (angle1 < 0.0) {
+ angle1 += 360.0;
+ }
- while (angle1 >= 360.0) {
- angle1 -= 360.0;
- }
+ while (angle1 >= 360.0) {
+ angle1 -= 360.0;
+ }
- angle0 = 90.0-angle0;
+ angle0 = 90.0-angle0;
- while (angle0 < 0.0) {
- angle0 += 360.0;
- }
+ while (angle0 < 0.0) {
+ angle0 += 360.0;
+ }
- while (angle0 >= 360.0) {
- angle0 -= 360.0;
- }
+ while (angle0 >= 360.0) {
+ angle0 -= 360.0;
+ }
- // draw the curve
- cairo_arc(cr, x0, y0, r, angle1 * M_PI / 180.0, angle0 * M_PI / 180.0);
+ // draw the curve
+ cairo_arc(cr, x0, y0, r, angle1 * M_PI / 180.0, angle0 * M_PI / 180.0);
- if (drawCenter) {
- // draw crosshair for center of curve
- cairo_move_to(cr, x0 - CENTERMARK_LENGTH / 2, y0);
- cairo_line_to(cr, x0 + CENTERMARK_LENGTH / 2, y0);
- cairo_move_to(cr, x0, y0 - CENTERMARK_LENGTH / 2);
- cairo_line_to(cr, x0, y0 + CENTERMARK_LENGTH / 2);
- }
+ if (drawCenter) {
+ // draw crosshair for center of curve
+ cairo_move_to(cr, x0 - CENTERMARK_LENGTH / 2, y0);
+ cairo_line_to(cr, x0 + CENTERMARK_LENGTH / 2, y0);
+ cairo_move_to(cr, x0, y0 - CENTERMARK_LENGTH / 2);
+ cairo_line_to(cr, x0, y0 + CENTERMARK_LENGTH / 2);
+ }
- cairo_stroke(psPrint_d.printContext);
+ cairo_stroke(psPrint_d.printContext);
}
/**
@@ -534,28 +531,28 @@ void psPrintArc(
*/
void psPrintFillRectangle(
- wPos_t x0, wPos_t y0,
- wPos_t x1, wPos_t y1,
- wDrawColor color,
- wDrawOpts opts)
+ wDrawPix_t x0, wDrawPix_t y0,
+ wDrawPix_t x1, wDrawPix_t y1,
+ wDrawColor color,
+ wDrawOpts opts)
{
- cairo_t *cr = psPrint_d.printContext;
- double width = x0 - x1;
- double height = y0 - y1;
+ cairo_t *cr = psPrint_d.printContext;
+ double width = x0 - x1;
+ double height = y0 - y1;
- if (color == wDrawColorWhite) {
- return;
- }
+ if (color == wDrawColorWhite) {
+ return;
+ }
- if (opts&wDrawOptTemp) {
- return;
- }
+ if (opts&wDrawOptTemp) {
+ return;
+ }
- psSetColor(color);
+ psSetColor(color);
- cairo_rectangle(cr, x0, y0, width, height);
+ cairo_rectangle(cr, x0, y0, width, height);
- cairo_fill(cr);
+ cairo_fill(cr);
}
/**
@@ -570,34 +567,34 @@ void psPrintFillRectangle(
*/
void psPrintFillPolygon(
- wPos_t p[][2],
- wPolyLine_e type[],
- int cnt,
- wDrawColor color,
- wDrawOpts opts,
- int fill,
- int open )
+ wDrawPix_t p[][2],
+ wPolyLine_e type[],
+ int cnt,
+ wDrawColor color,
+ wDrawOpts opts,
+ int fill,
+ int open )
{
- int inx;
- cairo_t *cr = psPrint_d.printContext;
+ int inx;
+ cairo_t *cr = psPrint_d.printContext;
- if (color == wDrawColorWhite) {
- return;
- }
+ if (color == wDrawColorWhite) {
+ return;
+ }
- if (opts&wDrawOptTemp) {
- return;
- }
+ if (opts&wDrawOptTemp) {
+ return;
+ }
- psSetColor(color);
+ psSetColor(color);
- wPos_t mid0[2], mid1[2], mid2[2], mid3[2], mid4[2];
+ wDrawPix_t mid0[2], mid1[2], /*mid2[2],*/ mid3[2], mid4[2];
- for (inx=0; inx<cnt; inx++) {
- int j = inx-1;
- int k = inx+1;
- if (j < 0) j = cnt-1;
- if (k > cnt-1) k = 0;
+ for (inx=0; inx<cnt; inx++) {
+ int j = inx-1;
+ int k = inx+1;
+ if (j < 0) { j = cnt-1; }
+ if (k > cnt-1) { k = 0; }
double len0, len1;
double d0x = (p[inx][0]-p[j][0]);
double d0y = (p[inx][1]-p[j][1]);
@@ -623,35 +620,39 @@ void psPrintFillPolygon(
mid3[1] = (p[inx][1]-mid0[1])/2+mid0[1];
mid4[0] = (mid1[0]-p[inx][0])/2+p[inx][0];
mid4[1] = (mid1[1]-p[inx][1])/2+p[inx][1];
- wPos_t save[2];
+ wDrawPix_t save[2];
if (inx==0) {
- if (!type || (type && type[0] == wPolyLineStraight) || open) {
- cairo_move_to(cr, p[ 0 ][ 0 ], p[ 0 ][ 1 ]);
- save[0] = p[0][0]; save[1] = p[0][1];
- } else {
- cairo_move_to(cr, mid0[0], mid0[1]);
- if (type[inx] == wPolyLineSmooth)
- cairo_curve_to(cr, p[inx][0], p[inx][1], p[inx][0], p[inx][1], mid1[0], mid1[1]);
- else
- cairo_curve_to(cr, mid3[0], mid3[1], mid4[0], mid4[1], mid1[0], mid1[1]);
- save[0] = mid0[0]; save[1] = mid0[1];
- }
- } else if (!type || (type && type[inx] == wPolyLineStraight) || (open && (inx==cnt-1)) ) {
+ if (!type || (type && type[0] == wPolyLineStraight) || open) {
+ cairo_move_to(cr, p[ 0 ][ 0 ], p[ 0 ][ 1 ]);
+ save[0] = p[0][0]; save[1] = p[0][1];
+ } else {
+ cairo_move_to(cr, mid0[0], mid0[1]);
+ if (type[inx] == wPolyLineSmooth) {
+ cairo_curve_to(cr, p[inx][0], p[inx][1], p[inx][0], p[inx][1], mid1[0],
+ mid1[1]);
+ } else {
+ cairo_curve_to(cr, mid3[0], mid3[1], mid4[0], mid4[1], mid1[0], mid1[1]);
+ }
+ save[0] = mid0[0]; save[1] = mid0[1];
+ }
+ } else if (!type || (type && type[inx] == wPolyLineStraight) || (open
+ && (inx==cnt-1)) ) {
cairo_line_to(cr, p[ inx ][ 0 ], p[ inx ][ 1 ]);
} else {
cairo_line_to(cr, mid0[ 0 ], mid0[ 1 ]);
- if (type && type[inx] == wPolyLineSmooth)
+ if (type && type[inx] == wPolyLineSmooth) {
cairo_curve_to(cr, p[inx][0],p[inx][1],p[inx][0],p[inx][1],mid1[0],mid1[1]);
- else
+ } else {
cairo_curve_to(cr, mid3[0],mid3[1],mid4[0],mid4[1],mid1[0],mid1[1]);
+ }
}
if ((inx==cnt-1) && !open) {
cairo_line_to(cr, save[0], save[1]);
}
- }
+ }
- if (fill && !open) cairo_fill(cr);
- else cairo_stroke(cr);
+ if (fill && !open) { cairo_fill(cr); }
+ else { cairo_stroke(cr); }
}
/**
@@ -665,25 +666,25 @@ void psPrintFillPolygon(
*/
void psPrintFillCircle(
- wPos_t x0, wPos_t y0,
- wPos_t r,
- wDrawColor color,
- wDrawOpts opts)
+ wDrawPix_t x0, wDrawPix_t y0,
+ wDrawPix_t r,
+ wDrawColor color,
+ wDrawOpts opts)
{
- if (color == wDrawColorWhite) {
- return;
- }
+ if (color == wDrawColorWhite) {
+ return;
+ }
- if (opts&wDrawOptTemp) {
- return;
- }
+ if (opts&wDrawOptTemp) {
+ return;
+ }
- psSetColor(color);
+ psSetColor(color);
- cairo_arc(psPrint_d.printContext,
- x0, y0, r, 0.0, 2 * M_PI);
+ cairo_arc(psPrint_d.printContext,
+ x0, y0, r, 0.0, 2 * M_PI);
- cairo_fill(psPrint_d.printContext);
+ cairo_fill(psPrint_d.printContext);
}
@@ -710,97 +711,102 @@ void psPrintFillCircle(
*/
void psPrintString(
- wPos_t x, wPos_t y,
- double a,
- char * s,
- wFont_p fp,
- double fs,
- wDrawColor color,
- wDrawOpts opts)
+ wDrawPix_t x, wDrawPix_t y,
+ double a,
+ char * s,
+ wFont_p fp,
+ double fs,
+ wDrawColor color,
+ wDrawOpts opts)
{
- char * cp;
- double x0 = (double)x, y0 = (double)y;
- int text_height, text_width;
- double ascent;
+// char * cp;
+ double x0 = (double)x, y0 = (double)y;
+ int text_height, text_width;
+// double ascent;
+
+ cairo_t *cr;
+ cairo_matrix_t matrix;
+
+ PangoLayout *layout;
+ PangoFontDescription *desc;
+// PangoFontMetrics *metrics;
+ PangoContext *pcontext;
- cairo_t *cr;
- cairo_matrix_t matrix;
+ if (color == wDrawColorWhite) {
+ return;
+ }
- PangoLayout *layout;
- PangoFontDescription *desc;
- PangoFontMetrics *metrics;
- PangoContext *pcontext;
+ cr = psPrint_d.printContext;
- if (color == wDrawColorWhite) {
- return;
- }
+ // get the current transformation matrix and transform the starting
+ // point of the string
- cr = psPrint_d.printContext;
+ cairo_save(cr);
- // get the current transformation matrix and transform the starting
- // point of the string
+ cairo_get_matrix(cr, &matrix);
- cairo_save(cr);
+ cairo_matrix_transform_point(&matrix, &x0, &y0);
- cairo_get_matrix(cr, &matrix);
+ cairo_identity_matrix(cr);
- cairo_matrix_transform_point(&matrix, &x0, &y0);
+ layout = pango_cairo_create_layout(cr);
- cairo_identity_matrix(cr);
+ // set the correct font and size
+ /** \todo use a getter function instead of double conversion */
+ desc = pango_font_description_from_string(wlibFontTranslate(fp));
- layout = pango_cairo_create_layout(cr);
+ pango_font_description_set_size(desc, fs * PANGO_SCALE * scale_text);
- // set the correct font and size
- /** \todo use a getter function instead of double conversion */
- desc = pango_font_description_from_string(wlibFontTranslate(fp));
+ // render the string to a Pango layout
+ pango_layout_set_font_description(layout, desc);
- pango_font_description_set_size(desc, fs * PANGO_SCALE * scale_text);
+ gchar *utf8 = wlibConvertInput(s);
- // render the string to a Pango layout
- pango_layout_set_font_description(layout, desc);
- pango_layout_set_text(layout, s, -1);
- pango_layout_set_width(layout, -1);
- pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
- pango_layout_get_size(layout, &text_width, &text_height);
+ pango_layout_set_text(layout, utf8, -1);
+ pango_layout_set_width(layout, -1);
+ pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
+ pango_layout_get_size(layout, &text_width, &text_height);
- text_width = text_width / PANGO_SCALE;
- text_height = text_height / PANGO_SCALE;
+ text_width = text_width / PANGO_SCALE;
+ text_height = text_height / PANGO_SCALE;
- // get the height of the string
- pcontext = pango_cairo_create_context(cr);
- metrics = pango_context_get_metrics(pcontext, desc,
- pango_context_get_language(pcontext));
+ // get the height of the string
+ pcontext = pango_cairo_create_context(cr);
+// metrics = pango_context_get_metrics(pcontext, desc,
+// pango_context_get_language(pcontext));
- ascent = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE;
+// ascent = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE;
- int baseline = pango_layout_get_baseline(layout) / PANGO_SCALE;
+ int baseline = pango_layout_get_baseline(layout) / PANGO_SCALE;
- cairo_translate(cr, x0, y0 );
- cairo_rotate(cr, -a * M_PI / 180.0);
- cairo_translate( cr, 0, -baseline );
+ cairo_translate(cr, x0, y0 );
+ cairo_rotate(cr, -a * M_PI / 180.0);
+ cairo_translate( cr, 0, -baseline );
- cairo_move_to(cr,0,0);
+ cairo_move_to(cr,0,0);
- pango_cairo_update_layout(cr, layout);
+ pango_cairo_update_layout(cr, layout);
- // set the color
- psSetColor(color);
+ // set the color
+ psSetColor(color);
- // and show the string
- if(!(opts & wDrawOutlineFont)) {
+ // and show the string
+ if(!(opts & wDrawOutlineFont)) {
pango_cairo_show_layout(cr, layout);
+ cairo_stroke( cr );
} else {
PangoLayoutLine *line;
line = pango_layout_get_line_readonly (layout, 0);
+ setLineType( wDrawLineSolid, 0, 0 );
pango_cairo_layout_line_path (cr, line);
- cairo_stroke( cr );
+ cairo_stroke( cr );
}
- // free unused objects
- g_object_unref(layout);
- g_object_unref(pcontext);
+ // free unused objects
+ g_object_unref(layout);
+ g_object_unref(pcontext);
- cairo_restore(cr);
+ cairo_restore(cr);
}
/**
@@ -811,14 +817,14 @@ void psPrintString(
* \return
*/
-void wPrintClip(wPos_t x, wPos_t y, wPos_t w, wPos_t h)
+void wPrintClip(wDrawPix_t x, wDrawPix_t y, wDrawPix_t w, wDrawPix_t h)
{
- cairo_move_to(psPrint_d.printContext, x, y);
- cairo_rel_line_to(psPrint_d.printContext, w, 0);
- cairo_rel_line_to(psPrint_d.printContext, 0, h);
- cairo_rel_line_to(psPrint_d.printContext, -w, 0);
- cairo_close_path(psPrint_d.printContext);
- cairo_clip(psPrint_d.printContext);
+ cairo_move_to(psPrint_d.printContext, x, y);
+ cairo_rel_line_to(psPrint_d.printContext, w, 0);
+ cairo_rel_line_to(psPrint_d.printContext, 0, h);
+ cairo_rel_line_to(psPrint_d.printContext, -w, 0);
+ cairo_close_path(psPrint_d.printContext);
+ cairo_clip(psPrint_d.printContext);
}
/*****************************************************************************
@@ -835,22 +841,22 @@ void wPrintClip(wPos_t x, wPos_t y, wPos_t w, wPos_t h)
static void
WlibGetPaperSize(void)
{
- double temp;
-
- bBorder = gtk_page_setup_get_bottom_margin(page_setup, GTK_UNIT_INCH);
- tBorder = gtk_page_setup_get_top_margin(page_setup, GTK_UNIT_INCH);
- lBorder = gtk_page_setup_get_left_margin(page_setup, GTK_UNIT_INCH);
- rBorder = gtk_page_setup_get_right_margin(page_setup, GTK_UNIT_INCH);
- paperHeight = gtk_page_setup_get_paper_height(page_setup, GTK_UNIT_INCH);
- paperWidth = gtk_page_setup_get_paper_width(page_setup, GTK_UNIT_INCH);
-
- // XTrackCAD does page orientation itself. Basic assumption is that the
- // paper is always oriented in portrait mode. Ignore settings by user
- if (paperHeight < paperWidth) {
- temp = paperHeight;
- paperHeight = paperWidth;
- paperWidth = temp;
- }
+ double temp;
+
+ bBorder = gtk_page_setup_get_bottom_margin(page_setup, GTK_UNIT_INCH);
+ tBorder = gtk_page_setup_get_top_margin(page_setup, GTK_UNIT_INCH);
+ lBorder = gtk_page_setup_get_left_margin(page_setup, GTK_UNIT_INCH);
+ rBorder = gtk_page_setup_get_right_margin(page_setup, GTK_UNIT_INCH);
+ paperHeight = gtk_page_setup_get_paper_height(page_setup, GTK_UNIT_INCH);
+ paperWidth = gtk_page_setup_get_paper_width(page_setup, GTK_UNIT_INCH);
+
+ // XTrackCAD does page orientation itself. Basic assumption is that the
+ // paper is always oriented in portrait mode. Ignore settings by user
+ if (paperHeight < paperWidth) {
+ temp = paperHeight;
+ paperHeight = paperWidth;
+ paperWidth = temp;
+ }
}
/**
@@ -863,15 +869,15 @@ WlibGetPaperSize(void)
void wPrintGetMargins(
- double * tMargin,
- double * rMargin,
- double * bMargin,
- double * lMargin )
+ double * tMargin,
+ double * rMargin,
+ double * bMargin,
+ double * lMargin )
{
- if ( tMargin ) *tMargin = tBorder;
- if ( rMargin ) *rMargin = rBorder;
- if ( bMargin ) *bMargin = bBorder;
- if ( lMargin ) *lMargin = lBorder;
+ if ( tMargin ) { *tMargin = tBorder; }
+ if ( rMargin ) { *rMargin = rBorder; }
+ if ( bMargin ) { *bMargin = bBorder; }
+ if ( lMargin ) { *lMargin = lBorder; }
}
@@ -884,18 +890,18 @@ void wPrintGetMargins(
*/
void wPrintGetPageSize(
- double * w,
- double * h)
+ double * w,
+ double * h)
{
- // if necessary load the settings
- if (!settings) {
- WlibApplySettings(NULL);
- }
+ // if necessary load the settings
+ if (!settings) {
+ WlibApplySettings(NULL);
+ }
- WlibGetPaperSize();
+ WlibGetPaperSize();
- *w = paperWidth;
- *h = paperHeight;
+ *w = paperWidth;
+ *h = paperHeight;
}
/**
@@ -904,11 +910,11 @@ void wPrintGetPageSize(
* \param context IN unused
* \return
*/
-static void printAbort(void * context)
-{
- printContinue = FALSE;
+//static void printAbort(void * context)
+//{
+// printContinue = FALSE;
// wWinShow( printAbortW, FALSE );
-}
+//}
/**
* Initialize new page.
@@ -920,11 +926,11 @@ static void printAbort(void * context)
*/
wDraw_p wPrintPageStart(void)
{
- pageCount++;
+ pageCount++;
- cairo_save(psPrint_d.printContext);
+ cairo_save(psPrint_d.printContext);
- return &psPrint_d;
+ return &psPrint_d;
}
/**
@@ -940,11 +946,11 @@ wDraw_p wPrintPageStart(void)
wBool_t wPrintPageEnd(wDraw_p p)
{
- cairo_show_page(psPrint_d.printContext);
+ cairo_show_page(psPrint_d.printContext);
- cairo_restore(psPrint_d.printContext);
+ cairo_restore(psPrint_d.printContext);
- return printContinue;
+ return printContinue;
}
/*****************************************************************************
@@ -965,112 +971,134 @@ wBool_t wPrintPageEnd(wDraw_p p)
wBool_t wPrintDocStart(const char * title, int fTotalPageCount, int * copiesP)
{
- GtkWidget *printDialog;
- gint res;
- cairo_surface_type_t surface_type;
- cairo_matrix_t matrix;
+ GtkWidget *printDialog;
+ gint res;
+// cairo_surface_type_t surface_type;
+// cairo_matrix_t matrix;
+
+
+ printDialog = gtk_print_unix_dialog_new(title, GTK_WINDOW(gtkMainW->gtkwin));
+
+ // load the settings
+ WlibApplySettings(NULL);
+
+ // and apply them to the printer dialog
+ gtk_print_unix_dialog_set_settings((GtkPrintUnixDialog *)printDialog, settings);
+ gtk_print_unix_dialog_set_page_setup((GtkPrintUnixDialog *)printDialog,
+ page_setup);
+ res = gtk_dialog_run((GtkDialog *)printDialog);
- printDialog = gtk_print_unix_dialog_new(title, GTK_WINDOW(gtkMainW->gtkwin));
+ if (res == GTK_RESPONSE_OK) {
+ selPrinter = gtk_print_unix_dialog_get_selected_printer((
+ GtkPrintUnixDialog *)printDialog);
- // load the settings
- WlibApplySettings(NULL);
+ if (settings) {
+ g_object_unref(settings);
+ }
+
+ settings = gtk_print_unix_dialog_get_settings((GtkPrintUnixDialog *)
+ printDialog);
- // and apply them to the printer dialog
- gtk_print_unix_dialog_set_settings((GtkPrintUnixDialog *)printDialog, settings);
- gtk_print_unix_dialog_set_page_setup((GtkPrintUnixDialog *)printDialog,
- page_setup);
+ if (page_setup) {
+ g_object_unref(page_setup);
+ }
- res = gtk_dialog_run((GtkDialog *)printDialog);
+ page_setup = gtk_print_unix_dialog_get_page_setup((GtkPrintUnixDialog *)
+ printDialog);
- if (res == GTK_RESPONSE_OK) {
- selPrinter = gtk_print_unix_dialog_get_selected_printer((
- GtkPrintUnixDialog *)printDialog);
+ curPrintJob = gtk_print_job_new(title,
+ selPrinter,
+ settings,
+ page_setup);
- if (settings) {
- g_object_unref(settings);
- }
+ psPrint_d.curPrintSurface = gtk_print_job_get_surface(curPrintJob,
+ NULL);
+ psPrint_d.printContext = cairo_create(psPrint_d.curPrintSurface);
- settings = gtk_print_unix_dialog_get_settings((GtkPrintUnixDialog *)
- printDialog);
+ WlibApplySettings( NULL );
+ //update the paper dimensions
+ WlibGetPaperSize();
- if (page_setup) {
- g_object_unref(page_setup);
- }
+ /* for all surfaces including files the resolution is always 72 ppi (as all GTK uses PDF) */
+ /*surface_type = */cairo_surface_get_type(psPrint_d.curPrintSurface);
- page_setup = gtk_print_unix_dialog_get_page_setup((GtkPrintUnixDialog *)
- printDialog);
+ /*
+ * Override up-scaling for some printer drivers/Linux systems that don't support the latest CUPS
+ * - the user either sets preferences or the environment variable XTRKCADPRINTSCALE to a value
+ * and we just let the dpi default to 72ppi and set scaling to that value.
+ * And for PangoText we allow an override via preferences or variable XTRKCADPRINTTEXTSCALE
+ * Note - doing this will introduce differing artifacts.
+ *
+ */
+ char * sEnvScale = PRODUCT "PRINTSCALE";
+ char * sEnvTextScale = PRODUCT "PRINTTEXTSCALE";
- curPrintJob = gtk_print_job_new(title,
- selPrinter,
- settings,
- page_setup);
+ scale_text = 1.0;
+ scale_adjust = 1.0;
- psPrint_d.curPrintSurface = gtk_print_job_get_surface(curPrintJob,
- NULL);
- psPrint_d.printContext = cairo_create(psPrint_d.curPrintSurface);
+ double printScale,printTextScale;
- WlibApplySettings( NULL );
- //update the paper dimensions
- WlibGetPaperSize();
+ wPrefGetFloat(PREFSECTION, PRINTSCALE, &printScale, -1.0);
+ wPrefGetFloat(PREFSECTION, PRINTTEXTSCALE, &printTextScale, -1.0);
- /* for all surfaces including files the resolution is always 72 ppi (as all GTK uses PDF) */
- surface_type = cairo_surface_get_type(psPrint_d.curPrintSurface);
- /*
- * Override up-scaling for some printer drivers/Linux systems that don't support the latest CUPS
- * - the user sets the environment variable XTRKCADPRINTSCALE to a value
- * and we just let the dpi default to 72ppi and set scaling to that value.
- * And for PangoText we allow an override via variable XTRKCADPRINTTEXTSCALE
- * Note - doing this will introduce differing artifacts.
- *
- */
- char * sEnvScale = PRODUCT "PRINTSCALE";
+ //If the preferences are not set, look at environmental variables
- const char * sPrinterName = gtk_printer_get_name( selPrinter );
- if ((strcmp(sPrinterName,"Print to File") == 0) || getenv(sEnvScale) == NULL) {
+ if (printScale < 0.0 ) {
+ if (getenv(sEnvScale) && (atof(getenv(sEnvScale)) > 0.0)) {
+ printScale = atof(getenv(sEnvScale));
+ }
+ }
+ if (printTextScale < 0.0 ) {
+ if (getenv(sEnvTextScale) && (atof(getenv(sEnvTextScale)) > 0.0)) {
+ printTextScale = atof(getenv(sEnvTextScale));
+ }
+ }
+
+ const char * sPrinterName = gtk_printer_get_name( selPrinter );
+ if ((strcmp(sPrinterName,"Print to File") == 0) || printScale < 0.0) {
double p_def = 600;
cairo_surface_set_fallback_resolution(psPrint_d.curPrintSurface, p_def, p_def);
psPrint_d.dpi = p_def;
scale_adjust = 72/p_def;
} else {
- char * sEnvTextScale = PRODUCT "PRINTTEXTSCALE";
- if (getenv(sEnvTextScale) && (atof(getenv(sEnvTextScale)) != 0.0)) {
- scale_text = atof(getenv(sEnvTextScale));
- } else scale_text = 1.0;
- if (getenv(sEnvScale) && (atof(getenv(sEnvScale)) != 0.0)) {
- scale_adjust = atof(getenv(sEnvScale));
- } else scale_adjust = 1.0;
+ if (printTextScale > 0.0) {
+ scale_text = printTextScale;
+ }
+ if (printScale > 0.0) {
+ scale_adjust = printScale;
+ }
psPrint_d.dpi = 72;
}
- // in XTrackCAD 0,0 is top left, in cairo bottom left. This is
- // corrected via the following transformations.
- // also the translate makes sure that the drawing is rendered
- // within the paper margin
+ // in XTrackCAD 0,0 is top left, in cairo bottom left. This is
+ // corrected via the following transformations.
+ // also the translate makes sure that the drawing is rendered
+ // within the paper margin
- cairo_translate(psPrint_d.printContext, lBorder*72, (paperHeight-bBorder)*72 );
+ cairo_translate(psPrint_d.printContext, lBorder*72, (paperHeight-bBorder)*72 );
- cairo_scale(psPrint_d.printContext, 1.0 * scale_adjust, -1.0 * scale_adjust);
+ cairo_scale(psPrint_d.printContext, 1.0 * scale_adjust, -1.0 * scale_adjust);
- //cairo_translate(psPrint_d.printContext, 0, -paperHeight* psPrint_d.dpi);
+ //cairo_translate(psPrint_d.printContext, 0, -paperHeight* psPrint_d.dpi);
- WlibSaveSettings(NULL);
- }
+ WlibSaveSettings(NULL);
+ }
- gtk_widget_destroy(printDialog);
+ gtk_widget_destroy(printDialog);
- if (copiesP) {
- *copiesP = 1;
- }
+ if (copiesP) {
+ *copiesP = 1;
+ }
- printContinue = TRUE;
+ printContinue = TRUE;
- if (res != GTK_RESPONSE_OK) {
- return FALSE;
- } else {
- return TRUE;
- }
+ if (res != GTK_RESPONSE_OK) {
+ return FALSE;
+ } else {
+ return TRUE;
+ }
}
/**
@@ -1085,16 +1113,16 @@ wBool_t wPrintDocStart(const char * title, int fTotalPageCount, int * copiesP)
void
doPrintJobFinished(GtkPrintJob *job, void *data, GError *err)
{
- GtkWidget *dialog;
+// GtkWidget *dialog;
- cairo_destroy(psPrint_d.printContext);
+ cairo_destroy(psPrint_d.printContext);
- if (err) {
- dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- "%s",err->message);
- }
+ if (err) {
+ /*dialog = */gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+ "%s",err->message);
+ }
}
/**
@@ -1104,12 +1132,12 @@ doPrintJobFinished(GtkPrintJob *job, void *data, GError *err)
void wPrintDocEnd(void)
{
- cairo_surface_finish(psPrint_d.curPrintSurface);
+ cairo_surface_finish(psPrint_d.curPrintSurface);
- gtk_print_job_send(curPrintJob,
- doPrintJobFinished,
- NULL,
- NULL);
+ gtk_print_job_send(curPrintJob,
+ doPrintJobFinished,
+ NULL,
+ NULL);
// wWinShow( printAbortW, FALSE );
}
@@ -1117,11 +1145,11 @@ void wPrintDocEnd(void)
wBool_t wPrintQuit(void)
{
- return FALSE;
+ return FALSE;
}
wBool_t wPrintInit(void)
{
- return TRUE;
+ return TRUE;
}
diff --git a/app/wlib/gtklib/single.c b/app/wlib/gtklib/single.c
index 600f1dd..6204ed5 100644
--- a/app/wlib/gtklib/single.c
+++ b/app/wlib/gtklib/single.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#define GTK_DISABLE_SINGLE_INCLUDES
@@ -35,7 +35,6 @@
#include "gtkint.h"
-#define TIMEOUT_INACTIVITY (500) /**< timeout for entry fields in millisecs */
/*
*****************************************************************************
@@ -54,7 +53,6 @@ struct wString_t {
wBool_t enter_pressed; /**< flag if enter was pressed */
wBool_t hasSignal; /** needs signal to be suppressed */
int count; /** number of 100ms since last entry **/
- guint timer; /**< timer source for inactivity timer */
};
/**
@@ -62,24 +60,27 @@ struct wString_t {
*
* \param b IN widget to be updated
* \param arg IN new string value
- * \return
+ * \return
*/
void wStringSetValue(
- wString_p b,
- const char *arg)
+ wString_p b,
+ const char *arg)
{
- if (b->widget == NULL)
+ if (b->widget == NULL) {
abort();
-
+ }
+
// the contents should not be changed programatically while
// the user is editing it
- if( !(gtk_widget_has_focus(b->widget))) {
- if (b->hasSignal)
- gtk_signal_handler_block_by_data(GTK_OBJECT(b->widget), b);
+ if( (b->option&BO_IGNFOCUS) || !(gtk_widget_has_focus(b->widget))) {
+ if (b->hasSignal) {
+ gtk_signal_handler_block_by_data(GTK_OBJECT(b->widget), b);
+ }
gtk_entry_set_text(GTK_ENTRY(b->widget), arg);
- if (b->hasSignal)
+ if (b->hasSignal) {
gtk_signal_handler_unblock_by_data(GTK_OBJECT(b->widget), b);
+ }
}
}
@@ -88,12 +89,12 @@ void wStringSetValue(
*
* \param b IN widget to be updated
* \param w IN new width
- * \return
+ * \return
*/
void wStringSetWidth(
- wString_p b,
- wPos_t w)
+ wString_p b,
+ wWinPix_t w)
{
gtk_widget_set_size_request(b->widget, w, -1);
b->w = w;
@@ -107,113 +108,71 @@ void wStringSetWidth(
*/
const char *wStringGetValue(
- wString_p b)
+ wString_p b)
{
- if ( !b->widget )
+ if ( !b->widget ) {
abort();
-
+ }
+
return gtk_entry_get_text(GTK_ENTRY(b->widget));
}
-/**
- * Kill an active timer
- *
- * \param b IN entry field
- * \return the entered text
- */
-
-static gboolean killTimer(
- GtkEntry *widget,
- GdkEvent *event,
- wString_p b)
-{
-
- // remove all timers related to this widget
- while( g_source_remove_by_user_data( b ))
- ;
- b->timer = 0;
-
- if (b->action) {
- const char *s;
-
- s = gtk_entry_get_text(GTK_ENTRY(b->widget));
- b->action(s, b->data);
- }
- gtk_editable_select_region( GTK_EDITABLE( widget ), 0, 0 );
- return( FALSE );
-}
/**
- * Timer handler for string activity. This timer checks the input if the user
- * doesn't change an entry value for the preset time (0.5s).
+ * Do the current active string's action when a button was pushed
+ * Used to validate input
*/
-
-static gboolean
-timeoutString( wString_p bs )
+static wString_p stringControl = NULL;
+void wlibStringUpdate()
{
- const char *new_value;
- if ( !bs )
- return( FALSE );
- if (bs->widget == 0)
- abort();
-
- bs->count--;
-
- if (bs->count==0) {
- // get the currently entered value
- new_value = wStringGetValue(bs);
- if (bs->valueP != NULL)
- strcpy(bs->valueP, new_value);
-
- if (bs->action) {
- bs->enter_pressed = FALSE; //Normal input
- if ( new_value )
- bs->action(new_value,bs->data);
- }
- }
- if (bs->count<=0) {
- bs->timer = 0;
- return( FALSE ); //Stop timer
- } else {
- return TRUE; //Wait 100ms
+ if ( stringControl && stringControl->action ) {
+ stringControl->action( wStringGetValue(stringControl), stringControl->data );
+ stringControl = NULL;
}
}
+
/**
* Signal handler for 'activate' signal: enter pressed - callback with the current value and then
* select the whole default value
*
* \param widget IN the edit field
* \param b IN the widget data structure
- * \return
+ * \return
*/
static gboolean stringActivated(
- GtkEntry *widget,
- wString_p b)
+ GtkEntry *widget,
+ wString_p b)
{
+ if ( debugWindow >= 1 ) {
+ printf( "stringActivated: %s\n", b->labelStr );
+ }
const char *s;
const char * output = "\n";
- if ( !b )
+ if ( !b ) {
return( FALSE );
-
+ }
+
s = wStringGetValue(b);
- if (b->valueP)
+ if (b->valueP) {
strcpy(b->valueP, s);
+ }
if (b->action) {
b->enter_pressed = TRUE;
b->action( output, b->data);
}
-
+
// select the complete default value to make editing it easier
gtk_editable_select_region( GTK_EDITABLE( widget ), 0, -1 );
return( TRUE );
}
-static gboolean stringExposed(GtkWidget* widget, GdkEventExpose * event, gpointer g )
+static gboolean stringExposed(GtkWidget* widget, GdkEventExpose * event,
+ gpointer g )
{
wControl_p b = (wControl_p)g;
return wControlExpose(widget,event,b);
@@ -225,40 +184,113 @@ static gboolean stringExposed(GtkWidget* widget, GdkEventExpose * event, gpointe
*
* \param widget IN
* \param entry field IN
- * \return
+ * \return
*/
-static void stringChanged(
- GtkEntry *widget,
- wString_p b)
+static int stringChanged(
+ GtkEntry *widget,
+ wString_p b)
{
- const char *new_value;
-
- if ( !b )
- return;
-
- b->count = 5; /* set ~500 ms from now */
-
- // get the entered value
- //new_value = wStringGetValue(b);
- //if (b->valueP != NULL)
- // strcpy(b->valueP, new_value);
- //
- //
- if (b->action){
- // if one exists, remove the inactivity timer
- if( !b->timer ) {
- //g_source_remove( b->timer );
-
- // create a new timer
- b->timer = g_timeout_add( TIMEOUT_INACTIVITY/5,
- (GSourceFunc)timeoutString,
- b );
- }
- }
- return;
+ if ( debugWindow >= 1 ) {
+ printf( "stringChanged: %s\n", b->labelStr);
+ }
+ stringControl = b;
+ return FALSE;
}
+static int stringPreeditChanged(
+ GtkEntry *widget,
+ wString_p b)
+{
+ if ( debugWindow >= 1 ) {
+ printf( "stringPreeditChanged: %s\n", b->labelStr );
+ }
+ return FALSE;
+}
+static int stringFocusOutEvent(
+ GtkEntry *widget,
+ GdkEvent * event,
+ wString_p b)
+{
+ if ( debugWindow >= 1 ) {
+ printf( "stringFocusOut: %s\n", b->labelStr );
+ }
+ if (b->action) {
+ const char *s;
+ s = gtk_entry_get_text(GTK_ENTRY(b->widget));
+ b->action(s, b->data);
+ }
+ gtk_editable_select_region( GTK_EDITABLE( widget ), 0, 0 );
+ return FALSE;
+}
+static int stringFocusInEvent(
+ GtkEntry *widget,
+ GdkEvent * event,
+ wString_p b)
+{
+ if ( debugWindow >= 1 ) {
+ printf( "stringFocusIn: %s\n", b->labelStr );
+ }
+ stringControl = b;
+ return FALSE;
+}
+static int stringLeaveNotifyEvent(
+ GtkEntry *widget,
+ GdkEvent * event,
+ wString_p b)
+{
+ if ( debugWindow >= 3 ) {
+ printf( "stringLeaveNotfyEvent: %s\n", b->labelStr );
+ }
+ return FALSE;
+}
+static int stringEventAfter(
+ GtkEntry *widget,
+ wString_p b)
+{
+ if ( debugWindow >= 3 ) {
+ printf( "stringEventAfter: %s\n", b->labelStr );
+ }
+ return FALSE;
+}
+static int stringEvent(
+ GtkEntry *widget,
+ wString_p b)
+{
+ if ( debugWindow >= 3 ) {
+ printf( "stringEvent: %s\n", b->labelStr );
+ }
+ return FALSE;
+}
+static int stringKeyPressEvent(
+ GtkEntry *widget,
+ GdkEvent * event,
+ wString_p b)
+{
+ if ( debugWindow >= 1 ) {
+ printf( "stringKeyPressEvent: %s\n", b->labelStr );
+ }
+ return FALSE;
+}
+static int stringStateChanged(
+ GtkEntry *widget,
+ int state,
+ wString_p b)
+{
+ if ( debugWindow >= 1 ) {
+ printf( "stringStateChanged: %s\n", b->labelStr );
+ }
+ return FALSE;
+}
+static int stringActivate(
+ GtkEntry *widget,
+ wString_p b)
+{
+ if ( debugWindow >= 1 ) {
+ printf( "stringActivate: %s\n", b->labelStr );
+ }
+ return stringChanged( widget, b );
+}
/**
* Create a single line entry field for a string value
*
@@ -268,86 +300,109 @@ static void stringChanged(
* \param helpStr IN help anchor
* \param labelStr IN label
* \param option IN option (supported BO_READONLY )
- * \param width IN width of entry field
+ * \param width IN width of entry field
* \param valueP IN default value
- * \param valueL IN maximum length of entry
+ * \param valueL IN maximum length of entry
* \param action IN application callback function
* \param data IN application data
* \return the created widget
*/
wString_p wStringCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char *helpStr,
- const char *labelStr,
- long option,
- wPos_t width,
- char *valueP,
- wIndex_t valueL,
- wStringCallBack_p action,
- void *data)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char *helpStr,
+ const char *labelStr,
+ long option,
+ wWinPix_t width,
+ char *valueP,
+ wIndex_t valueL,
+ wStringCallBack_p action,
+ void *data)
{
wString_p b;
- // create and initialize the widget
+ // create and initialize the widget
b = (wString_p)wlibAlloc(parent, B_TEXT, x, y, labelStr, sizeof *b, data);
b->valueP = valueP;
b->action = action;
b->option = option;
b->valueL = valueL;
- b->timer = 0;
b->hasSignal = 0;
wlibComputePos((wControl_p)b);
- // create the gtk entry field and set maximum length if desired
+ // create the gtk entry field and set maximum length if desired
b->widget = (GtkWidget *)gtk_entry_new();
- if (b->widget == NULL) abort();
+ if (b->widget == NULL) { abort(); }
- if( valueL )
+ if( valueL ) {
gtk_entry_set_max_length( GTK_ENTRY( b->widget ), valueL );
-
+ }
+
// it is assumed that the parent is a fixed layout widget and the entry can
// be placed at a specific position
gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
-
- // set minimum size for widget
- if (width)
+
+ // set minimum size for widget
+ if (width) {
gtk_widget_set_size_request(b->widget, width, -1);
-
+ }
+
// get the resulting size
wlibControlGetSize((wControl_p)b);
// if desired, place a label in front of the created widget
- if (labelStr)
+ if (labelStr) {
b->labelW = wlibAddLabel((wControl_p)b, labelStr);
-
- if (option & BO_READONLY)
+ }
+
+ if (option & BO_READONLY) {
gtk_editable_set_editable(GTK_EDITABLE(b->widget), FALSE);
-
+ }
+
// set the default text and select it to make replacing it easier
if (b->valueP) {
wStringSetValue(b, b->valueP);
// select the text only if text is editable
}
-
+
// show
gtk_widget_show(b->widget);
-
+
// add the new widget to the list of created widgets
wlibAddButton((wControl_p)b);
-
- // link into help
+
+ // link into help
wlibAddHelpString(b->widget, helpStr);
-
- //g_signal_connect(GTK_OBJECT(b->widget), "changed", G_CALLBACK(stringChanged), b);
+
+ g_signal_connect(GTK_OBJECT(b->widget), "changed", G_CALLBACK(stringChanged),
+ b);
+ g_signal_connect(GTK_OBJECT(b->widget), "preedit-changed",
+ G_CALLBACK(stringPreeditChanged), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "focus-out-event",
+ G_CALLBACK(stringFocusOutEvent), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "focus-in-event",
+ G_CALLBACK(stringFocusInEvent), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "leave-notify-event",
+ G_CALLBACK(stringLeaveNotifyEvent), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "event", G_CALLBACK(stringEvent), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "event-after",
+ G_CALLBACK(stringEventAfter), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "key-press-event",
+ G_CALLBACK(stringKeyPressEvent), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "state-changed",
+ G_CALLBACK(stringStateChanged), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "activate", G_CALLBACK(stringActivate),
+ b);
+
//if (option&BO_ENTER)
- g_signal_connect(GTK_OBJECT(b->widget), "activate", G_CALLBACK(stringActivated), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "activate", G_CALLBACK(stringActivated),
+ b);
b->hasSignal = 1;
- g_signal_connect_after(GTK_OBJECT(b->widget), "expose-event",
- G_CALLBACK(stringExposed), b);
-
+ g_signal_connect_after(GTK_OBJECT(b->widget), "expose-event",
+ G_CALLBACK(stringExposed), b);
+
// set the default text and select it to make replacing it easier
if (b->valueP) {
wStringSetValue(b, b->valueP);
@@ -355,7 +410,6 @@ wString_p wStringCreate(
}
gtk_widget_add_events( b->widget, GDK_FOCUS_CHANGE_MASK );
- g_signal_connect(GTK_OBJECT(b->widget), "focus-out-event", G_CALLBACK(killTimer), b);
-
+
return b;
}
diff --git a/app/wlib/gtklib/splash.c b/app/wlib/gtklib/splash.c
index 5d56e9f..d42b7c0 100644
--- a/app/wlib/gtklib/splash.c
+++ b/app/wlib/gtklib/splash.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <string.h>
@@ -50,65 +50,65 @@ static GtkWidget *message; /**< window handle for progress message */
int
wCreateSplash(char *appName, char *appVer)
{
- GtkWidget *vbox;
- GtkWidget *image;
- GtkWidget *label;
- char *temp;
- char logoPath[BUFSIZ];
-
- /* create the basic window */
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
- gtk_window_set_title(GTK_WINDOW(window), appName);
- gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
- gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
- gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_SPLASHSCREEN);
+ GtkWidget *vbox;
+ GtkWidget *image;
+ GtkWidget *label;
+ char *temp;
+ char logoPath[BUFSIZ];
+
+ /* create the basic window */
+ window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
+ gtk_window_set_title(GTK_WINDOW(window), appName);
+ gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
+ gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
+ gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_SPLASHSCREEN);
#if GTK_MAJOR_VERSION > 1 || GTK_MINOR_VERSION > 5
- gtk_window_set_focus_on_map(GTK_WINDOW(window), FALSE);
+ gtk_window_set_focus_on_map(GTK_WINDOW(window), FALSE);
#endif
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_widget_show(vbox);
- gtk_container_add(GTK_CONTAINER(window), vbox);
+ vbox = gtk_vbox_new(FALSE, 0);
+ gtk_widget_show(vbox);
+ gtk_container_add(GTK_CONTAINER(window), vbox);
- /* add the logo image to the top of the splash window */
- sprintf(logoPath, "%s/" LOGOFILENAME, wGetAppLibDir());
- image = gtk_image_new_from_file(logoPath);
- gtk_widget_show(image);
- gtk_box_pack_start(GTK_BOX(vbox), image, TRUE, TRUE, 0);
- gtk_misc_set_alignment(GTK_MISC(image), 0, 0);
+ /* add the logo image to the top of the splash window */
+ sprintf(logoPath, "%s/" LOGOFILENAME, wGetAppLibDir());
+ image = gtk_image_new_from_file(logoPath);
+ gtk_widget_show(image);
+ gtk_box_pack_start(GTK_BOX(vbox), image, TRUE, TRUE, 0);
+ gtk_misc_set_alignment(GTK_MISC(image), 0, 0);
- /* put the product name into the window */
+ /* put the product name into the window */
- temp = malloc(strlen(appName) + strlen(appVer) + 2);
+ temp = malloc(strlen(appName) + strlen(appVer) + 2);
- if (!temp) {
- return (FALSE);
- }
+ if (!temp) {
+ return (FALSE);
+ }
- sprintf(temp, "%s %s", appName, appVer);
+ sprintf(temp, "%s %s", appName, appVer);
- label = gtk_label_new(temp);
- gtk_widget_show(label);
- gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
- gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_FILL);
- gtk_label_set_selectable(GTK_LABEL(label), FALSE);
- gtk_misc_set_padding(GTK_MISC(label), 6, 2);
+ label = gtk_label_new(temp);
+ gtk_widget_show(label);
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+ gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_FILL);
+ gtk_label_set_selectable(GTK_LABEL(label), FALSE);
+ gtk_misc_set_padding(GTK_MISC(label), 6, 2);
- free(temp);
+ free(temp);
- label = gtk_label_new("Application is starting...");
- gtk_widget_show(label);
- gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
- gtk_label_set_line_wrap(GTK_LABEL(label), FALSE);
- gtk_misc_set_padding(GTK_MISC(label), 6, 2);
+ label = gtk_label_new("Application is starting...");
+ gtk_widget_show(label);
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+ gtk_label_set_line_wrap(GTK_LABEL(label), FALSE);
+ gtk_misc_set_padding(GTK_MISC(label), 6, 2);
#if GTK_MINOR_VERSION > 5
- gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_START);
+ gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_START);
#endif
- message = label;
+ message = label;
- gtk_widget_show(window);
- return (TRUE);
+ gtk_widget_show(window);
+ return (TRUE);
}
/**
@@ -120,14 +120,13 @@ wCreateSplash(char *appName, char *appVer)
int
wSetSplashInfo(char *msg)
{
- if (!window) return FALSE;
- if (msg && message) {
- gtk_label_set_text(GTK_LABEL(message), msg);
- wFlush();
- return TRUE;
- }
-
- return FALSE;
+ if (!window) { return FALSE; }
+ if (msg && message) {
+ gtk_label_set_text(GTK_LABEL(message), msg);
+ return TRUE;
+ }
+
+ return FALSE;
}
/**
@@ -138,9 +137,9 @@ wSetSplashInfo(char *msg)
void
wDestroySplash(void)
{
- /* kill window */
- if (window) gtk_widget_destroy(window);
- window = NULL;
+ /* kill window */
+ if (window) { gtk_widget_destroy(window); }
+ window = NULL;
- return;
+ return;
}
diff --git a/app/wlib/gtklib/statusbar.c b/app/wlib/gtklib/statusbar.c
index 3a2fd0d..78d54ac 100644
--- a/app/wlib/gtklib/statusbar.c
+++ b/app/wlib/gtklib/statusbar.c
@@ -39,10 +39,10 @@
#include "gtkint.h"
struct wStatus_t {
- WOBJ_COMMON
- GtkWidget * labelWidget;
- const char * message;
- wPos_t labelWidth;
+ WOBJ_COMMON
+ GtkWidget * labelWidget;
+ const char * message;
+ wWinPix_t labelWidth;
};
/**
@@ -54,20 +54,20 @@ struct wStatus_t {
*/
void wStatusSetValue(
- wStatus_p b,
- const char * arg)
+ wStatus_p b,
+ const char * arg)
{
- if (b->widget == 0) {
- abort();
- }
+ if (b->widget == 0) {
+ abort();
+ }
- if (gtk_entry_get_max_length(GTK_ENTRY(b->labelWidget))<strlen(arg)) {
- gtk_entry_set_max_length(GTK_ENTRY(b->labelWidget), strlen(arg));
- gtk_entry_set_width_chars(GTK_ENTRY(b->labelWidget), strlen(arg));
- }
+ if (gtk_entry_get_max_length(GTK_ENTRY(b->labelWidget))<strlen(arg)) {
+ gtk_entry_set_max_length(GTK_ENTRY(b->labelWidget), strlen(arg));
+ gtk_entry_set_width_chars(GTK_ENTRY(b->labelWidget), strlen(arg));
+ }
- gtk_entry_set_text(GTK_ENTRY(b->labelWidget), wlibConvertInput(arg));
- gtk_widget_queue_draw (GTK_WIDGET(b->labelWidget));
+ gtk_entry_set_text(GTK_ENTRY(b->labelWidget), wlibConvertInput(arg));
+ gtk_widget_queue_draw (GTK_WIDGET(b->labelWidget));
}
/**
* Create a window for a simple text.
@@ -83,38 +83,37 @@ void wStatusSetValue(
*/
wStatus_p wStatusCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * labelStr,
- wPos_t width,
- const char *message)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * labelStr,
+ wWinPix_t width,
+ const char *message)
{
- wStatus_p b;
- GtkRequisition requisition;
- b = (wStatus_p)wlibAlloc(parent, B_STATUS, x, y, NULL, sizeof *b, NULL);
- wlibComputePos((wControl_p)b);
- b->message = message;
- b->labelWidth = width;
- b->labelWidget = gtk_entry_new();
- gtk_editable_set_editable(GTK_EDITABLE(b->labelWidget), FALSE);
- gtk_entry_set_has_frame(GTK_ENTRY(b->labelWidget), FALSE);
- gtk_widget_set_can_focus(b->labelWidget, FALSE);
- gtk_widget_set_sensitive(b->labelWidget, FALSE);
- GdkColor black = {0, 0x0000, 0x0000, 0x0000};
- gtk_widget_modify_text(b->labelWidget,GTK_STATE_INSENSITIVE,&black);
- gtk_entry_set_text(GTK_ENTRY(b->labelWidget),
- message?wlibConvertInput(message):"");
-
- b->widget = gtk_fixed_new();
- gtk_container_add(GTK_CONTAINER(b->widget), b->labelWidget);
- wlibControlGetSize((wControl_p)b);
- gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
- gtk_widget_show(b->widget);
- gtk_widget_show(b->labelWidget);
- wlibAddButton((wControl_p)b);
-
- return b;
+ wStatus_p b;
+ b = (wStatus_p)wlibAlloc(parent, B_STATUS, x, y, NULL, sizeof *b, NULL);
+ wlibComputePos((wControl_p)b);
+ b->message = message;
+ b->labelWidth = width;
+ b->labelWidget = gtk_entry_new();
+ gtk_editable_set_editable(GTK_EDITABLE(b->labelWidget), FALSE);
+ gtk_entry_set_has_frame(GTK_ENTRY(b->labelWidget), FALSE);
+ gtk_widget_set_can_focus(b->labelWidget, FALSE);
+ gtk_widget_set_sensitive(b->labelWidget, FALSE);
+ GdkColor black = {0, 0x0000, 0x0000, 0x0000};
+ gtk_widget_modify_text(b->labelWidget,GTK_STATE_INSENSITIVE,&black);
+ gtk_entry_set_text(GTK_ENTRY(b->labelWidget),
+ message?wlibConvertInput(message):"");
+
+ b->widget = gtk_fixed_new();
+ gtk_container_add(GTK_CONTAINER(b->widget), b->labelWidget);
+ wlibControlGetSize((wControl_p)b);
+ gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
+ gtk_widget_show(b->widget);
+ gtk_widget_show(b->labelWidget);
+ wlibAddButton((wControl_p)b);
+
+ return b;
}
/**
@@ -124,25 +123,25 @@ wStatus_p wStatusCreate(
* \return expected width of message box
*/
-wPos_t
+wWinPix_t
wStatusGetWidth(const char *testString)
{
- GtkWidget *entry;
- GtkRequisition requisition;
+ GtkWidget *entry;
+ GtkRequisition requisition;
- entry = gtk_entry_new();
- g_object_ref_sink(entry);
+ entry = gtk_entry_new();
+ g_object_ref_sink(entry);
- gtk_entry_set_has_frame(GTK_ENTRY(entry), FALSE);
- gtk_entry_set_width_chars(GTK_ENTRY(entry), strlen(testString));
- gtk_entry_set_max_length(GTK_ENTRY(entry), strlen(testString));
+ gtk_entry_set_has_frame(GTK_ENTRY(entry), FALSE);
+ gtk_entry_set_width_chars(GTK_ENTRY(entry), strlen(testString));
+ gtk_entry_set_max_length(GTK_ENTRY(entry), strlen(testString));
- gtk_widget_size_request(entry, &requisition);
+ gtk_widget_size_request(entry, &requisition);
- gtk_widget_destroy(entry);
- g_object_unref(entry);
+ gtk_widget_destroy(entry);
+ g_object_unref(entry);
- return (requisition.width);
+ return (requisition.width);
}
/**
@@ -152,50 +151,50 @@ wStatusGetWidth(const char *testString)
* \return text height
*/
-wPos_t wStatusGetHeight(
- long flags)
+wWinPix_t wStatusGetHeight(
+ long flags)
{
- GtkWidget * temp;
+ GtkWidget * temp;
- if (!(flags&COMBOBOX)) {
+ if (!(flags&COMBOBOX)) {
temp = gtk_entry_new(); //To get size of text itself
- gtk_entry_set_has_frame(GTK_ENTRY(temp), FALSE);
- } else {
- temp = gtk_combo_box_text_new(); //to get max size of an object in infoBar
- }
- g_object_ref_sink(temp);
-
- if (wMessageSetFont(flags)) {
- GtkStyle *style;
- PangoFontDescription *fontDesc;
- int fontSize;
- /* get the current font descriptor */
- style = gtk_widget_get_style(temp);
- fontDesc = style->font_desc;
- /* get the current font size */
- fontSize = PANGO_PIXELS(pango_font_description_get_size(fontDesc));
-
- /* calculate the new font size */
- if (flags & BM_LARGE) {
- pango_font_description_set_size(fontDesc, fontSize * 1.4 * PANGO_SCALE);
- } else {
- pango_font_description_set_size(fontDesc, fontSize * 0.7 * PANGO_SCALE);
- }
-
- /* set the new font size */
- gtk_widget_modify_font(temp, fontDesc);
- }
-
- if (flags&1L) {
- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(temp),"Test");
- }
-
- GtkRequisition temp_requisition;
- gtk_widget_size_request(temp,&temp_requisition);
- //g_object_ref_sink(temp);
- //g_object_unref(temp);
- gtk_widget_destroy(temp);
- return temp_requisition.height;
+ gtk_entry_set_has_frame(GTK_ENTRY(temp), FALSE);
+ } else {
+ temp = gtk_combo_box_text_new(); //to get max size of an object in infoBar
+ }
+ g_object_ref_sink(temp);
+
+ if (wMessageSetFont(flags)) {
+ GtkStyle *style;
+ PangoFontDescription *fontDesc;
+ int fontSize;
+ /* get the current font descriptor */
+ style = gtk_widget_get_style(temp);
+ fontDesc = style->font_desc;
+ /* get the current font size */
+ fontSize = PANGO_PIXELS(pango_font_description_get_size(fontDesc));
+
+ /* calculate the new font size */
+ if (flags & BM_LARGE) {
+ pango_font_description_set_size(fontDesc, fontSize * 1.4 * PANGO_SCALE);
+ } else {
+ pango_font_description_set_size(fontDesc, fontSize * 0.7 * PANGO_SCALE);
+ }
+
+ /* set the new font size */
+ gtk_widget_modify_font(temp, fontDesc);
+ }
+
+ if (flags&1L) {
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(temp),"Test");
+ }
+
+ GtkRequisition temp_requisition;
+ gtk_widget_size_request(temp,&temp_requisition);
+ //g_object_ref_sink(temp);
+ //g_object_unref(temp);
+ gtk_widget_destroy(temp);
+ return temp_requisition.height;
}
/**
@@ -207,9 +206,9 @@ wPos_t wStatusGetHeight(
*/
void wStatusSetWidth(
- wStatus_p b,
- wPos_t width)
+ wStatus_p b,
+ wWinPix_t width)
{
- b->labelWidth = width;
- gtk_widget_set_size_request(b->widget, width, -1);
+ b->labelWidth = width;
+ gtk_widget_set_size_request(b->widget, width, -1);
}
diff --git a/app/wlib/gtklib/sysinfo.c b/app/wlib/gtklib/sysinfo.c
new file mode 100644
index 0000000..eccd67f
--- /dev/null
+++ b/app/wlib/gtklib/sysinfo.c
@@ -0,0 +1,137 @@
+/** \file sysinfo.c
+ * Collect info about runtime environment
+*/
+
+/* XTrkCad - Model Railroad CAD
+ * Copyright (C) 2024 Martin Fischer
+ *
+ * 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 <wlib.h>
+#include "gtkint.h"
+
+
+static char *buffer;
+
+/**
+ * Return the path to a temporary directory. The directory is not created.
+ * The result is put into a buffer and is only valid immediately after the call.
+ *
+ * \return pointer to fully qualified directory path
+ */
+
+char *
+wGetTempPath()
+{
+ gchar const *tempDir = g_get_tmp_dir();
+ gchar *path;
+ gchar pidString[20];
+
+ g_snprintf(pidString, 20, "xtc%d", getpid());
+ path = g_build_path("/", tempDir, pidString, (char *)0);
+
+ if(buffer) {
+ g_free(buffer);
+ }
+
+ buffer = g_strdup(path);
+ g_free(path);
+
+ return(buffer);
+}
+
+/**
+ * Get the Windows version. This function uses the Windows ver command to
+ * retrieve the OS version. The result is put into a buffer and is only
+ * valid immediately after the call.
+ *
+ * \return buffer containing the zero terminated string
+ *
+ */
+
+char *
+wGetOSVersion()
+{
+ FILE* pPipe;
+ size_t bufferSize = 80;
+
+ if(buffer) {
+ free(buffer);
+ buffer = NULL;
+ }
+
+ buffer = malloc(bufferSize);
+// pPipe = _popen("cat /etc/*-release | grep "PRETTY_NAME" | sed 's/PRETTY_NAME=//g'", "r");
+ pPipe = popen("uname -sr", "r");
+
+ while (fgets(buffer, bufferSize, pPipe))
+ ;
+
+ if (buffer[strlen(buffer) -1] == '\n')
+ buffer[strlen(buffer) -1 ] = '\0';
+ pclose(pPipe);
+
+ return(buffer);
+}
+
+
+
+/**
+ * Get the name of the current user. The result is put into a buffer and is only
+ * valid immediately after the call.
+ *
+ * \return buffer containing the zero terminated string
+ *
+ */
+
+char *
+wGetUserID()
+{
+ const gchar *name;
+
+ name = g_get_user_name();
+
+ if(buffer) {
+ g_free(buffer);
+ }
+ buffer = g_strdup( name );
+ return(buffer);
+}
+
+/** Get the user's profile directory. Other than on UNIX Windows differentiates
+ * between the home directory and and the profile directory.
+ *
+ * \return pointer to the user's profile directory
+ */
+
+const char* wGetUserHomeRootDir(void)
+{
+ return(wGetUserHomeDir());
+}
+
+const char* wGetPlatformVersion()
+{
+ if(buffer) {
+ g_free(buffer);
+ }
+
+ buffer = g_strdup_printf("%d.%d.%d", gtk_major_version, gtk_minor_version, gtk_micro_version );
+ return(buffer);
+}
+
diff --git a/app/wlib/gtklib/text.c b/app/wlib/gtklib/text.c
index 0812ace..69a7ecc 100644
--- a/app/wlib/gtklib/text.c
+++ b/app/wlib/gtklib/text.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -37,12 +37,12 @@
#include "gtkint.h"
struct PrintData {
- wText_p tb;
- gint lines_per_page;
- gdouble font_size;
- gchar **lines;
- gint total_lines;
- gint total_pages;
+ wText_p tb;
+ gint lines_per_page;
+ gdouble font_size;
+ gchar **lines;
+ gint total_lines;
+ gint total_pages;
};
#define HEADER_HEIGHT 20.0
@@ -58,10 +58,10 @@ struct PrintData {
*/
struct wText_t {
- WOBJ_COMMON
- wPos_t width, height;
- int changed;
- GtkWidget *text;
+ WOBJ_COMMON
+ wWinPix_t width, height;
+ int changed;
+ GtkWidget *text;
};
/**
@@ -74,15 +74,15 @@ struct wText_t {
void wTextClear(wText_p bt)
{
- GtkTextBuffer *tb;
- tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bt->text));
- gtk_text_buffer_set_text(tb, "", -1);
+ GtkTextBuffer *tb;
+ tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bt->text));
+ gtk_text_buffer_set_text(tb, "", -1);
- if (bt->option & BO_READONLY) {
- gtk_text_view_set_editable(GTK_TEXT_VIEW(bt->text), FALSE);
- }
+ if (bt->option & BO_READONLY) {
+ gtk_text_view_set_editable(GTK_TEXT_VIEW(bt->text), FALSE);
+ }
- bt->changed = FALSE;
+ bt->changed = FALSE;
}
/**
@@ -96,34 +96,34 @@ void wTextClear(wText_p bt)
void wTextAppend(wText_p bt,
const char *text)
{
- GtkTextBuffer *tb;
- GtkTextIter ti1;
- GtkTextMark *tm;
-
-
- if (bt->text == 0) {
- abort();
- }
-
- tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bt->text));
- // convert to utf-8
- text = wlibConvertInput(text);
- // append to end of buffer
- gtk_text_buffer_get_end_iter(tb, &ti1);
- gtk_text_buffer_insert(tb, &ti1, text, -1);
-
- if ( bt->option & BT_TOP ) {
- // and scroll to start of text
- gtk_text_buffer_get_start_iter(tb, &ti1);
- } else {
- // and scroll to end of text
- gtk_text_buffer_get_end_iter(tb, &ti1);
- }
- tm = gtk_text_buffer_create_mark(tb, NULL, &ti1, TRUE );
- gtk_text_view_scroll_mark_onscreen (GTK_TEXT_VIEW(bt->text), tm );
- gtk_text_buffer_delete_mark( tb, tm );
-
- bt->changed = FALSE;
+ GtkTextBuffer *tb;
+ GtkTextIter ti1;
+ GtkTextMark *tm;
+
+
+ if (bt->text == 0) {
+ abort();
+ }
+
+ tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bt->text));
+ // convert to utf-8
+ text = wlibConvertInput(text);
+ // append to end of buffer
+ gtk_text_buffer_get_end_iter(tb, &ti1);
+ gtk_text_buffer_insert(tb, &ti1, text, -1);
+
+ if ( bt->option & BT_TOP ) {
+ // and scroll to start of text
+ gtk_text_buffer_get_start_iter(tb, &ti1);
+ } else {
+ // and scroll to end of text
+ gtk_text_buffer_get_end_iter(tb, &ti1);
+ }
+ tm = gtk_text_buffer_create_mark(tb, NULL, &ti1, TRUE );
+ gtk_text_view_scroll_mark_onscreen (GTK_TEXT_VIEW(bt->text), tm );
+ gtk_text_buffer_delete_mark( tb, tm );
+
+ bt->changed = FALSE;
}
/**
@@ -138,21 +138,22 @@ void wTextAppend(wText_p bt,
static char *wlibGetText(wText_p bt)
{
- GtkTextBuffer *tb;
- GtkTextIter ti1, ti2;
- char *cp, *cp1, *res;
-
- if (bt->text == 0) {
- abort();
- }
-
- tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bt->text));
- gtk_text_buffer_get_bounds(tb, &ti1, &ti2);
- cp = gtk_text_buffer_get_text(tb, &ti1, &ti2, FALSE);
- //cp1 = wlibConvertOutput(cp);
- res = strdup(cp);
- g_free(cp);
- return res;
+ GtkTextBuffer *tb;
+ GtkTextIter ti1, ti2;
+ char *cp, *res;
+ //char *cp1;
+
+ if (bt->text == 0) {
+ abort();
+ }
+
+ tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bt->text));
+ gtk_text_buffer_get_bounds(tb, &ti1, &ti2);
+ cp = gtk_text_buffer_get_text(tb, &ti1, &ti2, FALSE);
+ //cp1 = wlibConvertOutput(cp);
+ res = strdup(cp);
+ g_free(cp);
+ return res;
}
/**
@@ -165,20 +166,20 @@ static char *wlibGetText(wText_p bt)
wBool_t wTextSave(wText_p bt, const char *fileName)
{
- FILE *f;
- char *cp;
- f = fopen(fileName, "w");
-
- if (f==NULL) {
- wNoticeEx(NT_ERROR, fileName, "Ok", NULL);
- return FALSE;
- }
-
- cp = wlibGetText(bt);
- fwrite(cp, 1, strlen(cp), f);
- free(cp);
- fclose(f);
- return TRUE;
+ FILE *f;
+ char *cp;
+ f = fopen(fileName, "w");
+
+ if (f==NULL) {
+ wNoticeEx(NT_ERROR, fileName, "Ok", NULL);
+ return FALSE;
+ }
+
+ cp = wlibGetText(bt);
+ fwrite(cp, 1, strlen(cp), f);
+ free(cp);
+ fclose(f);
+ return TRUE;
}
/**
@@ -196,28 +197,28 @@ begin_print(GtkPrintOperation *operation,
GtkPrintContext *context,
struct PrintData *pd)
{
- gchar *contents;
- gdouble height;
- contents = wlibGetText(pd->tb);
- pd->lines = g_strsplit(contents, "\n", 0);
- /* Count the total number of lines in the file. */
- /* ignore the header lines */
- pd->total_lines = 6;
-
- while (pd->lines[pd->total_lines] != NULL) {
- pd->total_lines++;
- }
-
- /* Based on the height of the page and font size, calculate how many lines can be
- * rendered on a single page. A padding of 3 is placed between lines as well.
- * Space for page header, table header and footer lines is subtracted from the total size
- */
- height = gtk_print_context_get_height(context) - (pd->font_size + 3) - 2 *
- (HEADER_HEIGHT + HEADER_GAP);
- pd->lines_per_page = floor(height / (pd->font_size + 3));
- pd->total_pages = (pd->total_lines - 1) / pd->lines_per_page + 1;
- gtk_print_operation_set_n_pages(operation, pd->total_pages);
- free(contents);
+ gchar *contents;
+ gdouble height;
+ contents = wlibGetText(pd->tb);
+ pd->lines = g_strsplit(contents, "\n", 0);
+ /* Count the total number of lines in the file. */
+ /* ignore the header lines */
+ pd->total_lines = 6;
+
+ while (pd->lines[pd->total_lines] != NULL) {
+ pd->total_lines++;
+ }
+
+ /* Based on the height of the page and font size, calculate how many lines can be
+ * rendered on a single page. A padding of 3 is placed between lines as well.
+ * Space for page header, table header and footer lines is subtracted from the total size
+ */
+ height = gtk_print_context_get_height(context) - (pd->font_size + 3) - 2 *
+ (HEADER_HEIGHT + HEADER_GAP);
+ pd->lines_per_page = floor(height / (pd->font_size + 3));
+ pd->total_pages = (pd->total_lines - 1) / pd->lines_per_page + 1;
+ gtk_print_operation_set_n_pages(operation, pd->total_pages);
+ free(contents);
}
/**
@@ -238,76 +239,76 @@ draw_page(GtkPrintOperation *operation,
gint page_nr,
struct PrintData *pd)
{
- cairo_t *cr;
- PangoLayout *layout;
- gdouble width, text_height, height;
- gint line, i, text_width, layout_height;
- PangoFontDescription *desc;
- gchar *page_str;
- cr = gtk_print_context_get_cairo_context(context);
- width = gtk_print_context_get_width(context);
- layout = gtk_print_context_create_pango_layout(context);
- desc = pango_font_description_from_string("Monospace");
- pango_font_description_set_size(desc, pd->font_size * PANGO_SCALE);
- /*
- * render the header line with document type parts list on left and
- * first line of layout title on right
- */
- pango_layout_set_font_description(layout, desc);
- pango_layout_set_text(layout, pd->lines[ 0 ], -1); // document type
- pango_layout_set_width(layout, -1);
- pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
- pango_layout_get_size(layout, NULL, &layout_height);
- text_height = (gdouble) layout_height / PANGO_SCALE;
- cairo_move_to(cr, 0, (HEADER_HEIGHT - text_height) / 2);
- pango_cairo_show_layout(cr, layout);
- pango_layout_set_text(layout, pd->lines[ 2 ], -1); // layout title
- pango_layout_get_size(layout, &text_width, NULL);
- pango_layout_set_alignment(layout, PANGO_ALIGN_RIGHT);
- cairo_move_to(cr, width - (text_width / PANGO_SCALE),
- (HEADER_HEIGHT - text_height) / 2);
- pango_cairo_show_layout(cr, layout);
- /* Render the column header */
- cairo_move_to(cr, 0, HEADER_HEIGHT + HEADER_GAP + pd->font_size + 3);
- pango_layout_set_text(layout, pd->lines[ 6 ], -1);
- pango_cairo_show_layout(cr, layout);
- cairo_rel_move_to(cr, 0, pd->font_size + 3);
- pango_layout_set_text(layout, pd->lines[ 7 ], -1);
- pango_cairo_show_layout(cr, layout);
- /* Render the page text with the specified font and size. */
- cairo_rel_move_to(cr, 0, pd->font_size + 3);
- line = page_nr * pd->lines_per_page + 8;
-
- for (i = 0; i < pd->lines_per_page && line < pd->total_lines; i++) {
- pango_layout_set_text(layout, pd->lines[line], -1);
- pango_cairo_show_layout(cr, layout);
- cairo_rel_move_to(cr, 0, pd->font_size + 3);
- line++;
- }
-
- /*
- * Render the footer line with date on the left and page number
- * on the right
- */
- pango_layout_set_text(layout, pd->lines[ 5 ], -1); // date
- pango_layout_set_width(layout, -1);
- pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
- pango_layout_get_size(layout, NULL, &layout_height);
- text_height = (gdouble) layout_height / PANGO_SCALE;
- height = gtk_print_context_get_height(context);
- cairo_move_to(cr, 0, height - ((HEADER_HEIGHT - text_height) / 2));
- pango_cairo_show_layout(cr, layout);
- page_str = g_strdup_printf(_("%d of %d"), page_nr + 1,
- pd->total_pages); // page number
- pango_layout_set_text(layout, page_str, -1);
- pango_layout_get_size(layout, &text_width, NULL);
- pango_layout_set_alignment(layout, PANGO_ALIGN_RIGHT);
- cairo_move_to(cr, width - (text_width / PANGO_SCALE),
- height - ((HEADER_HEIGHT - text_height) / 2));
- pango_cairo_show_layout(cr, layout);
- g_free(page_str);
- g_object_unref(layout);
- pango_font_description_free(desc);
+ cairo_t *cr;
+ PangoLayout *layout;
+ gdouble width, text_height, height;
+ gint line, i, text_width, layout_height;
+ PangoFontDescription *desc;
+ gchar *page_str;
+ cr = gtk_print_context_get_cairo_context(context);
+ width = gtk_print_context_get_width(context);
+ layout = gtk_print_context_create_pango_layout(context);
+ desc = pango_font_description_from_string("Monospace");
+ pango_font_description_set_size(desc, pd->font_size * PANGO_SCALE);
+ /*
+ * render the header line with document type parts list on left and
+ * first line of layout title on right
+ */
+ pango_layout_set_font_description(layout, desc);
+ pango_layout_set_text(layout, pd->lines[ 0 ], -1); // document type
+ pango_layout_set_width(layout, -1);
+ pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
+ pango_layout_get_size(layout, NULL, &layout_height);
+ text_height = (gdouble) layout_height / PANGO_SCALE;
+ cairo_move_to(cr, 0, (HEADER_HEIGHT - text_height) / 2);
+ pango_cairo_show_layout(cr, layout);
+ pango_layout_set_text(layout, pd->lines[ 2 ], -1); // layout title
+ pango_layout_get_size(layout, &text_width, NULL);
+ pango_layout_set_alignment(layout, PANGO_ALIGN_RIGHT);
+ cairo_move_to(cr, width - (text_width / PANGO_SCALE),
+ (HEADER_HEIGHT - text_height) / 2);
+ pango_cairo_show_layout(cr, layout);
+ /* Render the column header */
+ cairo_move_to(cr, 0, HEADER_HEIGHT + HEADER_GAP + pd->font_size + 3);
+ pango_layout_set_text(layout, pd->lines[ 6 ], -1);
+ pango_cairo_show_layout(cr, layout);
+ cairo_rel_move_to(cr, 0, pd->font_size + 3);
+ pango_layout_set_text(layout, pd->lines[ 7 ], -1);
+ pango_cairo_show_layout(cr, layout);
+ /* Render the page text with the specified font and size. */
+ cairo_rel_move_to(cr, 0, pd->font_size + 3);
+ line = page_nr * pd->lines_per_page + 8;
+
+ for (i = 0; i < pd->lines_per_page && line < pd->total_lines; i++) {
+ pango_layout_set_text(layout, pd->lines[line], -1);
+ pango_cairo_show_layout(cr, layout);
+ cairo_rel_move_to(cr, 0, pd->font_size + 3);
+ line++;
+ }
+
+ /*
+ * Render the footer line with date on the left and page number
+ * on the right
+ */
+ pango_layout_set_text(layout, pd->lines[ 5 ], -1); // date
+ pango_layout_set_width(layout, -1);
+ pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
+ pango_layout_get_size(layout, NULL, &layout_height);
+ text_height = (gdouble) layout_height / PANGO_SCALE;
+ height = gtk_print_context_get_height(context);
+ cairo_move_to(cr, 0, height - ((HEADER_HEIGHT - text_height) / 2));
+ pango_cairo_show_layout(cr, layout);
+ page_str = g_strdup_printf(_("%d of %d"), page_nr + 1,
+ pd->total_pages); // page number
+ pango_layout_set_text(layout, page_str, -1);
+ pango_layout_get_size(layout, &text_width, NULL);
+ pango_layout_set_alignment(layout, PANGO_ALIGN_RIGHT);
+ cairo_move_to(cr, width - (text_width / PANGO_SCALE),
+ height - ((HEADER_HEIGHT - text_height) / 2));
+ pango_cairo_show_layout(cr, layout);
+ g_free(page_str);
+ g_object_unref(layout);
+ pango_font_description_free(desc);
}
/**
@@ -324,8 +325,8 @@ end_print(GtkPrintOperation *operation,
GtkPrintContext *context,
struct PrintData *pd)
{
- g_strfreev(pd->lines);
- free(pd);
+ g_strfreev(pd->lines);
+ free(pd);
}
/**
@@ -341,47 +342,47 @@ end_print(GtkPrintOperation *operation,
*/
wBool_t wTextPrint(
- wText_p bt)
+ wText_p bt)
{
- GtkPrintOperation *operation;
- GtkWidget *dialog;
- GError *error = NULL;
- gint res;
- struct PrintData *data;
- /* Create a new print operation, applying saved print settings if they exist. */
- operation = gtk_print_operation_new();
- WlibApplySettings(operation);
- data = malloc(sizeof(struct PrintData));
- data->font_size = 10.0;
- data->tb = bt;
- g_signal_connect(G_OBJECT(operation), "begin_print",
- G_CALLBACK(begin_print), (gpointer) data);
- g_signal_connect(G_OBJECT(operation), "draw_page",
- G_CALLBACK(draw_page), (gpointer) data);
- g_signal_connect(G_OBJECT(operation), "end_print",
- G_CALLBACK(end_print), (gpointer) data);
- /* Run the default print operation that will print the selected file. */
- res = gtk_print_operation_run(operation,
- GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
- GTK_WINDOW(gtkMainW->gtkwin), &error);
-
- /* If the print operation was accepted, save the new print settings. */
- if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
- WlibSaveSettings(operation);
- }
- /* Otherwise, report that the print operation has failed. */
- else if (error) {
- dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- "%s",error->message);
- g_error_free(error);
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- }
- g_object_ref_sink(operation);
- g_object_unref(operation);
- return TRUE;
+ GtkPrintOperation *operation;
+ GtkWidget *dialog;
+ GError *error = NULL;
+ gint res;
+ struct PrintData *data;
+ /* Create a new print operation, applying saved print settings if they exist. */
+ operation = gtk_print_operation_new();
+ WlibApplySettings(operation);
+ data = malloc(sizeof(struct PrintData));
+ data->font_size = 10.0;
+ data->tb = bt;
+ g_signal_connect(G_OBJECT(operation), "begin_print",
+ G_CALLBACK(begin_print), (gpointer) data);
+ g_signal_connect(G_OBJECT(operation), "draw_page",
+ G_CALLBACK(draw_page), (gpointer) data);
+ g_signal_connect(G_OBJECT(operation), "end_print",
+ G_CALLBACK(end_print), (gpointer) data);
+ /* Run the default print operation that will print the selected file. */
+ res = gtk_print_operation_run(operation,
+ GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
+ GTK_WINDOW(gtkMainW->gtkwin), &error);
+
+ /* If the print operation was accepted, save the new print settings. */
+ if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
+ WlibSaveSettings(operation);
+ }
+ /* Otherwise, report that the print operation has failed. */
+ else if (error) {
+ dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+ "%s",error->message);
+ g_error_free(error);
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ }
+ g_object_ref_sink(operation);
+ g_object_unref(operation);
+ return TRUE;
}
@@ -394,10 +395,10 @@ wBool_t wTextPrint(
int wTextGetSize(wText_p bt)
{
- char *cp = wlibGetText(bt);
- int len = strlen(cp);
- free(cp);
- return len + 1;
+ char *cp = wlibGetText(bt);
+ int len = strlen(cp);
+ free(cp);
+ return len + 1;
}
/**
@@ -411,15 +412,15 @@ int wTextGetSize(wText_p bt)
void wTextGetText(wText_p bt, char *text, int len)
{
- char *cp;
- cp = wlibGetText(bt);
- strncpy(text, cp, len);
+ char *cp;
+ cp = wlibGetText(bt);
+ strncpy(text, cp, len);
- if (len > 0) {
- text[len - 1] = '\0';
- }
+ if (len > 0) {
+ text[len - 1] = '\0';
+ }
- free(cp);
+ free(cp);
}
/**
@@ -432,13 +433,13 @@ void wTextGetText(wText_p bt, char *text, int len)
void wTextSetReadonly(wText_p bt, wBool_t ro)
{
- gtk_text_view_set_editable(GTK_TEXT_VIEW(bt->text), !ro);
+ gtk_text_view_set_editable(GTK_TEXT_VIEW(bt->text), !ro);
- if (ro) {
- bt->option |= BO_READONLY;
- } else {
- bt->option &= ~BO_READONLY;
- }
+ if (ro) {
+ bt->option |= BO_READONLY;
+ } else {
+ bt->option &= ~BO_READONLY;
+ }
}
/**
@@ -450,7 +451,7 @@ void wTextSetReadonly(wText_p bt, wBool_t ro)
wBool_t wTextGetModified(wText_p bt)
{
- return bt->changed;
+ return bt->changed;
}
/**
@@ -462,11 +463,11 @@ wBool_t wTextGetModified(wText_p bt)
* \return
*/
-void wTextSetSize(wText_p bt, wPos_t w, wPos_t h)
+void wTextSetSize(wText_p bt, wWinPix_t w, wWinPix_t h)
{
- gtk_widget_set_size_request(bt->widget, w, h);
- bt->w = w;
- bt->h = h;
+ gtk_widget_set_size_request(bt->widget, w, h);
+ bt->w = w;
+ bt->h = h;
}
/**
@@ -481,11 +482,12 @@ void wTextSetSize(wText_p bt, wPos_t w, wPos_t h)
* \return
*/
-void wTextComputeSize(wText_p bt, int rows, int cols, wPos_t *width,
- wPos_t *height)
+void wTextComputeSize(wText_p bt, wWinPix_t rows, wWinPix_t cols,
+ wWinPix_t *width,
+ wWinPix_t *height)
{
- *width = rows * 7;
- *height = cols * 14;
+ *width = rows * 7;
+ *height = cols * 14;
}
/**
@@ -498,7 +500,7 @@ void wTextComputeSize(wText_p bt, int rows, int cols, wPos_t *width,
void wTextSetPosition(wText_p bt, int pos)
{
- /* TODO */
+ /* TODO TextSetPosition */
}
/**
@@ -511,11 +513,11 @@ void wTextSetPosition(wText_p bt, int pos)
static void textChanged(GtkWidget *widget, wText_p bt)
{
- if (bt == 0) {
- return;
- }
+ if (bt == 0) {
+ return;
+ }
- bt->changed = TRUE;
+ bt->changed = TRUE;
}
/**
@@ -536,69 +538,69 @@ static void textChanged(GtkWidget *widget, wText_p bt)
wText_p
wTextCreate(wWin_p parent,
- wPos_t x,
- wPos_t y,
+ wWinPix_t x,
+ wWinPix_t y,
const char *helpStr,
const char *labelStr,
long option,
- wPos_t width,
- wPos_t height)
+ wWinPix_t width,
+ wWinPix_t height)
{
- wText_p bt;
- GtkTextBuffer *tb;
- // create the widget
- bt = wlibAlloc(parent, B_MULTITEXT, x, y, labelStr, sizeof *bt, NULL);
- bt->width = width;
- bt->height = height;
- bt->option = option;
- wlibComputePos((wControl_p)bt);
- // create a scroll window with scroll bars that are automatically created
- bt->widget = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(bt->widget),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
- // create a text view and place it inside the scroll widget
- bt->text = gtk_text_view_new();
-
- if (bt->text == 0) {
- abort();
- }
-
- gtk_container_add(GTK_CONTAINER(bt->widget), bt->text);
- // get the text buffer and add a bold tag to it
- tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bt->text));
- gtk_text_buffer_create_tag(tb, "bold", "weight", PANGO_WEIGHT_BOLD, NULL);
-
- // this seems to assume some fixed size fonts, not really helpful
- if (option&BT_CHARUNITS) {
- width *= 7;
- height *= 14;
- }
-
- // show the widgets
- gtk_widget_show(bt->text);
- gtk_widget_show(bt->widget);
- // set the size???
- gtk_widget_set_size_request(GTK_WIDGET(bt->widget),
- width+15/*requisition.width*/, height);
-
- // configure read-only mode
- if (bt->option&BO_READONLY) {
- gtk_text_view_set_editable(GTK_TEXT_VIEW(bt->text), FALSE);
- gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(bt->text), FALSE);
- }
-
- if (labelStr) {
- bt->labelW = wlibAddLabel((wControl_p)bt, labelStr);
- }
-
- wlibAddHelpString(bt->widget, helpStr);
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(bt->text), GTK_WRAP_WORD);
- g_signal_connect(G_OBJECT(tb), "changed", G_CALLBACK(textChanged), bt);
- // place the widget in a fixed position of the parent
- gtk_fixed_put(GTK_FIXED(parent->widget), bt->widget, bt->realX, bt->realY);
- wlibControlGetSize((wControl_p)bt);
- wlibAddButton((wControl_p)bt);
- // done, return the finished widget
- return bt;
+ wText_p bt;
+ GtkTextBuffer *tb;
+ // create the widget
+ bt = wlibAlloc(parent, B_MULTITEXT, x, y, labelStr, sizeof *bt, NULL);
+ bt->width = width;
+ bt->height = height;
+ bt->option = option;
+ wlibComputePos((wControl_p)bt);
+ // create a scroll window with scroll bars that are automatically created
+ bt->widget = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(bt->widget),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+ // create a text view and place it inside the scroll widget
+ bt->text = gtk_text_view_new();
+
+ if (bt->text == 0) {
+ abort();
+ }
+
+ gtk_container_add(GTK_CONTAINER(bt->widget), bt->text);
+ // get the text buffer and add a bold tag to it
+ tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bt->text));
+ gtk_text_buffer_create_tag(tb, "bold", "weight", PANGO_WEIGHT_BOLD, NULL);
+
+ // this seems to assume some fixed size fonts, not really helpful
+ if (option&BT_CHARUNITS) {
+ width *= 7;
+ height *= 14;
+ }
+
+ // show the widgets
+ gtk_widget_show(bt->text);
+ gtk_widget_show(bt->widget);
+ // set the size???
+ gtk_widget_set_size_request(GTK_WIDGET(bt->widget),
+ width+15/*requisition.width*/, height);
+
+ // configure read-only mode
+ if (bt->option&BO_READONLY) {
+ gtk_text_view_set_editable(GTK_TEXT_VIEW(bt->text), FALSE);
+ gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(bt->text), FALSE);
+ }
+
+ if (labelStr) {
+ bt->labelW = wlibAddLabel((wControl_p)bt, labelStr);
+ }
+
+ wlibAddHelpString(bt->widget, helpStr);
+ gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(bt->text), GTK_WRAP_WORD);
+ g_signal_connect(G_OBJECT(tb), "changed", G_CALLBACK(textChanged), bt);
+ // place the widget in a fixed position of the parent
+ gtk_fixed_put(GTK_FIXED(parent->widget), bt->widget, bt->realX, bt->realY);
+ wlibControlGetSize((wControl_p)bt);
+ wlibAddButton((wControl_p)bt);
+ // done, return the finished widget
+ return bt;
}
diff --git a/app/wlib/gtklib/timer.c b/app/wlib/gtklib/timer.c
index 80c71fb..9e70458 100644
--- a/app/wlib/gtklib/timer.c
+++ b/app/wlib/gtklib/timer.c
@@ -52,14 +52,14 @@ static setTriggerCallback_p triggerFunc = NULL;
*/
static gint doAlarm(
- gpointer data)
+ gpointer data)
{
- wAlarmCallBack_p func = (wAlarmCallBack_p)data;
+ wAlarmCallBack_p func = (wAlarmCallBack_p)data;
- func();
+ func();
- alarmTimer = 0;
- return FALSE;
+ alarmTimer = 0;
+ return FALSE;
}
/**
@@ -70,34 +70,34 @@ static gint doAlarm(
*/
void wAlarm(
- long count,
- wAlarmCallBack_p func) /* milliseconds */
+ long count,
+ wAlarmCallBack_p func) /* milliseconds */
{
- gtkPaused = TRUE;
+ gtkPaused = TRUE;
- if (alarmTimer) {
- g_source_remove(alarmTimer);
- }
+ if (alarmTimer) {
+ g_source_remove(alarmTimer);
+ }
- alarmTimer = g_timeout_add(count, doAlarm, (void *)(GSourceFunc)func);
+ alarmTimer = g_timeout_add(count, doAlarm, (void *)(GSourceFunc)func);
}
static void doTrigger(void)
{
- if (triggerControl && triggerFunc) {
- triggerFunc(triggerControl);
- triggerFunc = NULL;
- triggerControl = NULL;
- }
+ if (triggerControl && triggerFunc) {
+ triggerFunc(triggerControl);
+ triggerFunc = NULL;
+ triggerControl = NULL;
+ }
}
void wlibSetTrigger(
- wControl_p b,
- setTriggerCallback_p trigger)
+ wControl_p b,
+ setTriggerCallback_p trigger)
{
- triggerControl = b;
- triggerFunc = trigger;
- wAlarm(500, doTrigger);
+ triggerControl = b;
+ triggerFunc = trigger;
+ wAlarm(500, doTrigger);
}
/**
@@ -107,27 +107,28 @@ void wlibSetTrigger(
*/
void wPause(
- long count) /* milliseconds */
+ long count) /* milliseconds */
{
- while (gtk_events_pending())
- gtk_main_iteration(); //Allow GTK to finish before pausing
-
- struct timeval timeout;
- sigset_t signal_mask;
- sigset_t oldsignal_mask;
- gdk_display_sync(gdk_display_get_default());
- timeout.tv_sec = count/1000;
- timeout.tv_usec = (count%1000)*1000;
- sigemptyset(&signal_mask);
- sigaddset(&signal_mask, SIGIO);
- sigaddset(&signal_mask, SIGALRM);
- sigprocmask(SIG_BLOCK, &signal_mask, &oldsignal_mask);
-
- if (select(0, NULL, NULL, NULL, &timeout) == -1) {
- perror("wPause:select");
- }
-
- sigprocmask(SIG_BLOCK, &oldsignal_mask, NULL);
+ while (gtk_events_pending()) {
+ gtk_main_iteration(); //Allow GTK to finish before pausing
+ }
+
+ struct timeval timeout;
+ sigset_t signal_mask;
+ sigset_t oldsignal_mask;
+ gdk_display_sync(gdk_display_get_default());
+ timeout.tv_sec = count/1000;
+ timeout.tv_usec = (count%1000)*1000;
+ sigemptyset(&signal_mask);
+ sigaddset(&signal_mask, SIGIO);
+ sigaddset(&signal_mask, SIGALRM);
+ sigprocmask(SIG_BLOCK, &signal_mask, &oldsignal_mask);
+
+ if (select(0, NULL, NULL, NULL, &timeout) == -1) {
+ perror("wPause:select");
+ }
+
+ sigprocmask(SIG_BLOCK, &oldsignal_mask, NULL);
}
/**
@@ -139,9 +140,9 @@ void wPause(
unsigned long wGetTimer(void)
{
- struct timeval tv;
- struct timezone tz;
-
- gettimeofday(&tv, &tz);
- return (tv.tv_sec-startTime.tv_sec+1) * 1000 + tv.tv_usec /1000;
+ struct timeval tv;
+ struct timezone tz;
+
+ gettimeofday(&tv, &tz);
+ return (tv.tv_sec-startTime.tv_sec+1) * 1000 + tv.tv_usec /1000;
}
diff --git a/app/wlib/gtklib/tooltip.c b/app/wlib/gtklib/tooltip.c
index 20a1ba9..75c8870 100644
--- a/app/wlib/gtklib/tooltip.c
+++ b/app/wlib/gtklib/tooltip.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -47,18 +47,18 @@ static GtkWidget * balloonPI;
static char balloonMsg[100] = "";
static wControl_p balloonB;
-static wPos_t balloonDx, balloonDy;
+static wWinPix_t balloonDx, balloonDy;
static wBool_t balloonVisible = FALSE;
/**
* Hide the currently displayed Balloon Help.
*/
-
+
void
wlibHelpHideBalloon()
{
- wControlSetBalloon( balloonB, 0, 0, NULL );
+ wControlSetBalloon( balloonB, 0, 0, NULL );
}
/**
@@ -70,7 +70,7 @@ wlibHelpHideBalloon()
void wSetBalloonHelp( wBalloonHelp_t * bh )
{
- balloonHelpStrings = bh;
+ balloonHelpStrings = bh;
}
/**
@@ -82,7 +82,7 @@ void wSetBalloonHelp( wBalloonHelp_t * bh )
void wEnableBalloonHelp( int enable )
{
- enableBalloonHelp = enable;
+ enableBalloonHelp = enable;
}
/**
@@ -93,10 +93,10 @@ void wEnableBalloonHelp( int enable )
*/
void wControlSetHelp(
- wControl_p b,
- const char * help )
+ wControl_p b,
+ const char * help )
{
- wControlSetBalloonText( b, help );
+ wControlSetBalloonText( b, help );
}
/**
@@ -107,13 +107,13 @@ void wControlSetHelp(
*/
void wControlSetBalloonText(
- wControl_p b,
- const char * label )
+ wControl_p b,
+ const char * label )
{
- assert(b->widget != NULL);
+ assert(b->widget != NULL);
- gtk_widget_set_tooltip_text( b->widget, label );
+ gtk_widget_set_tooltip_text( b->widget, label );
}
/**
@@ -128,84 +128,93 @@ void wControlSetBalloonText(
* \return
*/
-void wControlSetBalloon( wControl_p b, wPos_t dx, wPos_t dy, const char * msg )
+void wControlSetBalloon( wControl_p b, wWinPix_t dx, wWinPix_t dy,
+ const char * msg )
{
- PangoLayout * layout;
-
- wPos_t x, y;
- wPos_t w, h;
- wPos_t xx, yy;
- const char * msgConverted;
- GtkRequisition size;
-
- /* return if there is nothing to do */
- if (balloonVisible && balloonB == b &&
- balloonDx == dx && balloonDy == dy && msg != NULL && !balloonMsg[0])
- if (strcmp(msg,balloonMsg)==0)
- return;
-
- /* hide the tooltip */
- if ( msg == NULL ) {
- if ( balloonF != NULL && balloonVisible) {
- gtk_widget_hide( balloonF );
- balloonVisible = FALSE;
- }
- balloonMsg[0] = '\0';
- return;
- }
- msgConverted = wlibConvertInput(msg);
-
- if ( balloonF == NULL ) {
+ gint x, y;
+ gint w, h;
+ wWinPix_t xx, yy;
+ const char * msgConverted;
+ GtkRequisition size;
+
+ /* return if there is nothing to do */
+ if (balloonVisible && balloonB == b &&
+ balloonDx == dx && balloonDy == dy && msg != NULL && !balloonMsg[0])
+ if (strcmp(msg,balloonMsg)==0) {
+ return;
+ }
+
+ /* hide the tooltip */
+ if ( msg == NULL ) {
+ if ( balloonF != NULL && balloonVisible) {
+ gtk_widget_hide( balloonF );
+ balloonVisible = FALSE;
+ }
+ balloonMsg[0] = '\0';
+ return;
+ }
+ msgConverted = wlibConvertInput(msg);
+
+ if ( balloonF == NULL ) {
//GtkWidget *alignment;
-
- balloonF = gtk_window_new( GTK_WINDOW_POPUP );
- gtk_window_set_type_hint( GTK_WINDOW( balloonF), GDK_WINDOW_TYPE_HINT_TOOLTIP );
- gtk_window_set_decorated (GTK_WINDOW (balloonF), FALSE );
- gtk_window_set_resizable( GTK_WINDOW (balloonF), FALSE );
- gtk_window_set_accept_focus(GTK_WINDOW( balloonF), FALSE);
-
+
+ GdkColor color;
+ color.red = 0x00C5 * 65536/255;
+ color.green = 0x006F * 65536/255;
+ color.blue = 0x0078 * 65536/255;
+
+ balloonF = gtk_window_new( GTK_WINDOW_POPUP );
+ gtk_window_set_type_hint( GTK_WINDOW( balloonF), GDK_WINDOW_TYPE_HINT_TOOLTIP );
+ gtk_window_set_decorated (GTK_WINDOW (balloonF), FALSE );
+ gtk_window_set_resizable( GTK_WINDOW (balloonF), FALSE );
+ gtk_window_set_accept_focus(GTK_WINDOW( balloonF), FALSE);
+ gtk_widget_modify_bg(GTK_WIDGET(balloonF), GTK_STATE_NORMAL, &color);
+
GtkWidget * alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
gtk_alignment_set_padding( GTK_ALIGNMENT(alignment), 6, 6, 6, 6 );
gtk_container_add (GTK_CONTAINER (balloonF), alignment);
-
+
gtk_widget_show (alignment);
-
- balloonPI = gtk_label_new(msgConverted);
- gtk_container_add( GTK_CONTAINER(alignment), balloonPI );
- gtk_widget_show_all( balloonPI );
- }
- gtk_label_set_text( GTK_LABEL(balloonPI), msgConverted );
-
- balloonDx = dx;
- balloonDy = dy;
- balloonB = b;
- snprintf(balloonMsg, sizeof(balloonMsg), "%s", msg);
- gtk_widget_get_requisition(balloonPI, &size );
- w = size.width;
- h = size.height;
-
- gtk_window_get_position( GTK_WINDOW(b->parent->gtkwin), &x, &y);
-
- x += b->realX + dx;
- y += b->realY + b->h - dy;
- xx = gdk_screen_width();
- yy = gdk_screen_height();
- if ( x < 0 ) {
- x = 0;
- } else if ( x+w > xx ) {
- x = xx - w;
- }
- if ( y < 0 ) {
- y = 0;
- } else if ( y+h > yy ) {
- y = yy - h ;
- }
- gtk_window_move( GTK_WINDOW( balloonF ), x, y );
- gtk_widget_show_all( balloonF );
- gtk_widget_show( balloonPI );
-
- balloonVisible = TRUE;
+
+ balloonPI = gtk_label_new(msgConverted);
+ gtk_container_add( GTK_CONTAINER(alignment), balloonPI );
+ gtk_widget_show_all( balloonPI );
+ }
+ gtk_label_set_text( GTK_LABEL(balloonPI), msgConverted );
+
+ balloonDx = dx;
+ balloonDy = dy;
+ balloonB = b;
+ snprintf(balloonMsg, sizeof(balloonMsg), "%s", msg);
+ gtk_widget_get_requisition(balloonPI, &size );
+ w = size.width;
+ h = size.height;
+
+ gtk_window_get_position( GTK_WINDOW(b->parent->gtkwin), &x, &y);
+
+ x += b->realX + dx;
+ y += b->realY + b->h - dy;
+#ifdef __linux__
+ y += 7; // balloon popup overlaps the control
+#endif
+ xx = gdk_screen_width();
+ yy = gdk_screen_height();
+ if ( x < 0 ) {
+ x = 0;
+ } else if ( x+w > xx ) {
+ x = xx - w;
+ }
+ if ( y < 0 ) {
+ y = 0;
+ } else if ( y+h > yy ) {
+ y = yy - h ;
+ }
+ gtk_window_move( GTK_WINDOW( balloonF ), x, y );
+ gtk_widget_show_all( balloonF );
+ gtk_widget_show( balloonPI );
+
+ balloonVisible = TRUE;
}
/**
@@ -223,36 +232,41 @@ void wBalloonHelpUpdate( void )
*/
void wlibAddHelpString(
- GtkWidget * widget,
- const char * helpStr )
+ GtkWidget * widget,
+ const char * helpStr )
{
- char *string;
- char *wAppName = wlibGetAppName();
- wBalloonHelp_t * bhp;
-
- if (helpStr==NULL || *helpStr==0)
- return;
- if ( balloonHelpStrings == NULL )
- return;
-
- // search for the helpStr, bhp points to the entry when found
- for ( bhp = balloonHelpStrings; bhp->name && strcmp(bhp->name,helpStr) != 0; bhp++ )
- ;
-
- if (listMissingHelpStrings && !bhp->name) {
- printf( "Missing Help String: %s\n", helpStr );
- return;
- }
-
- string = malloc( strlen(wAppName) + 5 + strlen(helpStr) + 1 );
- sprintf( string, "%sHelp/%s", wAppName, helpStr );
-
- if(bhp->value)
+ char *string;
+ char *wAppName = wlibGetAppName();
+ wBalloonHelp_t * bhp;
+
+ if (helpStr==NULL || *helpStr==0) {
+ return;
+ }
+ if ( balloonHelpStrings == NULL ) {
+ return;
+ }
+
+ // search for the helpStr, bhp points to the entry when found
+ for ( bhp = balloonHelpStrings; bhp->name
+ && strcmp(bhp->name,helpStr) != 0; bhp++ )
+ ;
+
+ if (listMissingHelpStrings && !bhp->name) {
+ printf( "Missing Help String: %s\n", helpStr );
+ return;
+ }
+
+ string = malloc( strlen(wAppName) + 5 + strlen(helpStr) + 1 );
+ sprintf( string, "%sHelp/%s", wAppName, helpStr );
+
+ if(bhp->value) {
gtk_widget_set_tooltip_text( widget, wlibConvertInput(_(bhp->value)) );
+ }
- g_object_set_data( G_OBJECT( widget ), HELPDATAKEY, string );
+ g_object_set_data( G_OBJECT( widget ), HELPDATAKEY, string );
- if (listHelpStrings)
- printf( "HELPSTR - %s\n", string );
+ if (listHelpStrings) {
+ printf( "HELPSTR - %s\n", string );
+ }
}
diff --git a/app/wlib/gtklib/treeview.c b/app/wlib/gtklib/treeview.c
index 2b743cb..b3f2d77 100644
--- a/app/wlib/gtklib/treeview.c
+++ b/app/wlib/gtklib/treeview.c
@@ -53,7 +53,7 @@
int
wTreeViewGetCount(wList_p b)
{
- return b->count;
+ return b->count;
}
/**
@@ -65,9 +65,9 @@ wTreeViewGetCount(wList_p b)
void
wTreeViewClear(wList_p b)
{
- assert(b != NULL);
+ assert(b != NULL);
- wlibListStoreClear(b->listStore);
+ wlibListStoreClear(b->listStore);
}
/**
@@ -81,15 +81,15 @@ wTreeViewClear(wList_p b)
void *
wTreeViewGetItemContext(wList_p b, int row)
{
- wListItem_p id_p;
+ wListItem_p id_p;
- id_p = wlibListItemGet(b->listStore, row, NULL);
+ id_p = wlibListItemGet(b->listStore, row, NULL);
- if (id_p) {
- return id_p->itemData;
- } else {
- return NULL;
- }
+ if (id_p) {
+ return id_p->itemData;
+ } else {
+ return NULL;
+ }
}
/**
@@ -101,11 +101,11 @@ wTreeViewGetItemContext(wList_p b, int row)
*/
wIndex_t wListGetIndex(
- wList_p b)
+ wList_p b)
{
- assert(b!=NULL);
+ assert(b!=NULL);
- return b->last;
+ return b->last;
}
/**
@@ -119,48 +119,48 @@ wIndex_t wListGetIndex(
void
wlibTreeViewSetSelected(wList_p b, int index)
{
- GtkTreeSelection *sel;
- GtkTreeIter iter;
+ GtkTreeSelection *sel;
+ GtkTreeIter iter;
- wListItem_p id_p;
+ wListItem_p id_p;
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(b->treeView));
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(b->treeView));
- if (gtk_tree_selection_count_selected_rows(sel)) {
+ if (gtk_tree_selection_count_selected_rows(sel)) {
int inx;
-
- gtk_tree_selection_unselect_all(sel);
- // and synchronize the internal data structures
- wTreeViewGetCount(b);
+ gtk_tree_selection_unselect_all(sel);
- for (inx=0; inx<b->count; inx++) {
- id_p = wlibListItemGet(b->listStore, inx, NULL);
- id_p->selected = FALSE;
- }
- }
+ // and synchronize the internal data structures
+ wTreeViewGetCount(b);
- if (index != -1) {
+ for (inx=0; inx<b->count; inx++) {
+ id_p = wlibListItemGet(b->listStore, inx, NULL);
+ id_p->selected = FALSE;
+ }
+ }
+
+ if (index != -1) {
gint childs;
-
+
childs = gtk_tree_model_iter_n_children (GTK_TREE_MODEL(b->listStore),
- NULL );
+ NULL );
if(index < childs) {
gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(b->listStore),
- &iter,
- NULL,
- index);
+ &iter,
+ NULL,
+ index);
gtk_tree_selection_select_iter(sel,
- &iter);
+ &iter);
id_p = wlibListItemGet(b->listStore, index, NULL);
-
+
if (id_p) {
id_p->selected = TRUE;
}
- }
- }
+ }
+ }
}
/**
@@ -175,35 +175,37 @@ wlibTreeViewSetSelected(wList_p b, int index)
GtkWidget *
wlibNewTreeView(GtkListStore *ls, int showTitles, int multiSelection)
{
- GtkWidget *treeView;
- GtkTreeSelection *sel;
- assert(ls != NULL);
+ GtkWidget *treeView;
+ GtkTreeSelection *sel;
+ assert(ls != NULL);
- /* create and configure the tree view */
- treeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ls));
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeView), showTitles);
+ /* create and configure the tree view */
+ treeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ls));
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeView), showTitles);
- /* set up selection handling */
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView));
- gtk_tree_selection_set_mode(sel,
- (multiSelection)?GTK_SELECTION_MULTIPLE:GTK_SELECTION_BROWSE);
+ /* set up selection handling */
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView));
+ gtk_tree_selection_set_mode(sel,
+ (multiSelection)?GTK_SELECTION_MULTIPLE:GTK_SELECTION_BROWSE);
- return (treeView);
+ return (treeView);
}
+#if 0
static int changeListColumnWidth(
- GtkTreeViewColumn * column,
- void * width)
+ GtkTreeViewColumn * column,
+ void * width)
{
- //wList_p bl = (wList_p)data;
+ //wList_p bl = (wList_p)data;
- //if (bl->recursion)
- //return 0;
- //if ( col >= 0 && col < bl->colCnt )
- //bl->colWidths[col] = width;
- return 0;
+ //if (bl->recursion)
+ //return 0;
+ //if ( col >= 0 && col < bl->colCnt )
+ //bl->colWidths[col] = width;
+ return 0;
}
+#endif
/**
* Create and initialize a column in treeview. Initially all columns are
@@ -220,17 +222,17 @@ static void
wlibAddColumn(GtkWidget *tv, int visibility, GtkCellRenderer *renderer,
char *attribute, int value)
{
- GtkTreeViewColumn *column;
+ GtkTreeViewColumn *column;
- column = gtk_tree_view_column_new();
- gtk_tree_view_column_pack_start(column,
- renderer,
- TRUE);
- gtk_tree_view_column_add_attribute(column, renderer, attribute, value);
- gtk_tree_view_column_set_visible(column, visibility);
- gtk_tree_view_column_set_resizable(column, TRUE);
+ column = gtk_tree_view_column_new();
+ gtk_tree_view_column_pack_start(column,
+ renderer,
+ TRUE);
+ gtk_tree_view_column_add_attribute(column, renderer, attribute, value);
+ gtk_tree_view_column_set_visible(column, visibility);
+ gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_append_column(GTK_TREE_VIEW(tv), column);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(tv), column);
// g_signal_connect( column, "notify::width", G_CALLBACK(changeListColumnWidth), tv );
}
@@ -247,22 +249,22 @@ wlibAddColumn(GtkWidget *tv, int visibility, GtkCellRenderer *renderer,
int
wlibTreeViewAddColumns(GtkWidget *tv, int count)
{
- GtkCellRenderer *renderer;
- int i;
+ GtkCellRenderer *renderer;
+ int i;
- assert(tv != NULL);
- renderer = gtk_cell_renderer_pixbuf_new();
- /* first visible column is used for bitmaps */
- wlibAddColumn(tv, FALSE, renderer, "pixbuf", LISTCOL_BITMAP);
+ assert(tv != NULL);
+ renderer = gtk_cell_renderer_pixbuf_new();
+ /* first visible column is used for bitmaps */
+ wlibAddColumn(tv, FALSE, renderer, "pixbuf", LISTCOL_BITMAP);
- renderer = gtk_cell_renderer_text_new();
+ renderer = gtk_cell_renderer_text_new();
- /* add renderers to all columns */
- for (i = 0; i < count; i++) {
- wlibAddColumn(tv, TRUE, renderer, "text", i + LISTCOL_TEXT);
- }
+ /* add renderers to all columns */
+ for (i = 0; i < count; i++) {
+ wlibAddColumn(tv, TRUE, renderer, "text", i + LISTCOL_TEXT);
+ }
- return i;
+ return i;
}
/**
@@ -276,26 +278,26 @@ wlibTreeViewAddColumns(GtkWidget *tv, int count)
int
wlibAddColumnTitles(GtkWidget *tv, const char **titles)
{
- int i = 0;
-
- assert(tv != NULL);
-
- if (titles) {
- while (*titles) {
- GtkTreeViewColumn *column;
-
- column = gtk_tree_view_get_column(GTK_TREE_VIEW(tv), i + 1);
-
- if (column) {
- gtk_tree_view_column_set_title(column, titles[ i ]);
- i++;
- } else {
- break;
- }
- }
- }
-
- return i;
+ int i = 0;
+
+ assert(tv != NULL);
+
+ if (titles) {
+ while (*titles) {
+ GtkTreeViewColumn *column;
+
+ column = gtk_tree_view_get_column(GTK_TREE_VIEW(tv), i + 1);
+
+ if (column) {
+ gtk_tree_view_column_set_title(column, titles[ i ]);
+ i++;
+ } else {
+ break;
+ }
+ }
+ }
+
+ return i;
}
/**
@@ -313,20 +315,20 @@ int
wlibTreeViewAddData(GtkWidget *tv, int cols, char *label, GdkPixbuf *pixbuf,
wListItem_p userData)
{
- GtkListStore *listStore = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(
- tv)));
+ GtkListStore *listStore = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(
+ tv)));
+
+ wlibListStoreAddData(listStore, pixbuf, cols, userData);
- wlibListStoreAddData(listStore, pixbuf, cols, userData);
+ if (pixbuf) {
+ GtkTreeViewColumn *column;
- if (pixbuf) {
- GtkTreeViewColumn *column;
-
- // first column in list store has pixbuf
- column = gtk_tree_view_get_column(GTK_TREE_VIEW(tv), 0);
- gtk_tree_view_column_set_visible(column,
- TRUE);
- }
- return 0;
+ // first column in list store has pixbuf
+ column = gtk_tree_view_get_column(GTK_TREE_VIEW(tv), 0);
+ gtk_tree_view_column_set_visible(column,
+ TRUE);
+ }
+ return 0;
}
@@ -344,28 +346,28 @@ wlibTreeViewAddData(GtkWidget *tv, int cols, char *label, GdkPixbuf *pixbuf,
void
wlibTreeViewAddRow(wList_p b, char *label, wIcon_p bm, wListItem_p id_p)
{
- GtkAdjustment *adj;
- GdkPixbuf *pixbuf = NULL;
+ GtkAdjustment *adj;
+ GdkPixbuf *pixbuf = NULL;
- if (bm) {
- pixbuf = wlibMakePixbuf(bm);
- }
+ if (bm) {
+ pixbuf = wlibMakePixbuf(bm);
+ }
- wlibTreeViewAddData(b->treeView, b->colCnt, (char *)label, pixbuf, id_p);
+ wlibTreeViewAddData(b->treeView, b->colCnt, (char *)label, pixbuf, id_p);
- adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(b->widget));
+ adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(b->widget));
- if (gtk_adjustment_get_upper(adj) < gtk_adjustment_get_step_increment(adj) *
- (b->count+1)) {
- gtk_adjustment_set_upper(adj,
- gtk_adjustment_get_upper(adj) +
- gtk_adjustment_get_step_increment(adj));
- gtk_adjustment_changed(adj);
- }
+ if (gtk_adjustment_get_upper(adj) < gtk_adjustment_get_step_increment(adj) *
+ (b->count+1)) {
+ gtk_adjustment_set_upper(adj,
+ gtk_adjustment_get_upper(adj) +
+ gtk_adjustment_get_step_increment(adj));
+ gtk_adjustment_changed(adj);
+ }
- b->last = gtk_tree_model_iter_n_children(gtk_tree_view_get_model(GTK_TREE_VIEW(
- b->treeView)),
- NULL);
+ b->last = gtk_tree_model_iter_n_children(gtk_tree_view_get_model(GTK_TREE_VIEW(
+ b->treeView)),
+ NULL);
}
@@ -390,36 +392,34 @@ changeSelection(GtkTreeSelection *selection,
gboolean path_currently_selected,
gpointer data)
{
- GtkTreeIter iter;
- GValue value = { 0 };
- wListItem_p id_p = NULL;
- wList_p bl = (wList_p)data;
- int row;
- char *text;
+ GtkTreeIter iter;
+ GValue value = { 0 };
+ wListItem_p id_p = NULL;
+ wList_p bl = (wList_p)data;
+ int row;
+ char *text;
- text = gtk_tree_path_to_string(path);
- row = atoi(text);
- g_free(text);
+ text = gtk_tree_path_to_string(path);
+ row = atoi(text);
+ g_free(text);
- gtk_tree_model_get_iter(model, &iter, path);
- gtk_tree_model_get_value(model, &iter, LISTCOL_DATA, &value);
+ gtk_tree_model_get_iter(model, &iter, path);
+ gtk_tree_model_get_value(model, &iter, LISTCOL_DATA, &value);
- id_p = g_value_get_pointer(&value);
- id_p->selected = !path_currently_selected;
+ id_p = g_value_get_pointer(&value);
+ id_p->selected = !path_currently_selected;
- if (id_p->selected) {
- bl->last = row;
+ bl->last = row;
- if (bl->valueP) {
- *bl->valueP = row;
- }
+ if (bl->valueP) {
+ *bl->valueP = row;
+ }
- if (bl->action) {
- bl->action(row, id_p->label, 1, bl->data, id_p->itemData);
- }
- }
+ if (bl->action) {
+ bl->action(row, id_p->label, id_p->selected, bl->data, id_p->itemData);
+ }
- return TRUE;
+ return TRUE;
}
/**
@@ -444,88 +444,88 @@ changeSelection(GtkTreeSelection *selection,
*/
wList_p wListCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- const char * labelStr,
- long option,
- long number,
- wPos_t width,
- int colCnt,
- wPos_t * colWidths,
- wBool_t * colRightJust,
- const char ** colTitles,
- long *valueP,
- wListCallBack_p action,
- void *data)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ long number,
+ wWinPix_t width,
+ int colCnt,
+ wWinPix_t * colWidths,
+ wBool_t * colRightJust,
+ const char ** colTitles,
+ long *valueP,
+ wListCallBack_p action,
+ void *data)
{
- GtkTreeSelection *sel;
- wList_p bl;
- static wPos_t zeroPos = 0;
+ GtkTreeSelection *sel;
+ wList_p bl;
+ static wWinPix_t zeroPos = 0;
- assert(width != 0);
+ assert(width != 0);
- bl = (wList_p)wlibAlloc(parent, B_LIST, x, y, labelStr, sizeof *bl, data);
- bl->option = option;
- bl->number = number;
- bl->count = 0;
- bl->last = -1;
- bl->valueP = valueP;
- bl->action = action;
- bl->listX = bl->realX;
+ bl = (wList_p)wlibAlloc(parent, B_LIST, x, y, labelStr, sizeof *bl, data);
+ bl->option = option;
+ bl->number = number;
+ bl->count = 0;
+ bl->last = -1;
+ bl->valueP = valueP;
+ bl->action = action;
+ bl->listX = bl->realX;
- if (colCnt <= 0) {
- colCnt = 1;
- colWidths = &zeroPos;
- }
+ if (colCnt <= 0) {
+ colCnt = 1;
+ colWidths = &zeroPos;
+ }
- bl->colCnt = colCnt;
- bl->colWidths = (wPos_t*)malloc(colCnt * sizeof *(wPos_t*)0);
- memcpy(bl->colWidths, colWidths, colCnt * sizeof *(wPos_t*)0);
+ bl->colCnt = colCnt;
+ bl->colWidths = (wWinPix_t*)malloc(colCnt * sizeof *(wWinPix_t*)0);
+ memcpy(bl->colWidths, colWidths, colCnt * sizeof *(wWinPix_t*)0);
- /* create the data structure for data */
- bl->listStore = wlibNewListStore(colCnt);
- /* create the widget for the list store */
- bl->treeView = wlibNewTreeView(bl->listStore,
- colTitles != NULL,
- option & BL_MANY);
+ /* create the data structure for data */
+ bl->listStore = wlibNewListStore(colCnt);
+ /* create the widget for the list store */
+ bl->treeView = wlibNewTreeView(bl->listStore,
+ colTitles != NULL,
+ option & BL_MANY);
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(bl->treeView));
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(bl->treeView));
- gtk_tree_selection_set_select_function(sel,
- changeSelection,
- bl,
- NULL);
+ gtk_tree_selection_set_select_function(sel,
+ changeSelection,
+ bl,
+ NULL);
- wlibTreeViewAddColumns(bl->treeView, colCnt);
+ wlibTreeViewAddColumns(bl->treeView, colCnt);
- wlibAddColumnTitles(bl->treeView, colTitles);
+ wlibAddColumnTitles(bl->treeView, colTitles);
- wlibComputePos((wControl_p)bl);
+ wlibComputePos((wControl_p)bl);
- bl->widget = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(bl->widget),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(bl->widget),
- bl->treeView);
+ bl->widget = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(bl->widget),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(bl->widget),
+ bl->treeView);
- gtk_widget_set_size_request(bl->widget, width, (number+1)*ROW_HEIGHT);
+ gtk_widget_set_size_request(bl->widget, width, (number+1)*ROW_HEIGHT);
/// g_signal_connect( GTK_OBJECT(bl->list), "resize_column", G_CALLBACK(changeListColumnWidth), bl );
- gtk_widget_show_all(bl->widget);
+ gtk_widget_show_all(bl->widget);
- gtk_fixed_put(GTK_FIXED(parent->widget), bl->widget, bl->realX, bl->realY);
- wlibControlGetSize((wControl_p)bl);
+ gtk_fixed_put(GTK_FIXED(parent->widget), bl->widget, bl->realX, bl->realY);
+ wlibControlGetSize((wControl_p)bl);
- if (labelStr) {
- bl->labelW = wlibAddLabel((wControl_p)bl, labelStr);
- }
+ if (labelStr) {
+ bl->labelW = wlibAddLabel((wControl_p)bl, labelStr);
+ }
- wlibAddButton((wControl_p)bl);
- wlibAddHelpString(bl->widget, helpStr);
+ wlibAddButton((wControl_p)bl);
+ wlibAddHelpString(bl->widget, helpStr);
- return bl;
+ return bl;
}
diff --git a/app/wlib/gtklib/uthash.h b/app/wlib/gtklib/uthash.h
index 39fd891..bf74f7b 100644
--- a/app/wlib/gtklib/uthash.h
+++ b/app/wlib/gtklib/uthash.h
@@ -890,22 +890,22 @@ for((el)=(head),(tmp)=DECLTYPE(el)((head)?(head)->hh.next:NULL);
#define HASH_CNT(hh,head) ((head)?((head)->hh.tbl->num_items):0)
typedef struct UT_hash_bucket {
- struct UT_hash_handle *hh_head;
- unsigned count;
-
- /* expand_mult is normally set to 0. In this situation, the max chain length
- * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If
- * the bucket's chain exceeds this length, bucket expansion is triggered).
- * However, setting expand_mult to a non-zero value delays bucket expansion
- * (that would be triggered by additions to this particular bucket)
- * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH.
- * (The multiplier is simply expand_mult+1). The whole idea of this
- * multiplier is to reduce bucket expansions, since they are expensive, in
- * situations where we know that a particular bucket tends to be overused.
- * It is better to let its chain length grow to a longer yet-still-bounded
- * value, than to do an O(n) bucket expansion too often.
- */
- unsigned expand_mult;
+ struct UT_hash_handle *hh_head;
+ unsigned count;
+
+ /* expand_mult is normally set to 0. In this situation, the max chain length
+ * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If
+ * the bucket's chain exceeds this length, bucket expansion is triggered).
+ * However, setting expand_mult to a non-zero value delays bucket expansion
+ * (that would be triggered by additions to this particular bucket)
+ * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH.
+ * (The multiplier is simply expand_mult+1). The whole idea of this
+ * multiplier is to reduce bucket expansions, since they are expensive, in
+ * situations where we know that a particular bucket tends to be overused.
+ * It is better to let its chain length grow to a longer yet-still-bounded
+ * value, than to do an O(n) bucket expansion too often.
+ */
+ unsigned expand_mult;
} UT_hash_bucket;
@@ -914,47 +914,47 @@ typedef struct UT_hash_bucket {
#define HASH_BLOOM_SIGNATURE 0xb12220f2
typedef struct UT_hash_table {
- UT_hash_bucket *buckets;
- unsigned num_buckets, log2_num_buckets;
- unsigned num_items;
- struct UT_hash_handle *tail; /* tail hh in app order, for fast append */
- ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */
-
- /* in an ideal situation (all buckets used equally), no bucket would have
- * more than ceil(#items/#buckets) items. that's the ideal chain length. */
- unsigned ideal_chain_maxlen;
-
- /* nonideal_items is the number of items in the hash whose chain position
- * exceeds the ideal chain maxlen. these items pay the penalty for an uneven
- * hash distribution; reaching them in a chain traversal takes >ideal steps */
- unsigned nonideal_items;
-
- /* ineffective expands occur when a bucket doubling was performed, but
- * afterward, more than half the items in the hash had nonideal chain
- * positions. If this happens on two consecutive expansions we inhibit any
- * further expansion, as it's not helping; this happens when the hash
- * function isn't a good fit for the key domain. When expansion is inhibited
- * the hash will still work, albeit no longer in constant time. */
- unsigned ineff_expands, noexpand;
-
- uint32_t signature; /* used only to find hash tables in external analysis */
+ UT_hash_bucket *buckets;
+ unsigned num_buckets, log2_num_buckets;
+ unsigned num_items;
+ struct UT_hash_handle *tail; /* tail hh in app order, for fast append */
+ ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */
+
+ /* in an ideal situation (all buckets used equally), no bucket would have
+ * more than ceil(#items/#buckets) items. that's the ideal chain length. */
+ unsigned ideal_chain_maxlen;
+
+ /* nonideal_items is the number of items in the hash whose chain position
+ * exceeds the ideal chain maxlen. these items pay the penalty for an uneven
+ * hash distribution; reaching them in a chain traversal takes >ideal steps */
+ unsigned nonideal_items;
+
+ /* ineffective expands occur when a bucket doubling was performed, but
+ * afterward, more than half the items in the hash had nonideal chain
+ * positions. If this happens on two consecutive expansions we inhibit any
+ * further expansion, as it's not helping; this happens when the hash
+ * function isn't a good fit for the key domain. When expansion is inhibited
+ * the hash will still work, albeit no longer in constant time. */
+ unsigned ineff_expands, noexpand;
+
+ uint32_t signature; /* used only to find hash tables in external analysis */
#ifdef HASH_BLOOM
- uint32_t bloom_sig; /* used only to test bloom exists in external analysis */
- uint8_t *bloom_bv;
- char bloom_nbits;
+ uint32_t bloom_sig; /* used only to test bloom exists in external analysis */
+ uint8_t *bloom_bv;
+ char bloom_nbits;
#endif
} UT_hash_table;
typedef struct UT_hash_handle {
- struct UT_hash_table *tbl;
- void *prev; /* prev element in app order */
- void *next; /* next element in app order */
- struct UT_hash_handle *hh_prev; /* previous hh in bucket order */
- struct UT_hash_handle *hh_next; /* next hh in bucket order */
- void *key; /* ptr to enclosing struct's key */
- unsigned keylen; /* enclosing struct's key len */
- unsigned hashv; /* result of hash-fcn(key) */
+ struct UT_hash_table *tbl;
+ void *prev; /* prev element in app order */
+ void *next; /* next element in app order */
+ struct UT_hash_handle *hh_prev; /* previous hh in bucket order */
+ struct UT_hash_handle *hh_next; /* next hh in bucket order */
+ void *key; /* ptr to enclosing struct's key */
+ unsigned keylen; /* enclosing struct's key len */
+ unsigned hashv; /* result of hash-fcn(key) */
} UT_hash_handle;
#endif /* UTHASH_H */
diff --git a/app/wlib/gtklib/util.c b/app/wlib/gtklib/util.c
index a265938..3f746e6 100644
--- a/app/wlib/gtklib/util.c
+++ b/app/wlib/gtklib/util.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -37,41 +37,43 @@
#include "gtkint.h"
#include "i18n.h"
-wWin_p gtkMainW;
+extern wWin_p gtkMainW;
long debugWindow = 0;
char wConfigName[ 256 ];
const char * wNames[] = {
- "MAIN",
- "POPUP",
- "BUTT",
- "CANCEL",
- "POPUP",
- "TEXT",
- "INTEGER",
- "FLOAT",
- "LIST",
- "DROPLIST",
- "COMBOLIST",
- "RADIO",
- "TOGGLE",
- "DRAW",
- "MENU"
- "MULTITEXT",
- "MESSAGE",
- "LINES",
- "MENUITEM",
- "BOX"
+ "MAIN",
+ "POPUP",
+ "BUTT",
+ "CANCEL",
+ "POPUP",
+ "TEXT",
+ "INTEGER",
+ "FLOAT",
+ "LIST",
+ "DROPLIST",
+ "COMBOLIST",
+ "RADIO",
+ "TOGGLE",
+ "DRAW",
+ "MENU"
+ "MULTITEXT",
+ "MESSAGE",
+ "LINES",
+ "MENUITEM",
+ "BOX"
};
+#if 0
static wBool_t reverseIcon =
#if defined(linux)
- FALSE;
+ FALSE;
#else
- TRUE;
+ TRUE;
+#endif
#endif
@@ -92,50 +94,49 @@ static wBool_t reverseIcon =
*/
GdkPixbuf* wlibPixbufFromXBM(
- wIcon_p ip)
+ 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, " %d %d 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] = '.';
- }
- }
- pixmapData[row + 3][ip->w] = 0;
- }
-
- pixbuf = gdk_pixbuf_new_from_xpm_data((const char **) pixmapData);
-
- for (row = 0; row < ip->h; row++) {
- free(pixmapData[row + 3]);
- }
- free(pixmapData);
- return pixbuf;
+ 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] = '.';
+ }
+ }
+ pixmapData[row + 3][ip->w] = 0;
+ }
+
+ pixbuf = gdk_pixbuf_new_from_xpm_data((const char **) pixmapData);
+
+ for (row = 0; row < ip->h; row++) {
+ free(pixmapData[row + 3]);
+ }
+ free(pixmapData);
+ return pixbuf;
}
/**
@@ -148,23 +149,25 @@ GdkPixbuf* wlibPixbufFromXBM(
int wlibAddLabel(wControl_p b, const char * labelStr)
{
- GtkRequisition requisition, reqwidget;
-
- if (labelStr == NULL) {
- return 0;
- }
-
- b->label = gtk_label_new(wlibConvertInput(labelStr));
- gtk_widget_size_request(b->label, &requisition);
- if (b->widget)
- gtk_widget_size_request(b->widget, &reqwidget);
- else
- reqwidget.height = requisition.height;
- gtk_container_add(GTK_CONTAINER(b->parent->widget), b->label);
- gtk_fixed_move(GTK_FIXED(b->parent->widget), b->label,
- b->realX - requisition.width - 8, b->realY + (reqwidget.height/2 - requisition.height/2));
- gtk_widget_show(b->label);
- return requisition.width + 8;
+ GtkRequisition requisition, reqwidget;
+
+ if (labelStr == NULL) {
+ return 0;
+ }
+
+ b->label = gtk_label_new(wlibConvertInput(labelStr));
+ gtk_widget_size_request(b->label, &requisition);
+ if (b->widget) {
+ gtk_widget_size_request(b->widget, &reqwidget);
+ } else {
+ reqwidget.height = requisition.height;
+ }
+ gtk_container_add(GTK_CONTAINER(b->parent->widget), b->label);
+ gtk_fixed_move(GTK_FIXED(b->parent->widget), b->label,
+ b->realX - requisition.width - 8,
+ b->realY + (reqwidget.height/2 - requisition.height/2));
+ gtk_widget_show(b->label);
+ return requisition.width + 8;
}
/**
@@ -181,44 +184,44 @@ int wlibAddLabel(wControl_p b, const char * labelStr)
*/
void * wlibAlloc(
- wWin_p parent,
- wType_e type,
- wPos_t origX,
- wPos_t origY,
- const char * labelStr,
- int size,
- void * data)
+ wWin_p parent,
+ wType_e type,
+ wWinPix_t origX,
+ wWinPix_t origY,
+ const char * labelStr,
+ int size,
+ void * data)
{
- wControl_p w = (wControl_p) malloc(size);
- char * cp;
- memset(w, 0, size);
+ wControl_p w = (wControl_p) malloc(size);
+ char * cp;
+ memset(w, 0, size);
- if (w == NULL) {
- abort();
- }
+ if (w == NULL) {
+ abort();
+ }
- w->outline = FALSE;
+ w->outline = FALSE;
- w->type = type;
- w->parent = parent;
- w->origX = origX;
- w->origY = origY;
+ w->type = type;
+ w->parent = parent;
+ w->origX = origX;
+ w->origY = origY;
- if (labelStr) {
- cp = (char*) malloc(strlen(labelStr) + 1);
- w->labelStr = cp;
+ if (labelStr) {
+ cp = (char*) malloc(strlen(labelStr) + 1);
+ w->labelStr = cp;
- for (; *labelStr; labelStr++)
- if (*labelStr != '&') {
- *cp++ = *labelStr;
- }
+ for (; *labelStr; labelStr++)
+ if (*labelStr != '&') {
+ *cp++ = *labelStr;
+ }
- *cp = 0;
- }
+ *cp = 0;
+ }
- w->doneProc = NULL;
- w->data = data;
- return w;
+ w->doneProc = NULL;
+ w->data = data;
+ return w;
}
/**
@@ -228,23 +231,22 @@ void * wlibAlloc(
*/
void wlibComputePos(
- wControl_p b)
+ wControl_p b)
{
- wWin_p w = b->parent;
-
- if (b->origX >= 0) {
- b->realX = b->origX;
- }
- else {
- b->realX = w->lastX + (-b->origX) - 1;
- }
-
- if (b->origY >= 0) {
- b->realY = b->origY + BORDERSIZE + ((w->option & F_MENUBAR) ? w->menu_height : 0);
- }
- else {
- b->realY = w->lastY + (-b->origY) - 1;
- }
+ wWin_p w = b->parent;
+
+ if (b->origX >= 0) {
+ b->realX = b->origX;
+ } else {
+ b->realX = w->lastX + (-b->origX) - 1;
+ }
+
+ if (b->origY >= 0) {
+ b->realY = b->origY + BORDERSIZE + ((w->option & F_MENUBAR) ? w->menu_height :
+ 0);
+ } else {
+ b->realY = w->lastY + (-b->origY) - 1;
+ }
}
/**
@@ -254,12 +256,12 @@ void wlibComputePos(
*/
void wlibControlGetSize(
- wControl_p b)
+ wControl_p b)
{
- GtkRequisition requisition;
- gtk_widget_size_request(b->widget, &requisition);
- b->w = requisition.width;
- b->h = requisition.height;
+ GtkRequisition requisition;
+ gtk_widget_size_request(b->widget, &requisition);
+ b->w = requisition.width;
+ b->h = requisition.height;
}
/**
@@ -268,50 +270,49 @@ void wlibControlGetSize(
*/
void wlibAddButton(
- wControl_p b)
+ wControl_p b)
{
- wWin_p win = b->parent;
- wBool_t resize = FALSE;
-
- if (win->first == NULL) {
- win->first = b;
- }
- else {
- win->last->next = b;
- }
-
- win->last = b;
- b->next = NULL;
- b->parent = win;
- win->lastX = b->realX + b->w;
- win->lastY = b->realY + b->h;
-
- if (win->option & F_AUTOSIZE) {
- if (win->lastX > win->realX) {
- win->realX = win->lastX;
-
- if (win->w != (win->realX + win->origX)) {
- resize = TRUE;
- win->w = (win->realX + win->origX);
- }
- }
-
- if (win->lastY > win->realY) {
- win->realY = win->lastY;
-
- if (win->h != (win->realY + win->origY)) {
- resize = TRUE;
- win->h = (win->realY + win->origY);
- }
- }
-
- if (win->shown) {
- if (resize) {
- gtk_widget_set_size_request(win->gtkwin, win->w, win->h);
- gtk_widget_set_size_request(win->widget, win->w, win->h);
- }
- }
- }
+ wWin_p win = b->parent;
+ wBool_t resize = FALSE;
+
+ if (win->first == NULL) {
+ win->first = b;
+ } else {
+ win->last->next = b;
+ }
+
+ win->last = b;
+ b->next = NULL;
+ b->parent = win;
+ win->lastX = b->realX + b->w;
+ win->lastY = b->realY + b->h;
+
+ if (win->option & F_AUTOSIZE) {
+ if (win->lastX > win->realX) {
+ win->realX = win->lastX;
+
+ if (win->w != (win->realX + win->origX)) {
+ resize = TRUE;
+ win->w = (win->realX + win->origX);
+ }
+ }
+
+ if (win->lastY > win->realY) {
+ win->realY = win->lastY;
+
+ if (win->h != (win->realY + win->origY)) {
+ resize = TRUE;
+ win->h = (win->realY + win->origY);
+ }
+ }
+
+ if (win->shown) {
+ if (resize) {
+ gtk_widget_set_size_request(win->gtkwin, win->w, win->h);
+ gtk_widget_set_size_request(win->widget, win->w, win->h);
+ }
+ }
+ }
}
/**
@@ -323,26 +324,26 @@ void wlibAddButton(
*/
wControl_p wlibGetControlFromPos(
- wWin_p win,
- wPos_t x,
- wPos_t y)
+ wWin_p win,
+ wWinPix_t x,
+ wWinPix_t y)
{
- wControl_p b;
- wPos_t xx, yy;
-
- for (b = win->first; b != NULL; b = b->next) {
- if (b->widget && gtk_widget_get_visible(b->widget)) {
- xx = b->realX;
- yy = b->realY;
-
- if (xx <= x && x < xx + b->w &&
- yy <= y && y < yy + b->h) {
- return b;
- }
- }
- }
-
- return NULL;
+ wControl_p b;
+ wWinPix_t xx, yy;
+
+ for (b = win->first; b != NULL; b = b->next) {
+ if (b->widget && gtk_widget_get_visible(b->widget)) {
+ xx = b->realX;
+ yy = b->realY;
+
+ if (xx <= x && x < xx + b->w &&
+ yy <= y && y < yy + b->h) {
+ return b;
+ }
+ }
+ }
+
+ return NULL;
}
@@ -360,7 +361,7 @@ wControl_p wlibGetControlFromPos(
*/
void wBeep(void)
{
- gdk_display_beep(gdk_display_get_default());
+ gdk_display_beep(gdk_display_get_default());
}
/**
@@ -368,13 +369,13 @@ void wBeep(void)
*/
void wFlush(
- void)
+ void)
{
- while (gtk_events_pending()) {
- gtk_main_iteration_do(FALSE);
- }
+ while (gtk_events_pending()) {
+ gtk_main_iteration_do(FALSE);
+ }
- gdk_display_sync(gdk_display_get_default());
+ gdk_display_sync(gdk_display_get_default());
}
/**
@@ -386,6 +387,8 @@ void wWinTop(wWin_p win)
{
}
+extern long dontHideCursor;
+
/**
* Set the cursor in GTK
*
@@ -397,69 +400,71 @@ void wSetCursor(wDraw_p bd, wCursor_t cursor)
static GdkCursor * gdkcursors[wCursorQuestion+1];
GdkCursor * gdkcursor;
//GdkWindow * gdkwindow = gtk_widget_get_window(GTK_WIDGET(win->gtkwin));;
- GdkWindow * gdkwindow = gdk_get_default_root_window();
- GdkDisplay * display = gdk_window_get_display(gdkwindow);
+// GdkWindow * gdkwindow = gdk_get_default_root_window();
+// GdkDisplay * display = gdk_window_get_display(gdkwindow);
+ if ((cursor == wCursorNone) && dontHideCursor) { return; } //Ignore if we dont want to suppress
if (!gdkcursors[cursor]) {
switch(cursor) {
- case wCursorAppStart:
- //gdkcursor = gdk_cursor_new_from_name (display,"progress");
- gdkcursor = gdk_cursor_new(GDK_WATCH);
- break;
- case wCursorHand:
- //gdkcursor = gdk_cursor_new_from_name (display,"pointer");
- gdkcursor = gdk_cursor_new(GDK_HAND2);
- break;
- case wCursorNo:
- //gdkcursor = gdk_cursor_new_from_name (display,"not-allowed");
- gdkcursor = gdk_cursor_new(GDK_X_CURSOR);
- break;
- case wCursorSizeAll:
- //gdkcursor = gdk_cursor_new_from_name (display,"move");
- gdkcursor = gdk_cursor_new(GDK_FLEUR);
- break;
- case wCursorSizeNESW:
- //gdkcursor = gdk_cursor_new_from_name (display,"nesw-resize");
- gdkcursor = gdk_cursor_new(GDK_BOTTOM_LEFT_CORNER);
- break;
- case wCursorSizeNS:
- //gdkcursor = gdk_cursor_new_from_name (display,"ns-resize");
- gdkcursor = gdk_cursor_new(GDK_DOUBLE_ARROW);
- break;
- case wCursorSizeNWSE:
- //gdkcursor = gdk_cursor_new_from_name (display,"nwse-resize");
- gdkcursor = gdk_cursor_new(GDK_BOTTOM_RIGHT_CORNER);
- break;
- case wCursorSizeWE:
- //gdkcursor = gdk_cursor_new_from_name (display,"ew-resize");
- gdkcursor = gdk_cursor_new(GDK_SB_H_DOUBLE_ARROW);
- break;
- case wCursorWait:
- //gdkcursor = gdk_cursor_new_from_name (display,"wait");
- gdkcursor = gdk_cursor_new(GDK_WATCH);
- break;
- case wCursorIBeam:
- //gdkcursor = gdk_cursor_new_from_name (display,"text");
- gdkcursor = gdk_cursor_new(GDK_XTERM);
- break;
- case wCursorCross:
- //gdkcursor = gdk_cursor_new_from_name (display,"crosshair");
- gdkcursor = gdk_cursor_new(GDK_TCROSS);
- break;
- case wCursorQuestion:
- //gdkcursor = gdk_cursor_new_from_name (display,"help");
- gdkcursor = gdk_cursor_new(GDK_QUESTION_ARROW);
- break;
- case wCursorNone:
- gdkcursor = gdk_cursor_new(GDK_BLANK_CURSOR);
- case wCursorNormal:
- default:
- //gdkcursor = gdk_cursor_new_from_name (display,"default");
- gdkcursor = gdk_cursor_new(GDK_LEFT_PTR);
- break;
+ case wCursorAppStart:
+ //gdkcursor = gdk_cursor_new_from_name (display,"progress");
+ gdkcursor = gdk_cursor_new(GDK_WATCH);
+ break;
+ case wCursorHand:
+ //gdkcursor = gdk_cursor_new_from_name (display,"pointer");
+ gdkcursor = gdk_cursor_new(GDK_HAND2);
+ break;
+ case wCursorNo:
+ //gdkcursor = gdk_cursor_new_from_name (display,"not-allowed");
+ gdkcursor = gdk_cursor_new(GDK_X_CURSOR);
+ break;
+ case wCursorSizeAll:
+ //gdkcursor = gdk_cursor_new_from_name (display,"move");
+ gdkcursor = gdk_cursor_new(GDK_FLEUR);
+ break;
+ case wCursorSizeNESW:
+ //gdkcursor = gdk_cursor_new_from_name (display,"nesw-resize");
+ gdkcursor = gdk_cursor_new(GDK_BOTTOM_LEFT_CORNER);
+ break;
+ case wCursorSizeNS:
+ //gdkcursor = gdk_cursor_new_from_name (display,"ns-resize");
+ gdkcursor = gdk_cursor_new(GDK_DOUBLE_ARROW);
+ break;
+ case wCursorSizeNWSE:
+ //gdkcursor = gdk_cursor_new_from_name (display,"nwse-resize");
+ gdkcursor = gdk_cursor_new(GDK_BOTTOM_RIGHT_CORNER);
+ break;
+ case wCursorSizeWE:
+ //gdkcursor = gdk_cursor_new_from_name (display,"ew-resize");
+ gdkcursor = gdk_cursor_new(GDK_SB_H_DOUBLE_ARROW);
+ break;
+ case wCursorWait:
+ //gdkcursor = gdk_cursor_new_from_name (display,"wait");
+ gdkcursor = gdk_cursor_new(GDK_WATCH);
+ break;
+ case wCursorIBeam:
+ //gdkcursor = gdk_cursor_new_from_name (display,"text");
+ gdkcursor = gdk_cursor_new(GDK_XTERM);
+ break;
+ case wCursorCross:
+ //gdkcursor = gdk_cursor_new_from_name (display,"crosshair");
+ gdkcursor = gdk_cursor_new(GDK_TCROSS);
+ break;
+ case wCursorQuestion:
+ //gdkcursor = gdk_cursor_new_from_name (display,"help");
+ gdkcursor = gdk_cursor_new(GDK_QUESTION_ARROW);
+ break;
+ case wCursorNone:
+ gdkcursor = gdk_cursor_new(GDK_BLANK_CURSOR);
+ break;
+ case wCursorNormal:
+ default:
+ //gdkcursor = gdk_cursor_new_from_name (display,"default");
+ gdkcursor = gdk_cursor_new(GDK_LEFT_PTR);
+ break;
}
gdkcursors[cursor] = gdkcursor;
- } else gdkcursor = gdkcursors[cursor];
+ } else { gdkcursor = gdkcursors[cursor]; }
gdk_window_set_cursor ( gtk_widget_get_window(bd->widget), gdkcursor);
}
@@ -471,7 +476,7 @@ void wSetCursor(wDraw_p bd, wCursor_t cursor)
const char * wMemStats(void)
{
- return "No stats available";
+ return "No stats available";
}
/**
@@ -481,14 +486,14 @@ const char * wMemStats(void)
* \param h IN pointer to height
*/
-void wGetDisplaySize(wPos_t * w, wPos_t * h)
+void wGetDisplaySize(wWinPix_t * w, wWinPix_t * h)
{
GdkScreen *screen = gdk_screen_get_default();
guint monitor = gdk_screen_get_primary_monitor(screen);
GdkRectangle screen_geometry = { 0, 0, 0, 0 };
-
+
gdk_screen_get_monitor_geometry( screen, monitor, &screen_geometry );
-
+
*w = screen_geometry.width;
*h = screen_geometry.height;
}
@@ -505,42 +510,41 @@ static dynArr_t conversionBuffer_da;
char * wlibConvertInput(const char * inString)
{
- const char * cp;
- char * cq;
- int extCharCnt, inCharCnt;
-
- /* Already UTF-8 encoded? */
- if (g_utf8_validate(inString, -1, NULL))
- /* Yes, do not double-convert */ {
- return (char*) inString;
- }
-
- for (cp = inString, extCharCnt = 0; *cp; cp++) {
- if (((*cp)&0x80) != '\0') {
- extCharCnt++;
- }
- }
-
- inCharCnt = cp - inString;
-
- if (extCharCnt == '\0') {
- return (char*) inString;
- }
-
- DYNARR_SET(char, conversionBuffer_da, inCharCnt + extCharCnt + 1);
-
- for (cp = inString, cq = (char*) conversionBuffer_da.ptr; *cp; cp++) {
- if (((*cp)&0x80) != 0) {
- *cq++ = 0xC0 + (((*cp)&0xC0) >> 6);
- *cq++ = 0x80 + ((*cp)&0x3F);
- }
- else {
- *cq++ = *cp;
- }
- }
-
- *cq = 0;
- return (char*) conversionBuffer_da.ptr;
+ const char * cp;
+ char * cq;
+ int extCharCnt, inCharCnt;
+
+ /* Already UTF-8 encoded? */
+ if (g_utf8_validate(inString, -1, NULL))
+ /* Yes, do not double-convert */ {
+ return (char*) inString;
+ }
+
+ for (cp = inString, extCharCnt = 0; *cp; cp++) {
+ if (((*cp)&0x80) != '\0') {
+ extCharCnt++;
+ }
+ }
+
+ inCharCnt = cp - inString;
+
+ if (extCharCnt == '\0') {
+ return (char*) inString;
+ }
+
+ DYNARR_SET(char, conversionBuffer_da, inCharCnt + extCharCnt + 1);
+
+ for (cp = inString, cq = (char*) conversionBuffer_da.ptr; *cp; cp++) {
+ if (((*cp)&0x80) != 0) {
+ *cq++ = 0xC0 + (((*cp)&0xC0) >> 6);
+ *cq++ = 0x80 + ((*cp)&0x3F);
+ } else {
+ *cq++ = *cp;
+ }
+ }
+
+ *cq = 0;
+ return (char*) conversionBuffer_da.ptr;
}
/**
@@ -552,36 +556,35 @@ char * wlibConvertInput(const char * inString)
char * wlibConvertOutput(const char * inString)
{
- const char * cp;
- char * cq;
- int extCharCnt, inCharCnt;
-
- for (cp = inString, extCharCnt = 0; *cp; cp++) {
- if (((*cp)&0xC0) == 0x80) {
- extCharCnt++;
- }
- }
-
- inCharCnt = cp - inString;
-
- if (extCharCnt == '\0') {
- return (char*) inString;
- }
-
- DYNARR_SET(char, conversionBuffer_da, inCharCnt + 1);
-
- for (cp = inString, cq = (char*) conversionBuffer_da.ptr; *cp; cp++) {
- if (((*cp)&0x80) != 0) {
- *cq++ = 0xC0 + (((*cp)&0xC0) >> 6);
- *cq++ = 0x80 + ((*cp)&0x3F);
- }
- else {
- *cq++ = *cp;
- }
- }
-
- *cq = '\0';
- return (char*) conversionBuffer_da.ptr;
+ const char * cp;
+ char * cq;
+ int extCharCnt, inCharCnt;
+
+ for (cp = inString, extCharCnt = 0; *cp; cp++) {
+ if (((*cp)&0xC0) == 0x80) {
+ extCharCnt++;
+ }
+ }
+
+ inCharCnt = cp - inString;
+
+ if (extCharCnt == '\0') {
+ return (char*) inString;
+ }
+
+ DYNARR_SET(char, conversionBuffer_da, inCharCnt + 1);
+
+ for (cp = inString, cq = (char*) conversionBuffer_da.ptr; *cp; cp++) {
+ if (((*cp)&0x80) != 0) {
+ *cq++ = 0xC0 + (((*cp)&0xC0) >> 6);
+ *cq++ = 0x80 + ((*cp)&0x3F);
+ } else {
+ *cq++ = *cp;
+ }
+ }
+
+ *cq = '\0';
+ return (char*) conversionBuffer_da.ptr;
}
/*-----------------------------------------------------------------*/
@@ -591,32 +594,32 @@ static dynArr_t accelData_da;
#define accelData(N) DYNARR_N( accelData_t, accelData_da, N )
static guint accelKeyMap[] = {
- 0, /* wAccelKey_None, */
- GDK_KEY_Delete, /* wAccelKey_Del, */
- GDK_KEY_Insert, /* wAccelKey_Ins, */
- GDK_KEY_Home, /* wAccelKey_Home, */
- GDK_KEY_End, /* wAccelKey_End, */
- GDK_KEY_Page_Up, /* wAccelKey_Pgup, */
- GDK_KEY_Page_Down, /* wAccelKey_Pgdn, */
- GDK_KEY_Up, /* wAccelKey_Up, */
- GDK_KEY_Down, /* wAccelKey_Down, */
- GDK_KEY_Right, /* wAccelKey_Right, */
- GDK_KEY_Left, /* wAccelKey_Left, */
- GDK_KEY_BackSpace, /* wAccelKey_Back, */
- GDK_KEY_F1, /* wAccelKey_F1, */
- GDK_KEY_F2, /* wAccelKey_F2, */
- GDK_KEY_F3, /* wAccelKey_F3, */
- GDK_KEY_F4, /* wAccelKey_F4, */
- GDK_KEY_F5, /* wAccelKey_F5, */
- GDK_KEY_F6, /* wAccelKey_F6, */
- GDK_KEY_F7, /* wAccelKey_F7, */
- GDK_KEY_F8, /* wAccelKey_F8, */
- GDK_KEY_F9, /* wAccelKey_F9, */
- GDK_KEY_F10, /* wAccelKey_F10, */
- GDK_KEY_F11, /* wAccelKey_F11, */
- GDK_KEY_F12, /* wAccelKey_F12, */
- GDK_KEY_KP_Add, /* wAccelKey_Numpad_Add */
- GDK_KEY_KP_Subtract /* wAccelKey_Numpad_Subtract */
+ 0, /* wAccelKey_None, */
+ GDK_KEY_Delete, /* wAccelKey_Del, */
+ GDK_KEY_Insert, /* wAccelKey_Ins, */
+ GDK_KEY_Home, /* wAccelKey_Home, */
+ GDK_KEY_End, /* wAccelKey_End, */
+ GDK_KEY_Page_Up, /* wAccelKey_Pgup, */
+ GDK_KEY_Page_Down, /* wAccelKey_Pgdn, */
+ GDK_KEY_Up, /* wAccelKey_Up, */
+ GDK_KEY_Down, /* wAccelKey_Down, */
+ GDK_KEY_Right, /* wAccelKey_Right, */
+ GDK_KEY_Left, /* wAccelKey_Left, */
+ GDK_KEY_BackSpace, /* wAccelKey_Back, */
+ GDK_KEY_F1, /* wAccelKey_F1, */
+ GDK_KEY_F2, /* wAccelKey_F2, */
+ GDK_KEY_F3, /* wAccelKey_F3, */
+ GDK_KEY_F4, /* wAccelKey_F4, */
+ GDK_KEY_F5, /* wAccelKey_F5, */
+ GDK_KEY_F6, /* wAccelKey_F6, */
+ GDK_KEY_F7, /* wAccelKey_F7, */
+ GDK_KEY_F8, /* wAccelKey_F8, */
+ GDK_KEY_F9, /* wAccelKey_F9, */
+ GDK_KEY_F10, /* wAccelKey_F10, */
+ GDK_KEY_F11, /* wAccelKey_F11, */
+ GDK_KEY_F12, /* wAccelKey_F12, */
+ GDK_KEY_KP_Add, /* wAccelKey_Numpad_Add */
+ GDK_KEY_KP_Subtract /* wAccelKey_Numpad_Subtract */
};
/**
@@ -629,24 +632,24 @@ static guint accelKeyMap[] = {
*/
void wAttachAccelKey(
- wAccelKey_e key,
- int modifier,
- wAccelKeyCallBack_p action,
- void * data)
+ wAccelKey_e key,
+ int modifier,
+ wAccelKeyCallBack_p action,
+ void * data)
{
- accelData_t * ad;
+ accelData_t * ad;
// if (key < 1 || key > wAccelKey_F12) {
// fprintf(stderr, "wAttachAccelKey(%d) out of range\n", (int) key);
// return;
// }
- DYNARR_APPEND(accelData_t, accelData_da, 10);
- ad = &accelData(accelData_da.cnt - 1);
- ad->key = key;
- ad->modifier = modifier;
- ad->action = action;
- ad->data = data;
+ DYNARR_APPEND(accelData_t, accelData_da, 10);
+ ad = &accelData(accelData_da.cnt - 1);
+ ad->key = key;
+ ad->modifier = modifier;
+ ad->action = action;
+ ad->data = data;
}
/**
@@ -657,30 +660,30 @@ void wAttachAccelKey(
*/
struct accelData_t * wlibFindAccelKey(
- GdkEventKey * event)
+ GdkEventKey * event)
{
- accelData_t * ad;
- int modifier = 0;
+ accelData_t * ad;
+ int modifier = 0;
- if ((event->state & GDK_SHIFT_MASK)) {
- modifier |= WKEY_SHIFT;
- }
+ if ((event->state & GDK_SHIFT_MASK)) {
+ modifier |= WKEY_SHIFT;
+ }
- if ((event->state & GDK_CONTROL_MASK)) {
- modifier |= WKEY_CTRL;
- }
+ if ((event->state & GDK_CONTROL_MASK)) {
+ modifier |= WKEY_CTRL;
+ }
- if ((event->state & GDK_MOD1_MASK)) {
- modifier |= WKEY_ALT;
- }
+ if ((event->state & GDK_MOD1_MASK)) {
+ modifier |= WKEY_ALT;
+ }
- for (ad = &accelData(0); ad<&accelData(accelData_da.cnt); ad++)
- if (event->keyval == accelKeyMap[ad->key] &&
- modifier == ad->modifier) {
- return ad;
- }
+ for (ad = &accelData(0); ad<&accelData(accelData_da.cnt); ad++)
+ if (event->keyval == accelKeyMap[ad->key] &&
+ modifier == ad->modifier) {
+ return ad;
+ }
- return NULL;
+ return NULL;
}
/**
@@ -691,16 +694,16 @@ struct accelData_t * wlibFindAccelKey(
*/
wBool_t wlibHandleAccelKey(
- GdkEventKey *event)
+ GdkEventKey *event)
{
- accelData_t * ad = wlibFindAccelKey(event);
+ accelData_t * ad = wlibFindAccelKey(event);
- if (ad) {
- ad->action(ad->key, ad->data);
- return TRUE;
- }
+ if (ad) {
+ ad->action(ad->key, ad->data);
+ return TRUE;
+ }
- return FALSE;
+ return FALSE;
}
/**
@@ -717,13 +720,13 @@ wBool_t wlibHandleAccelKey(
void wControlLinkedSet(wControl_p b1, wControl_p b2)
{
- b2->synonym = b1->synonym;
+ b2->synonym = b1->synonym;
- if (b2->synonym == NULL) {
- b2->synonym = b1;
- }
+ if (b2->synonym == NULL) {
+ b2->synonym = b1;
+ }
- b1->synonym = b2;
+ b1->synonym = b2;
}
/**
@@ -736,26 +739,24 @@ void wControlLinkedSet(wControl_p b1, wControl_p b2)
void wControlLinkedActive(wControl_p b, int active)
{
- wControl_p savePtr = b;
+ wControl_p savePtr = b;
- if (savePtr->type == B_MENUITEM) {
- wMenuPushEnable((wMenuPush_p) savePtr, active);
- }
- else {
- wControlActive(savePtr, active);
- }
+ if (savePtr->type == B_MENUITEM) {
+ wMenuPushEnable((wMenuPush_p) savePtr, active);
+ } else {
+ wControlActive(savePtr, active);
+ }
- savePtr = savePtr->synonym;
+ savePtr = savePtr->synonym;
- while (savePtr && savePtr != b) {
+ while (savePtr && savePtr != b) {
- if (savePtr->type == B_MENUITEM) {
- wMenuPushEnable((wMenuPush_p) savePtr, active);
- }
- else {
- wControlActive(savePtr, active);
- }
+ if (savePtr->type == B_MENUITEM) {
+ wMenuPushEnable((wMenuPush_p) savePtr, active);
+ } else {
+ wControlActive(savePtr, active);
+ }
- savePtr = savePtr->synonym;
- }
+ savePtr = savePtr->synonym;
+ }
}
diff --git a/app/wlib/gtklib/window.c b/app/wlib/gtklib/window.c
index 1468c89..b8a3cdf 100644
--- a/app/wlib/gtklib/window.c
+++ b/app/wlib/gtklib/window.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -40,11 +40,8 @@
wWin_p gtkMainW;
-#define MIN_WIN_WIDTH 150
-#define MIN_WIN_HEIGHT 150
-
-#define MIN_WIN_WIDTH_MAIN 400
-#define MIN_WIN_HEIGHT_MAIN 400
+#define MIN_WIN_WIDTH 50
+#define MIN_WIN_HEIGHT 50
#define SECTIONWINDOWSIZE "gtklib window size"
#define SECTIONWINDOWPOS "gtklib window pos"
@@ -55,6 +52,9 @@ static wControl_p firstWin = NULL, lastWin;
static int keyState;
static wBool_t gtkBlockEnabled = TRUE;
static wBool_t maximize_at_next_show = FALSE;
+
+#include "../../bin/bitmaps/xtc.xpm"
+static GdkPixbuf *windowIconPixbuf = NULL;
/*
*****************************************************************************
@@ -70,7 +70,8 @@ static wBool_t maximize_at_next_show = FALSE;
*
*/
-static GdkRectangle getMonitorDimensions(GtkWidget * widget) {
+static GdkRectangle getMonitorDimensions(GtkWidget * widget)
+{
GdkRectangle monitor_dimensions;
@@ -81,9 +82,10 @@ static GdkRectangle getMonitorDimensions(GtkWidget * widget) {
GtkWidget * toplevel = gtk_widget_get_toplevel(widget);
if (gtk_widget_is_toplevel(GTK_WIDGET(toplevel)) &&
- gtk_widget_get_parent_window(GTK_WIDGET(toplevel))) {
+ gtk_widget_get_parent_window(GTK_WIDGET(toplevel))) {
- GdkWindow * window = GDK_WINDOW(gtk_widget_get_parent_window(GTK_WIDGET(toplevel)));
+ GdkWindow * window = GDK_WINDOW(gtk_widget_get_parent_window(GTK_WIDGET(
+ toplevel)));
screen = gdk_window_get_screen(GDK_WINDOW(window));
@@ -113,46 +115,39 @@ static GdkRectangle getMonitorDimensions(GtkWidget * widget) {
static void getWinSize(wWin_p win, const char * nameStr)
{
- int w=50, h=50;
- const char *cp;
- char *cp1, *cp2;
-
-
- /*
- * Clamp window to be no bigger than one monitor size (to start - the user can always maximize)
- */
-
- GdkRectangle monitor_dimensions = getMonitorDimensions(GTK_WIDGET(win->gtkwin));
-
- wPos_t maxDisplayWidth = monitor_dimensions.width-10;
- wPos_t maxDisplayHeight = monitor_dimensions.height-50;
-
-
-
- if ((win->option&F_RECALLSIZE) &&
- (win->option&F_RECALLPOS) &&
- (cp = wPrefGetString(SECTIONWINDOWSIZE, nameStr)) &&
- (w = strtod(cp, &cp1), cp != cp1) &&
- (h = strtod(cp1, &cp2), cp1 != cp2)) {
- win->option &= ~F_AUTOSIZE;
-
- if (w < 50) {
- w = 50;
- }
-
- if (h < 50) {
- h = 50;
- }
- }
-
- if (w > maxDisplayWidth) w = maxDisplayWidth;
- if (h > maxDisplayHeight) h = maxDisplayHeight;
-
- if (w<MIN_WIDTH) w = MIN_WIDTH;
- if (h<MIN_HEIGHT) h = MIN_HEIGHT;
-
- win->w = win->origX = w;
- win->h = win->origY = h;
+ /*
+ * original w/h values in .origX/Y
+ */
+ int w = win->w = win->origX;
+ int h = win->h = win->origY;
+
+ /*
+ * Take values from Prefs if possible
+ */
+ const char *cp;
+ char *cp1, *cp2;
+ if ((win->option&F_RESIZE) &&
+ (win->option&F_RECALLSIZE) &&
+ (cp = wPrefGetString(SECTIONWINDOWSIZE, nameStr)) &&
+ (w = strtod(cp, &cp1), cp != cp1) &&
+ (h = strtod(cp1, &cp2), cp1 != cp2)) {
+ win->option &= ~F_AUTOSIZE;
+
+ /*
+ * Clamp window to be no bigger than one monitor size (to start - the user can always maximize)
+ */
+ GdkRectangle monitor_dimensions = getMonitorDimensions(GTK_WIDGET(win->gtkwin));
+ wWinPix_t maxDisplayWidth = monitor_dimensions.width-10;
+ wWinPix_t maxDisplayHeight = monitor_dimensions.height-50;
+ if (w > maxDisplayWidth) { w = maxDisplayWidth; }
+ if (h > maxDisplayHeight) { h = maxDisplayHeight; }
+
+ if (w<MIN_WIDTH) { w = MIN_WIDTH; }
+ if (h<MIN_HEIGHT) { h = MIN_HEIGHT; }
+
+ win->w = win->origX = w;
+ win->h = win->origY = h;
+ }
}
@@ -166,14 +161,14 @@ static void getWinSize(wWin_p win, const char * nameStr)
static void saveSize(wWin_p win)
{
- if ((win->option&F_RECALLSIZE) &&
- gtk_widget_get_visible(GTK_WIDGET(win->gtkwin))) {
- char pos_s[20];
+ if ((win->option&F_RECALLSIZE) &&
+ gtk_widget_get_visible(GTK_WIDGET(win->gtkwin))) {
+ char pos_s[32];
- sprintf(pos_s, "%d %d", win->w,
- win->h-(BORDERSIZE + ((win->option&F_MENUBAR)?MENUH:0)));
- wPrefSetString(SECTIONWINDOWSIZE, win->nameStr, pos_s);
- }
+ sprintf(pos_s, "%ld %ld", win->w,
+ (win->h-(BORDERSIZE + ((win->option&F_MENUBAR)?MENUH:0))));
+ wPrefSetString(SECTIONWINDOWSIZE, win->nameStr, pos_s);
+ }
}
/**
@@ -185,47 +180,46 @@ static void saveSize(wWin_p win)
static void getPos(wWin_p win)
{
- char *cp1, *cp2;
- GdkRectangle monitor_dimensions = getMonitorDimensions(GTK_WIDGET(win->gtkwin));
+ char *cp1, *cp2;
+ GdkRectangle monitor_dimensions = getMonitorDimensions(GTK_WIDGET(win->gtkwin));
- if ((win->option&F_RECALLPOS) && (!win->shown)) {
- const char *cp;
+ if ((win->option&F_RECALLPOS) && (!win->shown)) {
+ const char *cp;
- if ((cp = wPrefGetString(SECTIONWINDOWPOS, win->nameStr))) {
- int x, y;
+ if ((cp = wPrefGetString(SECTIONWINDOWPOS, win->nameStr))) {
+ int x, y;
- x = strtod(cp, &cp1);
+ x = strtod(cp, &cp1);
- if (cp == cp1) {
- return;
- }
+ if (cp == cp1) {
+ return;
+ }
- y = strtod(cp1, &cp2);
+ y = strtod(cp1, &cp2);
- if (cp2 == cp1) {
- return;
- }
+ if (cp2 == cp1) {
+ return;
+ }
- if (y > monitor_dimensions.height+monitor_dimensions.y-win->h) {
- y = monitor_dimensions.height+monitor_dimensions.y-win->h;
- }
+ if (y > monitor_dimensions.height+monitor_dimensions.y-win->h) {
+ y = monitor_dimensions.height+monitor_dimensions.y-win->h;
+ }
- if (x > monitor_dimensions.width+monitor_dimensions.x-win->w) {
- x = monitor_dimensions.width+monitor_dimensions.x-win->w;
- }
+ if (x > monitor_dimensions.width+monitor_dimensions.x-win->w) {
+ x = monitor_dimensions.width+monitor_dimensions.x-win->w;
+ }
- if (x <= 0) {
- x = 1;
- }
+ if (x <= 0) {
+ x = 1;
+ }
- if (y <= 0) {
- y = 1;
- }
+ if (y <= 0) {
+ y = 1;
+ }
- gtk_window_move(GTK_WINDOW(win->gtkwin), x, y);
- //gtk_window_resize(GTK_WINDOW(win->gtkwin), win->w, win->h);
- }
- }
+ gtk_window_move(GTK_WINDOW(win->gtkwin), x, y);
+ }
+ }
}
/**
@@ -237,17 +231,17 @@ static void getPos(wWin_p win)
static void savePos(wWin_p win)
{
- int x, y;
+ int x, y;
- if ((win->option&F_RECALLPOS)) {
- char pos_s[20];
+ if ((win->option&F_RECALLPOS)) {
+ char pos_s[32];
- gdk_window_get_position(gtk_widget_get_window(GTK_WIDGET(win->gtkwin)), &x, &y);
- x -= 5;
- y -= 25;
- sprintf(pos_s, "%d %d", x, y);
- wPrefSetString(SECTIONWINDOWPOS, win->nameStr, pos_s);
- }
+ gdk_window_get_position(gtk_widget_get_window(GTK_WIDGET(win->gtkwin)), &x, &y);
+ x -= 5;
+ y -= 25;
+ sprintf(pos_s, "%d %d", x, y);
+ wPrefSetString(SECTIONWINDOWPOS, win->nameStr, pos_s);
+ }
}
/**
@@ -259,28 +253,17 @@ static void savePos(wWin_p win)
*/
void wWinGetSize(
- wWin_p win, /* Window */
- wPos_t * width, /* Returned window width */
- wPos_t * height) /* Returned window height */
+ wWin_p win, /* Window */
+ wWinPix_t * width, /* Returned window width */
+ wWinPix_t * height) /* Returned window height */
{
- GtkRequisition requisition;
- wPos_t w, h;
- gtk_widget_size_request(win->gtkwin, &requisition);
- w = win->w;
- h = win->h;
-
- if (win->option&F_AUTOSIZE) {
- if (win->realX > w) {
- w = win->realX;
- }
-
- if (win->realY > h) {
- h = win->realY;
- }
- }
-
- *width = w;
- *height = h - BORDERSIZE - ((win->option&F_MENUBAR)?win->menu_height:0);
+ GtkRequisition requisition;
+ wWinPix_t w, h;
+ gtk_widget_size_request(win->gtkwin, &requisition);
+ w = win->w;
+ h = win->h;
+ *width = w;
+ *height = h - BORDERSIZE - ((win->option&F_MENUBAR)?win->menu_height:0);
}
/**
@@ -292,24 +275,23 @@ void wWinGetSize(
*/
void wWinSetSize(
- wWin_p win, /* Window */
- wPos_t width, /* Window width */
- wPos_t height) /* Window height */
+ wWin_p win, /* Window */
+ wWinPix_t width, /* Window width */
+ wWinPix_t height) /* Window height */
{
- win->busy = TRUE;
- win->w = width;
- win->h = height + BORDERSIZE + ((win->option&F_MENUBAR)?MENUH:0);
- if (win->option&F_RESIZE) {
- gtk_window_resize(GTK_WINDOW(win->gtkwin), win->w, win->h);
- gtk_widget_set_size_request(win->widget, win->w-10, win->h-10);
- }
- else {
- gtk_widget_set_size_request(win->gtkwin, win->w, win->h);
- gtk_widget_set_size_request(win->widget, win->w, win->h);
- }
-
-
- win->busy = FALSE;
+ win->busy = TRUE;
+ win->w = width;
+ win->h = height + BORDERSIZE + ((win->option&F_MENUBAR)?MENUH:0);
+ if (win->option&F_RESIZE) {
+ gtk_window_resize(GTK_WINDOW(win->gtkwin), win->w, win->h);
+ gtk_widget_set_size_request(win->widget, win->w-10, win->h-10);
+ } else {
+ gtk_widget_set_size_request(win->gtkwin, win->w, win->h);
+ gtk_widget_set_size_request(win->widget, win->w, win->h);
+ }
+
+
+ win->busy = FALSE;
}
/**
@@ -322,93 +304,93 @@ void wWinSetSize(
*/
void wWinShow(
- wWin_p win, /* Window */
- wBool_t show) /* Command */
+ wWin_p win, /* Window */
+ wBool_t show) /* Command */
{
- //GtkRequisition min_req, pref_req;
+ //GtkRequisition min_req, pref_req;
- if (debugWindow >= 2) {
- printf("Set Show %s\n", win->labelStr?win->labelStr:"No label");
- }
+ if (debugWindow >= 2) {
+ printf("Set Show %s\n", win->labelStr?win->labelStr:"No label");
+ }
- if (win->widget == 0) {
- abort();
- }
+ if (win->widget == 0) {
+ abort();
+ }
- int width, height;
+ int width, height;
- if (show) {
- keyState = 0;
- getPos(win);
+ if (show) {
+ keyState = 0;
+ getPos(win);
- if (!win->shown) {
+ if (!win->shown) {
gtk_widget_show(win->gtkwin);
gtk_widget_show(win->widget);
}
- if (win->option & F_AUTOSIZE) {
- GtkAllocation allocation;
- GtkRequisition requistion;
- gtk_widget_size_request(win->widget,&requistion);
+ if (win->option & F_AUTOSIZE) {
+ GtkAllocation allocation;
+ GtkRequisition requistion;
+ gtk_widget_size_request(win->widget,&requistion);
- width = win->w;
- height = win->h;
+ width = win->w;
+ height = win->h;
- if (requistion.width != width || requistion.height != height ) {
+ if (requistion.width != width || requistion.height != height ) {
width = requistion.width;
height = requistion.height;
- win->w = width;
- win->h = height;
+ win->w = width;
+ win->h = height;
- gtk_window_set_resizable(GTK_WINDOW(win->gtkwin),TRUE);
+ gtk_window_set_resizable(GTK_WINDOW(win->gtkwin),TRUE);
- if (win->option&F_MENUBAR) {
- gtk_widget_set_size_request(win->menubar, win->w-20, MENUH);
+ if (win->option&F_MENUBAR) {
+ gtk_widget_set_size_request(win->menubar, win->w-20, MENUH);
- gtk_widget_get_allocation(win->menubar, &allocation);
- win->menu_height = allocation.height;
- }
- }
- gtk_window_resize(GTK_WINDOW(win->gtkwin), width+10, height+10);
- }
+ gtk_widget_get_allocation(win->menubar, &allocation);
+ win->menu_height = allocation.height;
+ }
+ }
+ gtk_window_resize(GTK_WINDOW(win->gtkwin), width+10, height+10);
+ }
- gtk_window_present(GTK_WINDOW(win->gtkwin));
+ gtk_window_present(GTK_WINDOW(win->gtkwin));
- gdk_window_raise(gtk_widget_get_window(win->gtkwin));
+ gdk_window_raise(gtk_widget_get_window(win->gtkwin));
- if (win->shown && win->modalLevel > 0) {
- gtk_widget_set_sensitive(GTK_WIDGET(win->gtkwin), TRUE);
- }
+ if (win->shown && win->modalLevel > 0) {
+ gtk_widget_set_sensitive(GTK_WIDGET(win->gtkwin), TRUE);
+ }
- win->shown = show;
- win->modalLevel = 0;
+ win->shown = show;
+ win->modalLevel = 0;
- if ((!gtkBlockEnabled) || (win->option & F_BLOCK) == 0) {
- wFlush();
- } else {
- wlibDoModal(win, TRUE);
- }
- if (maximize_at_next_show) {
- gtk_window_maximize(GTK_WINDOW(win->gtkwin));
- maximize_at_next_show = FALSE;
- }
- } else {
- wFlush();
- saveSize(win);
- savePos(win);
- win->shown = show;
+ if ((!gtkBlockEnabled) || (win->option & F_BLOCK) == 0) {
+ wFlush();
+ } else {
+ wlibDoModal(win, TRUE);
+ }
+ if (maximize_at_next_show) {
+ gtk_window_maximize(GTK_WINDOW(win->gtkwin));
+ maximize_at_next_show = FALSE;
+ }
+ } else {
+ wFlush();
+ saveSize(win);
+ savePos(win);
+ win->shown = show;
- if (gtkBlockEnabled && (win->option & F_BLOCK) != 0) {
- wlibDoModal(win, FALSE);
- }
+ if (gtkBlockEnabled && (win->option & F_BLOCK) != 0) {
+ wlibDoModal(win, FALSE);
+ }
- gtk_widget_hide(win->gtkwin);
- gtk_widget_hide(win->widget);
- }
+ gtk_widget_hide(win->gtkwin);
+ gtk_widget_hide(win->widget);
+ }
}
/**
@@ -418,9 +400,9 @@ void wWinShow(
*/
void wWinBlockEnable(
- wBool_t enabled)
+ wBool_t enabled)
{
- gtkBlockEnabled = enabled;
+ gtkBlockEnabled = enabled;
}
/**
@@ -431,9 +413,9 @@ void wWinBlockEnable(
*/
wBool_t wWinIsVisible(
- wWin_p win)
+ wWin_p win)
{
- return win->shown;
+ return win->shown;
}
/**
@@ -445,7 +427,7 @@ wBool_t wWinIsVisible(
wBool_t wWinIsMaximized(wWin_p win)
{
- return win->maximize_initially;
+ return win->maximize_initially;
}
/**
@@ -456,10 +438,10 @@ wBool_t wWinIsMaximized(wWin_p win)
*/
void wWinSetTitle(
- wWin_p win, /* Window */
- const char * title) /* New title */
+ wWin_p win, /* Window */
+ const char * title) /* New title */
{
- gtk_window_set_title(GTK_WINDOW(win->gtkwin), title);
+ gtk_window_set_title(GTK_WINDOW(win->gtkwin), title);
}
/**
@@ -470,28 +452,28 @@ void wWinSetTitle(
*/
void wWinSetBusy(
- wWin_p win, /* Window */
- wBool_t busy) /* Command */
+ wWin_p win, /* Window */
+ wBool_t busy) /* Command */
{
- GdkCursor * cursor;
+ GdkCursor * cursor;
- if (win->gtkwin == 0) {
- abort();
- }
+ if (win->gtkwin == 0) {
+ abort();
+ }
- if (busy) {
- cursor = gdk_cursor_new(GDK_WATCH);
- } else {
- cursor = NULL;
- }
+ if (busy) {
+ cursor = gdk_cursor_new(GDK_WATCH);
+ } else {
+ cursor = NULL;
+ }
- gdk_window_set_cursor(gtk_widget_get_window(win->gtkwin), cursor);
+ gdk_window_set_cursor(gtk_widget_get_window(win->gtkwin), cursor);
- if (cursor) {
- gdk_cursor_unref(cursor);
- }
+ if (cursor) {
+ gdk_cursor_unref(cursor);
+ }
- gtk_widget_set_sensitive(GTK_WIDGET(win->gtkwin), busy==0);
+ gtk_widget_set_sensitive(GTK_WIDGET(win->gtkwin), busy==0);
}
/**
@@ -507,42 +489,42 @@ void wWinSetBusy(
*/
void wlibDoModal(
- wWin_p win0,
- wBool_t modal)
+ wWin_p win0,
+ wBool_t modal)
{
- wWin_p win;
-
- for (win=(wWin_p)firstWin; win; win=(wWin_p)win->next) {
- if (win->shown && win != win0) {
- if (modal) {
- if (win->modalLevel == 0) {
- gtk_widget_set_sensitive(GTK_WIDGET(win->gtkwin), FALSE);
- }
-
- win->modalLevel++;
- } else {
- if (win->modalLevel > 0) {
- win->modalLevel--;
-
- if (win->modalLevel == 0) {
- gtk_widget_set_sensitive(GTK_WIDGET(win->gtkwin), TRUE);
- }
- }
- }
-
- if (win->modalLevel < 0) {
- fprintf(stderr, "DoModal: %s modalLevel < 0",
- win->nameStr?win->nameStr:"<NULL>");
- abort();
- }
- }
- }
-
- if (modal) {
- gtk_main();
- } else {
- gtk_main_quit();
- }
+ wWin_p win;
+
+ for (win=(wWin_p)firstWin; win; win=(wWin_p)win->next) {
+ if (win->shown && win != win0) {
+ if (modal) {
+ if (win->modalLevel == 0) {
+ gtk_widget_set_sensitive(GTK_WIDGET(win->gtkwin), FALSE);
+ }
+
+ win->modalLevel++;
+ } else {
+ if (win->modalLevel > 0) {
+ win->modalLevel--;
+
+ if (win->modalLevel == 0) {
+ gtk_widget_set_sensitive(GTK_WIDGET(win->gtkwin), TRUE);
+ }
+ }
+ }
+
+ if (win->modalLevel < 0) {
+ fprintf(stderr, "DoModal: %s modalLevel < 0",
+ win->nameStr?win->nameStr:"<NULL>");
+ abort();
+ }
+ }
+ }
+
+ if (modal) {
+ gtk_main();
+ } else {
+ gtk_main_quit();
+ }
}
/**
@@ -553,32 +535,32 @@ void wlibDoModal(
*/
const char * wWinGetTitle(
- wWin_p win) /* Window */
+ wWin_p win) /* Window */
{
- return win->labelStr;
+ return win->labelStr;
}
void wWinClear(
- wWin_p win,
- wPos_t x,
- wPos_t y,
- wPos_t width,
- wPos_t height)
+ wWin_p win,
+ wWinPix_t x,
+ wWinPix_t y,
+ wWinPix_t width,
+ wWinPix_t height)
{
}
void wWinDoCancel(
- wWin_p win)
+ wWin_p win)
{
- wControl_p b;
+ wControl_p b;
- for (b=win->first; b; b=b->next) {
- if ((b->type == B_BUTTON) && (b->option & BB_CANCEL)) {
- wlibButtonDoAction((wButton_p)b);
- }
- }
+ for (b=win->first; b; b=b->next) {
+ if ((b->type == B_BUTTON) && (b->option & BB_CANCEL)) {
+ wlibButtonDoAction((wButton_p)b);
+ }
+ }
}
/*
@@ -590,155 +572,161 @@ void wWinDoCancel(
*/
static int window_redraw(
- wWin_p win,
- wBool_t doWinProc)
+ wWin_p win,
+ wBool_t doWinProc)
{
- wControl_p b;
+ wControl_p b;
- if (win==NULL) {
- return FALSE;
- }
+ if (win==NULL) {
+ return FALSE;
+ }
- for (b=win->first; b != NULL; b = b->next) {
- if (b->repaintProc) {
- b->repaintProc(b);
- }
- }
+ for (b=win->first; b != NULL; b = b->next) {
+ if (b->repaintProc) {
+ b->repaintProc(b);
+ }
+ }
- return FALSE;
+ return FALSE;
}
static gint window_delete_event(
- GtkWidget *widget,
- GdkEvent *event,
- wWin_p win)
+ GtkWidget *widget,
+ GdkEvent *event,
+ wWin_p win)
{
- wControl_p b;
- /* if you return FALSE in the "delete_event" signal handler,
- * GTK will emit the "destroy" signal. Returning TRUE means
- * you don't want the window to be destroyed.
- * This is useful for popping up 'are you sure you want to quit ?'
- * type dialogs. */
-
- /* Change TRUE to FALSE and the main window will be destroyed with
- * a "delete_event". */
-
- for (b = win->first; b; b=b->next)
- if (b->doneProc) {
- b->doneProc(b);
- }
-
- if (win->winProc) {
- win->winProc(win, wClose_e, NULL, win->data);
-
- if (win != gtkMainW) {
- wWinShow(win, FALSE);
- }
- }
-
- return (TRUE);
+ wControl_p b;
+ /* if you return FALSE in the "delete_event" signal handler,
+ * GTK will emit the "destroy" signal. Returning TRUE means
+ * you don't want the window to be destroyed.
+ * This is useful for popping up 'are you sure you want to quit ?'
+ * type dialogs. */
+
+ /* Change TRUE to FALSE and the main window will be destroyed with
+ * a "delete_event". */
+
+ for (b = win->first; b; b=b->next)
+ if (b->doneProc) {
+ b->doneProc(b);
+ }
+
+ if (win->winProc) {
+ win->winProc(win, wClose_e, NULL, win->data);
+
+ if (win != gtkMainW) {
+ wWinShow(win, FALSE);
+ }
+ }
+
+ return (TRUE);
}
static int fixed_expose_event(
- GtkWidget * widget,
- GdkEventExpose * event,
- wWin_p win)
+ GtkWidget * widget,
+ GdkEventExpose * event,
+ wWin_p win)
{
int rc;
- if (event->count==0) {
- rc = window_redraw(win, TRUE);
- } else {
- rc = FALSE;
- }
- cairo_t* cr = gdk_cairo_create (gtk_widget_get_window(widget));
-#ifdef CURSOR_SURFACE
- if (win && win->cursor_surface.surface && win->cursor_surface.show) {
- cairo_set_source_surface(cr,win->cursor_surface.surface,event->area.x, event->area.y);
- cairo_set_operator(cr,CAIRO_OPERATOR_OVER);
- cairo_rectangle(cr,event->area.x, event->area.y,
- event->area.width, event->area.height);
- cairo_fill(cr);
+ if (event->count==0) {
+ rc = window_redraw(win, TRUE);
+ } else {
+ rc = FALSE;
}
-#endif
- return rc;
+ return rc;
}
-static int resizeTime(wWin_p win) {
+static int resizeTime(wWin_p win)
+{
- if (win->resizeW == win->w && win->resizeH == win->h) { // If hasn't changed since last
+ if (debugWindow >= 2) {
+ printf( "resizeTime idleCnt %d, busyCnt %d [%d %d] [%ld %ld]\n",
+ win->timer_idle_count, win->timer_busy_count,
+ win->resizeW, win->resizeH, win->w, win->h );
+ }
+ if (win->resizeW == win->w
+ && win->resizeH == win->h) { // If hasn't changed since last
if (win->timer_idle_count>3) {
- win->winProc(win, wResize_e, NULL, win->data); //Trigger Redraw on last occasion if one-third of a second has elapsed
+ win->winProc(win, wResize_e, NULL,
+ win->data); //Trigger Redraw on last occasion if one-third of a second has elapsed
win->timer_idle_count = 0;
win->resizeTimer = 0;
win->timer_busy_count = 0;
return FALSE; //Stop Timer and don't resize
- } else win->timer_idle_count++;
+ } else { win->timer_idle_count++; }
}
if (win->busy==FALSE && win->winProc) { //Always drive once
if (win->timer_busy_count>10) {
- win->winProc(win, wResize_e, NULL, win->data); //Redraw if ten times we saw a change (1 sec)
- win->timer_busy_count = 0;
+ win->winProc(win, wResize_e, NULL,
+ win->data); //Redraw if ten times we saw a change (1 sec)
+ win->timer_busy_count = 0;
} else {
win->winProc(win, wResize_e, (void*) 1, win->data); //No Redraw
win->timer_busy_count++;
}
- win->resizeW = win->w; //Remember this one
- win->resizeH = win->h;
+ win->resizeW = win->w; //Remember this one
+ win->resizeH = win->h;
}
return TRUE; //Will redrive after another timer interval
}
static int window_configure_event(
- GtkWidget * widget,
- GdkEventConfigure * event,
- wWin_p win)
+ GtkWidget * widget,
+ GdkEventConfigure * event,
+ wWin_p win)
{
- if (win==NULL) {
- return FALSE;
- }
-
- if (win->option&F_RESIZE) {
- if (event->width < 10 || event->height < 10) {
- return TRUE;
- }
- int w = win->w;
- int h = win->h;
-
-
- if (win->w != event->width || win->h != event->height) {
- win->w = event->width;
- win->h = event->height;
-
- if (win->w < MIN_WIN_WIDTH) {
- win->w = MIN_WIN_WIDTH;
- }
-
- if (win->h < MIN_WIN_HEIGHT) {
- win->h = MIN_WIN_HEIGHT;
- }
-
- if (win->option&F_MENUBAR) {
- GtkAllocation allocation;
- gtk_widget_get_allocation(win->menubar, &allocation);
- win->menu_height= allocation.height;
- gtk_widget_set_size_request(win->menubar, win->w-20, win->menu_height);
- }
- if (win->resizeTimer) { // Already have a timer
- return FALSE;
- } else {
- win->resizeW = w; //Remember where this started
- win->resizeH = h;
- win->timer_idle_count = 0; //Start background timer on redraw
- win->timer_busy_count = 0;
- win->resizeTimer = g_timeout_add(100,(GSourceFunc)resizeTime,win); // 100ms delay
- return FALSE;
- }
- }
- }
-
- return FALSE;
+ if (win==NULL) {
+ return FALSE;
+ }
+
+ if (debugWindow >= 2) {
+ printf( "config/resize: [%d %d]\n", event->width, event->height );
+ }
+ if (win->option&F_RESIZE) {
+ if (event->width < 10 || event->height < 10) {
+ return TRUE;
+ }
+ int w = win->w;
+ int h = win->h;
+
+
+ if (win->w != event->width || win->h != event->height) {
+ if (debugWindow >= 2) {
+ printf( " Update [%ld %ld]\n", event->width-win->w, event->height-win->h );
+ }
+ win->w = event->width;
+ win->h = event->height;
+
+ if (win->w < MIN_WIN_WIDTH) {
+ win->w = MIN_WIN_WIDTH;
+ }
+
+ if (win->h < MIN_WIN_HEIGHT) {
+ win->h = MIN_WIN_HEIGHT;
+ }
+
+ if (win->option&F_MENUBAR) {
+ GtkAllocation allocation;
+ gtk_widget_get_allocation(win->menubar, &allocation);
+ win->menu_height= allocation.height;
+ gtk_widget_set_size_request(win->menubar, win->w-20, win->menu_height);
+ }
+ if (win->resizeTimer) { // Already have a timer
+ return FALSE;
+ } else {
+ win->resizeW = w; //Remember where this started
+ win->resizeH = h;
+ win->timer_idle_count = 0; //Start background timer on redraw
+ win->timer_busy_count = 0;
+ win->resizeTimer = g_timeout_add(100,(GSourceFunc)resizeTime,
+ win); // 100ms delay
+ return FALSE;
+ }
+ }
+ }
+
+ return FALSE;
}
/**
@@ -753,25 +741,25 @@ static int window_configure_event(
*/
gboolean window_state_event(
- GtkWidget *widget,
- GdkEventWindowState *event,
- wWin_p win)
+ GtkWidget *widget,
+ GdkEventWindowState *event,
+ wWin_p win)
{
- if (!win) {
- return (FALSE);
- }
+ if (!win) {
+ return (FALSE);
+ }
- win->maximize_initially = FALSE;
+ win->maximize_initially = FALSE;
- if (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) {
- win->maximize_initially = TRUE;
- }
+ if (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) {
+ win->maximize_initially = TRUE;
+ }
- if (win->busy==FALSE && win->winProc) {
- win->winProc(win, wState_e, NULL, win->data);
- }
+ if (win->busy==FALSE && win->winProc) {
+ win->winProc(win, wState_e, NULL, win->data);
+ }
- return TRUE;
+ return TRUE;
}
/**
* Get current state of shift, ctrl or alt keys.
@@ -781,87 +769,90 @@ gboolean window_state_event(
int wGetKeyState(void)
{
- return keyState;
+ return keyState;
}
wBool_t catch_shift_ctrl_alt_keys(
- GtkWidget * widget,
- GdkEventKey *event,
- void * data)
+ GtkWidget * widget,
+ GdkEventKey *event,
+ void * data)
{
- int state = 0;
- switch (event->keyval ) {
- case GDK_KEY_Shift_L:
- case GDK_KEY_Shift_R:
- state |= WKEY_SHIFT;
- break;
-
- case GDK_KEY_Control_L:
- case GDK_KEY_Control_R:
- state |= WKEY_CTRL;
- break;
-
- case GDK_KEY_Alt_L:
- case GDK_KEY_Alt_R:
- state |= WKEY_ALT;
- break;
-
- case GDK_KEY_Meta_L:
- case GDK_KEY_Meta_R:
- // Pressing SHIFT and then ALT generates a Meta key
- //printf( "Meta\n" );
- state |= WKEY_ALT;
- break;
- }
-
- if (state != 0) {
- if (event->type == GDK_KEY_PRESS) {
- keyState |= state;
- } else {
- keyState &= ~state;
- }
- return TRUE;
- }
- return FALSE;
+ int state = 0;
+ switch (event->keyval ) {
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
+ state |= WKEY_SHIFT;
+ break;
+
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
+ state |= WKEY_CTRL;
+ break;
+
+ case GDK_KEY_Alt_L:
+ case GDK_KEY_Alt_R:
+ state |= WKEY_ALT;
+ break;
+
+ case GDK_KEY_Meta_L:
+ case GDK_KEY_Meta_R:
+ // Pressing SHIFT and then ALT generates a Meta key
+ //printf( "Meta\n" );
+ state |= WKEY_ALT;
+ break;
+ }
+
+ if (state != 0) {
+ if (event->type == GDK_KEY_PRESS) {
+ keyState |= state;
+ } else {
+ keyState &= ~state;
+ }
+ return TRUE;
+ }
+ return FALSE;
}
static gint window_char_event(
- GtkWidget * widget,
- GdkEventKey *event,
- wWin_p win)
+ GtkWidget * widget,
+ GdkEventKey *event,
+ wWin_p win)
{
- wControl_p bb;
-
- if (catch_shift_ctrl_alt_keys(widget, event, win)) {
- return FALSE;
- }
-
- if (event->type == GDK_KEY_RELEASE) {
- return FALSE;
- }
-
- if ( ( event->state & GDK_MODIFIER_MASK ) == 0 ) {
- if (event->keyval == GDK_KEY_Escape) {
- for (bb=win->first; bb; bb=bb->next) {
- if (bb->type == B_BUTTON && (bb->option&BB_CANCEL)) {
- wlibButtonDoAction((wButton_p)bb);
- return TRUE;
- }
- }
- }
- }
-
- if (wlibHandleAccelKey(event)) {
- return TRUE;
- } else {
- return FALSE;
- }
+ wControl_p bb;
+
+ if (catch_shift_ctrl_alt_keys(widget, event, win)) {
+ return FALSE;
+ }
+
+ if (event->type == GDK_KEY_RELEASE) {
+ return FALSE;
+ }
+
+ if ( ( event->state & GDK_MODIFIER_MASK ) == 0 ) {
+ if (event->keyval == GDK_KEY_Escape) {
+ for (bb=win->first; bb; bb=bb->next) {
+ if (bb->type == B_BUTTON && (bb->option&BB_CANCEL)) {
+ wlibButtonDoAction((wButton_p)bb);
+ return TRUE;
+ }
+ }
+ }
+ }
+
+ if (wlibHandleAccelKey(event)) {
+ return TRUE;
+ } else {
+ return FALSE;
+ }
}
-void wSetGeometry(wWin_p win, int min_width, int max_width, int min_height, int max_height, int base_width, int base_height, double aspect_ratio ) {
+void wSetGeometry(wWin_p win, wWinPix_t min_width, wWinPix_t max_width,
+ wWinPix_t min_height, wWinPix_t max_height, wWinPix_t base_width,
+ wWinPix_t base_height, double aspect_ratio )
+{
GdkGeometry hints;
GdkWindowHints hintMask = GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE;
- hints.min_width = min_width;
+ hints.min_width = min_width;
hints.max_width = max_width;
hints.min_height = min_height;
hints.max_height = max_height;
@@ -871,16 +862,16 @@ void wSetGeometry(wWin_p win, int min_width, int max_width, int min_height, int
if( base_width != -1 && base_height != -1 ) {
hintMask |= GDK_HINT_BASE_SIZE;
}
-
+
if(aspect_ratio > -1.0 ) {
hintMask |= GDK_HINT_ASPECT;
- }
+ }
gtk_window_set_geometry_hints(
- GTK_WINDOW(win->gtkwin),
- win->gtkwin,
- &hints,
- hintMask);
+ GTK_WINDOW(win->gtkwin),
+ win->gtkwin,
+ &hints,
+ hintMask);
}
@@ -911,166 +902,158 @@ void wSetGeometry(wWin_p win, int min_width, int max_width, int min_height, int
*/
static wWin_p wWinCommonCreate(
- wWin_p parent,
- int winType,
- wPos_t x,
- wPos_t y,
- const char * labelStr,
- const char * nameStr,
- long option,
- wWinCallBack_p winProc,
- void * data)
+ wWin_p parent,
+ int winType,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * labelStr,
+ const char * nameStr,
+ long option,
+ wWinCallBack_p winProc,
+ void * data)
{
- wWin_p w;
- int h;
- w = wlibAlloc(NULL, winType, x, y, labelStr, sizeof *w, data);
- w->busy = TRUE;
- w->option = option;
+ wWin_p w;
+ int h;
+ w = wlibAlloc(NULL, winType, x, y, labelStr, sizeof *w, data);
+ w->busy = TRUE;
+ w->option = option;
w->resizeTimer = 0;
- h = BORDERSIZE;
-
- if (w->option&F_MENUBAR) {
- h += MENUH;
- }
-
- if (winType == W_MAIN) {
- w->gtkwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- } else {
- w->gtkwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-
- if (gtkMainW) {
- if (!(w->option&F_NOTTRANSIENT))
- gtk_window_set_transient_for(GTK_WINDOW(w->gtkwin),
- GTK_WINDOW(gtkMainW->gtkwin));
- }
- }
- getWinSize(w, nameStr);
- if (winType != W_MAIN) {
- gtk_widget_set_app_paintable (w->gtkwin,TRUE);
- }
-
- if (option & F_HIDE) {
- gtk_widget_hide(w->gtkwin);
- }
-
- /* center window on top of parent window */
- if (option & F_CENTER) {
- gtk_window_set_position(GTK_WINDOW(w->gtkwin), GTK_WIN_POS_CENTER_ON_PARENT);
- }
-
-
- w->widget = gtk_fixed_new();
-
- if (w->widget == 0) {
- abort();
- }
-
- if (w->option&F_MENUBAR) {
- w->menubar = gtk_menu_bar_new();
- gtk_container_add(GTK_CONTAINER(w->widget), w->menubar);
- gtk_widget_show(w->menubar);
- GtkAllocation allocation;
- gtk_widget_get_allocation(w->menubar, &allocation);
- w->menu_height = allocation.height;
- gtk_widget_set_size_request(w->menubar, -1, w->menu_height);
- }
-
- gtk_container_add(GTK_CONTAINER(w->gtkwin), w->widget);
-
-
-
-
- if (w->option&F_AUTOSIZE) {
- w->realX = 0;
- w->w = MIN_WIN_WIDTH+20;
- w->realY = h;
- w->h = MIN_WIN_HEIGHT;
- } else if (w->origX != 0){
- w->realX = w->origX;
- w->realY = w->origY+h;
-
- w->default_size_x = w->w;
- w->default_size_y = w->h;
- //gtk_widget_set_size_request(w->widget, w->w-20, w->h);
-
- if (w->option&F_MENUBAR) {
- gtk_widget_set_size_request(w->menubar, w->w-20, MENUH);
- }
- }
- int scr_w, scr_h;
- wGetDisplaySize(&scr_w, &scr_h);
- if (scr_w < MIN_WIN_WIDTH) scr_w = MIN_WIN_WIDTH+10;
- if (scr_h < MIN_WIN_HEIGHT) scr_h = MIN_WIN_HEIGHT;
+ h = BORDERSIZE;
+
+ if (w->option&F_MENUBAR) {
+ h += MENUH;
+ }
+
+ if (winType == W_MAIN) {
+ w->gtkwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ } else {
+ w->gtkwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
+ if (gtkMainW) {
+ if (!(w->option&F_NOTTRANSIENT))
+ gtk_window_set_transient_for(GTK_WINDOW(w->gtkwin),
+ GTK_WINDOW(gtkMainW->gtkwin));
+ }
+ }
+ getWinSize(w, nameStr);
if (winType != W_MAIN) {
- wSetGeometry(w, MIN_WIN_WIDTH, scr_w-10, MIN_WIN_HEIGHT, scr_h, -1, -1, -1);
+ gtk_widget_set_app_paintable (w->gtkwin,TRUE);
+ }
+
+ if (option & F_HIDE) {
+ gtk_widget_hide(w->gtkwin);
+ }
+
+ /* center window on top of parent window */
+ if (option & F_CENTER) {
+ gtk_window_set_position(GTK_WINDOW(w->gtkwin), GTK_WIN_POS_CENTER_ON_PARENT);
+ }
+
+
+ w->widget = gtk_fixed_new();
+
+ if (w->widget == 0) {
+ abort();
+ }
+
+ if (w->option&F_MENUBAR) {
+ w->menubar = gtk_menu_bar_new();
+ gtk_container_add(GTK_CONTAINER(w->widget), w->menubar);
+ gtk_widget_show(w->menubar);
+ GtkAllocation allocation;
+ gtk_widget_get_allocation(w->menubar, &allocation);
+ w->menu_height = allocation.height;
+ gtk_widget_set_size_request(w->menubar, -1, w->menu_height);
+ }
+
+ gtk_container_add(GTK_CONTAINER(w->gtkwin), w->widget);
+
+
+
+
+ if (w->option&F_AUTOSIZE) {
+ w->realX = 0;
+ w->w = 0;
+ w->realY = h;
+ w->h = 0;
+ } else if (w->origX != 0) {
+ w->realX = w->origX;
+ w->realY = w->origY+h;
+
+ //gtk_widget_set_size_request(w->widget, w->w-20, w->h);
+
+ if (w->option&F_MENUBAR) {
+ gtk_widget_set_size_request(w->menubar, w->w-20, MENUH);
+ }
+ }
+
+ w->first = w->last = NULL;
+ w->winProc = winProc;
+ g_signal_connect(GTK_OBJECT(w->gtkwin), "delete_event",
+ G_CALLBACK(window_delete_event), w);
+ g_signal_connect(GTK_OBJECT(w->widget), "expose_event",
+ G_CALLBACK(fixed_expose_event), w);
+ g_signal_connect(GTK_OBJECT(w->gtkwin), "configure_event",
+ G_CALLBACK(window_configure_event), w);
+ g_signal_connect(GTK_OBJECT(w->gtkwin), "window-state-event",
+ G_CALLBACK(window_state_event), w);
+ g_signal_connect(GTK_OBJECT(w->gtkwin), "key_press_event",
+ G_CALLBACK(window_char_event), w);
+ g_signal_connect(GTK_OBJECT(w->gtkwin), "key_release_event",
+ G_CALLBACK(window_char_event), w);
+ gtk_widget_set_events(w->widget, GDK_EXPOSURE_MASK);
+ gtk_widget_set_events(GTK_WIDGET(w->gtkwin),
+ GDK_EXPOSURE_MASK|GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK);
+
+ if (w->option & F_RESIZE) {
+ gtk_window_set_resizable(GTK_WINDOW(w->gtkwin), TRUE);
+ if ( ( w->option & F_AUTOSIZE ) == 0 ) {
+ gtk_window_resize(GTK_WINDOW(w->gtkwin), w->w, w->h);
+ }
} else {
- if (scr_w < MIN_WIN_WIDTH_MAIN+10) scr_w = MIN_WIN_WIDTH_MAIN+200;
- if (scr_h < MIN_WIN_HEIGHT_MAIN+10) scr_h = MIN_WIN_HEIGHT_MAIN+200;
- wSetGeometry(w, MIN_WIN_WIDTH_MAIN, scr_w-10, MIN_WIN_HEIGHT_MAIN, scr_h-10, -1, -1, -1);
- }
-
-
-
- w->first = w->last = NULL;
- w->winProc = winProc;
- g_signal_connect(GTK_OBJECT(w->gtkwin), "delete_event",
- G_CALLBACK(window_delete_event), w);
- g_signal_connect(GTK_OBJECT(w->widget), "expose_event",
- G_CALLBACK(fixed_expose_event), w);
- g_signal_connect(GTK_OBJECT(w->gtkwin), "configure_event",
- G_CALLBACK(window_configure_event), w);
- g_signal_connect(GTK_OBJECT(w->gtkwin), "window-state-event",
- G_CALLBACK(window_state_event), w);
- g_signal_connect(GTK_OBJECT(w->gtkwin), "key_press_event",
- G_CALLBACK(window_char_event), w);
- g_signal_connect(GTK_OBJECT(w->gtkwin), "key_release_event",
- G_CALLBACK(window_char_event), w);
- gtk_widget_set_events(w->widget, GDK_EXPOSURE_MASK);
- gtk_widget_set_events(GTK_WIDGET(w->gtkwin),
- GDK_EXPOSURE_MASK|GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK);
-
- if (w->option & F_RESIZE) {
- gtk_window_set_resizable(GTK_WINDOW(w->gtkwin), TRUE);
- gtk_window_resize(GTK_WINDOW(w->gtkwin), w->w, w->h);
- } else {
- gtk_window_set_resizable(GTK_WINDOW(w->gtkwin), FALSE);
- }
-
- w->lastX = 0;
- w->lastY = h;
- w->shown = FALSE;
- w->nameStr = nameStr?strdup(nameStr):NULL;
-
- if (labelStr) {
- gtk_window_set_title(GTK_WINDOW(w->gtkwin), labelStr);
- }
-
- if (listHelpStrings) {
- printf("WINDOW - %s\n", nameStr?nameStr:"<NULL>");
- }
-
- if (firstWin) {
- lastWin->next = (wControl_p)w;
- } else {
- firstWin = (wControl_p)w;
- }
-
- lastWin = (wControl_p)w;
- gtk_widget_show(w->widget);
- gtk_widget_realize(w->gtkwin);
- GtkAllocation allocation;
- gtk_widget_get_allocation(w->gtkwin, &allocation);
- w->menu_height = allocation.height;
-
- w->busy = FALSE;
-
- if (option&F_MAXIMIZE) {
- maximize_at_next_show = TRUE;
- }
-
- return w;
+ gtk_window_set_resizable(GTK_WINDOW(w->gtkwin), FALSE);
+ }
+
+ w->lastX = 0;
+ w->lastY = h;
+ w->shown = FALSE;
+ w->nameStr = nameStr?strdup(nameStr):NULL;
+
+ if (labelStr) {
+ gtk_window_set_title(GTK_WINDOW(w->gtkwin), labelStr);
+ }
+
+ if (listHelpStrings) {
+ printf("WINDOW - %s\n", nameStr?nameStr:"<NULL>");
+ }
+
+ if (firstWin) {
+ lastWin->next = (wControl_p)w;
+ } else {
+ firstWin = (wControl_p)w;
+ }
+
+ lastWin = (wControl_p)w;
+ gtk_widget_show(w->widget);
+ gtk_widget_realize(w->gtkwin);
+ GtkAllocation allocation;
+ gtk_widget_get_allocation(w->gtkwin, &allocation);
+ w->menu_height = allocation.height;
+
+ w->busy = FALSE;
+
+ if (option&F_MAXIMIZE) {
+ maximize_at_next_show = TRUE;
+ }
+
+ if ( windowIconPixbuf == NULL ) {
+ windowIconPixbuf = gdk_pixbuf_new_from_xpm_data((const char**)&xtc_xpm);
+ }
+ gtk_window_set_icon( GTK_WINDOW(w->gtkwin), windowIconPixbuf );
+
+ return w;
}
@@ -1091,38 +1074,38 @@ static wWin_p wWinCommonCreate(
*/
wWin_p wWinMainCreate(
- const char * name, /* Application name */
- wPos_t x, /* Initial window width */
- wPos_t y, /* Initial window height */
- const char * helpStr, /* Help topic string */
- const char * labelStr, /* Window title */
- const char * nameStr, /* Window name */
- long option, /* Options */
- wWinCallBack_p winProc, /* Call back function */
- void * data) /* User context */
+ const char * name, /* Application name */
+ wWinPix_t x, /* Initial window width */
+ wWinPix_t y, /* Initial window height */
+ const char * helpStr, /* Help topic string */
+ const char * labelStr, /* Window title */
+ const char * nameStr, /* Window name */
+ long option, /* Options */
+ wWinCallBack_p winProc, /* Call back function */
+ void * data) /* User context */
{
- char *pos;
- long isMaximized;
+ char *pos;
+ long isMaximized;
- pos = strchr(name, ';');
+ pos = strchr(name, ';');
- if (pos) {
- /* if found, split application name and configuration name */
- strcpy(wConfigName, pos + 1);
- } else {
- /* if not found, application name and configuration name are same */
- strcpy(wConfigName, name);
- }
+ if (pos) {
+ /* if found, split application name and configuration name */
+ strcpy(wConfigName, pos + 1);
+ } else {
+ /* if not found, application name and configuration name are same */
+ strcpy(wConfigName, name);
+ }
- wPrefGetInteger("draw", "maximized", &isMaximized, 0);
- option = option | (isMaximized?F_MAXIMIZE:0);
+ wPrefGetInteger("draw", "maximized", &isMaximized, 0);
+ option = option | (isMaximized?F_MAXIMIZE:0);
- gtkMainW = wWinCommonCreate(NULL, W_MAIN, x, y, labelStr, nameStr, option,
- winProc, data);
+ gtkMainW = wWinCommonCreate(NULL, W_MAIN, x, y, labelStr, nameStr, option,
+ winProc, data);
- wDrawColorWhite = wDrawFindColor(0xFFFFFF);
- wDrawColorBlack = wDrawFindColor(0x000000);
- return gtkMainW;
+ wDrawColorWhite = wDrawFindColor(0xFFFFFF);
+ wDrawColorBlack = wDrawFindColor(0x000000);
+ return gtkMainW;
}
/**
@@ -1141,29 +1124,29 @@ wWin_p wWinMainCreate(
*/
wWin_p wWinPopupCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- const char * labelStr,
- const char * nameStr,
- long option,
- wWinCallBack_p winProc,
- void * data)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ const char * nameStr,
+ long option,
+ wWinCallBack_p winProc,
+ void * data)
{
- wWin_p win;
+ wWin_p win;
- if (parent == NULL) {
- if (gtkMainW == NULL) {
- abort();
- }
+ if (parent == NULL) {
+ if (gtkMainW == NULL) {
+ abort();
+ }
- parent = gtkMainW;
- }
+ parent = gtkMainW;
+ }
- win = wWinCommonCreate(parent, W_POPUP, x, y, labelStr, nameStr, option,
- winProc, data);
- return win;
+ win = wWinCommonCreate(parent, W_POPUP, x, y, labelStr, nameStr, option,
+ winProc, data);
+ return win;
}
@@ -1178,22 +1161,22 @@ wWin_p wWinPopupCreate(
void wExit(
- int rc) /* Application return code */
+ int rc) /* Application return code */
{
- wWin_p win;
+ wWin_p win;
- for (win = (wWin_p)firstWin; win; win = (wWin_p)win->next) {
- if (gtk_widget_get_visible(GTK_WIDGET(win->gtkwin))) {
- saveSize(win);
- savePos(win);
- }
- }
+ for (win = (wWin_p)firstWin; win; win = (wWin_p)win->next) {
+ if (gtk_widget_get_visible(GTK_WIDGET(win->gtkwin))) {
+ saveSize(win);
+ savePos(win);
+ }
+ }
- wPrefFlush();
+ wPrefFlush("");
- if (gtkMainW && gtkMainW->winProc != NULL) {
- gtkMainW->winProc(gtkMainW, wQuit_e, NULL, gtkMainW->data);
- }
+ if (gtkMainW && gtkMainW->winProc != NULL) {
+ gtkMainW->winProc(gtkMainW, wQuit_e, NULL, gtkMainW->data);
+ }
- exit(rc);
+ exit(rc);
}
diff --git a/app/wlib/gtklib/wpref.c b/app/wlib/gtklib/wpref.c
index 124305a..356dd95 100644
--- a/app/wlib/gtklib/wpref.c
+++ b/app/wlib/gtklib/wpref.c
@@ -17,7 +17,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -26,6 +26,7 @@
#include <ctype.h>
#include <dirent.h>
#include <sys/stat.h>
+#include <errno.h>
#define GTK_DISABLE_SINGLE_INCLUDES
#define GDK_DISABLE_DEPRECATED
@@ -47,6 +48,8 @@ extern char wConfigName[];
static char appLibDir[BUFSIZ];
static char appWorkDir[BUFSIZ];
static char userHomeDir[BUFSIZ];
+
+static char *profileFile;
/*
@@ -58,13 +61,13 @@ static char userHomeDir[BUFSIZ];
*/
-/** Find the directory where configuration files, help, demos etc are installed.
+/** Find the directory where configuration files, help, demos etc are installed.
* The search order is:
* 1. Directory specified by the XTRKCADLIB environment variable
* 2. Directory specified by XTRKCAD_INSTALL_PREFIX/share/xtrkcad
- * 3. /usr/lib/xtrkcad
- * 4. /usr/local/lib/xtrkcad
- *
+ * 3. /usr/share/xtrkcad
+ * 4. /usr/local/share/xtrkcad
+ *
* \return pointer to directory name
*/
@@ -79,46 +82,66 @@ const char * wGetAppLibDir( void )
return appLibDir;
}
- for (cp=wlibGetAppName(),ep=envvar; *cp; cp++,ep++)
+ for (cp=wlibGetAppName(),ep=envvar; *cp; cp++,ep++) {
*ep = toupper(*cp);
- strcpy( ep, "LIB" );
+ }
+#ifndef __APPLE__
+ if ( strstr( XTRKCAD_VERSION, "Beta" ) != NULL ) {
+ strcat( ep, "BETA" );
+ }
+#endif
+ strcat( ep, "LIB" );
ep = getenv( envvar );
if (ep != NULL) {
if ((stat( ep, &buf) == 0 ) && S_ISDIR( buf.st_mode)) {
- strncpy( appLibDir, ep, sizeof appLibDir );
+ strncpy( appLibDir, ep, sizeof(appLibDir) -1 );
+ //printf( "wAppLbDir=%s\n", appLibDir );
return appLibDir;
}
}
- strcpy(appLibDir, XTRKCAD_INSTALL_PREFIX);
- strcat(appLibDir, "/share/");
+ strcpy(appLibDir, "../share/");
strcat(appLibDir, wlibGetAppName());
-
if ((stat( appLibDir, &buf) == 0 ) && S_ISDIR( buf.st_mode)) {
+ //printf( "wAppLbDir=%s\n", appLibDir );
return appLibDir;
}
- strcpy( appLibDir, "/usr/lib/" );
+ char * dir1 = "/usr/share/";
+ char * dir2 = "/usr/local/share/";
+ char * beta = "";
+ if ( strstr( XTRKCAD_VERSION, "Beta" ) != NULL ) {
+ dir1 = "/usr/local/share/";
+ dir2 = "/usr/share/";
+#ifndef __APPLE__
+ beta = "-beta";
+#endif
+ }
+
+ strcpy( appLibDir, dir1 );
strcat( appLibDir, wlibGetAppName() );
+ strcat( appLibDir, beta );
if ((stat( appLibDir, &buf) == 0 ) && S_ISDIR( buf.st_mode)) {
+ //printf( "wAppLbDir=%s\n", appLibDir );
return appLibDir;
}
- strcpy( appLibDir, "/usr/local/lib/" );
+ strcpy( appLibDir, dir2 );
strcat( appLibDir, wlibGetAppName() );
if ((stat( appLibDir, &buf) == 0 ) && S_ISDIR( buf.st_mode)) {
+ //printf( "wAppLbDir=%s\n", appLibDir );
return appLibDir;
}
sprintf( msg,
- _("The required configuration files could not be located in the expected location.\n\n"
- "Usually this is an installation problem. Make sure that these files are installed in either \n"
- " %s/share/xtrkcad or\n"
- " /usr/lib/%s or\n"
- " /usr/local/lib/%s\n"
- "If this is not possible, the environment variable %s must contain "
- "the name of the correct directory."),
- XTRKCAD_INSTALL_PREFIX, wlibGetAppName(), wlibGetAppName(), envvar );
+ _("The required configuration files could not be located in the expected location.\n\n"
+ "Usually this is an installation problem. Make sure that these files are installed in either \n"
+ " ../share/xtrkcad or\n"
+ " /usr/share/%s or\n"
+ " /usr/local/share/%s\n"
+ "If this is not possible, the environment variable %s must contain "
+ "the name of the correct directory."),
+ wlibGetAppName(), wlibGetAppName(), envvar );
wNoticeEx( NT_ERROR, msg, _("Ok"), NULL );
appLibDir[0] = '\0';
wExit(0);
@@ -135,20 +158,26 @@ const char * wGetAppLibDir( void )
const char * wGetAppWorkDir(
- void )
+ void )
{
char tmp[BUFSIZ+20];
char * homeDir;
DIR *dirp;
-
- if (appWorkDir[0] != '\0')
+
+ if (appWorkDir[0] != '\0') {
return appWorkDir;
+ }
if ((homeDir = getenv( "HOME" )) == NULL) {
wNoticeEx( NT_ERROR, _("HOME is not set"), _("Exit"), NULL);
wExit(0);
}
sprintf( appWorkDir, "%s/.%s", homeDir, wlibGetAppName() );
+#ifndef __APPLE__
+ if ( strstr( XTRKCAD_VERSION, "Beta" ) != NULL ) {
+ strcat( appWorkDir, "-beta" );
+ }
+#endif
if ( (dirp = opendir(appWorkDir)) != NULL ) {
closedir(dirp);
} else {
@@ -157,18 +186,18 @@ const char * wGetAppWorkDir(
wNoticeEx( NT_ERROR, tmp, _("Exit"), NULL );
wExit(0);
} else {
- /*
- * check for default configuration file and copy to
+ /*
+ * check for default configuration file and copy to
* the workdir if it exists
*/
struct stat stFileInfo;
char appEtcConfig[BUFSIZ];
sprintf( appEtcConfig, "/etc/%s.rc", wlibGetAppName());
-
+
if ( stat( appEtcConfig, &stFileInfo ) == 0 ) {
char copyConfigCmd[(BUFSIZ * 2) + 3];
sprintf( copyConfigCmd, "cp %s %s", appEtcConfig, appWorkDir );
- int rc = system( copyConfigCmd );
+ system( copyConfigCmd );
}
}
}
@@ -185,16 +214,17 @@ const char * wGetAppWorkDir(
const char *wGetUserHomeDir( void )
{
char *homeDir;
-
- if( userHomeDir[ 0 ] != '\0' )
+
+ if( userHomeDir[ 0 ] != '\0' ) {
return userHomeDir;
-
+ }
+
if ((homeDir = getenv( "HOME" )) == NULL) {
wNoticeEx( NT_ERROR, _("HOME is not set"), _("Exit"), NULL);
wExit(0);
} else {
strcpy( userHomeDir, homeDir );
- }
+ }
return userHomeDir;
}
@@ -209,63 +239,116 @@ const char *wGetUserHomeDir( void )
*/
typedef struct {
- char * section;
- char * name;
- wBool_t present;
- wBool_t dirty;
- char * val;
- } prefs_t;
+ char * section;
+ char * name;
+ wBool_t present;
+ wBool_t dirty;
+ char * val;
+} prefs_t;
dynArr_t prefs_da;
#define prefs(N) DYNARR_N(prefs_t,prefs_da,N)
wBool_t prefInitted = FALSE;
/**
+ * Define the name of the configuration file. Needed size is calculated, allocated and
+ * initialized with the filename
+ *
+ * \param name overwrite default configuration
+ */
+
+void static
+wlibSetProfileFilename(char *name)
+{
+ const char *workDir;
+
+ workDir = wGetAppWorkDir();
+ if (name && name[0]) {
+ size_t length;
+ length = snprintf(profileFile, 0, "%s", name);
+ profileFile = malloc(length + sizeof(NULL));
+ 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 );
+ }
+}
+
+
+/**
+ * Get the name of the configuration file.
+ *
+ * \return pointer to the filename.
+ *
+ */
+
+char *
+wGetProfileFilename()
+{
+ return(profileFile);
+}
+
+/**
* Read the configuration file into memory
*/
-static void readPrefs( void )
+static void readPrefs( char * name, wBool_t update )
{
- char tmp[BUFSIZ], *np, *vp, *cp;
- const char * workDir;
+ char tmp[BUFSIZ+32], *np, *vp, *cp;
FILE * prefFile;
prefs_t * p;
prefInitted = TRUE;
- workDir = wGetAppWorkDir();
- sprintf( tmp, "%s/%s.rc", workDir, wConfigName );
- prefFile = fopen( tmp, "r" );
- if (prefFile == NULL)
+ wlibSetProfileFilename(name);
+
+ prefFile = fopen( profileFile, "r" );
+ if (prefFile == NULL) {
+ // First run, no .rc file yet
return;
+ }
while ( ( fgets(tmp, sizeof tmp, prefFile) ) != NULL ) {
char *sp;
-
+
sp = tmp;
- while ( *sp==' ' || *sp=='\t' ) sp++;
- if ( *sp == '\n' || *sp == '#' )
+ while ( *sp==' ' || *sp=='\t' ) { sp++; }
+ if ( *sp == '\n' || *sp == '#' ) {
continue;
+ }
np = strchr( sp, '.' );
if (np == NULL) {
wNoticeEx( NT_INFORMATION, tmp, _("Continue"), NULL );
continue;
}
*np++ = '\0';
- while ( *np==' ' || *np=='\t' ) np++;
+ while ( *np==' ' || *np=='\t' ) { np++; }
vp = strchr( np, ':' );
if (vp == NULL) {
wNoticeEx( NT_INFORMATION, tmp, _("Continue"), NULL );
continue;
}
*vp++ = '\0';
- while ( *vp==' ' || *vp=='\t' ) vp++;
+ while ( *vp==' ' || *vp=='\t' ) { vp++; }
cp = vp + strlen(vp) -1;
- while ( cp >= vp && (*cp=='\n' || *cp==' ' || *cp=='\t') ) cp--;
+ while ( cp >= vp && (*cp=='\n' || *cp==' ' || *cp=='\t') ) { cp--; }
cp[1] = '\0';
- DYNARR_APPEND( prefs_t, prefs_da, 10 );
- p = &prefs(prefs_da.cnt-1);
- p->name = strdup(np);
- p->section = strdup(sp);
- p->dirty = FALSE;
- p->val = strdup(vp);
+ if (update) {
+ for (int i=0; i<prefs_da.cnt; i++) {
+ p = &DYNARR_N(prefs_t,prefs_da,i);
+ if (strcmp(p->name,np)==0 && strcmp(p->section,sp)==0) {
+ p->val = strdup(vp);
+ p->dirty = TRUE;
+ break;
+ }
+ }
+ } else {
+ DYNARR_APPEND( prefs_t, prefs_da, 10 );
+ p = &prefs(prefs_da.cnt-1);
+ p->name = strdup(np);
+ p->section = strdup(sp);
+ p->dirty = FALSE;
+ p->val = strdup(vp);
+ }
}
fclose( prefFile );
}
@@ -279,19 +362,21 @@ static void readPrefs( void )
*/
void wPrefSetString(
- const char * section, /* Section */
- const char * name, /* Name */
- const char * sval ) /* Value */
+ const char * section, /* Section */
+ const char * name, /* Name */
+ const char * sval ) /* Value */
{
prefs_t * p;
- if (!prefInitted)
- readPrefs();
-
+ if (!prefInitted) {
+ readPrefs("", FALSE);
+ }
+
for (p=&prefs(0); p<&prefs(prefs_da.cnt); p++) {
if ( strcmp( p->section, section ) == 0 && strcmp( p->name, name ) == 0 ) {
- if (p->val)
+ if (p->val) {
free(p->val);
+ }
p->dirty = TRUE;
p->val = (sval?strdup( sval ):NULL);
return;
@@ -313,14 +398,15 @@ void wPrefSetString(
*/
char * wPrefGetStringBasic(
- const char * section, /* Section */
- const char * name ) /* Name */
+ const char * section, /* Section */
+ const char * name ) /* Name */
{
prefs_t * p;
- if (!prefInitted)
- readPrefs();
-
+ if (!prefInitted) {
+ readPrefs("", FALSE);
+ }
+
for (p=&prefs(0); p<&prefs(prefs_da.cnt); p++) {
if ( strcmp( p->section, section ) == 0 && strcmp( p->name, name ) == 0 ) {
return p->val;
@@ -337,14 +423,14 @@ char * wPrefGetStringBasic(
* \param lval IN value to save
*/
- void wPrefSetInteger(
- const char * section, /* Section */
- const char * name, /* Name */
- long lval ) /* Value */
+void wPrefSetInteger(
+ const char * section, /* Section */
+ const char * name, /* Name */
+ long lval ) /* Value */
{
char tmp[20];
- sprintf(tmp, "%ld", lval );
+ snprintf(tmp, sizeof(tmp), "%ld", lval );
wPrefSetString( section, name, tmp );
}
@@ -359,13 +445,13 @@ char * wPrefGetStringBasic(
*/
wBool_t wPrefGetIntegerBasic(
- const char * section, /* Section */
- const char * name, /* Name */
- long * res, /* Address of result */
- long def ) /* Default value */
+ const char * section, /* Section */
+ const char * name, /* Name */
+ long * res, /* Address of result */
+ long def ) /* Default value */
{
const char * cp;
- char *cp1;
+ char *cp1;
cp = wPrefGetStringBasic( section, name );
if (cp == NULL) {
@@ -381,21 +467,21 @@ wBool_t wPrefGetIntegerBasic(
}
/**
- * Save a float value in the preferences file.
+ * Save a float value in the preferences file.
*
* \param section IN the file section into which the value should be saved
* \param name IN the name of the preference
* \param lval IN the value
*/
- void wPrefSetFloat(
- const char * section, /* Section */
- const char * name, /* Name */
- double lval ) /* Value */
+void wPrefSetFloat(
+ const char * section, /* Section */
+ const char * name, /* Name */
+ double lval ) /* Value */
{
char tmp[20];
- sprintf(tmp, "%0.6f", lval );
+ snprintf(tmp, sizeof(tmp), "%0.6f", lval );
wPrefSetString( section, name, tmp );
}
@@ -411,13 +497,13 @@ wBool_t wPrefGetIntegerBasic(
wBool_t wPrefGetFloatBasic(
- const char * section, /* Section */
- const char * name, /* Name */
- double * res, /* Address of result */
- double def ) /* Default value */
+ const char * section, /* Section */
+ const char * name, /* Name */
+ double * res, /* Address of result */
+ double def ) /* Default value */
{
const char * cp;
- char *cp1;
+ char *cp1;
cp = wPrefGetStringBasic( section, name );
if (cp == NULL) {
@@ -432,55 +518,117 @@ wBool_t wPrefGetFloatBasic(
return TRUE;
}
+void wPrefsLoad(char * name)
+{
+ readPrefs(name,TRUE);
+}
+
/**
* Save the configuration to a file. The config parameters are held and updated in an array.
- * To make the settings persistant, this function has to be called.
+ * To make the settings persistant, this function has to be called.
*
*/
void wPrefFlush(
- void )
+ char * name )
{
prefs_t * p;
- char tmp[BUFSIZ];
- const char *workDir;
+ char tmp[BUFSIZ+32];
FILE * prefFile;
- if (!prefInitted)
+ if (!prefInitted) {
return;
-
- workDir = wGetAppWorkDir();
- sprintf( tmp, "%s/%s.rc", workDir, wConfigName );
- prefFile = fopen( tmp, "w" );
- if (prefFile == NULL)
+ }
+
+ wlibSetProfileFilename(name);
+
+ prefFile = fopen( profileFile, "w" );
+ if (prefFile == NULL) {
+ // Can not write pref file
+ size_t n = BUFSIZ+32-1-strlen(tmp);
+ strncat( tmp, ": ", n );
+ strncat( tmp, strerror(errno), n-2 );
+ wNoticeEx( NT_ERROR, tmp, "Ok", NULL );
return;
+ }
for (p=&prefs(0); p<&prefs(prefs_da.cnt); p++) {
if(p->val) {
fprintf( prefFile, "%s.%s: %s\n", p->section, p->name, p->val );
- }
+ }
}
fclose( prefFile );
}
/**
* Clear the preferences from memory
- * \return
+ * \return
*/
void wPrefReset(
- void )
+ void )
{
prefs_t * p;
prefInitted = FALSE;
for (p=&prefs(0); p<&prefs(prefs_da.cnt); p++) {
- if (p->section)
+ if (p->section) {
free( p->section );
- if (p->name)
+ }
+ if (p->name) {
free( p->name );
- if (p->val)
+ }
+ if (p->val) {
free( p->val );
+ }
}
prefs_da.cnt = 0;
}
+
+/**
+ * Split a line from the config file ie. rc ini-file into separate tokens. The
+ * line is split into sections, name of value and value following. Pointers
+ * to the respective token are returned. These are zero-terminated.
+ * If a token is not present, NULL is returned instead.
+ * The input line is modified.
+ *
+ * \param line input line, modified during excution of function
+ * \param section section if present
+ * \param name name of config value if present
+ * \param value name of value if present
+ */
+void
+wPrefTokenize(char* line, char** section, char** name, char** value)
+{
+ *section = NULL;
+ *name = NULL;
+ *value = NULL;
+
+ *section = strtok(line, ".");
+ *name = strtok(NULL, ":");
+ *value = strtok(NULL, "\n");
+ if(*value)
+ g_strstrip(*value);
+
+}
+
+/**
+ * A valid line for a config file is created from the individual elements.
+ * Values not need for specific statement are ignored. Eg. when section is
+ * present, name and value are not used.
+ * The caller has to make sure, that the return buffer is large enough.
+ *
+ * \param section section, first token, dellimited with '.'
+ * \param name name, left side of ':'
+ * \param value value, right side of ':'
+ * \param result pointer to buffer for formated line.
+ */
+
+void
+wPrefFormatLine(const char* section, const char* name, const char* value, char* result)
+{
+ if (!value || *value == '\0') {
+ value = "";
+ }
+ sprintf(result, "%s.%s: %s", section, name, value);
+} \ No newline at end of file
diff --git a/app/wlib/gtklib/writebitmap.c b/app/wlib/gtklib/writebitmap.c
new file mode 100644
index 0000000..0f5041a
--- /dev/null
+++ b/app/wlib/gtklib/writebitmap.c
@@ -0,0 +1,102 @@
+/** \file writebitmap.c
+ * Bitmap file creation
+ */
+
+/* XTrackCad - Model Railroad CAD
+ * Copyright (C) 2015 Martin Fischer
+ *
+ * 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 GTK_DISABLE_SINGLE_INCLUDES
+#define GDK_DISABLE_DEPRECATED
+#define GTK_DISABLE_DEPRECATED
+#define GSEAL_ENABLE
+
+#include <string.h>
+#include <gtk/gtk.h>
+#include "gtkint.h"
+
+#define PNGFORMAT "png"
+#define JPEGFORMAT "jpeg"
+
+/**
+ * Get the Extension part of a filename
+ *
+ * /param fname the filename
+ *
+ * /return char* point to the extension
+ */
+
+static const char *
+GetExtension(const char *fname)
+{
+ const char *end = fname + strlen(fname);
+
+ while (end > fname && *end != '.') {
+ --end;
+ }
+ return( end + 1 );
+}
+
+/**
+* Export as bitmap file.
+*
+* \param d IN the drawing area ?
+* \param fileName IN fully qualified filename for the bitmap file.
+* \return TRUE on success, FALSE on error
+*/
+
+wBool_t wBitMapWriteFile(wDraw_p d, const char * fileName)
+{
+ GdkPixbuf *pixbuf;
+ GError *error;
+ gboolean res;
+ const char *fileFormat = GetExtension(fileName);
+ char *writeFormat = NULL;
+
+ if(!strcasecmp(fileFormat, PNGFORMAT )) {
+ writeFormat = PNGFORMAT;
+ }
+ if( !strcasecmp(fileFormat, "jpg") ||
+ !strcasecmp(fileFormat, "jpeg")) {
+ writeFormat = JPEGFORMAT;
+ }
+
+ if(!writeFormat) {
+ wNoticeEx(NT_ERROR, "WriteBitMap: invalid file format!", "Ok", NULL);
+ return FALSE;
+ }
+
+ pixbuf = gdk_pixbuf_get_from_drawable(NULL, (GdkWindow*)d->pixmap, NULL, 0, 0,
+ 0, 0, d->w, d->h);
+
+ if (!pixbuf) {
+ wNoticeEx(NT_ERROR, "WriteBitMap: pixbuf_get failed", "Ok", NULL);
+ return FALSE;
+ }
+
+ error = NULL;
+ res = gdk_pixbuf_save(pixbuf, fileName, writeFormat, &error, NULL);
+
+ if (res == FALSE) {
+ wNoticeEx(NT_ERROR, "WriteBitMap: pixbuf_save failed", "Ok", NULL);
+ return FALSE;
+ }
+
+ g_object_ref_sink(pixbuf);
+ g_object_unref(pixbuf);
+ return TRUE;
+}
diff --git a/app/wlib/include/CMakeLists.txt b/app/wlib/include/CMakeLists.txt
new file mode 100644
index 0000000..5891b02
--- /dev/null
+++ b/app/wlib/include/CMakeLists.txt
@@ -0,0 +1,12 @@
+
+target_include_directories(xtrkcad-wlib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
+
+target_sources(xtrkcad-wlib
+ PUBLIC
+ wlib.h)
+
+if(WIN32)
+ target_sources(xtrkcad-wlib
+ PRIVATE
+ getopt.h)
+endif() \ No newline at end of file
diff --git a/app/wlib/include/getline.h b/app/wlib/include/getline.h
new file mode 100644
index 0000000..ffbb699
--- /dev/null
+++ b/app/wlib/include/getline.h
@@ -0,0 +1,132 @@
+#ifndef GETLINE_H
+#define GETLINE_H
+
+#include <stdio.h>
+
+#define restrict __restrict
+typedef long long ssize_t;
+
+ssize_t getline(char **restrict lineptr, size_t *restrict n, FILE *restrict stream);
+ssize_t getdelim(char **restrict lineptr, size_t *restrict n, int delim, FILE *restrict stream);
+
+/*
+~$ export MANWIDTH=80
+~$ man getline | col -b
+GETLINE(3) Linux Programmer's Manual GETLINE(3)
+
+NAME
+ getline, getdelim - delimited string input
+
+SYNOPSIS
+ #include <stdio.h>
+
+ ssize_t getline(char **lineptr, size_t *n, FILE *stream);
+
+ ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);
+
+ Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
+
+ getline(), getdelim():
+ Since glibc 2.10:
+ _POSIX_C_SOURCE >= 200809L
+ Before glibc 2.10:
+ _GNU_SOURCE
+
+DESCRIPTION
+ getline() reads an entire line from stream, storing the address of the
+ buffer containing the text into *lineptr. The buffer is null-termi-
+ nated and includes the newline character, if one was found.
+
+ If *lineptr is set to NULL and *n is set 0 before the call, then get-
+ line() will allocate a buffer for storing the line. This buffer should
+ be freed by the user program even if getline() failed.
+
+ Alternatively, before calling getline(), *lineptr can contain a pointer
+ to a malloc(3)-allocated buffer *n bytes in size. If the buffer is not
+ large enough to hold the line, getline() resizes it with realloc(3),
+ updating *lineptr and *n as necessary.
+
+ In either case, on a successful call, *lineptr and *n will be updated
+ to reflect the buffer address and allocated size respectively.
+
+ getdelim() works like getline(), except that a line delimiter other
+ than newline can be specified as the delimiter argument. As with get-
+ line(), a delimiter character is not added if one was not present in
+ the input before end of file was reached.
+
+RETURN VALUE
+ On success, getline() and getdelim() return the number of characters
+ read, including the delimiter character, but not including the termi-
+ nating null byte ('\0'). This value can be used to handle embedded
+ null bytes in the line read.
+
+ Both functions return -1 on failure to read a line (including end-of-
+ file condition). In the event of an error, errno is set to indicate
+ the cause.
+
+ERRORS
+ EINVAL Bad arguments (n or lineptr is NULL, or stream is not valid).
+
+ ENOMEM Allocation or reallocation of the line buffer failed.
+
+ATTRIBUTES
+ For an explanation of the terms used in this section, see at-
+ tributes(7).
+
+ +------------------------------------------------+
+ ¦Interface ¦ Attribute ¦ Value ¦
+ +----------------------+---------------+---------¦
+ ¦getline(), getdelim() ¦ Thread safety ¦ MT-Safe ¦
+ +------------------------------------------------+
+
+CONFORMING TO
+ Both getline() and getdelim() were originally GNU extensions. They
+ were standardized in POSIX.1-2008.
+
+EXAMPLE
+ #define _GNU_SOURCE
+ #include <stdio.h>
+ #include <stdlib.h>
+
+ int
+ main(int argc, char *argv[])
+ {
+ FILE *stream;
+ char *line = NULL;
+ size_t len = 0;
+ ssize_t nread;
+
+ if (argc != 2) {
+ fprintf(stderr, "Usage: %s <file>\n", argv[0]);
+ exit(EXIT_FAILURE);
+ }
+
+ stream = fopen(argv[1], "r");
+ if (stream == NULL) {
+ perror("fopen");
+ exit(EXIT_FAILURE);
+ }
+
+ while ((nread = getline(&line, &len, stream)) != -1) {
+ printf("Retrieved line of length %zu:\n", nread);
+ fwrite(line, nread, 1, stdout);
+ }
+
+ free(line);
+ fclose(stream);
+ exit(EXIT_SUCCESS);
+ }
+
+SEE ALSO
+ read(2), fgets(3), fopen(3), fread(3), scanf(3)
+
+COLOPHON
+ This page is part of release 5.05 of the Linux man-pages project. A
+ description of the project, information about reporting bugs, and the
+ latest version of this page, can be found at
+ https://www.kernel.org/doc/man-pages/.
+
+GNU 2019-03-06 GETLINE(3)
+*/
+
+#endif /* GETLINE_H */
diff --git a/app/wlib/include/getopt.h b/app/wlib/include/getopt.h
index e9a8354..4a3ced4 100644
--- a/app/wlib/include/getopt.h
+++ b/app/wlib/include/getopt.h
@@ -17,7 +17,7 @@
You should have received a copy of the GNU General Public License
along with ASPEX; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
extern char *optarg;
diff --git a/app/wlib/include/wlib.h b/app/wlib/include/wlib.h
index d3bfc18..88b2806 100644
--- a/app/wlib/include/wlib.h
+++ b/app/wlib/include/wlib.h
@@ -7,6 +7,7 @@
#ifdef WINDOWS
#include <stdio.h>
#define FILE_SEP_CHAR "\\"
+#include "getline.h"
#else
#define FILE_SEP_CHAR "/"
#endif
@@ -23,17 +24,25 @@ char *g_win32_getlocale (void);
#endif
// conversion routines to and from UTF-8
-bool wSystemToUTF8(const char *inString, char *outString, unsigned outStringLength);
-bool wUTF8ToSystem(const char *inString, char *outString, unsigned outStringLength);
+bool wSystemToUTF8(const char *inString, char *outString,
+ unsigned outStringLength);
+bool wUTF8ToSystem(const char *inString, char *outString,
+ unsigned outStringLength);
bool wIsUTF8(const char * string);
/*
* Interface types
*/
+// a big integer
typedef long wInteger_t;
-typedef int wPos_t;
+// Position/Size of objects drawn on a WDraw canvas (fractional pixels)
+typedef double wDrawPix_t;
+// Position/Size of controls/windows (integral pixels)
+typedef long wWinPix_t;
+// Boolean
typedef int wBool_t;
+// index for lists etc
typedef int wIndex_t;
/*
@@ -68,7 +77,7 @@ typedef int wDrawColor;
typedef struct {
const char * name;
const char * value;
- } wBalloonHelp_t;
+} wBalloonHelp_t;
extern long debugWindow;
extern long wDebugFont;
@@ -78,8 +87,10 @@ extern long wDebugFont;
* Bitmap Controls bitmap.c
*/
-wControl_p wBitmapCreate(wWin_p parent, wPos_t x, wPos_t y, long options, wIcon_p iconP);
-wIcon_p wIconCreateBitMap(wPos_t w, wPos_t h, const char *bits, wDrawColor color);
+wControl_p wBitmapCreate(wWin_p parent, wWinPix_t x, wWinPix_t y, long options,
+ const struct wIcon_t * iconP);
+wIcon_p wIconCreateBitMap(wWinPix_t w, wWinPix_t h, const char *bits,
+ wDrawColor color);
wIcon_p wIconCreatePixMap(char *pm[]);
void wIconSetColor(wIcon_p ip, wDrawColor color);
@@ -97,12 +108,15 @@ typedef enum {
wBoxThickB,
wBoxThickW,
wBoxRidge,
- wBoxTrough }
- wBoxType_e;
+ wBoxTrough
+}
+wBoxType_e;
-void wBoxSetSize(wBox_p b, wPos_t w, wPos_t h);
-void wlibDrawBox(wWin_p win, wBoxType_e style, wPos_t x, wPos_t y, wPos_t w, wPos_t h);
-wBox_p wBoxCreate(wWin_p parent, wPos_t bx, wPos_t by, const char *labelStr, wBoxType_e boxTyp, wPos_t bw, wPos_t bh);
+void wBoxSetSize(wBox_p b, wWinPix_t w, wWinPix_t h);
+void wlibDrawBox(wWin_p win, wBoxType_e style, wWinPix_t x, wWinPix_t y,
+ wWinPix_t w, wWinPix_t h);
+wBox_p wBoxCreate(wWin_p parent, wWinPix_t bx, wWinPix_t by,
+ const char *labelStr, wBoxType_e boxTyp, wWinPix_t bw, wWinPix_t bh);
/*------------------------------------------------------------------------------
*
@@ -129,13 +143,19 @@ typedef void (*wChoiceCallBack_p)( long, void * );
void wButtonSetLabel(wButton_p bb, const char *labelStr);
void wButtonSetBusy(wButton_p bb, int value);
-wButton_p wButtonCreate(wWin_p parent, wPos_t x, wPos_t y, const char *helpStr, const char *labelStr, long option, wPos_t width, wButtonCallBack_p action, void *data);
+wButton_p wButtonCreate(wWin_p parent, wWinPix_t x, wWinPix_t y,
+ const char *helpStr, const char *labelStr, long option, wWinPix_t width,
+ wButtonCallBack_p action, void *data);
void wRadioSetValue(wChoice_p bc, long value);
long wRadioGetValue(wChoice_p bc);
void wToggleSetValue(wChoice_p bc, long value);
long wToggleGetValue(wChoice_p b);
-wChoice_p wRadioCreate(wWin_p parent, wPos_t x, wPos_t y, const char *helpStr, const char *labelStr, long option, const char **labels, long *valueP, wChoiceCallBack_p action, void *data);
-wChoice_p wToggleCreate(wWin_p parent, wPos_t x, wPos_t y, const char *helpStr, const char *labelStr, long option, const char **labels, long *valueP, wChoiceCallBack_p action, void *data);
+wChoice_p wRadioCreate(wWin_p parent, wWinPix_t x, wWinPix_t y,
+ const char *helpStr, const char *labelStr, long option,
+ const char * const *labels, long *valueP, wChoiceCallBack_p action, void *data);
+wChoice_p wToggleCreate(wWin_p parent, wWinPix_t x, wWinPix_t y,
+ const char *helpStr, const char *labelStr, long option,
+ const char * const *labels, long *valueP, wChoiceCallBack_p action, void *data);
/*------------------------------------------------------------------------------
@@ -160,7 +180,8 @@ void wHelp( const char * );
#define NT_WARNING 2
#define NT_ERROR 4
-wBool_t wNoticeEx( int type, const char * msg, const char * yes, const char * no );
+wBool_t wNoticeEx( int type, const char * msg, const char * yes,
+ const char * no );
unsigned wOpenFileExternal(char *filename);
@@ -179,19 +200,20 @@ unsigned long wGetTimer( void );
void wExit( int );
typedef enum { wCursorNormal,
- wCursorNone,
- wCursorAppStart,
- wCursorHand,
- wCursorNo,
- wCursorSizeAll,
- wCursorSizeNESW,
- wCursorSizeNS,
- wCursorSizeNWSE,
- wCursorSizeWE,
- wCursorWait,
- wCursorIBeam,
- wCursorCross,
- wCursorQuestion } wCursor_t;
+ wCursorNone,
+ wCursorAppStart,
+ wCursorHand,
+ wCursorNo,
+ wCursorSizeAll,
+ wCursorSizeNESW,
+ wCursorSizeNS,
+ wCursorSizeNWSE,
+ wCursorSizeWE,
+ wCursorWait,
+ wCursorIBeam,
+ wCursorCross,
+ wCursorQuestion
+ } wCursor_t;
void wSetCursor( wDraw_p, wCursor_t );
#define defaultCursor wCursorCross
@@ -202,12 +224,13 @@ const char * wMemStats( void );
#define WKEY_ALT (1<<3)
int wGetKeyState( void );
-void wGetDisplaySize( wPos_t*, wPos_t* );
+void wGetDisplaySize( wWinPix_t*, wWinPix_t* );
-wIcon_p wIconCreateBitMap( wPos_t, wPos_t, const char * bits, wDrawColor );
+wIcon_p wIconCreateBitMap( wWinPix_t, wWinPix_t, const char * bits,
+ wDrawColor );
wIcon_p wIconCreatePixMap( char *[] );
void wIconSetColor( wIcon_p, wDrawColor );
-void wIconDraw( wDraw_p d, wIcon_p bm, wPos_t x, wPos_t y );
+void wIconDraw( wDraw_p d, wIcon_p bm, wWinPix_t x, wWinPix_t y );
void wConvertToCharSet( char *, int );
void wConvertFromCharSet( char *, int );
@@ -226,8 +249,9 @@ typedef enum {
wResize_e,
wState_e,
wQuit_e,
- wRedraw_e }
- winProcEvent;
+ wRedraw_e
+}
+winProcEvent;
typedef void (*wWinCallBack_p)( wWin_p, winProcEvent, void *, void * );
/* Creation Options */
@@ -246,10 +270,12 @@ typedef void (*wWinCallBack_p)( wWin_p, winProcEvent, void *, void * );
#define F_RESTRICT (1L<<15)
#define F_NOTTRANSIENT (1L<<16)
-wWin_p wWinMainCreate( const char *, wPos_t, wPos_t, const char *, const char *, const char *,
- long, wWinCallBack_p, void * );
-wWin_p wWinPopupCreate( wWin_p, wPos_t, wPos_t, const char *, const char *, const char *,
- long, wWinCallBack_p, void * );
+wWin_p wWinMainCreate( const char *, wWinPix_t, wWinPix_t, const char *,
+ const char *, const char *,
+ long, wWinCallBack_p, void * );
+wWin_p wWinPopupCreate( wWin_p, wWinPix_t, wWinPix_t, const char *,
+ const char *, const char *,
+ long, wWinCallBack_p, void * );
wWin_p wMain( int, char *[] );
void wWinSetBigIcon( wWin_p, wIcon_p );
@@ -257,17 +283,19 @@ void wWinSetSmallIcon( wWin_p, wIcon_p );
void wWinShow( wWin_p, wBool_t );
wBool_t wWinIsVisible( wWin_p );
wBool_t wWinIsMaximized( wWin_p win);
-void wWinGetSize ( wWin_p, wPos_t *, wPos_t * );
-void wWinSetSize( wWin_p, wPos_t, wPos_t );
+void wWinGetSize ( wWin_p, wWinPix_t *, wWinPix_t * );
+void wWinSetSize( wWin_p, wWinPix_t, wWinPix_t );
void wWinSetTitle( wWin_p, const char * );
void wWinSetBusy( wWin_p, wBool_t );
const char * wWinGetTitle( wWin_p );
-void wWinClear( wWin_p, wPos_t, wPos_t, wPos_t, wPos_t );
+void wWinClear( wWin_p, wWinPix_t, wWinPix_t, wWinPix_t, wWinPix_t );
void wMessage( wWin_p, const char *, wBool_t );
void wWinTop( wWin_p );
void wWinDoCancel( wWin_p );
void wWinBlockEnable( wBool_t );
-void wSetGeometry(wWin_p, int min_width, int max_width, int min_height, int max_height, int base_width, int base_height, double aspect_ratio);
+void wSetGeometry(wWin_p, wWinPix_t min_width, wWinPix_t max_width,
+ wWinPix_t min_height, wWinPix_t max_height, wWinPix_t base_width,
+ wWinPix_t base_height, double aspect_ratio);
int wCreateSplash( char *appName, char *appVer );
int wSetSplashInfo( char *msg );
@@ -284,20 +312,23 @@ void wDestroySplash( void );
#define BO_READONLY (1L<<2)
#define BO_NOTAB (1L<<8)
#define BO_BORDER (1L<<9)
-#define BO_ENTER (1L<<10)
+//#define BO_ENTER (1L<<10)
+#define BO_ENTER 0
+#define BO_REPEAT (1L<<11)
+#define BO_IGNFOCUS (1L<<12)
-wPos_t wLabelWidth( const char * );
+wWinPix_t wLabelWidth( const char * );
const char * wControlGetHelp( wControl_p );
void wControlSetHelp( wControl_p, const char * );
void wControlShow( wControl_p, wBool_t );
-wPos_t wControlGetWidth( wControl_p );
-wPos_t wControlGetHeight( wControl_p );
-wPos_t wControlGetPosX( wControl_p );
-wPos_t wControlGetPosY( wControl_p );
-void wControlSetPos( wControl_p, wPos_t, wPos_t );
+wWinPix_t wControlGetWidth( wControl_p );
+wWinPix_t wControlGetHeight( wControl_p );
+wWinPix_t wControlGetPosX( wControl_p );
+wWinPix_t wControlGetPosY( wControl_p );
+void wControlSetPos( wControl_p, wWinPix_t, wWinPix_t );
void wControlSetFocus( wControl_p );
void wControlActive( wControl_p, wBool_t );
-void wControlSetBalloon( wControl_p, wPos_t, wPos_t, const char * );
+void wControlSetBalloon( wControl_p, wWinPix_t, wWinPix_t, const char * );
void wControlSetLabel( wControl_p, const char * );
void wControlSetBalloonText( wControl_p, const char * );
void wControlSetContext( wControl_p, void * );
@@ -314,11 +345,12 @@ void wControlLinkedActive( wControl_p b, int active );
#define BS_TRIM (1<<12)
/* Creation CallBacks */
typedef void (*wStringCallBack_p)( const char *, void *);
-wString_p wStringCreate( wWin_p, wPos_t, wPos_t, const char *, const char *, long,
- wPos_t, char *, wIndex_t, wStringCallBack_p,
- void * );
+wString_p wStringCreate( wWin_p, wWinPix_t, wWinPix_t, const char *,
+ const char *, long,
+ wWinPix_t, char *, wIndex_t, wStringCallBack_p,
+ void * );
void wStringSetValue( wString_p, const char * );
-void wStringSetWidth( wString_p, wPos_t );
+void wStringSetWidth( wString_p, wWinPix_t );
const char * wStringGetValue( wString_p );
@@ -328,14 +360,16 @@ const char * wStringGetValue( wString_p );
*/
/* Creation CallBacks */
-typedef void (*wIntegerCallBack_p)( long, void * , int);
-typedef void (*wFloatCallBack_p)( double, void * , int);
-wInteger_p wIntegerCreate( wWin_p, wPos_t, wPos_t, const char *, const char *, long,
- wPos_t, wInteger_t, wInteger_t, wInteger_t *,
- wIntegerCallBack_p, void * );
-wFloat_p wFloatCreate( wWin_p, wPos_t, wPos_t, const char *, const char *, long,
- wPos_t, double, double, double *,
- wFloatCallBack_p, void * );
+typedef void (*wIntegerCallBack_p)( long, void *, int);
+typedef void (*wFloatCallBack_p)( double, void *, int);
+wInteger_p wIntegerCreate( wWin_p, wWinPix_t, wWinPix_t, const char *,
+ const char *, long,
+ wWinPix_t, wInteger_t, wInteger_t, wInteger_t *,
+ wIntegerCallBack_p, void * );
+wFloat_p wFloatCreate( wWin_p, wWinPix_t, wWinPix_t, const char *,
+ const char *, long,
+ wWinPix_t, double, double, double *,
+ wFloatCallBack_p, void * );
void wIntegerSetValue( wInteger_p, wInteger_t );
void wFloatSetValue( wFloat_p, double );
wInteger_t wIntegerGetValue( wInteger_p );
@@ -348,7 +382,8 @@ double wFloatGetValue( wFloat_p );
*/
/* Creation CallBacks */
-typedef void (*wListCallBack_p)( wIndex_t, const char *, wIndex_t, void *, void * );
+typedef void (*wListCallBack_p)( wIndex_t, const char *, wIndex_t, void *,
+ void * );
/* Creation Options */
#define BL_DUP (1L<<16)
@@ -364,12 +399,17 @@ typedef void (*wListCallBack_p)( wIndex_t, const char *, wIndex_t, void *, void
/* lists, droplists and combo boxes */
-wList_p wListCreate( wWin_p, wPos_t, wPos_t, const char *, const char *, long,
- long, wPos_t, int, wPos_t *, wBool_t *, const char **, long *, wListCallBack_p, void * );
-wList_p wDropListCreate( wWin_p, wPos_t, wPos_t, const char *, const char *, long,
- long, wPos_t, long *, wListCallBack_p, void * );
-
-wList_p wComboListCreate(wWin_p parent, wPos_t x, wPos_t y, const char *helpStr, const char *labelStr, long option, long number, wPos_t width, long *valueP, wListCallBack_p action, void *data);
+wList_p wListCreate( wWin_p, wWinPix_t, wWinPix_t, const char *, const char *,
+ long,
+ long, wWinPix_t, int, wWinPix_t *, wBool_t *, const char **, long *,
+ wListCallBack_p, void * );
+wList_p wDropListCreate( wWin_p, wWinPix_t, wWinPix_t, const char *,
+ const char *, long,
+ long, wWinPix_t, long *, wListCallBack_p, void * );
+
+wList_p wComboListCreate(wWin_p parent, wWinPix_t x, wWinPix_t y,
+ const char *helpStr, const char *labelStr, long option, long number,
+ wWinPix_t width, long *valueP, wListCallBack_p action, void *data);
void wListClear(wList_p b);
void wListSetIndex(wList_p b, int element);
wIndex_t wListFindValue(wList_p b, const char *val);
@@ -379,11 +419,13 @@ void *wListGetItemContext(wList_p b, wIndex_t inx);
wBool_t wListGetItemSelected(wList_p b, wIndex_t inx);
wIndex_t wListGetSelectedCount(wList_p b);
void wListSelectAll(wList_p bl);
-wBool_t wListSetValues(wList_p b, wIndex_t row, const char *labelStr, wIcon_p bm, void *itemData);
+wBool_t wListSetValues(wList_p b, wIndex_t row, const char *labelStr,
+ wIcon_p bm, void *itemData);
void wListDelete(wList_p b, wIndex_t inx);
-int wListGetColumnWidths(wList_p bl, int colCnt, wPos_t *colWidths);
-wIndex_t wListAddValue(wList_p b, const char *labelStr, wIcon_p bm, void *itemData);
-void wListSetSize(wList_p bl, wPos_t w, wPos_t h);
+int wListGetColumnWidths(wList_p bl, int colCnt, wWinPix_t *colWidths);
+wIndex_t wListAddValue(wList_p b, const char *labelStr, wIcon_p bm,
+ void *itemData);
+void wListSetSize(wList_p bl, wWinPix_t w, wWinPix_t h);
wIndex_t wListGetValues( wList_p, char *, int, void * *, void * * );
/** \todo Check for the existance of following functions */
@@ -404,13 +446,13 @@ void wListSetEditable( wList_p, wBool_t );
#define wMessageSetFont( x ) ( x & (BM_LARGE | BM_SMALL ))
#define wMessageCreate( w, p1, p2, l, p3, m ) wMessageCreateEx( w, p1, p2, l, p3, m, 0 )
-wMessage_p wMessageCreateEx( wWin_p, wPos_t, wPos_t, const char *,
- wPos_t, const char *, long );
+wMessage_p wMessageCreateEx( wWin_p, wWinPix_t, wWinPix_t, const char *,
+ wWinPix_t, const char *, long );
void wMessageSetValue( wMessage_p, const char * );
-void wMessageSetWidth( wMessage_p, wPos_t );
-wPos_t wMessageGetWidth( const char *testString );
-wPos_t wMessageGetHeight( long );
+void wMessageSetWidth( wMessage_p, wWinPix_t );
+wWinPix_t wMessageGetWidth( const char *testString );
+wWinPix_t wMessageGetHeight( long );
/*------------------------------------------------------------------------------
@@ -422,7 +464,7 @@ typedef struct {
int width;
int x0, y0;
int x1, y1;
- } wLines_t, * wLines_p;
+} wLines_t, * wLines_p;
wLine_p wLineCreate( wWin_p, const char *, int, wLines_t *);
@@ -439,8 +481,9 @@ wLine_p wLineCreate( wWin_p, const char *, int, wLines_t *);
#define BT_DOBOLD (1L<<21)
#define BT_TOP (1L<<20) /* Show the top of the text */
-wText_p wTextCreate( wWin_p, wPos_t, wPos_t, const char *, const char *, long,
- wPos_t, wPos_t );
+wText_p wTextCreate( wWin_p, wWinPix_t, wWinPix_t, const char *, const char *,
+ long,
+ wWinPix_t, wWinPix_t );
void wTextClear( wText_p );
void wTextAppend( wText_p, const char * );
void wTextSetReadonly( wText_p, wBool_t );
@@ -450,8 +493,9 @@ wBool_t wTextGetModified( wText_p );
void wTextReadFile( wText_p, const char * );
wBool_t wTextSave( wText_p, const char * );
wBool_t wTextPrint( wText_p );
-void wTextSetSize( wText_p, wPos_t, wPos_t );
-void wTextComputeSize( wText_p, int, int, wPos_t *, wPos_t * );
+void wTextSetSize( wText_p, wWinPix_t, wWinPix_t );
+void wTextComputeSize( wText_p, wWinPix_t, wWinPix_t, wWinPix_t *,
+ wWinPix_t * );
void wTextSetPosition( wText_p bt, int pos );
@@ -483,14 +527,16 @@ typedef enum {
wDrawLineDashDot,
wDrawLineDashDotDot,
wDrawLineCenter,
- wDrawLinePhantom}
- wDrawLineType_e;
+ wDrawLinePhantom
+}
+wDrawLineType_e;
typedef enum {
wPolyLineStraight,
wPolyLineSmooth,
- wPolyLineRound}
- wPolyLine_e;
+ wPolyLineRound
+}
+wPolyLine_e;
typedef int wAction_t;
#define wActionMove (1)
@@ -510,7 +556,10 @@ typedef int wAction_t;
#define wActionScrollDown (15)
#define wActionScrollLeft (16)
#define wActionScrollRight (17)
-#define wActionLast wActionScrollRight
+#define wActionMDown (18)
+#define wActionMDrag (19)
+#define wActionMUp (20)
+#define wActionLast wActionMUp
#define wRGB(R,G,B)\
@@ -518,8 +567,9 @@ typedef int wAction_t;
/* Creation CallBacks */
-typedef void (*wDrawRedrawCallBack_p)( wDraw_p, void *, wPos_t, wPos_t );
-typedef void (*wDrawActionCallBack_p)( wDraw_p, void*, wAction_t, wPos_t, wPos_t );
+typedef void (*wDrawRedrawCallBack_p)( wDraw_p, void *, wWinPix_t, wWinPix_t );
+typedef void (*wDrawActionCallBack_p)( wDraw_p, void*, wAction_t, wDrawPix_t,
+ wDrawPix_t );
/* Creation Options */
#define BD_TICKS (1L<<25)
@@ -529,38 +579,44 @@ typedef void (*wDrawActionCallBack_p)( wDraw_p, void*, wAction_t, wPos_t, wPos_t
#define BD_MODKEYS (1L<<29)
/* Create: */
-wDraw_p wDrawCreate( wWin_p, wPos_t, wPos_t, const char *, long,
- wPos_t, wPos_t, void *,
- wDrawRedrawCallBack_p, wDrawActionCallBack_p );
+wDraw_p wDrawCreate( wWin_p, wWinPix_t, wWinPix_t, const char *, long,
+ wWinPix_t, wWinPix_t, void *,
+ wDrawRedrawCallBack_p, wDrawActionCallBack_p );
/* Draw: */
-void wDrawLine( wDraw_p, wPos_t, wPos_t, wPos_t, wPos_t,
- wDrawWidth, wDrawLineType_e, wDrawColor,
- wDrawOpts );
+void wDrawLine( wDraw_p, wDrawPix_t, wDrawPix_t, wDrawPix_t, wDrawPix_t,
+ wDrawWidth, wDrawLineType_e, wDrawColor,
+ wDrawOpts );
#define double2wAngle_t( A ) (A)
typedef double wAngle_t;
-void wDrawArc( wDraw_p, wPos_t, wPos_t, wPos_t, wAngle_t, wAngle_t,
- int, wDrawWidth, wDrawLineType_e, wDrawColor,
- wDrawOpts );
-void wDrawPoint( wDraw_p, wPos_t, wPos_t, wDrawColor, wDrawOpts );
+void wDrawArc( wDraw_p, wDrawPix_t, wDrawPix_t, wDrawPix_t, wAngle_t,
+ wAngle_t,
+ int, wDrawWidth, wDrawLineType_e, wDrawColor,
+ wDrawOpts );
+void wDrawPoint( wDraw_p, wDrawPix_t, wDrawPix_t, wDrawColor, wDrawOpts );
#define double2wFontSize_t( FS ) (FS)
typedef double wFontSize_t;
-void wDrawString( wDraw_p, wPos_t, wPos_t, wAngle_t, const char *, wFont_p,
- wFontSize_t, wDrawColor, wDrawOpts );
-void wDrawFilledRectangle( wDraw_p, wPos_t, wPos_t, wPos_t, wPos_t,
- wDrawColor, wDrawOpts );
-void wDrawPolygon( wDraw_p, wPos_t [][2], wPolyLine_e [], wIndex_t, wDrawColor, wDrawWidth, wDrawLineType_e,
- wDrawOpts, int, int );
-void wDrawFilledCircle( wDraw_p, wPos_t, wPos_t, wPos_t, wDrawColor, wDrawOpts );
-
-void wDrawGetTextSize( wPos_t *, wPos_t *, wPos_t *, wPos_t *, wDraw_p, const char *, wFont_p,
- wFontSize_t );
+void wDrawString( wDraw_p, wDrawPix_t, wDrawPix_t, wAngle_t, const char *,
+ wFont_p,
+ wFontSize_t, wDrawColor, wDrawOpts );
+void wDrawFilledRectangle( wDraw_p, wDrawPix_t, wDrawPix_t, wDrawPix_t,
+ wDrawPix_t,
+ wDrawColor, wDrawOpts );
+void wDrawPolygon( wDraw_p, wDrawPix_t [][2], wPolyLine_e [], wIndex_t,
+ wDrawColor, wDrawWidth, wDrawLineType_e,
+ wDrawOpts, int, int );
+void wDrawFilledCircle( wDraw_p, wDrawPix_t, wDrawPix_t, wDrawPix_t,
+ wDrawColor, wDrawOpts );
+
+void wDrawGetTextSize( wDrawPix_t *, wDrawPix_t *, wDrawPix_t *, wDrawPix_t *,
+ wDraw_p, const char *, wFont_p,
+ wFontSize_t );
void wDrawClear( wDraw_p );
void wDrawClearTemp( wDraw_p );
wBool_t wDrawSetTempMode( wDraw_p, wBool_t );
void wDrawDelayUpdate( wDraw_p, wBool_t );
-void wDrawClip( wDraw_p, wPos_t, wPos_t, wPos_t, wPos_t );
+void wDrawClip( wDraw_p, wDrawPix_t, wDrawPix_t, wDrawPix_t, wDrawPix_t );
wDrawColor wDrawColorGray( int );
wDrawColor wDrawFindColor( long );
long wDrawGetRGB( wDrawColor );
@@ -568,15 +624,16 @@ long wDrawGetRGB( wDrawColor );
/* Geometry */
double wDrawGetDPI( wDraw_p );
double wDrawGetMaxRadius( wDraw_p );
-void wDrawSetSize( wDraw_p, wPos_t, wPos_t, void * );
-void wDrawGetSize( wDraw_p, wPos_t *, wPos_t * );
+void wDrawSetSize( wDraw_p, wWinPix_t, wWinPix_t, void * );
+void wDrawGetSize( wDraw_p, wWinPix_t *, wWinPix_t * );
/* Bitmaps */
-wDrawBitMap_p wDrawBitMapCreate( wDraw_p, int, int, int, int, const unsigned char * );
-void wDrawBitMap( wDraw_p, wDrawBitMap_p, wPos_t, wPos_t,
- wDrawColor, wDrawOpts );
+wDrawBitMap_p wDrawBitMapCreate( wDraw_p, int, int, int, int,
+ const unsigned char * );
+void wDrawBitMap( wDraw_p, wDrawBitMap_p, wDrawPix_t, wDrawPix_t,
+ wDrawColor, wDrawOpts );
-wDraw_p wBitMapCreate( wPos_t, wPos_t, int );
+wDraw_p wBitMapCreate( wWinPix_t, wWinPix_t, int );
wBool_t wBitMapDelete( wDraw_p );
wBool_t wBitMapWriteFile( wDraw_p, const char * );
@@ -585,7 +642,9 @@ void * wDrawGetContext( wDraw_p );
void wDrawSaveImage( wDraw_p );
void wDrawRestoreImage( wDraw_p );
int wDrawSetBackground( wDraw_p, char * path, char ** error);
-void wDrawShowBackground( wDraw_p, wPos_t pos_x, wPos_t pos_y, wPos_t width, wAngle_t angle, int screen);
+void wDrawCloneBackground(wDraw_p from, wDraw_p to);
+void wDrawShowBackground( wDraw_p, wWinPix_t pos_x, wWinPix_t pos_y,
+ wWinPix_t width, wAngle_t angle, int screen);
/*------------------------------------------------------------------------------
*
@@ -594,7 +653,7 @@ void wDrawShowBackground( wDraw_p, wPos_t pos_x, wPos_t pos_y, wPos_t width, w
void wInitializeFonts();
void wSelectFont( const char * );
wFontSize_t wSelectedFontSize( void );
-void wSetSelectionFontSize(wFontSize_t);
+void wSetSelectedFontSize(wFontSize_t size);
#define F_TIMES (1)
#define F_HELV (2)
wFont_p wStandardFont( int, wBool_t, wBool_t );
@@ -616,7 +675,7 @@ wDraw_p wPrintPageStart( void );
wBool_t wPrintPageEnd( wDraw_p );
void wPrintDocEnd( void );
wBool_t wPrintQuit( void );
-void wPrintClip( wPos_t, wPos_t, wPos_t, wPos_t );
+void wPrintClip( wDrawPix_t, wDrawPix_t, wDrawPix_t, wDrawPix_t );
const char * wPrintGetName( void );
@@ -656,37 +715,40 @@ typedef enum {
wAccelKey_F10,
wAccelKey_F11,
wAccelKey_F12,
- wAccelKey_Numpad_Add,
- wAccelKey_Numpad_Subtract,
- wAccelKey_LineFeed }
- wAccelKey_e;
+ wAccelKey_Numpad_Add,
+ wAccelKey_Numpad_Subtract,
+ wAccelKey_LineFeed
+}
+wAccelKey_e;
typedef enum {
wModKey_None,
wModKey_Alt,
wModKey_Shift,
- wModKey_Ctrl }
- wModKey_e;
+ wModKey_Ctrl
+}
+wModKey_e;
void wDoAccelHelp( wAccelKey_e key, void * );
/* Creation CallBacks */
typedef void (*wMenuCallBack_p)( void * );
typedef void (*wMenuListCallBack_p)( int, const char *, void * );
-typedef void (*wMenuToggleCallBack_p)( wBool_t , void * );
+typedef void (*wMenuCallBack_p)( void * );
typedef void (*wAccelKeyCallBack_p)( wAccelKey_e, void * );
typedef void (*wMenuTraceCallBack_p)( wMenu_p, const char *, void * );
/* Creation Options */
#define BM_ICON (1L<<0)
-wMenu_p wMenuCreate( wWin_p, wPos_t, wPos_t, const char *, const char *, long );
+wMenu_p wMenuCreate( wWin_p, wWinPix_t, wWinPix_t, const char *, const char *,
+ long );
wMenu_p wMenuBarAdd( wWin_p, const char *, const char * );
wMenuPush_p wMenuPushCreate( wMenu_p, const char *, const char *, long,
- wMenuCallBack_p, void * );
+ wMenuCallBack_p, void * );
wMenuRadio_p wMenuRadioCreate( wMenu_p, const char *, const char *, long,
- wMenuCallBack_p, void * );
+ wMenuCallBack_p, void * );
wMenu_p wMenuMenuCreate( wMenu_p, const char *, const char * );
wMenu_p wMenuPopupCreate( wWin_p, const char * );
@@ -699,7 +761,8 @@ void wMenuListDelete( wMenuList_p, const char * );
const char * wMenuListGet( wMenuList_p, int, void ** );
void wMenuListClear( wMenuList_p );
-wMenuToggle_p wMenuToggleCreate( wMenu_p, const char *, const char *, long, wBool_t, wMenuToggleCallBack_p, void * );
+wMenuToggle_p wMenuToggleCreate( wMenu_p, const char *, const char *, long,
+ wBool_t, wMenuCallBack_p, void * );
wBool_t wMenuToggleSet( wMenuToggle_p, wBool_t );
wBool_t wMenuToggleGet( wMenuToggle_p );
void wMenuToggleEnable( wMenuToggle_p, wBool_t );
@@ -725,11 +788,13 @@ struct wFilSel_t;
typedef enum {
FS_SAVE,
FS_LOAD,
- FS_UPDATE }
- wFilSelMode_e;
+ FS_UPDATE
+}
+wFilSelMode_e;
typedef int (*wFilSelCallBack_p)( int files, char ** fileName, void * );
-struct wFilSel_t * wFilSelCreate(wWin_p, wFilSelMode_e, int, const char *, const char *,
- wFilSelCallBack_p, void * );
+struct wFilSel_t * wFilSelCreate(wWin_p, wFilSelMode_e, int, const char *,
+ const char *,
+ wFilSelCallBack_p, void * );
int wFilSelect( struct wFilSel_t *, const char * );
@@ -741,8 +806,9 @@ int wFilSelect( struct wFilSel_t *, const char * );
typedef void (*wColorSelectButtonCallBack_p)( void *, wDrawColor );
wBool_t wColorSelect( const char *, wDrawColor * );
-wButton_p wColorSelectButtonCreate( wWin_p, wPos_t, wPos_t, const char *, const char *,
- long, wPos_t, wDrawColor *, wColorSelectButtonCallBack_p, void * );
+wButton_p wColorSelectButtonCreate( wWin_p, wWinPix_t, wWinPix_t, const char *,
+ const char *,
+ long, wWinPix_t, wDrawColor *, wColorSelectButtonCallBack_p, void * );
void wColorSelectButtonSetColor( wButton_p, wDrawColor );
wDrawColor wColorSelectButtonGetColor( wButton_p );
@@ -756,21 +822,33 @@ char * wPrefGetString(const char *section, const char *name);
char * wPrefGetStringBasic( const char *section, const char *name );
char * wPrefGetStringExt(const char *section, const char *name);
+void wPrefsLoad(char * name);
+
void wPrefSetInteger(const char *, const char *, long );
-wBool_t wPrefGetInteger(const char *section, const char *name, long *result, long defaultValue);
-wBool_t wPrefGetIntegerBasic(const char *section, const char *name, long *result, long defaultValue);
-wBool_t wPrefGetIntegerExt(const char *section, const char *name, long *result, long defaultValue);
+wBool_t wPrefGetInteger(const char *section, const char *name, long *result,
+ long defaultValue);
+wBool_t wPrefGetIntegerBasic(const char *section, const char *name,
+ long *result, long defaultValue);
+wBool_t wPrefGetIntegerExt(const char *section, const char *name, long *result,
+ long defaultValue);
void wPrefSetFloat( const char *, const char *, double );
-wBool_t wPrefGetFloat(const char *section, const char *name, double *result, double defaultValue);
-wBool_t wPrefGetFloatBasic(const char *section, const char *name, double *result, double defaultValue);
-wBool_t wPrefGetFloatExt(const char *section, const char *name, double *result, double defaultValue);
-
-const char * wPrefGetSectionItem( const char * sectionName, wIndex_t * index, const char ** name );
-void wPrefFlush( void );
-void wPrefReset( void );
-
-void CleanupCustom( void );
+wBool_t wPrefGetFloat(const char *section, const char *name, double *result,
+ double defaultValue);
+wBool_t wPrefGetFloatBasic(const char *section, const char *name,
+ double *result, double defaultValue);
+wBool_t wPrefGetFloatExt(const char *section, const char *name, double *result,
+ double defaultValue);
+
+//const char * wPrefGetSectionItem( const char * sectionName, wIndex_t * index,
+// const char ** name );
+void wPrefFlush( char * name);
+void wPrefReset( void );
+void wPrefTokenize(char* line, char** section, char** name, char** value);
+void wPrefFormatLine(const char* section, const char* name,
+ const char* value, char* result);
+
+//void CleanupCustom( void );
/*------------------------------------------------------------------------------
*
@@ -778,18 +856,30 @@ void CleanupCustom( void );
*/
wStatus_p wStatusCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * labelStr,
- wPos_t width,
- const char *message );
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * labelStr,
+ wWinPix_t width,
+ const char *message );
-wPos_t wStatusGetWidth(const char *testString);
-wPos_t wStatusGetHeight(long flags);
+wWinPix_t wStatusGetWidth(const char *testString);
+wWinPix_t wStatusGetHeight(long flags);
void wStatusSetValue(wStatus_p b, const char * arg);
-void wStatusSetWidth(wStatus_p b, wPos_t width);
+void wStatusSetWidth(wStatus_p b, wWinPix_t width);
+
+/*------------------------------------------------------------------------------
+ *
+ * System-Information
+ */
+
+char* wGetTempPath(void);
+char* wGetOSVersion(void);
+char* wGetProfileFilename(void);
+char* wGetUserID(void);
+const char* wGetUserHomeRootDir(void);
+const char *wGetPlatformVersion(void);
/*-------------------------------------------------------------------------------
* User Preferences
@@ -797,4 +887,7 @@ void wStatusSetWidth(wStatus_p b, wPos_t width);
#define PREFSECTION "Preference"
#define LARGEICON "LargeIcons"
+#define DPISET "ScreenDPI"
+#define PRINTSCALE "PrintScale"
+#define PRINTTEXTSCALE "PrintTextScale"
#endif
diff --git a/app/wlib/mswlib/CMakeLists.txt b/app/wlib/mswlib/CMakeLists.txt
index 07558f9..1d8464a 100644
--- a/app/wlib/mswlib/CMakeLists.txt
+++ b/app/wlib/mswlib/CMakeLists.txt
@@ -1,50 +1,57 @@
-find_package(FreeImage REQUIRED)
-
-FILE(GLOB HEADERS *.h)
-
-SET(SOURCES
- backgnd.c
- getopt.c
- mswbox.c
- mswbutt.c
- mswbitmap.c
- mswchoic.c
- mswcolor.c
- mswdraw.c
- mswedit.c
- mswlines.c
- mswlist.c
- mswmenu.c
- mswmisc.c
- mswmsg.c
- mswpref.c
- mswprint.c
- mswsplash.c
- mswstatus.c
- mswtext.c
- gwin32.c
- simple-gettext.c
- utf8conv.c
+#
+# build the Win32 variant of the wlib
+#
+
+
+
+if(XTRKCAD_USE_GETTEXT)
+ if(WIN32)
+ add_definitions(-DUSE_SIMPLE_GETTEXT )
+ endif(WIN32)
+endif(XTRKCAD_USE_GETTEXT)
+
+target_sources(xtrkcad-wlib
+ PRIVATE
+ backgnd.c
+ getopt.c
+ mswbox.c
+ mswbutt.c
+ mswbitmap.c
+ mswchoic.c
+ mswcolor.c
+ mswdraw.c
+ mswedit.c
+ mswlines.c
+ mswlist.c
+ mswmenu.c
+ mswmisc.c
+ mswmsg.c
+ mswpref.c
+ mswprint.c
+ mswsplash.c
+ mswstatus.c
+ mswtext.c
+ gwin32.c
+ simple-gettext.c
+ sysinfo.c
+ utf8conv.c
+ mswint.h
+ dynarr.h
+ getline/getline.c
)
-include_directories(${FREEIMAGE_INCLUDE_PATH})
-INCLUDE_DIRECTORIES(${XTrkCAD_BINARY_DIR})
-
-IF(XTRKCAD_USE_GETTEXT)
- IF(WIN32)
- ADD_DEFINITIONS(-DUSE_SIMPLE_GETTEXT )
- ENDIF(WIN32)
-ENDIF(XTRKCAD_USE_GETTEXT)
-
-ADD_LIBRARY(xtrkcad-wlib ${HEADERS} ${SOURCES})
-
-TARGET_LINK_LIBRARIES(xtrkcad-wlib Htmlhelp msimg32 shlwapi)
-target_link_libraries(xtrkcad-wlib ${FREEIMAGE_LIBRARY})
+target_link_libraries(xtrkcad-wlib
+ PRIVATE
+ Htmlhelp
+ msimg32
+ shlwapi
+ FreeImage::FreeImage
+)
install(FILES
${FREEIMAGE_SHAREDLIB}
DESTINATION ${XTRKCAD_BIN_INSTALL_DIR}
- )
+)
if(XTRKCAD_TESTING AND CMOCKA_FOUND)
add_subdirectory( unittest )
diff --git a/app/wlib/mswlib/backgnd.c b/app/wlib/mswlib/backgnd.c
index d35f19a..f10e0f0 100644
--- a/app/wlib/mswlib/backgnd.c
+++ b/app/wlib/mswlib/backgnd.c
@@ -17,7 +17,7 @@
*
* 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.
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <windows.h>
@@ -29,192 +29,215 @@
static char *lastErrorMessage; /**< store last message from FreeImage */
#define ERRORPUNCTUATION " : "
-/**
- * FreeImage error handler
- * \param fif Format / Plugin responsible for the error
- * \param message Error message
+/**
+ * FreeImage error handler
+ * \param fif Format / Plugin responsible for the error
+ * \param message Error message
*/
-static void
-HandleFreeImageError(FREE_IMAGE_FORMAT fif, const char *message)
-{
- unsigned totalLength = strlen(message) + 1;
-
- if (fif != FIF_UNKNOWN) {
- totalLength += strlen(FreeImage_GetFormatFromFIF(fif)) + strlen(ERRORPUNCTUATION);
- }
-
- lastErrorMessage = malloc(totalLength);
-
- if (fif != FIF_UNKNOWN) {
- sprintf(lastErrorMessage,
- "%s" ERRORPUNCTUATION "%s",
- FreeImage_GetFormatFromFIF(fif),
- message);
- } else {
- strcpy(lastErrorMessage, message);
- }
+static void
+HandleFreeImageError( FREE_IMAGE_FORMAT fif, const char *message )
+{
+ size_t totalLength = strlen( message ) + 1;
+
+ if( fif != FIF_UNKNOWN ) {
+ totalLength += strlen( FreeImage_GetFormatFromFIF( fif ) ) + strlen(
+ ERRORPUNCTUATION );
+ }
+
+ lastErrorMessage = malloc( totalLength );
+
+ if( fif != FIF_UNKNOWN ) {
+ sprintf( lastErrorMessage,
+ "%s" ERRORPUNCTUATION "%s",
+ FreeImage_GetFormatFromFIF( fif ),
+ message );
+ } else {
+ strcpy( lastErrorMessage, message );
+ }
}
-/**
-* Load the background image
-* \param bd drawing context
-* \param path filename for image file, if NULL the existing background will be removed
-* \param error returned error message
-* \return -1 unsupported or invalid file, 0 success, 1 background removed
+/**
+* Load the background image
+* \param bd drawing context
+* \param path filename for image file, if NULL the existing background will be removed
+* \param error returned error message
+* \return -1 unsupported or invalid file, 0 success, 1 background removed
*/
int
-wDrawSetBackground(wDraw_p bd, char * path, char ** error)
+wDrawSetBackground( wDraw_p bd, char * path, char ** error )
{
- FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
+ FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
+
+ FreeImage_SetOutputMessage( HandleFreeImageError );
- FreeImage_SetOutputMessage(HandleFreeImageError);
-
- if (lastErrorMessage) {
- free(lastErrorMessage);
- lastErrorMessage = NULL;
+ if( lastErrorMessage ) {
+ free( lastErrorMessage );
+ lastErrorMessage = NULL;
}
- if (path) {
- // check the file signature and deduce its format
- // (the second argument is currently not used by FreeImage)
- fif = FreeImage_GetFileType(path, 0);
-
- if (fif == FIF_UNKNOWN) {
- // no signature ?
- // try to guess the file format from the file extension
- fif = FreeImage_GetFIFFromFilename(path);
- }
-
- // check that the plugin has reading capabilities ...
- if ((fif != FIF_UNKNOWN) && FreeImage_FIFSupportsReading(fif)) {
- // ok, let's load the file
- bd->background = FreeImage_Load(fif, path, 0);
-
- // unless a bad file format, we are done !
- if (!bd->background) {
- *error = lastErrorMessage;
- return (-1);
- } else {
- return (0);
- }
- } else {
- *error = strdup(_("Image file is invalid or cannot be read."));
- return (-1);
- }
- } else {
- if (bd->background) {
- FreeImage_Unload(bd->background);
- bd->background = 0;
- }
-
- return (1);
- }
+ if( path ) {
+ // check the file signature and deduce its format
+ // (the second argument is currently not used by FreeImage)
+ fif = FreeImage_GetFileType( path, 0 );
+
+ if( fif == FIF_UNKNOWN ) {
+ // no signature ?
+ // try to guess the file format from the file extension
+ fif = FreeImage_GetFIFFromFilename( path );
+ }
+
+ // check that the plugin has reading capabilities ...
+ if( ( fif != FIF_UNKNOWN ) && FreeImage_FIFSupportsReading( fif ) ) {
+ // ok, let's load the file
+ bd->background = FreeImage_Load( fif, path, 0 );
+
+ // unless a bad file format, we are done !
+ if( !bd->background ) {
+ *error = lastErrorMessage;
+ return ( -1 );
+ } else {
+ return ( 0 );
+ }
+ } else {
+ *error = _strdup( _( "Image file is invalid or cannot be read." ) );
+ return ( -1 );
+ }
+ } else {
+ if( bd->background ) {
+ FreeImage_Unload( bd->background );
+ bd->background = 0;
+ }
+
+ return ( 1 );
+ }
}
+/**
+ * Use a loaded background in another context.
+ *
+ * \param from context with background
+ * \param to context to get a reference to the existing background
+ */
-/**
-* Draw background to screen. The background will be sized and rotated before being shown. The bitmap
-* is scaled so that the width is equal to size. The height is changed proportionally.
-*
-* \param bd drawing context
-* \param pos_x, pos_y bitmap position
-* \param size desired width after scaling
-* \param angle
-* \param screen visibility of bitmap in percent
+void
+wDrawCloneBackground( wDraw_p from, wDraw_p to )
+{
+ if( from->background ) {
+ to->background = from->background;
+ } else {
+ to->background = NULL;
+ }
+}
+
+/**
+* Draw background to screen. The background will be sized and rotated before being shown. The bitmap
+* is scaled so that the width is equal to size. The height is changed proportionally.
+*
+* \param bd drawing context
+* \param pos_x, pos_y bitmap position
+* \param size desired width after scaling
+* \param angle
+* \param screen visibility of bitmap in percent
*/
void
-wDrawShowBackground(wDraw_p bd, wPos_t pos_x, wPos_t pos_y, wPos_t size,
- wAngle_t angle, int screen)
+wDrawShowBackground( wDraw_p bd, wWinPix_t pos_x, wWinPix_t pos_y,
+ wWinPix_t size,
+ wAngle_t angle, int screen )
{
- if (bd->background) {
- double scale;
- FIBITMAP *tmp;
- FIBITMAP *rotated;
-
- if (size == 0) {
- scale = 1.0;
- } else {
- scale = (double)size / FreeImage_GetWidth(bd->background);
- }
-
- tmp = FreeImage_RescaleRect(bd->background,
- (int)((double)FreeImage_GetWidth(bd->background) * scale),
- (int)((double)FreeImage_GetHeight(bd->background) * scale),
- 0,
- 0,
- FreeImage_GetWidth(bd->background),
- FreeImage_GetHeight(bd->background),
- FILTER_BILINEAR,
- 0);
- FreeImage_AdjustColors(tmp, screen, -screen, 1.0, FALSE);
- FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(tmp);
-
- switch (image_type) {
- case FIT_BITMAP:
- switch (FreeImage_GetBPP(tmp)) {
- case 8: {
- BYTE color = 255;
- rotated = FreeImage_Rotate(tmp, angle, &color);
- }
- break;
-
- case 24: // we could also use 'RGBTRIPLE color' here
- case 32: {
- RGBQUAD color = { 255, 255, 255, 0 };
- // for 24-bit images, the first 3 bytes will be read
- // for 32-bit images, the first 4 bytes will be read
- rotated = FreeImage_Rotate(tmp, angle, &color);
- }
- break;
- }
-
- break;
-
- case FIT_UINT16: {
- WORD color = 255;
- rotated = FreeImage_Rotate(tmp, angle, &color);
- }
- break;
-
- case FIT_RGB16: // we could also use 'FIRGB16 color' here
- case FIT_RGBA16: {
- FIRGBA16 color = { 255, 255, 255, 0 };
- // for RGB16 images, the first 3 WORD will be read
- // for RGBA16 images, the first 4 WORD will be read
- rotated = FreeImage_Rotate(tmp, angle, &color);
- }
- break;
-
- case FIT_FLOAT: {
- float color = 1.0F;
- rotated = FreeImage_Rotate(tmp, angle, &color);
- }
- break;
-
- case FIT_RGBF: // we could also use 'FIRGBF color' here
- case FIT_RGBAF: {
- FIRGBAF color = { 1, 1, 1, 0 };
- // for RGBF images, the first 3 float will be read
- // for RGBAF images, the first 4 float will be read
- rotated = FreeImage_Rotate(tmp, angle, &color);
- }
- break;
- }
-
- SetDIBitsToDevice(bd->hDc,
- pos_x,
- bd->h - pos_y - FreeImage_GetHeight(rotated),
- FreeImage_GetWidth(rotated),
- FreeImage_GetHeight(rotated),
- 0, 0,
- 0,
- FreeImage_GetHeight(rotated),
- FreeImage_GetBits(rotated),
- FreeImage_GetInfo(rotated),
- DIB_RGB_COLORS);
- FreeImage_Unload(tmp);
- FreeImage_Unload(rotated);
- }
-} \ No newline at end of file
+ if( bd->background ) {
+ double scale;
+ FIBITMAP *tmp;
+ FIBITMAP *rotated;
+
+ if( size == 0 ) {
+ scale = 1.0;
+ } else {
+ scale = ( double )size / FreeImage_GetWidth( bd->background );
+ }
+
+ tmp = FreeImage_RescaleRect( bd->background,
+ ( int )( ( double )FreeImage_GetWidth( bd->background ) * scale ),
+ ( int )( ( double )FreeImage_GetHeight( bd->background ) * scale ),
+ 0,
+ 0,
+ FreeImage_GetWidth( bd->background ),
+ FreeImage_GetHeight( bd->background ),
+ FILTER_BILINEAR,
+ 0 );
+
+ if( tmp == NULL ) {
+ return;
+ }
+
+ FreeImage_AdjustColors( tmp, screen, -screen, 1.0, FALSE );
+ FREE_IMAGE_TYPE image_type = FreeImage_GetImageType( tmp );
+
+ switch( image_type ) {
+ case FIT_BITMAP:
+ switch( FreeImage_GetBPP( tmp ) ) {
+ case 8: {
+ BYTE color = 255;
+ rotated = FreeImage_Rotate( tmp, angle, &color );
+ }
+ break;
+
+ case 24: // we could also use 'RGBTRIPLE color' here
+ case 32: {
+ RGBQUAD color = { 255, 255, 255, 0 };
+ // for 24-bit images, the first 3 bytes will be read
+ // for 32-bit images, the first 4 bytes will be read
+ rotated = FreeImage_Rotate( tmp, angle, &color );
+ }
+ break;
+ }
+
+ break;
+
+ case FIT_UINT16: {
+ WORD color = 255;
+ rotated = FreeImage_Rotate( tmp, angle, &color );
+ }
+ break;
+
+ case FIT_RGB16: // we could also use 'FIRGB16 color' here
+ case FIT_RGBA16: {
+ FIRGBA16 color = { 255, 255, 255, 0 };
+ // for RGB16 images, the first 3 WORD will be read
+ // for RGBA16 images, the first 4 WORD will be read
+ rotated = FreeImage_Rotate( tmp, angle, &color );
+ }
+ break;
+
+ case FIT_FLOAT: {
+ float color = 1.0F;
+ rotated = FreeImage_Rotate( tmp, angle, &color );
+ }
+ break;
+
+ case FIT_RGBF: // we could also use 'FIRGBF color' here
+ case FIT_RGBAF: {
+ FIRGBAF color = { 1, 1, 1, 0 };
+ // for RGBF images, the first 3 float will be read
+ // for RGBAF images, the first 4 float will be read
+ rotated = FreeImage_Rotate( tmp, angle, &color );
+ }
+ break;
+ }
+
+ SetDIBitsToDevice( bd->hDc,
+ pos_x,
+ bd->h - pos_y - FreeImage_GetHeight( rotated ),
+ FreeImage_GetWidth( rotated ),
+ FreeImage_GetHeight( rotated ),
+ 0, 0,
+ 0,
+ FreeImage_GetHeight( rotated ),
+ FreeImage_GetBits( rotated ),
+ FreeImage_GetInfo( rotated ),
+ DIB_RGB_COLORS );
+ FreeImage_Unload( tmp );
+ FreeImage_Unload( rotated );
+ }
+}
diff --git a/app/wlib/mswlib/checksum.c b/app/wlib/mswlib/checksum.c
index f19d15b..52d8453 100644
--- a/app/wlib/mswlib/checksum.c
+++ b/app/wlib/mswlib/checksum.c
@@ -20,15 +20,19 @@ int main( int argc, char *argv[] )
set = 0;
fp = openfile( argv[1], "rb", &FileSize );
}
- if (fp == NULL)
+ if (fp == NULL) {
exit(1);
-
+ }
+
fprintf( stderr, "File Size = %ld (%lx)\n", FileSize, FileSize );
sum16computed = mswCheck16( fp, FileSize, &sum16stored );
- if (!mswCheck32( fp, FileSize, &sum32off, &sum32computed, &sum32stored ))
+ if (!mswCheck32( fp, FileSize, &sum32off, &sum32computed, &sum32stored )) {
fprintf( stderr, "mswCheck32 error\n" );
- fprintf( stderr, "sum16: stored = %x, computed = %x, sum = %x, expected FFFF\n", sum16stored, sum16computed, sum16stored+sum16computed );
- fprintf( stderr, "sum32: stored = %lx, computed = %lx, expected %lx\n", sum32stored, sum32computed, sum32stored );
+ }
+ fprintf( stderr, "sum16: stored = %x, computed = %x, sum = %x, expected FFFF\n",
+ sum16stored, sum16computed, sum16stored+sum16computed );
+ fprintf( stderr, "sum32: stored = %lx, computed = %lx, expected %lx\n",
+ sum32stored, sum32computed, sum32stored );
if (set) {
fseek( fp, 0x12, SEEK_SET );
sum16computed = 0xFFFF - sum16computed;
diff --git a/app/wlib/mswlib/dynarr.h b/app/wlib/mswlib/dynarr.h
index 5bd7a8e..8c79933 100644
--- a/app/wlib/mswlib/dynarr.h
+++ b/app/wlib/mswlib/dynarr.h
@@ -1,8 +1,8 @@
typedef struct {
- int cnt;
- int max;
- void * ptr;
- } dynArr_t;
+ int cnt;
+ int max;
+ void * ptr;
+} dynArr_t;
#define DYNARR_APPEND(T,DA,INCR) \
{ if ((DA).cnt >= (DA).max) { \
@@ -31,10 +31,6 @@ typedef struct {
#ifdef WINDOWS
-#ifndef WIN32
-#define FAR _far
-#endif
-#define M_PI 3.14159
#define strcasecmp _stricmp
#else
#endif
diff --git a/app/wlib/mswlib/getline/LICENSE b/app/wlib/mswlib/getline/LICENSE
new file mode 100644
index 0000000..22df455
--- /dev/null
+++ b/app/wlib/mswlib/getline/LICENSE
@@ -0,0 +1,25 @@
+BSD 2-Clause License
+
+Copyright (c) 2022, Costantino Grana
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/app/wlib/mswlib/getline/README.md b/app/wlib/mswlib/getline/README.md
new file mode 100644
index 0000000..60f0dae
--- /dev/null
+++ b/app/wlib/mswlib/getline/README.md
@@ -0,0 +1,5 @@
+A POSIX getdelim() and getline() implementation for MSVC
+
+Tired of always having problems in reading arbitrary length lines from file under Windows, I tried to write a POSIX getdelim() and getline() implementation for MSVC. Let me know if you have any suggestion for improving this.
+
+This probably needs a test suite.
diff --git a/app/wlib/mswlib/getline/getline.c b/app/wlib/mswlib/getline/getline.c
new file mode 100644
index 0000000..202c7e2
--- /dev/null
+++ b/app/wlib/mswlib/getline/getline.c
@@ -0,0 +1,73 @@
+#include "getline.h"
+
+#include <stdlib.h>
+#include <errno.h>
+
+// MSVC specific implementation
+static void fseterr(FILE *fp)
+{
+ struct file { // Undocumented implementation detail
+ unsigned char *_ptr;
+ unsigned char *_base;
+ int _cnt;
+ int _flag;
+ int _file;
+ int _charbuf;
+ int _bufsiz;
+ };
+ #define _IOERR 0x10
+
+ ((struct file *)fp)->_flag |= _IOERR;
+}
+
+ssize_t getdelim(char **restrict lineptr, size_t *restrict n, int delim, FILE *restrict stream)
+{
+ if (lineptr == NULL || n == NULL || stream == NULL || (*lineptr == NULL && *n != 0)) {
+ errno = EINVAL;
+ return -1;
+ }
+ if (feof(stream) || ferror(stream)) {
+ return -1;
+ }
+
+ if (*lineptr == NULL) {
+ *n = 256;
+ *lineptr = malloc(*n);
+ if (*lineptr == NULL) {
+ fseterr(stream);
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+ ssize_t nread = 0;
+ int c = EOF;
+ while (c != delim) {
+ c = fgetc(stream);
+ if (c == EOF) {
+ break;
+ }
+ if (nread >= (ssize_t)(*n - 1)) {
+ size_t newn = *n * 2;
+ char *newptr = realloc(*lineptr, newn);
+ if (newptr == NULL) {
+ fseterr(stream);
+ errno = ENOMEM;
+ return -1;
+ }
+ *lineptr = newptr;
+ *n = newn;
+ }
+ (*lineptr)[nread++] = c;
+ }
+ if (c == EOF && nread == 0) {
+ return -1;
+ }
+ (*lineptr)[nread] = 0;
+ return nread;
+}
+
+ssize_t getline(char **restrict lineptr, size_t *restrict n, FILE *restrict stream)
+{
+ return getdelim(lineptr, n, '\n', stream);
+}
+
diff --git a/app/wlib/mswlib/getopt.c b/app/wlib/mswlib/getopt.c
index 888f5f8..48ffca9 100644
--- a/app/wlib/mswlib/getopt.c
+++ b/app/wlib/mswlib/getopt.c
@@ -20,7 +20,7 @@
You should have received a copy of the GNU General Public License
along with ASPEX; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
----------------------------------------------------------------------*/
@@ -39,49 +39,50 @@ int optind = 1, opterr, optopt;
int getopt(int argc, char *argv[], const char *optstring)
{
- static int pos = 0;
- char *str;
-
- if (pos == 0) {
- if ((optind >= argc) || (*argv[optind] != OPTCHAR))
- return EOF;
- pos = 1;
- if (argv[optind][pos] == '\0')
- return EOF;
- }
-
- str = strchr(optstring, argv[optind][pos]);
- if (str == NULL) {
- optopt = argv[optind][pos];
- if (opterr)
- fprintf(stderr, "%s: illegal option -- %c\n", argv[0],
- optopt);
- return '?';
- }
-
- if (str[1] == ':') {
- if (argv[optind][pos+1] != '\0') {
- optarg = &argv[optind][pos+1];
- return *str;
+ static int pos = 0;
+ char *str;
+
+ if (pos == 0) {
+ if ((optind >= argc) || (*argv[optind] != OPTCHAR)) {
+ return EOF;
+ }
+ pos = 1;
+ if (argv[optind][pos] == '\0') {
+ return EOF;
+ }
}
- optind++;
- if (optind >= argc) {
- optopt = *str;
- if (opterr)
- fprintf(stderr, "%s: option requires an argument -- %c\n",
- argv[0], optopt);
- return '?';
+
+ str = strchr(optstring, argv[optind][pos]);
+ if (str == NULL) {
+ optopt = argv[optind][pos];
+ if (opterr)
+ fprintf(stderr, "%s: illegal option -- %c\n", argv[0],
+ optopt);
+ return '?';
}
- optarg = argv[optind];
- optind++; pos = 0;
- return *str;
- }
- else {
- pos++;
- if (argv[optind][pos] == '\0') {
- optind++;
- pos = 0;
+
+ if (str[1] == ':') {
+ if (argv[optind][pos+1] != '\0') {
+ optarg = &argv[optind][pos+1];
+ return *str;
+ }
+ optind++;
+ if (optind >= argc) {
+ optopt = *str;
+ if (opterr)
+ fprintf(stderr, "%s: option requires an argument -- %c\n",
+ argv[0], optopt);
+ return '?';
+ }
+ optarg = argv[optind];
+ optind++; pos = 0;
+ return *str;
+ } else {
+ pos++;
+ if (argv[optind][pos] == '\0') {
+ optind++;
+ pos = 0;
+ }
+ return *str;
}
- return *str;
- }
}
diff --git a/app/wlib/mswlib/gwin32.c b/app/wlib/mswlib/gwin32.c
index 6b0c7f3..c537439 100644
--- a/app/wlib/mswlib/gwin32.c
+++ b/app/wlib/mswlib/gwin32.c
@@ -13,16 +13,15 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*
* Modified by the GLib Team and others 1997-2000. See the AUTHORS
* file for a list of people on the GLib Team. See the ChangeLog
* files for a list of changes. These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/.
+ * GLib at ftp://ftp.gtk.org/pub/gtk/.
*
* Ported to standard C by Martin Fischer 2009
*
@@ -40,7 +39,7 @@
#include <errno.h>
#include <ctype.h>
#if defined(_MSC_VER) || defined(__DMC__)
-# include <io.h>
+#include <io.h>
#endif /* _MSC_VER || __DMC__ */
#ifndef SUBLANG_SERBIAN_LATIN_BA
@@ -48,17 +47,17 @@
#endif
#if _MSC_VER > 1300
- #define stricmp _stricmp
- #define strnicmp _strnicmp
- #define strdup _strdup
+#define stricmp _stricmp
+#define strnicmp _strnicmp
+#define strdup _strdup
#endif
/**
- * This function gets the current thread locale from Windows - without any
+ * This function gets the current thread locale from Windows - without any
* encoding info - and returns it as a string of the above form for use in forming
* file names etc. The setlocale() function in the Microsoft C library uses locale
* names of the form "English_United States.1252" etc. We want the
- * UNIXish standard form "en_US", "zh_TW" etc. The returned string should be
+ * UNIXish standard form "en_US", "zh_TW" etc. The returned string should be
* deallocated with free().
*
* \return newly-allocated locale name.
@@ -67,80 +66,80 @@
char *
g_win32_getlocale (void)
{
- LCID lcid;
- LANGID langid;
- char *ev;
- char *loc;
- int primary, sub;
- char iso639[10];
- char iso3166[10];
- const char *script = NULL;
+ LCID lcid;
+ LANGID langid;
+ char *ev;
+ char *loc;
+ int primary, sub;
+ char iso639[10];
+ char iso3166[10];
+ const char *script = NULL;
- /* Let the user override the system settings through environment
- * variables, as on POSIX systems. Note that in GTK+ applications
- * since GTK+ 2.10.7 setting either LC_ALL or LANG also sets the
- * Win32 locale and C library locale through code in gtkmain.c.
- */
- if (((ev = getenv ("LC_ALL")) != NULL && ev[0] != '\0')
- || ((ev = getenv ("LC_MESSAGES")) != NULL && ev[0] != '\0')
- || ((ev = getenv ("LANG")) != NULL && ev[0] != '\0'))
- return strdup (ev);
+ /* Let the user override the system settings through environment
+ * variables, as on POSIX systems. Note that in GTK+ applications
+ * since GTK+ 2.10.7 setting either LC_ALL or LANG also sets the
+ * Win32 locale and C library locale through code in gtkmain.c.
+ */
+ if (((ev = getenv ("LC_ALL")) != NULL && ev[0] != '\0')
+ || ((ev = getenv ("LC_MESSAGES")) != NULL && ev[0] != '\0')
+ || ((ev = getenv ("LANG")) != NULL && ev[0] != '\0')) {
+ return strdup (ev);
+ }
- lcid = GetThreadLocale ();
+ lcid = GetThreadLocale ();
- if (!GetLocaleInfo (lcid, LOCALE_SISO639LANGNAME, iso639, sizeof (iso639)) ||
- !GetLocaleInfo (lcid, LOCALE_SISO3166CTRYNAME, iso3166, sizeof (iso3166)))
- return strdup ("C");
-
- /* Strip off the sorting rules, keep only the language part. */
- langid = LANGIDFROMLCID (lcid);
+ if (!GetLocaleInfo (lcid, LOCALE_SISO639LANGNAME, iso639, sizeof (iso639)) ||
+ !GetLocaleInfo (lcid, LOCALE_SISO3166CTRYNAME, iso3166, sizeof (iso3166))) {
+ return strdup ("C");
+ }
- /* Split into language and territory part. */
- primary = PRIMARYLANGID (langid);
- sub = SUBLANGID (langid);
+ /* Strip off the sorting rules, keep only the language part. */
+ langid = LANGIDFROMLCID (lcid);
- /* Handle special cases */
- switch (primary)
- {
- case LANG_AZERI:
- switch (sub)
- {
- case SUBLANG_AZERI_LATIN:
- script = "@Latn";
- break;
- case SUBLANG_AZERI_CYRILLIC:
- script = "@Cyrl";
- break;
- }
- break;
- case LANG_SERBIAN: /* LANG_CROATIAN == LANG_SERBIAN */
- switch (sub)
- {
- case SUBLANG_SERBIAN_LATIN:
- case 0x06: /* Serbian (Latin) - Bosnia and Herzegovina */
- script = "@Latn";
- break;
+ /* Split into language and territory part. */
+ primary = PRIMARYLANGID (langid);
+ sub = SUBLANGID (langid);
+
+ /* Handle special cases */
+ switch (primary) {
+ case LANG_AZERI:
+ switch (sub) {
+ case SUBLANG_AZERI_LATIN:
+ script = "@Latn";
+ break;
+ case SUBLANG_AZERI_CYRILLIC:
+ script = "@Cyrl";
+ break;
+ }
+ break;
+ case LANG_SERBIAN: /* LANG_CROATIAN == LANG_SERBIAN */
+ switch (sub) {
+ case SUBLANG_SERBIAN_LATIN:
+ case 0x06: /* Serbian (Latin) - Bosnia and Herzegovina */
+ script = "@Latn";
+ break;
+ }
+ break;
+ case LANG_UZBEK:
+ switch (sub) {
+ case SUBLANG_UZBEK_LATIN:
+ script = "@Latn";
+ break;
+ case SUBLANG_UZBEK_CYRILLIC:
+ script = "@Cyrl";
+ break;
+ }
+ break;
}
- break;
- case LANG_UZBEK:
- switch (sub)
- {
- case SUBLANG_UZBEK_LATIN:
- script = "@Latn";
- break;
- case SUBLANG_UZBEK_CYRILLIC:
- script = "@Cyrl";
- break;
+
+ loc = malloc( strlen( iso639 ) + strlen( iso3166 ) + (script ? strlen(
+ script ) : 0) + 2 );
+ strcpy( loc, iso639 );
+ strcat( loc, "_" );
+ strcat( loc, iso3166 );
+ if( script ) {
+ strcat( loc, script );
}
- break;
- }
-
- loc = malloc( strlen( iso639 ) + strlen( iso3166 ) + (script ? strlen( script ) : 0) + 2 );
- strcpy( loc, iso639 );
- strcat( loc, "_" );
- strcat( loc, iso3166 );
- if( script )
- strcat( loc, script );
- return loc;
+ return loc;
}
diff --git a/app/wlib/mswlib/mswbitmap.c b/app/wlib/mswlib/mswbitmap.c
index 95b8a69..9069c35 100644
--- a/app/wlib/mswlib/mswbitmap.c
+++ b/app/wlib/mswlib/mswbitmap.c
@@ -18,40 +18,38 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <windows.h>
#include <string.h>
-#include <malloc.h>
#include <math.h>
#include <stdlib.h>
#include <commdlg.h>
#include <stdio.h>
#include <assert.h>
-#include "misc.h"
#include "mswint.h"
#include "i18n.h"
#if _MSC_VER > 1300
- #define stricmp _stricmp
- #define strnicmp _strnicmp
- #define strdup _strdup
+#define stricmp _stricmp
+#define strnicmp _strnicmp
+#define strdup _strdup
#endif
struct wBitmap_t {
- WOBJ_COMMON
- };
+ WOBJ_COMMON
+};
HPALETTE hOldPal;
HBITMAP mswCreateBitMap(
- COLORREF fgCol1,
- COLORREF fgCol2,
- COLORREF bgCol,
- wPos_t w,
- wPos_t h,
- const char * bits )
+ COLORREF fgCol1,
+ COLORREF fgCol2,
+ COLORREF bgCol,
+ int w,
+ int h,
+ const char * bits )
{
HDC hDc;
HDC hButtDc;
@@ -70,7 +68,7 @@ HBITMAP mswCreateBitMap(
if (mswPalette) {
hOldPal = SelectPalette( hButtDc, mswPalette, 0 );
}
-
+
/*PatBlt( hButtDc, 0, 0, w, h, WHITENESS );*/
newBrush = CreateSolidBrush( bgCol );
oldBrush = SelectObject( hButtDc, newBrush );
@@ -85,8 +83,9 @@ HBITMAP mswCreateBitMap(
for ( j = 0; j < h; j++ ) {
byt = (0xFF & *byts_p++) | 0x100;
for ( i = 0; i < w; i++ ) {
- if (byt == 1)
+ if (byt == 1) {
byt = (0xFF & *byts_p++) | 0x100;
+ }
if ( byt & 0x1 ) {
SetPixel( hButtDc, i, j, fgCol1 );
SetPixel( hButtDc, i+1, j+1, fgCol2 );
@@ -100,12 +99,12 @@ HBITMAP mswCreateBitMap(
return hBitMap;
}
-dynArr_t bitmap_da;
+static dynArr_t bitmap_da;
#define controlMap(N) DYNARR_N(controlMap_t,controlMap_da,N)
#define bitmap(N) DYNARR_N(HBITMAP,bitmap_da,N)
void mswRegisterBitMap(
- HBITMAP hBm )
+ HBITMAP hBm )
{
DYNARR_APPEND( HBITMAP, bitmap_da, 10 );
bitmap(bitmap_da.cnt-1) = hBm;
@@ -114,14 +113,15 @@ void mswRegisterBitMap(
void deleteBitmaps( void )
{
int inx;
- for ( inx=0; inx<bitmap_da.cnt; inx++ )
+ for ( inx=0; inx<bitmap_da.cnt; inx++ ) {
DeleteObject( bitmap(inx) );
+ }
}
/**
* Draw a bitmap to the screen.
*
- * \param hDc IN device context
+ * \param hDc IN device context
* \param offw IN horizontal offset
* \param offh IN vertical offset
* \param bm IN icon to draw
@@ -132,46 +132,48 @@ void deleteBitmaps( void )
*/
void mswDrawIcon(
- HDC hDc,
- int offw,
- int offh,
- wIcon_p bm,
- int disabled,
- COLORREF color1,
- COLORREF color2 )
+ HDC hDc,
+ int offw,
+ int offh,
+ wIcon_p bm,
+ int disabled,
+ COLORREF color1,
+ COLORREF color2 )
{
int i;
int byt;
BITMAPINFO *bmiInfo;
COLORREF col;
- /* draw the bitmap by dynamically creating a Windows DIB in memory */
+ /* draw the bitmap by dynamically creating a Windows DIB in memory */
/* BITMAPINFO already has one RGBQUAD color struct, so only allocate the rest */
- bmiInfo = malloc( sizeof( BITMAPINFO ) + (bm->colorcnt - 1) * sizeof( RGBQUAD ));
- if( !bmiInfo ) {
- fprintf( stderr, "could not allocate memory for bmiInfo\n" );
- abort();
- }
-
- /* initialize bitmap header from XPM information */
- bmiInfo->bmiHeader.biSize = sizeof( bmiInfo->bmiHeader );
- bmiInfo->bmiHeader.biWidth = bm->w;
- bmiInfo->bmiHeader.biHeight = bm->h;
- bmiInfo->bmiHeader.biPlanes = 1;
- if( bm->type == mswIcon_bitmap )
- bmiInfo->bmiHeader.biBitCount = 1;
- else
- bmiInfo->bmiHeader.biBitCount = 8; /* up to 256 colors */
- bmiInfo->bmiHeader.biCompression = BI_RGB; /* no compression */
- bmiInfo->bmiHeader.biSizeImage = 0;
- bmiInfo->bmiHeader.biXPelsPerMeter = 0;
- bmiInfo->bmiHeader.biYPelsPerMeter = 0;
- bmiInfo->bmiHeader.biClrUsed = bm->colorcnt; /* number of colors used */
- bmiInfo->bmiHeader.biClrImportant = bm->colorcnt;
+ bmiInfo = malloc( sizeof( BITMAPINFO ) + (bm->colorcnt - 1) * sizeof(
+ RGBQUAD ));
+ if( !bmiInfo ) {
+ fprintf( stderr, "could not allocate memory for bmiInfo\n" );
+ abort();
+ }
+
+ /* initialize bitmap header from XPM information */
+ bmiInfo->bmiHeader.biSize = sizeof( bmiInfo->bmiHeader );
+ bmiInfo->bmiHeader.biWidth = bm->w;
+ bmiInfo->bmiHeader.biHeight = bm->h;
+ bmiInfo->bmiHeader.biPlanes = 1;
+ if( bm->type == mswIcon_bitmap ) {
+ bmiInfo->bmiHeader.biBitCount = 1;
+ } else {
+ bmiInfo->bmiHeader.biBitCount = 8; /* up to 256 colors */
+ }
+ bmiInfo->bmiHeader.biCompression = BI_RGB; /* no compression */
+ bmiInfo->bmiHeader.biSizeImage = 0;
+ bmiInfo->bmiHeader.biXPelsPerMeter = 0;
+ bmiInfo->bmiHeader.biYPelsPerMeter = 0;
+ bmiInfo->bmiHeader.biClrUsed = bm->colorcnt; /* number of colors used */
+ bmiInfo->bmiHeader.biClrImportant = bm->colorcnt;
/*
* create a transparency mask and paint to screen
- */
+ */
if( bm->type == mswIcon_bitmap ) {
memset( &bmiInfo->bmiColors[ 0 ], 0xFF, sizeof( RGBQUAD ));
memset( &bmiInfo->bmiColors[ 1 ], 0, sizeof( RGBQUAD ));
@@ -181,69 +183,71 @@ void mswDrawIcon(
}
StretchDIBits(hDc, offw, offh,
- (int)ceil(bmiInfo->bmiHeader.biWidth*scaleIcon),
- (int)ceil(bmiInfo->bmiHeader.biHeight*scaleIcon),
+ bmiInfo->bmiHeader.biWidth,
+ bmiInfo->bmiHeader.biHeight,
0, 0,
bmiInfo->bmiHeader.biWidth,
bmiInfo->bmiHeader.biHeight,
bm->pixels, bmiInfo,
DIB_RGB_COLORS, SRCAND);
-
+
/* now paint the bitmap with transparent set to black */
if( bm->type == mswIcon_bitmap ) {
- if( disabled ) {
+ if( disabled ) {
col = color2;
} else {
col = color1;
}
memset( &bmiInfo->bmiColors[ 0 ], 0, sizeof( RGBQUAD ));
- bmiInfo->bmiColors[ 1 ].rgbRed = GetRValue( col );
- bmiInfo->bmiColors[ 1 ].rgbGreen = GetGValue( col );
- bmiInfo->bmiColors[ 1 ].rgbBlue = GetBValue( col );
- } else {
+ bmiInfo->bmiColors[ 1 ].rgbRed = GetRValue( col );
+ bmiInfo->bmiColors[ 1 ].rgbGreen = GetGValue( col );
+ bmiInfo->bmiColors[ 1 ].rgbBlue = GetBValue( col );
+ } else {
if( disabled ) {
/* create a gray scale palette */
for( i = 0; i < bm->colorcnt; i ++ ) {
if (i != bm->transparent) {
byt = (30 * bm->colormap[i].rgbRed +
- 59 * bm->colormap[i].rgbGreen +
- 11 * bm->colormap[i].rgbBlue) / 100;
+ 59 * bm->colormap[i].rgbGreen +
+ 11 * bm->colormap[i].rgbBlue) / 100;
/* if totally black, use a dark gray */
- if (byt == 0)
+ if (byt == 0) {
byt = 0x66;
+ }
bmiInfo->bmiColors[i].rgbRed = byt;
bmiInfo->bmiColors[i].rgbGreen = byt;
bmiInfo->bmiColors[i].rgbBlue = byt;
}
}
- } else {
- /* copy the palette */
- memcpy( (void *)bmiInfo->bmiColors, (void *)bm->colormap, bm->colorcnt * sizeof( RGBQUAD ));
- }
+ } else {
+ /* copy the palette */
+ memcpy( (void *)bmiInfo->bmiColors, (void *)bm->colormap,
+ bm->colorcnt * sizeof( RGBQUAD ));
+ }
memset( &bmiInfo->bmiColors[ bm->transparent ], 0, sizeof( RGBQUAD ));
- }
-
- /* show the bitmap */
- StretchDIBits(hDc, offw, offh,
- (int)ceil(bmiInfo->bmiHeader.biWidth*scaleIcon),
- (int)ceil(bmiInfo->bmiHeader.biHeight*scaleIcon),
- 0, 0,
- bmiInfo->bmiHeader.biWidth,
- bmiInfo->bmiHeader.biHeight,
- bm->pixels, bmiInfo,
- DIB_RGB_COLORS, SRCPAINT);
-
- /* forget the data */
- free( bmiInfo );
+ }
+
+ /* show the bitmap */
+ StretchDIBits(hDc, offw, offh,
+ bmiInfo->bmiHeader.biWidth,
+ bmiInfo->bmiHeader.biHeight,
+ 0, 0,
+ bmiInfo->bmiHeader.biWidth,
+ bmiInfo->bmiHeader.biHeight,
+ bm->pixels, bmiInfo,
+ DIB_RGB_COLORS, SRCPAINT);
+
+ /* forget the data */
+ free( bmiInfo );
}
/**
- * Create a two color bitmap. This creates a two color icon. Pixels set to 1 are painted
+ * Create a two color bitmap. This creates a two color icon. Pixels set to 1 are painted
* in the specified color, pixels set to 0 are transparent
- * in order to convert the format, a lot of bit fiddling is necessary. The order of
- * scanlines needs to be reversed and the bit order (high order - low order) is reversed
+ * in order to convert the format, a lot of bit fiddling is necessary. The order of
+ * scanlines needs to be reversed and the bit order (high order - low order) is reversed
* as well.
* \param w IN width in pixels
* \param h IN height in pixels
@@ -252,12 +256,13 @@ void mswDrawIcon(
* \return pointer to icon
*/
-wIcon_p wIconCreateBitMap( wPos_t w, wPos_t h, const char * bits, wDrawColor color )
+wIcon_p wIconCreateBitMap( wWinPix_t w, wWinPix_t h, const char * bits,
+ wDrawColor color )
{
int lineLength;
int i, j;
unsigned char *dest;
- static unsigned char revbits[] = { 0, 0x08, 0x04, 0x0C, 0x02, 0x0A, 0x06, 0x0E, 0x01, 0x09, 0x05, 0x0D, 0x03, 0x0B, 0x07, 0x0F };
+ static unsigned char revbits[] = { 0, 0x08, 0x04, 0x0C, 0x02, 0x0A, 0x06, 0x0E, 0x01, 0x09, 0x05, 0x0D, 0x03, 0x0B, 0x07, 0x0F };
unsigned long col = wDrawGetRGB( color );
wIcon_p ip;
@@ -279,13 +284,13 @@ wIcon_p wIconCreateBitMap( wPos_t w, wPos_t h, const char * bits, wDrawColor col
ip->colormap[ 1 ].rgbBlue = col & 0xFF;
ip->colormap[ 1 ].rgbRed = (col>>16) & 0xFF;
ip->colormap[ 1 ].rgbGreen = (col>>8) & 0xFF;
- ip->colormap[ 1 ].rgbReserved = 0;
+ ip->colormap[ 1 ].rgbReserved = 0;
color = GetSysColor( COLOR_BTNFACE );
ip->colormap[ 0 ].rgbBlue = GetBValue( color );
ip->colormap[ 0 ].rgbRed = GetRValue( color );
ip->colormap[ 0 ].rgbGreen = GetGValue( color );
- ip->colormap[ 0 ].rgbReserved = 0;
+ ip->colormap[ 0 ].rgbReserved = 0;
lineLength = (((( ip->w + 7 ) / 8 ) + 3 ) >> 2 ) << 2;
ip->pixels = malloc( lineLength * ip->h );
@@ -294,19 +299,19 @@ wIcon_p wIconCreateBitMap( wPos_t w, wPos_t h, const char * bits, wDrawColor col
abort();
}
- /*
+ /*
* copy the bits from source to the buffer, at this time the order of
* scanlines is reversed by starting with the last source line.
*/
for( i = 0; i < ip->h; i++ ) {
dest = ip->pixels + i * lineLength;
- memcpy( dest, bits + ( ip->h - i - 1 ) * (( ip->w + 7) / 8), ( ip->w + 7 ) / 8 );
+ memcpy( dest, bits + ( ip->h - i - 1 ) * (( ip->w + 7) / 8),
+ ( ip->w + 7 ) / 8 );
/*
* and now, the bit order is changed, this is done via a lookup table
*/
- for( j = 0; j < lineLength; j++ )
- {
+ for( j = 0; j < lineLength; j++ ) {
unsigned byte = dest[ j ];
unsigned low = byte & 0x0F;
unsigned high = (byte & 0xF0) >> 4;
@@ -324,18 +329,19 @@ wIcon_p wIconCreateBitMap( wPos_t w, wPos_t h, const char * bits, wDrawColor col
* transparency, other symbolic names are not supported.
*
* \param pm IN XPM variable
- * \return pointer to icon, call free() if not needed anymore.
+ * \return pointer to icon, call free() if not needed anymore.
*/
wIcon_p wIconCreatePixMap( char *pm[])
{
wIcon_p ip;
- int col, r, g, b, len;
+ int col, r, g, b;
+ size_t len;
int width, height;
char buff[3];
char * cp, * cq, * ptr;
int i, j, k;
- int lineLength;
+ size_t lineLength;
unsigned *keys;
unsigned numchars;
unsigned pixel;
@@ -355,9 +361,9 @@ wIcon_p wIconCreatePixMap( char *pm[])
height = (int)strtol(cq, &cq, 10 ); /* height of image */
col = (int)strtol(cq, &cq, 10 ); /* number of colors used */
numchars = (int)strtol(cq, &cq, 10 ); /* get number of chars per pixel */
-
+
ip->colormap = malloc( col * sizeof( RGBQUAD ));
- ip->w = width;
+ ip->w = width;
ip->h = height;
ip->colorcnt = col; /* number of colors used */
@@ -368,19 +374,19 @@ wIcon_p wIconCreatePixMap( char *pm[])
if( numchars == 1 ) {
keys[ col ] = (unsigned)ptr[0];
+ } else if( numchars == 2 ) {
+ keys[ col ] = (unsigned) ( ptr[ 0 ] + ptr[ 1 ] * 256 );
}
- else if( numchars == 2 ) {
- keys[ col ] = (unsigned) ( ptr[ 0 ] + ptr[ 1 ] * 256 );
- }
-
+
cp = strtok( ptr + numchars, "\t " ); /* cp points to color type */
assert( *cp == 'c' ); /* should always be color */
-
- cp = strtok( NULL, "\t " ); /* go to next token, the color definition itself */
+
+ cp = strtok( NULL,
+ "\t " ); /* go to next token, the color definition itself */
if( *cp == '#' ) { /* is this a hex RGB specification? */
len = strlen( cp+1 ) / 3;
- assert( len == 4 || len == 2 ); /* expecting three 2 char or 4 char values */
+ assert( len == 4 || len == 2 ); /* expecting three 2 char or 4 char values */
buff[2] = 0; /* if yes, extract the values */
memcpy( buff, cp + 1, 2 );
r = (int)strtol(buff, &cq, 16);
@@ -397,9 +403,9 @@ wIcon_p wIconCreatePixMap( char *pm[])
} else {
if( !stricmp( cp, "none" )) { /* special case transparency*/
ip->transparent = col;
+ } else {
+ assert( *cp == '#' ); /* if no, abort for the moment */
}
- else
- assert( *cp == '#' ); /* if no, abort for the moment */
}
free( ptr );
}
@@ -413,32 +419,34 @@ wIcon_p wIconCreatePixMap( char *pm[])
abort();
}
- /*
+ /*
convert the XPM pixel data to indexes into color table
- at the same time the order of rows is reversed
+ at the same time the order of rows is reversed
Win32 should be able to do that but I couldn't find out
- how, so this is coded by hand.
+ how, so this is coded by hand.
*/
/* for all rows */
for( i = 0; i < ip->h; i++ ) {
-
+
cq = ip->pixels + lineLength * i;
/* get the next row */
cp = pm[ ip->h - i + ip->colorcnt ];
/* for all pixels in row */
for( j = 0; j < ip->w; j++ ) {
/* get the pixel info */
- if( numchars == 1 )
+ if( numchars == 1 ) {
pixel = ( unsigned )*cp;
- else
+ } else {
pixel = (unsigned) (*cp + *(cp+1)*256);
+ }
cp += numchars;
/* look up pixel info in color table */
k = 0;
- while(k < col && pixel != keys[ k ] )
+ while(k < col && pixel != keys[ k ] ) {
k++;
+ }
if (pixel == keys[k]) {
/* save the index into color table */
*(cq + j) = k;
@@ -446,9 +454,9 @@ wIcon_p wIconCreatePixMap( char *pm[])
*(cq + j) = 0;
}
}
- }
+ }
free( keys );
-
+
return ip;
}
@@ -468,12 +476,12 @@ void wIconSetColor( wIcon_p ip, wDrawColor color )
*
* \param d IN drawing area
* \param bm IN bitmap to draw
- * \param x IN x position
+ * \param x IN x position
* \param y IN y position
*/
void
-wIconDraw( wDraw_p d, wIcon_p bm, wPos_t x, wPos_t y )
+wIconDraw( wDraw_p d, wIcon_p bm, wWinPix_t x, wWinPix_t y )
{
mswDrawIcon( d->hDc, (int)x, (int)y, bm, FALSE, 0, 0 );
}
@@ -489,20 +497,22 @@ wIconDraw( wDraw_p d, wIcon_p bm, wPos_t x, wPos_t y )
*/
wControl_p
-wBitmapCreate( wWin_p parent, wPos_t x, wPos_t y, long option, wIcon_p iconP )
+wBitmapCreate( wWin_p parent, wWinPix_t x, wWinPix_t y, long option,
+ const struct wIcon_t * iconP )
{
wBitmap_p control;
int index;
DWORD style = SS_OWNERDRAW | WS_VISIBLE | WS_CHILD;
- control = mswAlloc( parent, B_BITMAP, NULL, sizeof( struct wBitmap_t ), NULL, &index );
+ control = mswAlloc( parent, B_BITMAP, NULL, sizeof( struct wBitmap_t ), NULL,
+ &index );
mswComputePos( (wControl_p)control, x, y );
control->option = option;
control->hWnd = CreateWindow( "STATIC", NULL,
- style, control->x, control->y,
- iconP->w, iconP->h,
- ((wControl_p)parent)->hWnd, (HMENU)index, mswHInst, NULL );
+ style, control->x, control->y,
+ iconP->w, iconP->h,
+ ((wControl_p)parent)->hWnd, (HMENU)(UINT_PTR)index, mswHInst, NULL );
if (control->hWnd == NULL) {
mswFail("CreateWindow(BITMAP)");
@@ -510,7 +520,7 @@ wBitmapCreate( wWin_p parent, wPos_t x, wPos_t y, long option, wIcon_p iconP )
}
control->h = iconP->h;
control->w = iconP->w;
- control->data = iconP;
+ control->data = (void*)iconP;
return (wControl_p)control;
}
diff --git a/app/wlib/mswlib/mswbox.c b/app/wlib/mswlib/mswbox.c
index 04b3656..5698ae4 100644
--- a/app/wlib/mswlib/mswbox.c
+++ b/app/wlib/mswlib/mswbox.c
@@ -1,6 +1,5 @@
#include <windows.h>
#include <string.h>
-#include <malloc.h>
#include <stdlib.h>
#include <commdlg.h>
#include <math.h>
@@ -15,9 +14,9 @@
*/
struct wBox_t {
- WOBJ_COMMON
- wBoxType_e boxTyp;
- };
+ WOBJ_COMMON
+ wBoxType_e boxTyp;
+};
#define B (1)
#define W (2)
@@ -29,9 +28,9 @@ struct wBox_t {
void wBoxSetSize(
- wBox_p bb,
- wPos_t w,
- wPos_t h )
+ wBox_p bb,
+ wWinPix_t w,
+ wWinPix_t h )
{
bb->w = w;
bb->h = h;
@@ -39,10 +38,10 @@ void wBoxSetSize(
static void repaintBox( HWND hWnd, wControl_p b )
-{
+{
HDC hDc;
wBox_p bb = (wBox_p)(b);
- wPos_t x0, y0, x1, y1;
+ wWinPix_t x0, y0, x1, y1;
char lastColor;
int lastRop;
static char colors[8][4][2] = {
@@ -53,7 +52,8 @@ static void repaintBox( HWND hWnd, wControl_p b )
{ /* ThickB */ {B,B}, {B,B}, {B,B}, {B,B} },
{ /* ThickW */ {W,W}, {W,W}, {W,W}, {W,W} },
{ /* RidgeW */ {W,B}, {W,B}, {B,W}, {B,W} },
- { /* TroughW*/ {B,W}, {B,W}, {W,B}, {W,B} } };
+ { /* TroughW*/ {B,W}, {B,W}, {W,B}, {W,B} }
+ };
x0 = bb->x;
x1 = bb->x+bb->w;
@@ -89,18 +89,19 @@ static void repaintBox( HWND hWnd, wControl_p b )
static callBacks_t boxCallBacks = {
- repaintBox,
- NULL,
- NULL };
+ repaintBox,
+ NULL,
+ NULL
+};
wBox_p wBoxCreate(
- wWin_p parent,
- wPos_t origX,
- wPos_t origY,
- const char * labelStr,
- wBoxType_e typ,
- wPos_t width,
- wPos_t height )
+ wWin_p parent,
+ wWinPix_t origX,
+ wWinPix_t origY,
+ const char * labelStr,
+ wBoxType_e typ,
+ wWinPix_t width,
+ wWinPix_t height )
{
wBox_p b;
int index;
@@ -113,7 +114,7 @@ wBox_p wBoxCreate(
b->w = width;
b->h = height;
mswAddButton( (wControl_p)b, FALSE, NULL );
- mswCallBacks[B_BOX] = &boxCallBacks;
+ mswCallBacks[B_BOX] = &boxCallBacks;
repaintBox( ((wControl_p)parent)->hWnd, (wControl_p)b );
return b;
-}
+}
diff --git a/app/wlib/mswlib/mswbutt.c b/app/wlib/mswlib/mswbutt.c
index 16f31c1..be72257 100644
--- a/app/wlib/mswlib/mswbutt.c
+++ b/app/wlib/mswlib/mswbutt.c
@@ -17,17 +17,24 @@
*
* 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.
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <windows.h>
#include <string.h>
-#include <malloc.h>
#include <stdlib.h>
#include <commdlg.h>
#include <math.h>
#include "mswint.h"
-int kludge12 = 0;
+
+/** Macros for button repeat timers */
+#define REPEAT_STAGE0_DELAY 500
+#define REPEAT_STAGE1_DELAY 150
+#define REPEAT_STAGE2_DELAY 75
+#define STOP_TIMER (-1)
+#define INITIAL_WAIT (0)
+#define SLOW_REPEATS (1)
+#define FAST_REPEATS (2)
/*
*****************************************************************************
@@ -40,25 +47,29 @@ int kludge12 = 0;
static XWNDPROC oldButtProc = NULL;
struct wButton_t {
- WOBJ_COMMON
- wButtonCallBack_p action;
- wBool_t busy;
- wBool_t selected;
- wIcon_p icon;
- };
+ WOBJ_COMMON
+ wButtonCallBack_p action;
+ wBool_t busy;
+ wBool_t selected;
+ wIcon_p icon;
+ UINT_PTR timer_id;
+ int timer_count;
+ int timer_state;
+};
void mswButtPush(
- wControl_p b )
+ wControl_p b )
{
- if ( ((wButton_p)b)->action )
+ if ( ((wButton_p)b)->action ) {
((wButton_p)b)->action( ((wButton_p)b)->data );
+ }
}
/**
* Paint function for toolbar buttons
- *
+ *
* \param hButtDc IN valid device context
* \param bm IN bitmap to add to button
* \param selected IN selected state of button
@@ -66,27 +77,25 @@ void mswButtPush(
*/
static void drawButton(
- HDC hButtDc,
- wIcon_p bm,
- BOOL_T selected,
- BOOL_T disabled )
+ HDC hButtDc,
+ wIcon_p bm,
+ BOOL_T selected,
+ BOOL_T disabled )
{
HGDIOBJ oldBrush, newBrush;
HPEN oldPen, newPen;
RECT rect;
COLORREF color1, color2;
- POS_T offw=5, offh=5;
- TRIVERTEX vert[2] ;
- GRADIENT_RECT gRect;
+ wWinPix_t offw=5, offh=5;
COLORREF colL;
COLORREF colD;
COLORREF colF;
#define LEFT (0)
-#define RIGHT (LONG)ceil(bm->w*scaleIcon+10)
+#define RIGHT (bm->w+9)
#define TOP (0)
-#define BOTTOM (LONG)ceil(bm->h*scaleIcon+10)
+#define BOTTOM (bm->h+9)
/* get the lightest and the darkest color to use */
colL = GetSysColor( COLOR_BTNHIGHLIGHT );
@@ -106,8 +115,7 @@ static void drawButton(
DeleteObject( SelectObject( hButtDc, oldBrush ) );
/* disabled button remain flat */
- if( !disabled )
- {
+ if( !disabled ) {
/* select colors for the gradient */
if( selected ) {
color1 = colD;
@@ -117,67 +125,27 @@ static void drawButton(
color2 = colD;
}
-#define GRADIENT_WIDTH 6
-
- /*
- first draw the top gradient
- this always ends in the button face color
- starting color depends on button state (selected or not)
- */
- vert [0] .x = LEFT;
- vert [0] .y = TOP;
- vert [0] .Red = GetRValue( color1 )* 256;
- vert [0] .Green = GetGValue( color1 )* 256;
- vert [0] .Blue = GetBValue( color1 )* 256;
- vert [0] .Alpha = 0x0000;
- vert [1] .x = RIGHT;
- vert [1] .y = TOP + GRADIENT_WIDTH;
- vert [1] .Red = GetRValue( colF )* 256;
- vert [1] .Green = GetGValue( colF )* 256;
- vert [1] .Blue = GetBValue( colF )* 256;
- vert [1] .Alpha = 0x0000;
-
- gRect.UpperLeft = 0;
- gRect.LowerRight = 1;
-
- GradientFill(hButtDc, vert, 2, &gRect, 1, GRADIENT_FILL_RECT_V);
-
- /*
- now draw the bottom gradient
- this always starts with the button face color
- ending color depends on button state (selected or not)
- */
- vert [0] .x = LEFT;
- vert [0] .y = BOTTOM - GRADIENT_WIDTH;
- vert [0] .Red = GetRValue( colF )* 256;
- vert [0] .Green = GetGValue( colF )* 256;
- vert [0] .Blue = GetBValue( colF )* 256;
- vert [0] .Alpha = 0x0000;
- vert [1] .x = RIGHT;
- vert [1] .y = BOTTOM;
- vert [1] .Red = GetRValue( color2 )* 256;
- vert [1] .Green = GetGValue( color2 )* 256;
- vert [1] .Blue = GetBValue( color2 )* 256;
- vert [1] .Alpha = 0x0000;
- gRect.UpperLeft = 0;
- gRect.LowerRight = 1;
- GradientFill(hButtDc, vert, 2, &gRect, 1, GRADIENT_FILL_RECT_V);
+ /* draw delimiting lines in shadow color */
+ newPen = CreatePen( PS_SOLID, 0, color1 );
+ oldPen = SelectObject( hButtDc, newPen );
+
+ MoveTo( hButtDc, RIGHT-1, TOP );
+ LineTo( hButtDc, LEFT, TOP );
+ LineTo( hButtDc, LEFT, BOTTOM );
+ DeleteObject( SelectObject( hButtDc, oldPen ) );
+ newPen = CreatePen( PS_SOLID, 0, color2 );
+ oldPen = SelectObject( hButtDc, newPen );
+
+ MoveTo( hButtDc, RIGHT, TOP+1 );
+ LineTo( hButtDc, RIGHT, BOTTOM );
+ LineTo( hButtDc, LEFT, BOTTOM );
+ DeleteObject( SelectObject( hButtDc, oldPen ) );
}
- /* draw delimiting lines in shadow color */
- newPen = CreatePen( PS_SOLID, 0, colD );
- oldPen = SelectObject( hButtDc, newPen );
-
- MoveTo( hButtDc, LEFT, TOP );
- LineTo( hButtDc, LEFT, BOTTOM );
- MoveTo( hButtDc, RIGHT, TOP );
- LineTo( hButtDc, RIGHT, BOTTOM );
-
- DeleteObject( SelectObject( hButtDc, oldPen ) );
-
color2 = GetSysColor( COLOR_BTNSHADOW );
- color1 = RGB( bm->colormap[ 1 ].rgbRed, bm->colormap[ 1 ].rgbGreen, bm->colormap[ 1 ].rgbBlue );
+ color1 = RGB( bm->colormap[ 1 ].rgbRed, bm->colormap[ 1 ].rgbGreen,
+ bm->colormap[ 1 ].rgbBlue );
if (selected) {
offw++; offh++;
@@ -187,37 +155,46 @@ static void drawButton(
static void buttDrawIcon(
- wButton_p b,
- HDC butt_hDc )
+ wButton_p b,
+ HDC butt_hDc )
{
- wIcon_p bm = b->icon;
- POS_T offw=5, offh=5;
+ wIcon_p bm = b->icon;
+ wWinPix_t offw=5, offh=5;
- if (b->selected || b->busy) {
- offw++; offh++;
- } else if ( (b->option & BO_DISABLED) != 0 ) {
- ;
- } else {
- ;
- }
- drawButton( butt_hDc, bm, b->selected || b->busy, (b->option & BO_DISABLED) != 0 );
+ if (b->selected || b->busy) {
+ offw++; offh++;
+ } else if ( (b->option & BO_DISABLED) != 0 ) {
+ ;
+ } else {
+ ;
+ }
+ drawButton( butt_hDc, bm, b->selected
+ || b->busy, (b->option & BO_DISABLED) != 0 );
}
void wButtonSetBusy(
- wButton_p b,
- int value )
+ wButton_p b,
+ int value)
{
b->busy = value;
- if (!value)
+ if (!value) {
b->selected = FALSE;
- /*SendMessage( b->hWnd, BM_SETSTATE, (WPARAM)value, 0L );*/
- InvalidateRgn( b->hWnd, NULL, FALSE );
+ }
+
+ // in case a timer is associated with the button, kill it
+ if (b->timer_id) {
+ KillTimer(b->hWnd, b->timer_id);
+ b->timer_id = 0;
+ b->timer_state = STOP_TIMER;
+ }
+
+ InvalidateRgn(b->hWnd, NULL, FALSE);
}
void wButtonSetLabel(
- wButton_p b,
- const char * label )
+ wButton_p b,
+ const char * label )
{
if ((b->option&BO_ICON) == 0) {
/*b->labelStr = label;*/
@@ -227,9 +204,64 @@ void wButtonSetLabel(
}
InvalidateRgn( b->hWnd, NULL, FALSE );
}
-
-static LRESULT buttPush( wControl_p b, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
+/**
+ * Button timer: handle timer events for buttons. These are used for
+ * auto-repeating presses. Three phases used are
+ * - initial delay before repetitions begin
+ * - slow repeats for a few cycles
+ * - fast repeats therafter
+ * - stop timer
+ *
+ * \param hWnd Handle of the window, unused
+ * \param message The message, unused
+ * \param timer The timer id is the wlib widget .
+ * \param timepast The timepast, unused
+ */
+
+void CALLBACK buttTimer(HWND hWnd, UINT message, UINT_PTR timer,
+ DWORD timepast)
+{
+ wButton_p b = (wButton_p)timer;
+ if (b->timer_id == 0) {
+ b->timer_state = STOP_TIMER;
+ return ;
+ }
+
+ /* Autorepeat state machine */
+ switch (b->timer_state) {
+ case INITIAL_WAIT:
+ b->timer_state = SLOW_REPEATS;
+ b->timer_count = 0;
+ KillTimer(hWnd, (UINT_PTR)b);
+ SetTimer(hWnd, (UINT_PTR)b, REPEAT_STAGE1_DELAY, buttTimer);
+ break;
+ case SLOW_REPEATS: /* Enable slow auto-repeat */
+ if (b->timer_count++ > 10) {
+ /* Start fast auto-repeat */
+ b->timer_state = FAST_REPEATS;
+ KillTimer(hWnd, (UINT_PTR)b);
+ SetTimer(hWnd, (UINT_PTR)b, REPEAT_STAGE2_DELAY, buttTimer);
+ }
+ break;
+ case FAST_REPEATS:
+ break;
+ case STOP_TIMER:
+ default:
+ KillTimer(hWnd, (UINT_PTR)b);
+ b->timer_id = 0;
+ return;
+ break;
+ }
+ if (b->action) {
+ b->action(b->data);
+ }
+ return;
+}
+
+
+static LRESULT buttPush( wControl_p b, HWND hWnd, UINT message, WPARAM wParam,
+ LPARAM lParam )
{
wButton_p bb = (wButton_p)b;
DRAWITEMSTRUCT * di = (DRAWITEMSTRUCT *)lParam;
@@ -240,19 +272,20 @@ static LRESULT buttPush( wControl_p b, HWND hWnd, UINT message, WPARAM wParam, L
case WM_COMMAND:
if (bb->action /*&& !bb->busy*/) {
bb->action( bb->data );
- return 0L;
+ return (LRESULT)0;
}
break;
case WM_MEASUREITEM: {
MEASUREITEMSTRUCT * mi = (MEASUREITEMSTRUCT *)lParam;
- if (bb->type != B_BUTTON || (bb->option & BO_ICON) == 0)
+ if (bb->type != B_BUTTON || (bb->option & BO_ICON) == 0) {
break;
+ }
mi->CtlType = ODT_BUTTON;
- mi->CtlID = wParam;
- mi->itemWidth = (UINT)ceil(bb->w*scaleIcon);
- mi->itemHeight = (UINT)ceil(bb->h*scaleIcon);
- } return 0L;
+ mi->CtlID = (UINT)wParam;
+ mi->itemWidth = (UINT)bb->w;
+ mi->itemHeight = (UINT)bb->h;
+ } return (LRESULT)0;
case WM_DRAWITEM:
if (bb->type == B_BUTTON && (bb->option & BO_ICON) != 0) {
@@ -261,33 +294,29 @@ static LRESULT buttPush( wControl_p b, HWND hWnd, UINT message, WPARAM wParam, L
bb->selected = selected;
InvalidateRgn( bb->hWnd, NULL, FALSE );
}
- return TRUE;
+ return (LRESULT)TRUE;
}
break;
-
}
return DefWindowProc( hWnd, message, wParam, lParam );
}
static void buttDone(
- wControl_p b )
+ wControl_p b )
{
free(b);
}
LRESULT CALLBACK pushButt(
- HWND hWnd,
- UINT message,
- UINT wParam,
- LONG lParam )
+ HWND hWnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam )
{
/* Catch <Return> and cause focus to leave control */
-#ifdef WIN32
- long inx = GetWindowLong( hWnd, GWL_ID );
-#else
- short inx = GetWindowWord( hWnd, GWW_ID );
-#endif
+
+ wIndex_t inx = (wIndex_t)GetWindowLongPtr( hWnd, GWL_ID );
wButton_p b = (wButton_p)mswMapIndex( inx );
PAINTSTRUCT ps;
@@ -297,7 +326,7 @@ LRESULT CALLBACK pushButt(
BeginPaint( hWnd, &ps );
buttDrawIcon( (wButton_p)b, ps.hdc );
EndPaint( hWnd, &ps );
- return 1L;
+ return (LRESULT)1;
}
break;
case WM_CHAR:
@@ -308,41 +337,55 @@ LRESULT CALLBACK pushButt(
case 0x09:
/*SetFocus( ((wControl_p)(b->parent))->hWnd );*/
SendMessage( ((wControl_p)(b->parent))->hWnd, WM_CHAR,
- wParam, lParam );
+ wParam, lParam );
/*SendMessage( ((wControl_p)(b->parent))->hWnd, WM_COMMAND,
inx, MAKELONG( hWnd, EN_KILLFOCUS ) );*/
- return 0L;
+ return (LONG_PTR)0;
}
}
break;
case WM_KILLFOCUS:
- if ( b )
+ if ( b ) {
InvalidateRect( b->hWnd, NULL, TRUE );
- return 0L;
+ }
+ return (LRESULT)0;
+ break;
+ case WM_LBUTTONDOWN:
+ if (b->option&BO_REPEAT) {
+ SetTimer(hWnd, (UINT_PTR)b,REPEAT_STAGE0_DELAY,buttTimer);
+ b->timer_state = INITIAL_WAIT;
+ b->timer_id = (UINT_PTR)b;
+ }
break;
case WM_LBUTTONUP:
/* don't know why but this solves a problem with color selection */
Sleep( 0 );
+ if (b->timer_id) {
+ KillTimer(hWnd, (UINT_PTR)b);
+ }
+ b->timer_id = 0;
+ b->timer_state = STOP_TIMER;
break;
}
return CallWindowProc( oldButtProc, hWnd, message, wParam, lParam );
}
static callBacks_t buttonCallBacks = {
- mswRepaintLabel,
- buttDone,
- buttPush };
+ mswRepaintLabel,
+ buttDone,
+ buttPush
+};
wButton_p wButtonCreate(
- wWin_p parent,
- POS_T x,
- POS_T y,
- const char * helpStr,
- const char * labelStr,
- long option,
- wPos_t width,
- wButtonCallBack_p action,
- void * data )
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ wWinPix_t width,
+ wButtonCallBack_p action,
+ void * data )
{
wButton_p b;
RECT rect;
@@ -352,8 +395,9 @@ wButton_p wButtonCreate(
HDC hDc;
wIcon_p bm;
- if (width <= 0)
+ if (width <= 0) {
width = 80;
+ }
if ((option&BO_ICON) == 0) {
labelStr = mswStrdup( labelStr );
} else {
@@ -366,20 +410,21 @@ wButton_p wButtonCreate(
b->selected = 0;
mswComputePos( (wControl_p)b, x, y );
if (b->option&BO_ICON) {
- width = (wPos_t)ceil(bm->w*scaleIcon)+10;
- h = (int)ceil(bm->h*scaleIcon)+10;
+ width = (wWinPix_t)(bm->w+10);
+ h = bm->h+10;
b->icon = bm;
} else {
- width = (wPos_t)(width*mswScale);
+ width = (wWinPix_t)(width*mswScale);
}
style = ((b->option&BO_ICON)? BS_OWNERDRAW : BS_PUSHBUTTON) |
- WS_CHILD | WS_VISIBLE |
- mswGetBaseStyle(parent);
- if ((b->option&BB_DEFAULT) != 0)
+ WS_CHILD | WS_VISIBLE |
+ mswGetBaseStyle(parent);
+ if ((b->option&BB_DEFAULT) != 0) {
style |= BS_DEFPUSHBUTTON;
+ }
b->hWnd = CreateWindow( "BUTTON", labelStr, style, b->x, b->y,
- /*CW_USEDEFAULT, CW_USEDEFAULT,*/ width, h,
- ((wControl_p)parent)->hWnd, (HMENU)index, mswHInst, NULL );
+ /*CW_USEDEFAULT, CW_USEDEFAULT,*/ width, h,
+ ((wControl_p)parent)->hWnd, (HMENU)(UINT_PTR)index, mswHInst, NULL );
if (b->hWnd == NULL) {
mswFail("CreateWindow(BUTTON)");
return b;
@@ -393,16 +438,16 @@ wButton_p wButtonCreate(
mswCallBacks[B_BUTTON] = &buttonCallBacks;
mswChainFocus( (wControl_p)b );
- oldButtProc = (WNDPROC) SetWindowLongPtr(b->hWnd, GWL_WNDPROC, (LONG_PTR)&pushButt);
+ oldButtProc = (WNDPROC)SetWindowLongPtr(b->hWnd, GWLP_WNDPROC,
+ (LONG_PTR)&pushButt);
if (mswPalette) {
hDc = GetDC( b->hWnd );
SelectPalette( hDc, mswPalette, 0 );
RealizePalette( hDc );
ReleaseDC( b->hWnd, hDc );
}
- if ( !mswThickFont )
- SendMessage( b->hWnd, WM_SETFONT, (WPARAM)mswLabelFont, 0L );
+ SendMessage( b->hWnd, WM_SETFONT, (WPARAM)mswLabelFont, (LPARAM)0 );
InvalidateRect(b->hWnd, &rect, TRUE);
diff --git a/app/wlib/mswlib/mswchoic.c b/app/wlib/mswlib/mswchoic.c
index 2ac391a..ac58023 100644
--- a/app/wlib/mswlib/mswchoic.c
+++ b/app/wlib/mswlib/mswchoic.c
@@ -1,6 +1,5 @@
#include <windows.h>
#include <string.h>
-#include <malloc.h>
#include <stdlib.h>
#include <commdlg.h>
#include <math.h>
@@ -15,48 +14,49 @@
*****************************************************************************
*/
-int CHOICE_HEIGHT=(17);
-int CHOICE_MIN_WIDTH=25;
+#define CHOICE_HEIGHT (17)
+#define CHOICE_MIN_WIDTH (25)
static XWNDPROC oldChoiceItemProc = NULL;
static XWNDPROC newChoiceItemProc;
typedef struct {
- WOBJ_COMMON
- wChoice_p owner;
- } wChoiceItem_t, * wChoiceItem_p;
+ WOBJ_COMMON
+ wChoice_p owner;
+} wChoiceItem_t, * wChoiceItem_p;
struct wChoice_t {
- WOBJ_COMMON
- const char * * labels;
- wChoiceItem_p *buttList;
- long *valueP;
- long oldVal;
- wChoiceCallBack_p action;
- HWND hBorder;
- };
+ WOBJ_COMMON
+ const char * const * labels;
+ wChoiceItem_p *buttList;
+ long *valueP;
+ long oldVal;
+ wChoiceCallBack_p action;
+ HWND hBorder;
+};
static FARPROC oldChoiceProc;
void wRadioSetValue(
- wChoice_p bc,
- long val )
+ wChoice_p bc,
+ long val )
{
- const char ** labels;
+ const char * const * labels;
long cnt;
wChoiceItem_p * butts;
butts = (wChoiceItem_p*)bc->buttList;
for (labels = bc->labels, cnt=0; *labels; labels++, cnt++, butts++ )
SendMessage( (*butts)->hWnd, BM_SETCHECK,
- (val==cnt)?1:0, 0L );
+ (WPARAM)((val==cnt)?1:0), (LPARAM)0 );
bc->oldVal = val;
- if (bc->valueP)
+ if (bc->valueP) {
*bc->valueP = val;
+ }
}
long wRadioGetValue(
- wChoice_p bc )
+ wChoice_p bc )
{
return bc->oldVal;
}
@@ -64,93 +64,94 @@ long wRadioGetValue(
void wToggleSetValue(
- wChoice_p bc,
- long val )
+ wChoice_p bc,
+ long val )
{
- const char ** labels;
+ const char * const * labels;
long cnt;
wChoiceItem_p * butts;
butts = (wChoiceItem_p*)bc->buttList;
for (labels = bc->labels, cnt=0; *labels; labels++, cnt++, butts++ )
SendMessage( (*butts)->hWnd, BM_SETCHECK,
- (val & (1L<<cnt)) != 0, 0L );
+ (WPARAM)((val & (1L<<cnt)) != 0), (LPARAM)0 );
bc->oldVal = val;
- if (bc->valueP)
+ if (bc->valueP) {
*bc->valueP = val;
+ }
}
long wToggleGetValue(
- wChoice_p bc )
+ wChoice_p bc )
{
return bc->oldVal;
}
static void choiceSetBusy(
- wControl_p b,
- BOOL_T busy)
+ wControl_p b,
+ BOOL_T busy)
{
wChoiceItem_p * butts;
wChoice_p bc = (wChoice_p)b;
- for (butts = (wChoiceItem_p*)bc->buttList; *butts; butts++ )
+ for (butts = (wChoiceItem_p*)bc->buttList; *butts; butts++ ) {
EnableWindow( (*butts)->hWnd, !(BOOL)busy );
+ }
}
static void choiceShow(
- wControl_p b,
- BOOL_T show)
+ wControl_p b,
+ BOOL_T show)
{
wChoice_p bc = (wChoice_p)b;
wChoiceItem_p * butts;
- if ((bc->option & BC_NOBORDER)==0)
+ if ((bc->option & BC_NOBORDER)==0) {
ShowWindow( bc->hBorder, show?SW_SHOW:SW_HIDE );
+ }
- for (butts = (wChoiceItem_p*)bc->buttList; *butts; butts++ )
+ for (butts = (wChoiceItem_p*)bc->buttList; *butts; butts++ ) {
ShowWindow( (*butts)->hWnd, show?SW_SHOW:SW_HIDE );
+ }
}
static void choiceSetPos(
- wControl_p b,
- wPos_t x,
- wPos_t y )
+ wControl_p b,
+ wWinPix_t x,
+ wWinPix_t y )
{
wChoice_p bc = (wChoice_p)b;
wChoiceItem_p * butts;
- wPos_t dx, dy;
+ wWinPix_t dx, dy;
dx = x - bc->x;
dy = y - bc->y;
if ((bc->option & BC_NOBORDER)==0)
SetWindowPos( bc->hBorder, HWND_TOP, x, y, CW_USEDEFAULT, CW_USEDEFAULT,
- SWP_NOSIZE|SWP_NOZORDER );
+ SWP_NOSIZE|SWP_NOZORDER );
for (butts = (wChoiceItem_p*)bc->buttList; *butts; butts++ ) {
+ (*butts)->x += dx;
+ (*butts)->y += dy;
SetWindowPos( (*butts)->hWnd, HWND_TOP,
- (*butts)->x+=dx, (*butts)->y+=dy,
- CW_USEDEFAULT, CW_USEDEFAULT,
- SWP_NOSIZE|SWP_NOZORDER );
+ (*butts)->x, (*butts)->y,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ SWP_NOSIZE|SWP_NOZORDER );
}
bc->x = x;
bc->y = y;
}
-long FAR PASCAL _export pushChoiceItem(
- HWND hWnd,
- UINT message,
- UINT wParam,
- LONG lParam )
+LRESULT FAR PASCAL _export pushChoiceItem(
+ HWND hWnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam )
{
/* Catch <Return> and cause focus to leave control */
-#ifdef WIN32
- long inx = GetWindowLong( hWnd, GWL_ID );
-#else
- short inx = GetWindowWord( hWnd, GWW_ID );
-#endif
-
+ wIndex_t inx = (wIndex_t)GetWindowLongPtr( hWnd, GWL_ID );
wControl_p b = mswMapIndex( inx );
switch (message) {
@@ -160,12 +161,12 @@ long FAR PASCAL _export pushChoiceItem(
case 0x0D:
case 0x1B:
case 0x09:
- SetFocus( ((wControl_p)(b->parent))->hWnd );
+ SetFocus( ((wControl_p)(b->parent))->hWnd );
SendMessage( ((wControl_p)(b->parent))->hWnd, WM_CHAR,
- wParam, lParam );
+ wParam, lParam );
/*SendMessage( ((wControl_p)(b->parent))->hWnd, WM_COMMAND,
inx, MAKELONG( hWnd, EN_KILLFOCUS ) );*/
- return 0L;
+ return (LRESULT)0;
}
}
break;
@@ -174,18 +175,18 @@ long FAR PASCAL _export pushChoiceItem(
}
LRESULT choiceItemProc(
- wControl_p b,
- HWND hWnd,
- UINT message,
- WPARAM wParam,
- LPARAM lParam )
-{
+ wControl_p b,
+ HWND hWnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam )
+{
wChoiceItem_p me = (wChoiceItem_p)b, *rest;
wChoice_p bc;
int num;
switch( message ) {
-
+
case WM_COMMAND:
switch (WCMD_PARAM_NOTF) {
case BN_CLICKED:
@@ -194,53 +195,57 @@ LRESULT choiceItemProc(
for (rest = (wChoiceItem_p*)bc->buttList; *rest; rest++ ) {
switch (bc->type) {
case B_TOGGLE:
- num = rest-(wChoiceItem_p*)bc->buttList;
+ num = (int)(rest-(wChoiceItem_p*)bc->buttList);
if (*rest == me) {
bc->oldVal ^= (1L<<num);
}
SendMessage( (*rest)->hWnd, BM_SETCHECK,
- (bc->oldVal & (1L<<num)) != 0, 0L );
+ (WPARAM)((bc->oldVal & (1L<<num)) != 0), (LPARAM)0 );
break;
-
+
case B_RADIO:
if (*rest != me) {
- SendMessage( (*rest)->hWnd, BM_SETCHECK, 0, 0L );
+ SendMessage( (*rest)->hWnd, BM_SETCHECK, (WPARAM)0, (LPARAM)0 );
} else {
- bc->oldVal = rest-(wChoiceItem_p*)bc->buttList;
- SendMessage( (*rest)->hWnd, BM_SETCHECK, 1, 0L );
+ bc->oldVal = (long)(rest-(wChoiceItem_p*)bc->buttList);
+ SendMessage( (*rest)->hWnd, BM_SETCHECK, (WPARAM)1, (LPARAM)0 );
}
break;
}
}
- if (bc->valueP)
+ if (bc->valueP) {
*bc->valueP = bc->oldVal;
- if (bc->action)
+ }
+ if (bc->action) {
bc->action( bc->oldVal, bc->data );
+ }
break;
}
break;
- }
-
+ }
+
return DefWindowProc( hWnd, message, wParam, lParam );
-}
+}
static callBacks_t choiceCallBacks = {
- mswRepaintLabel,
- NULL,
- NULL,
- choiceSetBusy,
- choiceShow,
- choiceSetPos };
+ mswRepaintLabel,
+ NULL,
+ NULL,
+ choiceSetBusy,
+ choiceShow,
+ choiceSetPos
+};
static callBacks_t choiceItemCallBacks = {
- NULL,
- NULL,
- choiceItemProc };
+ NULL,
+ NULL,
+ choiceItemProc
+};
/**
- * Creates choice buttons. This function is used to create a group of
+ * Creates choice buttons. This function is used to create a group of
* radio buttons and checkboxes.
*
* \param type IN type of button
@@ -257,27 +262,27 @@ static callBacks_t choiceItemCallBacks = {
*/
static wChoice_p choiceCreate(
- wType_e type,
- wWin_p parent,
- POS_T x,
- POS_T y,
- const char * helpStr,
- const char * labelStr,
- long option,
- const char **labels,
- long *valueP,
- wChoiceCallBack_p action,
- void *data )
+ wType_e type,
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ const char * const * labels,
+ long *valueP,
+ wChoiceCallBack_p action,
+ void *data )
{
wChoice_p b;
- const char ** lp;
+ const char * const * lp;
int cnt;
wChoiceItem_p * butts;
- int ppx, ppy;
+ wWinPix_t ppx, ppy;
int bs;
HDC hDc;
HWND hButt;
- int lab_l;
+ size_t lab_l;
DWORD dw;
int w, maxW;
int pw, ph;
@@ -292,17 +297,17 @@ static wChoice_p choiceCreate(
b->action = action;
b->labels = labels;
b->labelY += 6;
-
+
ppx = b->x;
ppy = b->y;
switch (b->type) {
case B_TOGGLE:
- bs = BS_CHECKBOX;
- break;
+ bs = BS_CHECKBOX;
+ break;
case B_RADIO:
- bs = BS_RADIOBUTTON;
- break;
+ bs = BS_RADIOBUTTON;
+ break;
}
for (lp = b->labels,cnt=0; *lp; lp++,cnt++ );
butts = (wChoiceItem_p*)malloc( (cnt+1) * sizeof *butts );
@@ -310,54 +315,60 @@ static wChoice_p choiceCreate(
b->oldVal = (b->valueP?*b->valueP:0);
ph = pw = 2;
maxW = 0;
- if (helpStr)
+ if (helpStr) {
helpStrCopy = mswStrdup( helpStr );
- for (lp = b->labels, cnt=0; *lp; lp++, cnt++, butts++ ) {
- *butts = (wChoiceItem_p)mswAlloc( parent, B_CHOICEITEM,
- mswStrdup(_((char *)*lp)), sizeof( wChoiceItem_t ), data, &index );
- (*butts)->owner = b;
- (*butts)->hWnd = hButt = CreateWindow( "BUTTON", (*butts)->labelStr,
- bs | WS_CHILD | WS_VISIBLE | mswGetBaseStyle(parent), b->x+pw, b->y+ph,
- 80, CHOICE_HEIGHT,
- ((wControl_p)parent)->hWnd, (HMENU)index, mswHInst, NULL );
- if ( hButt == (HWND)0 ) {
- mswFail( "choiceCreate button" );
- return b;
- }
- (*butts)->x = b->x+pw;
- (*butts)->y = b->y+ph;
- if (b->hWnd == 0)
- b->hWnd = (*butts)->hWnd;
- (*butts)->helpStr = helpStrCopy;
-
- hDc = GetDC( hButt );
- lab_l = strlen((*butts)->labelStr);
-
- if (!mswThickFont) {hFont = SelectObject( hDc, mswLabelFont );}
- dw = GetTextExtent( hDc, (char *)((*butts)->labelStr), lab_l );
- if (!mswThickFont) {SelectObject( hDc, hFont );}
-
- w = LOWORD(dw) + CHOICE_MIN_WIDTH;
-
- if (w > maxW)
- maxW = w;
- SetBkMode( hDc, TRANSPARENT );
- ReleaseDC( hButt, hDc );
- if (b->option & BC_HORZ) {
- pw += w;
- } else {
- ph += CHOICE_HEIGHT;
- }
- if (!SetWindowPos( hButt, HWND_TOP, 0, 0,
- w, CHOICE_HEIGHT, SWP_NOMOVE|SWP_NOZORDER)) {
- mswFail("Create CHOICE: SetWindowPos");
- }
- mswChainFocus( (wControl_p)*butts );
- newChoiceItemProc = MakeProcInstance( (XWNDPROC)pushChoiceItem, mswHInst );
- oldChoiceItemProc = (XWNDPROC)GetWindowLong( (*butts)->hWnd, GWL_WNDPROC );
- SetWindowLong( (*butts)->hWnd, GWL_WNDPROC, (LONG)newChoiceItemProc );
- if ( !mswThickFont )
- SendMessage( (*butts)->hWnd, WM_SETFONT, (WPARAM)mswLabelFont, 0L );
+ }
+ for (lp = b->labels, cnt=0; *lp; lp++, cnt++, butts++ ) {
+ *butts = (wChoiceItem_p)mswAlloc( parent, B_CHOICEITEM,
+ mswStrdup(_((char *)*lp)), sizeof( wChoiceItem_t ), data, &index );
+ (*butts)->owner = b;
+ (*butts)->hWnd = hButt = CreateWindow( "BUTTON", (*butts)->labelStr,
+ bs | WS_CHILD | WS_VISIBLE | mswGetBaseStyle(parent), b->x+pw, b->y+ph,
+ 80, CHOICE_HEIGHT,
+ ((wControl_p)parent)->hWnd, (HMENU)(UINT_PTR)index, mswHInst, NULL );
+ if ( hButt == (HWND)0 ) {
+ mswFail( "choiceCreate button" );
+ return b;
+ }
+ (*butts)->x = b->x+pw;
+ (*butts)->y = b->y+ph;
+ if (b->hWnd == 0) {
+ b->hWnd = (*butts)->hWnd;
+ }
+ (*butts)->helpStr = helpStrCopy;
+
+ hDc = GetDC( hButt );
+ lab_l = strlen((*butts)->labelStr);
+
+ hFont = SelectObject( hDc, mswLabelFont );
+ dw = GetTextExtent( hDc, (char *)((*butts)->labelStr), (UINT)lab_l );
+ SelectObject( hDc, hFont );
+
+ w = LOWORD(dw) + CHOICE_MIN_WIDTH;
+
+ if (w > maxW) {
+ maxW = w;
+ }
+ SetBkMode( hDc, TRANSPARENT );
+ ReleaseDC( hButt, hDc );
+ if (b->option & BC_HORZ) {
+ pw += w;
+ } else {
+ ph += CHOICE_HEIGHT;
+ }
+ if (!SetWindowPos( hButt, HWND_TOP, 0, 0,
+ w, CHOICE_HEIGHT, SWP_NOMOVE|SWP_NOZORDER)) {
+ mswFail("Create CHOICE: SetWindowPos");
+ }
+ mswChainFocus( (wControl_p)*butts );
+ newChoiceItemProc = MakeProcInstance( (XWNDPROC)pushChoiceItem, mswHInst );
+ oldChoiceItemProc = (XWNDPROC)GetWindowLongPtr((*butts)->hWnd, GWLP_WNDPROC);
+ SetWindowLongPtr((*butts)->hWnd, GWLP_WNDPROC, (LPARAM)newChoiceItemProc);
+#ifdef _OLDCODE
+ oldChoiceItemProc = (XWNDPROC)GetWindowLong((*butts)->hWnd, GWL_WNDPROC);
+ SetWindowLong((*butts)->hWnd, GWL_WNDPROC, (LONG)newChoiceItemProc);
+#endif
+ SendMessage( (*butts)->hWnd, WM_SETFONT, (WPARAM)mswLabelFont, (LPARAM)0 );
}
*butts = NULL;
switch (b->type) {
@@ -375,13 +386,13 @@ static wChoice_p choiceCreate(
}
pw += 4; ph += 4;
b->w = pw;
- b->h = ph;
+ b->h = ph;
#define FRAME_STYLE SS_ETCHEDFRAME
if ((b->option & BC_NOBORDER)==0) {
b->hBorder = CreateWindow( "STATIC", NULL, WS_CHILD | WS_VISIBLE | FRAME_STYLE,
- b->x, b->y, pw, ph, ((wControl_p)parent)->hWnd, 0, mswHInst, NULL );
+ b->x, b->y, pw, ph, ((wControl_p)parent)->hWnd, 0, mswHInst, NULL );
}
mswAddButton( (wControl_p)b, TRUE, helpStr );
mswCallBacks[ B_CHOICEITEM ] = &choiceItemCallBacks;
@@ -391,33 +402,33 @@ static wChoice_p choiceCreate(
wChoice_p wRadioCreate(
- wWin_p parent,
- POS_T x,
- POS_T y,
- const char * helpStr,
- const char * labelStr,
- long option,
- const char **labels,
- long *valueP,
- wChoiceCallBack_p action,
- void *data )
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ const char * const *labels,
+ long *valueP,
+ wChoiceCallBack_p action,
+ void *data )
{
return choiceCreate( B_RADIO, parent, x, y, helpStr, labelStr,
- option, labels, valueP, action, data );
+ option, labels, valueP, action, data );
}
wChoice_p wToggleCreate(
- wWin_p parent,
- POS_T x,
- POS_T y,
- const char * helpStr,
- const char * labelStr,
- long option,
- const char **labels,
- long *valueP,
- wChoiceCallBack_p action,
- void *data )
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ const char * const *labels,
+ long *valueP,
+ wChoiceCallBack_p action,
+ void *data )
{
return choiceCreate( B_TOGGLE, parent, x, y, helpStr, labelStr,
- option, labels, valueP, action, data );
+ option, labels, valueP, action, data );
}
diff --git a/app/wlib/mswlib/mswcolor.c b/app/wlib/mswlib/mswcolor.c
index 41bf6a9..f28e298 100644
--- a/app/wlib/mswlib/mswcolor.c
+++ b/app/wlib/mswlib/mswcolor.c
@@ -4,7 +4,6 @@
#include <windows.h>
#include <string.h>
-#include <malloc.h>
#include <stdlib.h>
#include <commdlg.h>
#include <math.h>
@@ -25,8 +24,8 @@
#define NUM_GRAYS (16)
#define NUM_COLORS (256)
-wDrawColor wDrawColorWhite = 0;
-wDrawColor wDrawColorBlack = 1;
+static wDrawColor wDrawColorWhite = 0;
+static wDrawColor wDrawColorBlack = 1;
#define MAX_COLOR_DISTANCE (3)
@@ -34,18 +33,17 @@ static void mswGetCustomColors( void );
static struct {
- WORD palVersion;
- WORD palNumEntries;
- PALETTEENTRY palPalEntry[NUM_COLORS];
- } colorPalette = {
- 0x300,
- 2,
- {
+ WORD palVersion;
+ WORD palNumEntries;
+ PALETTEENTRY palPalEntry[NUM_COLORS];
+} colorPalette = {
+ 0x300,
+ 2,
+ {
{ 255, 255, 255 }, /* White */
{ 0, 0, 0 } /* Black */
- } };
-
-COLORREF mappedColors[NUM_COLORS];
+ }
+};
static long flipRGB( long rgb )
@@ -70,8 +68,10 @@ static void getpalette( void )
cnt = GetDeviceCaps(hdc, SIZEPALETTE);
GetSystemPaletteEntries( hdc, 0, cnt, pe );
f = fopen( "palette.txt", "w" );
- for (inx=0;inx<cnt;inx++)
- fprintf(f, "%d [ %d %d %d %d ]\n", inx, pe[inx].peRed, pe[inx].peGreen, pe[inx].peBlue, pe[inx].peFlags );
+ for (inx=0; inx<cnt; inx++) {
+ fprintf(f, "%d [ %d %d %d %d ]\n", inx, pe[inx].peRed, pe[inx].peGreen,
+ pe[inx].peBlue, pe[inx].peFlags );
+ }
fclose(f);
ReleaseDC( mswHWnd, hdc );
}
@@ -93,8 +93,9 @@ static int findColor( int r0, int g0, int b0 )
b1 = pal[c].peBlue;
g1 = pal[c].peGreen;
d1 = abs(r0-r1) + abs(g0-g1) + abs(b0-b1);
- if (d1 == 0)
+ if (d1 == 0) {
return c;
+ }
if (d1 < d0) {
d0 = d1;
cc = c;
@@ -106,7 +107,8 @@ static int findColor( int r0, int g0, int b0 )
pal[colorPalette.palNumEntries].peBlue = b0;
if ( mswPalette ) {
ResizePalette( mswPalette, colorPalette.palNumEntries+1 );
- SetPaletteEntries( mswPalette, colorPalette.palNumEntries, 1, &pal[colorPalette.palNumEntries] );
+ SetPaletteEntries( mswPalette, colorPalette.palNumEntries, 1,
+ &pal[colorPalette.palNumEntries] );
}
return colorPalette.palNumEntries++;
}
@@ -132,8 +134,9 @@ void mswInitColorPalette( void )
PALETTEENTRY palPalEntry[256];
} pe;
- if (initted)
+ if (initted) {
return;
+ }
initted = TRUE;
mswGetCustomColors();
@@ -160,7 +163,7 @@ HPALETTE mswCreatePalette( void )
int mswGetColorList( RGBQUAD * colors )
{
int i;
- for (i=0;i<(int)colorPalette.palNumEntries;i++) {
+ for (i=0; i<(int)colorPalette.palNumEntries; i++) {
colors[i].rgbBlue = colorPalette.palPalEntry[i].peBlue;
colors[i].rgbGreen = colorPalette.palPalEntry[i].peGreen;
colors[i].rgbRed = colorPalette.palPalEntry[i].peRed;
@@ -172,37 +175,41 @@ int mswGetColorList( RGBQUAD * colors )
COLORREF mswGetColor( wBool_t hasPalette, wDrawColor color )
{
- if ( hasPalette )
+ if ( hasPalette ) {
return PALETTEINDEX(color);
- else
- return RGB( colorPalette.palPalEntry[color].peRed, colorPalette.palPalEntry[color].peGreen, colorPalette.palPalEntry[color].peBlue );
+ } else {
+ return RGB( colorPalette.palPalEntry[color].peRed,
+ colorPalette.palPalEntry[color].peGreen,
+ colorPalette.palPalEntry[color].peBlue );
+ }
}
wDrawColor wDrawColorGray(
- int percent )
+ int percent )
{
int n;
n = (percent * NUM_GRAYS) / 100;
- if ( n <= 0 )
+ if ( n <= 0 ) {
return wDrawColorBlack;
- else if ( n > NUM_GRAYS )
+ } else if ( n > NUM_GRAYS ) {
return wDrawColorWhite;
- else {
+ } else {
n = (n*256)/NUM_GRAYS;
return wDrawFindColor( wRGB(n,n,n) );
}
}
wDrawColor wDrawFindColor(
- long rgb0 )
+ long rgb0 )
{
static long saved_rgb = wRGB(255,255,255);
static wDrawColor saved_color = 0;
int r0, g0, b0;
- if (rgb0 == saved_rgb)
+ if (rgb0 == saved_rgb) {
return saved_color;
+ }
r0 = (int)(rgb0>>16)&0xFF;
g0 = (int)(rgb0>>8)&0xFF;
b0 = (int)(rgb0)&0xFF;
@@ -212,7 +219,7 @@ wDrawColor wDrawFindColor(
long wDrawGetRGB(
- wDrawColor color )
+ wDrawColor color )
{
long rgb;
int r, g, b;
@@ -236,6 +243,7 @@ static void mswGetCustomColors( void )
strcpy( colorName, "custom-" );
for ( inx=0; inx<16; inx++ ) {
sprintf( colorName+7, "%d", inx );
+ /** @prefs [mswcolor] custom-0=<rgb> to custom-15=<rgb> Set custom colors */
wPrefGetInteger( "mswcolor", colorName, &rgb, 0 );
aclrCust[inx] = flipRGB(rgb);
}
@@ -260,8 +268,8 @@ void mswPutCustomColors( void )
wBool_t wColorSelect(
- const char * title,
- wDrawColor * color )
+ const char * title,
+ wDrawColor * color )
{
long rgb;
@@ -286,18 +294,18 @@ wBool_t wColorSelect(
typedef struct {
- wDrawColor * valueP;
- wColorSelectButtonCallBack_p action;
- const char * labelStr;
- void * data;
- wDrawColor color;
- wButton_p button;
- wIcon_p bm;
- } colorData_t;
+ wDrawColor * valueP;
+ wColorSelectButtonCallBack_p action;
+ const char * labelStr;
+ void * data;
+ wDrawColor color;
+ wButton_p button;
+ wIcon_p bm;
+} colorData_t;
static void doColorButton(
- void * data )
+ void * data )
{
colorData_t * cd = (colorData_t*)data;
wDrawColor newColor;
@@ -306,30 +314,33 @@ static void doColorButton(
if (wColorSelect( cd->labelStr, &newColor )) {
cd->color = newColor;
wColorSelectButtonSetColor( cd->button, newColor );
- if (cd->valueP)
+ if (cd->valueP) {
*cd->valueP = newColor;
- if (cd->action)
+ }
+ if (cd->action) {
cd->action( cd->data, newColor );
+ }
}
}
wButton_p wColorSelectButtonCreate(
- wWin_p win,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- const char * labelStr,
- long option,
- wPos_t width,
- wDrawColor * color,
- wColorSelectButtonCallBack_p action,
- void * data )
+ wWin_p win,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ wWinPix_t width,
+ wDrawColor * color,
+ wColorSelectButtonCallBack_p action,
+ void * data )
{
wButton_p bb;
wIcon_p bm;
colorData_t * cd;
- bm = wIconCreateBitMap( square10_width, square10_height, square10_bits, (color?*color:0) );
+ bm = wIconCreateBitMap( square10_width, square10_height, square10_bits,
+ (color?*color:0) );
cd = malloc( sizeof *cd );
cd->valueP = color;
cd->action = action;
@@ -337,17 +348,19 @@ wButton_p wColorSelectButtonCreate(
cd->labelStr = labelStr;
cd->color = (color?*color:0);
cd->bm = bm;
- bb = wButtonCreate( win, x, y, helpStr, (char*)bm, option|BO_ICON, width, doColorButton, cd );
+ bb = wButtonCreate( win, x, y, helpStr, (char*)bm, option|BO_ICON, width,
+ doColorButton, cd );
cd->button = bb;
- if ( labelStr )
- wControlSetLabel( (wControl_p)bb, labelStr );
+ if ( labelStr ) {
+ wControlSetLabel( (wControl_p)bb, labelStr );
+ }
return bb;
}
void wColorSelectButtonSetColor(
- wButton_p bb,
- wDrawColor color )
+ wButton_p bb,
+ wDrawColor color )
{
((colorData_t*)((wControl_p)bb)->data)->color = color;
wIconSetColor( ((colorData_t*)((wControl_p)bb)->data)->bm, color );
@@ -356,7 +369,7 @@ void wColorSelectButtonSetColor(
wDrawColor wColorSelectButtonGetColor(
- wButton_p bb )
+ wButton_p bb )
{
return ((colorData_t*)((wControl_p)bb)->data)->color;
}
diff --git a/app/wlib/mswlib/mswdraw.c b/app/wlib/mswlib/mswdraw.c
index c2739e6..7ab38ac 100644
--- a/app/wlib/mswlib/mswdraw.c
+++ b/app/wlib/mswlib/mswdraw.c
@@ -17,25 +17,19 @@
*
* 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.
- */
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
#define _WIN32_WINNT 0x0600 /* for wheel mouse supposrt */
#include <windows.h>
#include <string.h>
-#include <malloc.h>
#include <stdlib.h>
#include <commdlg.h>
#include <math.h>
#include <winuser.h>
-#ifdef WIN32
#define wFont_t tagLOGFONTA
-#else
-#define wFont_t tagLOGFONT
-#endif
-#include "misc.h"
#include "mswint.h"
#include <FreeImage.h>
@@ -48,9 +42,9 @@ wBool_t wDrawDoTempDraw = TRUE;
*****************************************************************************
*/
-static wBool_t initted = FALSE;
+#define M_PI 3.14159265358979323846
-long wDebugFont;
+static wBool_t initted = FALSE;
static FARPROC oldDrawProc;
@@ -59,69 +53,53 @@ static long tmpOp = 0x990066;
static long setOp = 0x8800c6;
static long clrOp = 0xbb0226;
-#define CENTERMARK_LENGTH 6
+#define CENTERMARK_LENGTH 4
-bool bDrawMainBM = 0;
+static bool bDrawMainBM = 0;
+
+typedef struct {
+ double x, y;
+} coOrd;
#ifdef SLOW
-static wPos_t XPIX2INCH( wDraw_p d, int ix )
+static wDrawPix_t XWINPIX2DRAWPIX( wDraw_p d, wWinPix_t ix )
{
- return (wPos_t)ix;
+ return (wDrawPix_t)ix;
}
-static wPos_t YPIX2INCH( wDraw_p d, int iy )
+static wDrawPix_t YWINPIX2DRAWPIX( wDraw_p d, wWinPix_t iy )
{
- wPos_t y;
- y = (wPos_t)(d->h-2-iy);
+ wWinPix_t y;
+ y = (wDrawPix_t)(d->h-2-iy);
return y;
}
-static int XINCH2PIX( wDraw_p d, wPos_t xx )
+static wWinPix_t XDRAWPIX2WINPIX( wDraw_p d, wDrawPix_t xx )
{
- int ix;
- ix = (int)(xx);
+ wWinPix_t ix;
+ ix = (wWinPix_t)(xx);
return ix;
}
-static int YINCH2PIX( wDraw_p d, wPos_t y )
+static wWinPix_t YDRAWPIX2WINPIX( wDraw_p d, wDrawPix_t y )
{
- int iy;
- iy = d->h-2 - (int)(y);
+ wWinPix_t iy;
+ iy = (d->h)-2 - (wWinPix_t)(y);
return iy;
}
-
-static wPos_t XPIXELSTOINCH( wDraw_p d, int ix )
-{
- return (wPos_t)ix;
-}
-
-
-static wPos_t YPIXELSTOINCH( wDraw_p d, int iy )
-{
- return (wPos_t)iy;
-}
#else
-#define XPIX2INCH( d, ix ) \
- ((wPos_t)ix)
-
-#define YPIX2INCH( d, iy ) \
- ((wPos_t)(d->h-2-iy))
-
-#define XINCH2PIX( d, xx ) \
- ((int)(xx))
-
-#define YINCH2PIX( d, y ) \
- (d->h-2 - (int)(y))
-
+#define XWINPIX2DRAWPIX( d, ix ) \
+ ((wDrawPix_t)ix)
-#define XPIXELSTOINCH( d, ix ) \
- ((wPos_t)ix)
+#define YWINPIX2DRAWPIX( d, iy ) \
+ ((wDrawPix_t)(d->h-2-iy))
+#define XDRAWPIX2WINPIX( d, xx ) \
+ ((wWinPix_t)(xx))
-#define YPIXELSTOINCH( d, iy ) \
- ((wPos_t)iy)
-
+#define YDRAWPIX2WINPIX( d, y ) \
+ (d->h - 2 - (wWinPix_t)(y))
#endif
/*
@@ -134,18 +112,15 @@ static wPos_t YPIXELSTOINCH( wDraw_p d, int iy )
-static long noNegDrawArgs = -1;
-static long noFlatEndCaps = 0;
-
void wDrawDelayUpdate(
- wDraw_p d,
- wBool_t delay )
+ wDraw_p d,
+ wBool_t delay )
{
}
wBool_t wDrawSetTempMode(
- wDraw_p bd,
- wBool_t bTemp )
+ wDraw_p bd,
+ wBool_t bTemp )
{
wBool_t rc = bd->bTempMode;
bd->bTempMode = bTemp;
@@ -153,14 +128,14 @@ wBool_t wDrawSetTempMode(
// Main to Temp drawing
// Copy mainBM to tempBM
wDrawClearTemp( bd );
- if (bDrawMainBM) return rc;
+ if (bDrawMainBM) { return rc; }
HDC hDcOld = CreateCompatibleDC(bd->hDc);
HBITMAP hBmOld = SelectObject(hDcOld, bd->hBmMain);
SelectObject(bd->hDc, bd->hBmTemp);
BitBlt(bd->hDc, 0, 0,
- bd->w, bd->h,
- hDcOld, 0, 0,
- SRCCOPY);
+ bd->w, bd->h,
+ hDcOld, 0, 0,
+ SRCCOPY);
SelectObject(hDcOld, hBmOld);
DeleteDC(hDcOld);
bd->bCopiedMain = TRUE;
@@ -170,21 +145,20 @@ wBool_t wDrawSetTempMode(
/**
* Sets the proper pen and composition for the next drawing operation
- *
*
- * \param hDc IN device context
- * \param d IN ???
+ *
+ * \param d IN drawing context
* \param dw IN line width
* \param lt IN line type (dashed, solid, ...)
* \param dc IN color
- * \param dopt IN ????
+ * \param dopt IN drawing options
*/
static void setDrawMode(
- wDraw_p d,
- wDrawWidth dw,
- wDrawLineType_e lt,
- wDrawColor dc,
- wDrawOpts dopt )
+ wDraw_p d,
+ wDrawWidth dw,
+ wDrawLineType_e lt,
+ wDrawColor dc,
+ wDrawOpts dopt )
{
long centerPen[] = {40,10,20,10};
long phantomPen[] = {40,10,20,10,20,10};
@@ -197,10 +171,11 @@ static void setDrawMode(
static LOGBRUSH logBrush = { 0, 0, 0 };
DWORD penStyle;
- if ( wDrawDoTempDraw && (dopt & wDrawOptTemp) )
+ if ( wDrawDoTempDraw && (dopt & wDrawOptTemp) ) {
SelectObject(d->hDc, d->hBmTemp);
- else
+ } else {
SelectObject(d->hDc, d->hBmMain);
+ }
if ( d->hasPalette ) {
int winPaletteClock = mswGetPaletteClock();
@@ -211,12 +186,14 @@ static void setDrawMode(
}
SetROP2( d->hDc, R2_COPYPEN );
- if ( d == d0 && dw0 == dw && lt == lt0 && dc == dc0 )
+ if ( d == d0 && dw0 == dw && lt == lt0 && dc == dc0 ) {
return;
+ }
// make sure that the line width is at least 1!
- if( !dw )
+ if( !dw ) {
dw++;
+ }
d0 = d; dw0 = dw; lt0 = lt; dc0 = dc;
@@ -225,16 +202,14 @@ static void setDrawMode(
logBrush.lbColor = mswGetColor(d->hasPalette,dc);
if ( lt==wDrawLineSolid ) {
- penStyle = PS_GEOMETRIC | PS_SOLID;
- if ( noFlatEndCaps == FALSE )
- penStyle |= PS_ENDCAP_FLAT;
+ penStyle = PS_GEOMETRIC | PS_SOLID | PS_ENDCAP_FLAT;
} else if (lt == wDrawLineDot) {
penStyle = PS_GEOMETRIC | PS_DOT;
} else if (lt == wDrawLineDash) {
penStyle = PS_GEOMETRIC | PS_DASH;
} else if (lt == wDrawLineDashDot) {
penStyle = PS_GEOMETRIC | PS_DASHDOT;
- } else if ( lt == wDrawLineDashDotDot){
+ } else if ( lt == wDrawLineDashDotDot) {
penStyle = PS_GEOMETRIC | PS_DASHDOTDOT;
} else if ( lt == wDrawLineCenter) {
penStyle = PS_GEOMETRIC | PS_USERSTYLE;
@@ -244,47 +219,49 @@ static void setDrawMode(
penStyle = PS_GEOMETRIC | PS_USERSTYLE;
penarray = &phantomPen;
penarray_size = sizeof(phantomPen) / sizeof(long);
- } else
+ } else {
penStyle = PS_GEOMETRIC | PS_SOLID;
+ }
d->hPen = ExtCreatePen( penStyle,
- dw,
- &logBrush,
- penarray_size,
- penarray );
+ dw,
+ &logBrush,
+ penarray_size,
+ penarray );
hOldPen = SelectObject( d->hDc, d->hPen );
DeleteObject( hOldPen );
}
static void setDrawBrush(
- wDraw_p d,
- wDrawColor dc,
- wDrawOpts dopt )
+ wDraw_p d,
+ wDrawColor dc,
+ wDrawOpts dopt )
{
HBRUSH hOldBrush;
static wDraw_p d0;
static wDrawColor dc0 = -1;
setDrawMode( d, 0, wDrawLineSolid, dc, dopt );
- if ( d == d0 && dc == dc0 )
+ if ( d == d0 && dc == dc0 ) {
return;
+ }
d0 = d; dc0 = dc;
- d->hBrush = CreateSolidBrush(
- mswGetColor(d->hasPalette,dc) );
+ d->hBrush = CreateSolidBrush(
+ mswGetColor(d->hasPalette,dc) );
hOldBrush = SelectObject( d->hDc, d->hBrush );
DeleteObject( hOldBrush );
}
static void myInvalidateRect(
- wDraw_p d,
- RECT * prect )
+ wDraw_p d,
+ RECT * prect )
{
- if ( prect->top < 0 ) prect->top = 0;
- if ( prect->left < 0 ) prect->left = 0;
- if ( prect->bottom > d->h ) prect->bottom = d->h;
- if ( prect->right > d->w ) prect->right = d->w;
+ if ( prect->top < 0 ) { prect->top = 0; }
+ if ( prect->left < 0 ) { prect->left = 0; }
+ if ( prect->bottom > d->h ) { prect->bottom = d->h; }
+ if ( prect->right > d->w ) { prect->right = d->w; }
InvalidateRect( d->hWnd, prect, FALSE );
}
@@ -293,8 +270,8 @@ static int clip0( POINT * p0, POINT * p1, wDraw_p d )
{
long int x0=p0->x, y0=p0->y, x1=p1->x, y1=p1->y;
long int dx, dy;
- if ( x0<0 && x1<0 ) return 0;
- if ( y0<0 && y1<0 ) return 0;
+ if ( x0<0 && x1<0 ) { return 0; }
+ if ( y0<0 && y1<0 ) { return 0; }
dx=x1-x0;
dy=y1-y0;
if ( x0 < 0 ) {
@@ -302,7 +279,7 @@ static int clip0( POINT * p0, POINT * p1, wDraw_p d )
x0 = 0;
}
if ( y0 < 0 ) {
- if ( (x0 -= y0*dx/dy) < 0 ) return 0;
+ if ( (x0 -= y0*dx/dy) < 0 ) { return 0; }
y0 = 0;
}
if ( x1 < 0 ) {
@@ -310,7 +287,7 @@ static int clip0( POINT * p0, POINT * p1, wDraw_p d )
x1 = 0;
}
if ( y1 < 0 ) {
- if ( (x1 -= y1*dx/dy) < 0 ) return 0;
+ if ( (x1 -= y1*dx/dy) < 0 ) { return 0; }
y1 = 0;
}
p0->x = (int)x0;
@@ -322,61 +299,67 @@ static int clip0( POINT * p0, POINT * p1, wDraw_p d )
void wDrawLine(
- wDraw_p d,
- wPos_t p0x,
- wPos_t p0y,
- wPos_t p1x,
- wPos_t p1y,
- wDrawWidth dw,
- wDrawLineType_e lt,
- wDrawColor dc,
- wDrawOpts dopt )
+ wDraw_p d,
+ wDrawPix_t p0x,
+ wDrawPix_t p0y,
+ wDrawPix_t p1x,
+ wDrawPix_t p1y,
+ wDrawWidth dw,
+ wDrawLineType_e lt,
+ wDrawColor dc,
+ wDrawOpts dopt )
{
POINT p0, p1;
RECT rect;
setDrawMode( d, dw, lt, dc, dopt );
- p0.x = XINCH2PIX(d,p0x);
- p0.y = YINCH2PIX(d,p0y);
- p1.x = XINCH2PIX(d,p1x);
- p1.y = YINCH2PIX(d,p1y);
- if ( noNegDrawArgs>0 && !clip0( &p0, &p1, d ) )
- return;
+ p0.x = XDRAWPIX2WINPIX(d,p0x);
+ p0.y = YDRAWPIX2WINPIX(d,p0y);
+ p1.x = XDRAWPIX2WINPIX(d,p1x);
+ p1.y = YDRAWPIX2WINPIX(d,p1y);
+
MoveTo( d->hDc, p0.x, p0.y );
LineTo( d->hDc, p1.x, p1.y );
if (d->hWnd) {
- if (dw==0)
+ if (dw==0) {
dw = 1;
+ }
dw++;
- if (p0.y<p1.y) {
- rect.top = p0.y-dw;
- rect.bottom = p1.y+dw;
- } else {
- rect.top = p1.y-dw;
- rect.bottom = p0.y+dw;
- }
- if (p0.x<p1.x) {
- rect.left = p0.x-dw;
- rect.right = p1.x+dw;
- } else {
- rect.left = p1.x-dw;
- rect.right = p0.x+dw;
- }
- myInvalidateRect( d, &rect );
+ if (p0.y<p1.y) {
+ rect.top = p0.y-dw;
+ rect.bottom = p1.y+dw;
+ } else {
+ rect.top = p1.y-dw;
+ rect.bottom = p0.y+dw;
+ }
+ if (p0.x<p1.x) {
+ rect.left = p0.x-dw;
+ rect.right = p1.x+dw;
+ } else {
+ rect.left = p1.x-dw;
+ rect.right = p0.x+dw;
+ }
+ myInvalidateRect( d, &rect );
}
}
+static double d2r(double angle)
+{
+ angle *= (M_PI / 180.0);
+ return angle;
+}
+
static double mswsin( double angle )
{
- while (angle < 0.0) angle += 360.0;
- while (angle >= 360.0) angle -= 360.0;
+ while (angle < 0.0) { angle += 360.0; }
+ while (angle >= 360.0) { angle -= 360.0; }
angle *= (M_PI*2.0)/360.0;
return sin( angle );
}
static double mswcos( double angle )
{
- while (angle < 0.0) angle += 360.0;
- while (angle >= 360.0) angle -= 360.0;
+ while (angle < 0.0) { angle += 360.0; }
+ while (angle >= 360.0) { angle -= 360.0; }
angle *= (M_PI*2.0)/360.0;
return cos( angle );
}
@@ -389,6 +372,13 @@ static double mswasin( double x, double h )
return angle;
}
+static double mswNormalizeAngle( double a )
+{
+ while (a<0.0) { a += 360.0; }
+ while (a>=360.0) { a -= 360.0; }
+ return a;
+}
+
/**
* Draw an arc around a specified center
*
@@ -405,33 +395,34 @@ static double mswasin( double x, double h )
void wDrawArc(
- wDraw_p d,
- wPos_t px,
- wPos_t py,
- wPos_t r,
- double a0,
- double a1,
- int drawCenter,
- wDrawWidth dw,
- wDrawLineType_e lt,
- wDrawColor dc,
- wDrawOpts dopt )
+ wDraw_p d,
+ wDrawPix_t px,
+ wDrawPix_t py,
+ wDrawPix_t r,
+ double a0,
+ double a1,
+ int sizeCenter,
+ wDrawWidth dw,
+ wDrawLineType_e lt,
+ wDrawColor dc,
+ wDrawOpts dopt )
{
int i, cnt;
POINT p0, p1, ps, pe, pp0, pp1, pp2, pc;
- double psx, psy, pex, pey, len, aa;
+ wDrawPix_t psx, psy, pex, pey;
+ double aa, ai;
RECT rect;
int needMoveTo;
wBool_t fakeArc = FALSE;
- len = a1/360.0 * (2 * M_PI) * r;
- if (len < 3)
- return;
+ // calculate the center coordinates
+ pc.x = XDRAWPIX2WINPIX( d, px );
+ pc.y = YDRAWPIX2WINPIX( d, py );
- p0.x = XINCH2PIX(d,px-r);
- p0.y = YINCH2PIX(d,py+r)+1;
- p1.x = XINCH2PIX(d,px+r);
- p1.y = YINCH2PIX(d,py-r)+1;
+ p0.x = XDRAWPIX2WINPIX(d,px-r);
+ p0.y = YDRAWPIX2WINPIX(d,py+r);
+ p1.x = XDRAWPIX2WINPIX(d,px+r);
+ p1.y = YDRAWPIX2WINPIX(d,py-r);
pex = px + r * mswsin(a0);
pey = py + r * mswcos(a0);
@@ -440,40 +431,43 @@ void wDrawArc(
/*pointOnCircle( &pe, p, r, a0 );
pointOnCircle( &ps, p, r, a0+a1 );*/
- ps.x = XINCH2PIX(d,(wPos_t)psx);
- ps.y = YINCH2PIX(d,(wPos_t)psy);
- pe.x = XINCH2PIX(d,(wPos_t)pex);
- pe.y = YINCH2PIX(d,(wPos_t)pey);
+ ps.x = XDRAWPIX2WINPIX(d,psx);
+ ps.y = YDRAWPIX2WINPIX(d,psy);
+ pe.x = XDRAWPIX2WINPIX(d,pex);
+ pe.y = YDRAWPIX2WINPIX(d,pey);
setDrawMode( d, dw, lt, dc, dopt );
- if (dw == 0)
+ if (dw == 0) {
dw = 1;
+ }
- if (r>4096) {
+ if ( r > 30000 || a1 < 1.0 ) {
/* The book says 32K but experience says otherwise */
fakeArc = TRUE;
}
- if ( noNegDrawArgs > 0 ) {
- if ( p0.x < 0 || p0.y < 0 || p1.x < 0 || p1.y < 0 )
- fakeArc = TRUE;
- }
+
+ // Starting point
+ psx = px + r * mswsin(a0);
+ psy = py + r * mswcos(a0);
+ pp0.x = XDRAWPIX2WINPIX( d, psx );
+ pp0.y = YDRAWPIX2WINPIX( d, psy );
+
if ( fakeArc ) {
- cnt = (int)a1;
- if ( cnt <= 0 ) cnt = 1;
- if ( cnt > 360 ) cnt = 360;
- aa = a1 / cnt;
- psx = px + r * mswsin(a0);
- psy = py + r * mswcos(a0);
- pp0.x = XINCH2PIX( d, (wPos_t)psx );
- pp0.y = YINCH2PIX( d, (wPos_t)psy );
+ cnt = (int)(a1 / 2);
+ if ( cnt <= 0 ) { cnt = 1; }
+ if ( cnt > 180 ) { cnt = 180; }
+
+ ai = d2r(a1) / cnt;
+ aa = d2r(a0);
needMoveTo = TRUE;
+
for ( i=0; i<cnt; i++ ) {
- a0 += aa;
- psx = px + r * mswsin(a0);
- psy = py + r * mswcos(a0);
- pp2.x = pp1.x = XINCH2PIX( d, (wPos_t)psx );
- pp2.y = pp1.y = YINCH2PIX( d, (wPos_t)psy );
+ aa += ai;
+ psx = px + r * sin(aa);
+ psy = py + r * cos(aa);
+ pp2.x = pp1.x = XDRAWPIX2WINPIX( d, psx );
+ pp2.y = pp1.y = YDRAWPIX2WINPIX( d, psy );
if ( clip0( &pp0, &pp1, d ) ) {
if (needMoveTo) {
MoveTo( d->hDc, pp0.x, pp0.y );
@@ -486,53 +480,68 @@ void wDrawArc(
pp0.x = pp2.x; pp0.y = pp2.y;
}
} else {
- if ( a0 == 0.0 && a1 == 360.0 ) {
- Arc( d->hDc, p0.x, p1.y, p1.x, p0.y, ps.x, p0.y-1, pe.x, p1.y-1 );
- Arc( d->hDc, p0.x, p1.y, p1.x, p0.y, ps.x, p1.y-1, pe.x, p0.y-1 );
+ DWORD rr = XDRAWPIX2WINPIX( d, r );
+ SetArcDirection( d->hDc,AD_CLOCKWISE );
+
+ // Draw two arcs from the center to eliminate the odd pie-shaped end artifact
+ if ( dw > 2.0 ) {
+ double a2 = a1 / 2.0;
+ pp2.x = XDRAWPIX2WINPIX( d, px + r * mswsin(a0+a2) );
+ pp2.y = YDRAWPIX2WINPIX( d, py + r * mswcos(a0+a2) );
+
+ MoveTo( d->hDc, pp2.x, pp2.y );
+ AngleArc( d->hDc, pc.x, pc.y, rr, (float)mswNormalizeAngle(90 - (a0+a2)),
+ (float)(-a2) );
+ MoveTo( d->hDc, pp2.x, pp2.y );
+ AngleArc( d->hDc, pc.x, pc.y, rr, (float)mswNormalizeAngle(90 - (a0+a2)),
+ (float)(a2) );
} else {
- Arc( d->hDc, p0.x, p1.y, p1.x, p0.y, ps.x, ps.y, pe.x, pe.y );
+ MoveTo( d->hDc, pp0.x, pp0.y );
+ AngleArc( d->hDc, pc.x, pc.y, rr, (float)mswNormalizeAngle(90 - a0),
+ (float)(-a1) );
}
}
// should the center of the arc be drawn?
- if( drawCenter ) {
-
- // calculate the center coordinates
- pc.x = XINCH2PIX( d, px );
- pc.y = YINCH2PIX( d, py );
- // now draw the crosshair
- MoveTo( d->hDc, pc.x - CENTERMARK_LENGTH/2, pc.y );
- LineTo( d->hDc, pc.x + CENTERMARK_LENGTH/2, pc.y );
- MoveTo( d->hDc, pc.x, pc.y - CENTERMARK_LENGTH/2 );
- LineTo( d->hDc, pc.x, pc.y + CENTERMARK_LENGTH/2 );
-
- // invalidate the area of the crosshair
- rect.top = pc.y - CENTERMARK_LENGTH / 2 - 1;
- rect.bottom = pc.y + CENTERMARK_LENGTH / 2 + 1;
- rect.left = pc.x - CENTERMARK_LENGTH / 2 - 1;
- rect.right = pc.x + CENTERMARK_LENGTH / 2 + 1;
- myInvalidateRect( d, &rect );
+ if( sizeCenter ) {
+
+ // now draw the crosshair
+ MoveTo( d->hDc, pc.x - CENTERMARK_LENGTH*sizeCenter, pc.y );
+ LineTo( d->hDc, pc.x + CENTERMARK_LENGTH*sizeCenter, pc.y );
+ MoveTo( d->hDc, pc.x, pc.y - CENTERMARK_LENGTH*sizeCenter );
+ LineTo( d->hDc, pc.x, pc.y + CENTERMARK_LENGTH*sizeCenter );
+
+ // invalidate the area of the crosshair
+ rect.top = pc.y - CENTERMARK_LENGTH*sizeCenter - 1;
+ rect.bottom = pc.y + CENTERMARK_LENGTH*sizeCenter + 1;
+ rect.left = pc.x - CENTERMARK_LENGTH*sizeCenter - 1;
+ rect.right = pc.x + CENTERMARK_LENGTH*sizeCenter + 1;
+ myInvalidateRect( d, &rect );
}
if (d->hWnd) {
dw++;
a1 += a0;
- if (a1>360.0)
+ if (a1>360.0) {
rect.top = p0.y;
- else
+ } else {
rect.top = min(pe.y,ps.y);
- if (a1>(a0>180?360.0:0.0)+180)
+ }
+ if (a1>(a0>180?360.0:0.0)+180) {
rect.bottom = p1.y;
- else
+ } else {
rect.bottom = max(pe.y,ps.y);
- if (a1>(a0>270?360.0:0.0)+270)
+ }
+ if (a1>(a0>270?360.0:0.0)+270) {
rect.left = p0.x;
- else
+ } else {
rect.left = min(pe.x,ps.x);
- if (a1>(a0>90?360.0:0.0)+90)
+ }
+ if (a1>(a0>90?360.0:0.0)+90) {
rect.right = p1.x;
- else
+ } else {
rect.right = max(pe.x,ps.x);
+ }
rect.top -= dw;
rect.bottom += dw;
rect.left -= dw;
@@ -543,25 +552,28 @@ void wDrawArc(
}
void wDrawPoint(
- wDraw_p d,
- wPos_t px,
- wPos_t py,
- wDrawColor dc,
- wDrawOpts dopt )
+ wDraw_p d,
+ wDrawPix_t px,
+ wDrawPix_t py,
+ wDrawColor dc,
+ wDrawOpts dopt )
{
POINT p0;
RECT rect;
- p0.x = XINCH2PIX(d,px);
- p0.y = YINCH2PIX(d,py);
+ p0.x = XDRAWPIX2WINPIX(d,px);
+ p0.y = YDRAWPIX2WINPIX(d,py);
- if ( p0.x < 0 || p0.y < 0 )
+ if ( p0.x < 0 || p0.y < 0 ) {
return;
- if ( p0.x >= d->w || p0.y >= d->h )
+ }
+ if ( p0.x >= d->w || p0.y >= d->h ) {
return;
+ }
setDrawMode( d, 0, wDrawLineSolid, dc, dopt );
- SetPixel( d->hDc, p0.x, p0.y, mswGetColor(d->hasPalette,dc) /*colorPalette.palPalEntry[dc]*/ );
+ SetPixel( d->hDc, p0.x, p0.y, mswGetColor(d->hasPalette,
+ dc) /*colorPalette.palPalEntry[dc]*/ );
if (d->hWnd) {
rect.top = p0.y-1;
rect.bottom = p0.y+1;
@@ -581,133 +593,150 @@ void wDrawPoint(
static LOGFONT logFont = {
- /* Initial default values */
- -24, 0, /* H, W */
- 0, /* A */
- 0,
- FW_REGULAR,
- 0, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- 0, /* P&F */
- "Arial" };
+ /* Initial default values */
+ -24, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_REGULAR,
+ 0, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ 0, /* P&F */
+ "Arial"
+ };
static LOGFONT timesFont[2][2] = {
- { {
- /* Initial default values */
- 0, 0, /* H, W */
- 0, /* A */
- 0,
- FW_REGULAR,
- 0, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- 0, /* P&F */
- "Times" },
+ { {
+ /* Initial default values */
+ 0, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_REGULAR,
+ 0, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ 0, /* P&F */
+ "Times"
+ },
{
- /* Initial default values */
- 0, 0, /* H, W */
- 0, /* A */
- 0,
- FW_REGULAR,
- 1, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- 0, /* P&F */
- "Times" } },
- { {
- /* Initial default values */
- 0, 0, /* H, W */
- 0, /* A */
- 0,
- FW_BOLD,
- 0, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- 0, /* P&F */
- "Times" },
+ /* Initial default values */
+ 0, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_REGULAR,
+ 1, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ 0, /* P&F */
+ "Times"
+ }
+ },
+ { {
+ /* Initial default values */
+ 0, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_BOLD,
+ 0, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ 0, /* P&F */
+ "Times"
+ },
{
- /* Initial default values */
- 0, 0, /* H, W */
- 0, /* A */
- 0,
- FW_BOLD,
- 1, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- 0, /* P&F */
- "Times" } } };
+ /* Initial default values */
+ 0, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_BOLD,
+ 1, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ 0, /* P&F */
+ "Times"
+ }
+ }
+};
static LOGFONT helvFont[2][2] = {
- { {
- /* Initial default values */
- 0, 0, /* H, W */
- 0, /* A */
- 0,
- FW_REGULAR,
- 0, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- 0, /* P&F */
- "Arial" },
+ { {
+ /* Initial default values */
+ 0, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_REGULAR,
+ 0, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ 0, /* P&F */
+ "Arial"
+ },
{
- /* Initial default values */
- 0, 0, /* H, W */
- 0, /* A */
- 0,
- FW_REGULAR,
- 1, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- 0, /* P&F */
- "Arial" } },
- { {
- /* Initial default values */
- 0, 0, /* H, W */
- 0, /* A */
- 0,
- FW_BOLD,
- 0, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- 0, /* P&F */
- "Arial" },
+ /* Initial default values */
+ 0, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_REGULAR,
+ 1, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ 0, /* P&F */
+ "Arial"
+ }
+ },
+ { {
+ /* Initial default values */
+ 0, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_BOLD,
+ 0, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ 0, /* P&F */
+ "Arial"
+ },
{
- /* Initial default values */
- 0, 0, /* H, W */
- 0, /* A */
- 0,
- FW_BOLD,
- 1, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- 0, /* P&F */
- "Hevletica" } } };
+ /* Initial default values */
+ 0, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_BOLD,
+ 1, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ 0, /* P&F */
+ "Hevletica"
+ }
+ }
+};
void mswFontInit( void )
{
const char * face;
long size;
+ /** @prefs [msw window font] face=FontName */
face = wPrefGetString( "msw window font", "face" );
+ /** @prefs [msw window font] size=-24 */
wPrefGetInteger( "msw window font", "size", &size, -24 );
if (face) {
strncpy( logFont.lfFaceName, face, LF_FACESIZE );
@@ -732,8 +761,9 @@ static void doChooseFont( void )
rc = ChooseFont( &chooseFont );
if (rc) {
fontSize = (wFontSize_t)(-logFont.lfHeight * 72) / 96.0 / fontFactor;
- if (fontSize < 1)
+ if (fontSize < 1) {
fontSize = 1;
+ }
wPrefSetString( "msw window font", "face", logFont.lfFaceName );
wPrefSetInteger( "msw window font", "size", logFont.lfHeight );
}
@@ -744,45 +774,47 @@ static int computeFontSize( wDraw_p d, double siz )
int ret;
siz = (siz * d->DPI) / 72.0;
ret = (int)(siz * fontFactor);
- if (ret < 1)
+ if (ret < 1) {
ret = 1;
+ }
return -ret;
}
void wDrawGetTextSize(
- wPos_t *w,
- wPos_t *h,
- wPos_t *d,
- wPos_t *a,
- wDraw_p bd,
- const char * text,
- wFont_p fp,
- double siz )
+ wDrawPix_t *w,
+ wDrawPix_t *h,
+ wDrawPix_t *d,
+ wDrawPix_t *a,
+ wDraw_p bd,
+ const char * text,
+ wFont_p fp,
+ double siz )
{
- int x, y;
+ wWinPix_t x, y;
HFONT newFont, prevFont;
DWORD extent;
int oldLfHeight;
TEXTMETRIC textMetric;
- if (fp == NULL)
+ if (fp == NULL) {
fp = &logFont;
+ }
fp->lfEscapement = 0;
oldLfHeight = fp->lfHeight;
fp->lfHeight = computeFontSize( bd, siz );
fp->lfWidth = 0;
newFont = CreateFontIndirect( fp );
prevFont = SelectObject( bd->hDc, newFont );
- extent = GetTextExtent( bd->hDc, CAST_AWAY_CONST text, strlen(text) );
+ extent = GetTextExtent( bd->hDc, CAST_AWAY_CONST text, (int)(strlen(text)) );
GetTextMetrics(bd->hDc, &textMetric);
x = LOWORD(extent);
y = HIWORD(extent);
- *w = XPIXELSTOINCH( bd, x );
- *h = YPIXELSTOINCH( bd, y );
- *d = YPIXELSTOINCH(bd, textMetric.tmDescent );
- *a = YPIXELSTOINCH(bd, textMetric.tmAscent );
+ *w = (wDrawPix_t)x;
+ *h = (wDrawPix_t)y;
+ *d = (wDrawPix_t)textMetric.tmDescent;
+ *a = (wDrawPix_t)textMetric.tmAscent;
SelectObject( bd->hDc, prevFont );
DeleteObject( newFont );
@@ -790,7 +822,7 @@ void wDrawGetTextSize(
}
/**
* Draw text
- *
+ *
* \param d device context
* \param px position x
* \param py position y
@@ -802,80 +834,74 @@ void wDrawGetTextSize(
* \param dopts drawing options
*/
void wDrawString(
- wDraw_p d,
- wPos_t px,
- wPos_t py,
- double angle,
- const char * text,
- wFont_p fp,
- double siz,
- wDrawColor dc,
- wDrawOpts dopts)
+ wDraw_p d,
+ wDrawPix_t px,
+ wDrawPix_t py,
+ double angle,
+ const char * text,
+ wFont_p fp,
+ double siz,
+ wDrawColor dc,
+ wDrawOpts dopts)
{
- int x, y;
- HFONT newFont, prevFont;
- DWORD extent;
- int w, h;
- RECT rect;
- int oldLfHeight;
-
- if (fp == NULL) {
- fp = &logFont;
- }
-
- oldLfHeight = fp->lfHeight;
- fp->lfEscapement = (int)(angle*10.0);
- fp->lfHeight = computeFontSize(d, siz);
- fp->lfWidth = 0;
- newFont = CreateFontIndirect(fp);
- x = XINCH2PIX(d,px) + (int)(mswsin(angle)*fp->lfHeight-0.5);
- y = YINCH2PIX(d,py) + (int)(mswcos(angle)*fp->lfHeight-0.5);
-
- if (noNegDrawArgs > 0 && (x < 0 || y < 0)) {
- DeleteObject(newFont);
- return;
- }
-
- setDrawMode( d, 0, wDrawLineSolid, dc, dopts );
- prevFont = SelectObject(d->hDc, newFont);
- SetBkMode(d->hDc, TRANSPARENT);
-
- if (dopts & wDrawOutlineFont) {
- HPEN oldPen;
- BeginPath(d->hDc);
- TextOut(d->hDc, x, y, text, strlen(text));
- EndPath(d->hDc);
-
- // Now draw outline text
- oldPen = SelectObject(d->hDc,
- CreatePen(PS_SOLID, 1,
- mswGetColor(d->hasPalette, dc)));
- StrokePath(d->hDc);
- SelectObject(d->hDc, oldPen);
- } else {
- COLORREF old;
-
- old = SetTextColor(d->hDc, mswGetColor(d->hasPalette,
- dc));
- TextOut(d->hDc, x, y, text, strlen(text));
- SetTextColor(d->hDc, old);
- }
-
- extent = GetTextExtent(d->hDc, CAST_AWAY_CONST text, strlen(text));
- SelectObject(d->hDc, prevFont);
- w = LOWORD(extent);
- h = HIWORD(extent);
-
- if (d->hWnd) {
- rect.top = y - (w + h + 1);
- rect.bottom = y + (w + h + 1);
- rect.left = x - (w + h + 1);
- rect.right = x + (w + h + 1);
- myInvalidateRect(d, &rect);
- }
-
- DeleteObject(newFont);
- fp->lfHeight = oldLfHeight;
+ int x, y;
+ HFONT newFont, prevFont;
+ DWORD extent;
+ int w, h;
+ RECT rect;
+ int oldLfHeight;
+
+ if (fp == NULL) {
+ fp = &logFont;
+ }
+
+ oldLfHeight = fp->lfHeight;
+ fp->lfEscapement = (int)(angle*10.0);
+ fp->lfHeight = computeFontSize(d, siz);
+ fp->lfWidth = 0;
+ newFont = CreateFontIndirect(fp);
+ x = XDRAWPIX2WINPIX(d,px) + (int)(mswsin(angle)*fp->lfHeight-0.5);
+ y = YDRAWPIX2WINPIX(d,py) + (int)(mswcos(angle)*fp->lfHeight-0.5);
+
+ setDrawMode( d, 0, wDrawLineSolid, dc, dopts );
+ prevFont = SelectObject(d->hDc, newFont);
+ SetBkMode(d->hDc, TRANSPARENT);
+
+ if (dopts & wDrawOutlineFont) {
+ HPEN oldPen;
+ BeginPath(d->hDc);
+ TextOut(d->hDc, x, y, text, (int)strlen(text));
+ EndPath(d->hDc);
+
+ // Now draw outline text
+ oldPen = SelectObject(d->hDc,
+ CreatePen(PS_SOLID, 1,
+ mswGetColor(d->hasPalette, dc)));
+ StrokePath(d->hDc);
+ SelectObject(d->hDc, oldPen);
+ } else {
+ COLORREF old;
+
+ old = SetTextColor(d->hDc, mswGetColor(d->hasPalette, dc));
+ TextOut(d->hDc, x, y, text, (int)(strlen(text)));
+ SetTextColor(d->hDc, old);
+ }
+
+ extent = GetTextExtent(d->hDc, CAST_AWAY_CONST text, (int)(strlen(text)));
+ SelectObject(d->hDc, prevFont);
+ w = LOWORD(extent);
+ h = HIWORD(extent);
+
+ if (d->hWnd) {
+ rect.top = y - (w + h + 1);
+ rect.bottom = y + (w + h + 1);
+ rect.left = x - (w + h + 1);
+ rect.right = x + (w + h + 1);
+ myInvalidateRect(d, &rect);
+ }
+
+ DeleteObject(newFont);
+ fp->lfHeight = oldLfHeight;
}
static const char * wCurFont( void )
@@ -889,12 +915,13 @@ void wInitializeFonts()
wFont_p wStandardFont( int family, wBool_t bold, wBool_t italic )
{
- if (family == F_TIMES)
+ if (family == F_TIMES) {
return &timesFont[bold][italic];
- else if (family == F_HELV)
+ } else if (family == F_HELV) {
return &helvFont[bold][italic];
- else
+ } else {
return NULL;
+ }
}
void wSelectFont( const char * title )
@@ -924,44 +951,50 @@ void wSetSelectedFontSize(wFontSize_t size)
void wDrawFilledRectangle(
- wDraw_p d,
- wPos_t px,
- wPos_t py,
- wPos_t sx,
- wPos_t sy,
- wDrawColor color,
- wDrawOpts opts )
+ wDraw_p d,
+ wDrawPix_t px,
+ wDrawPix_t py,
+ wDrawPix_t sx,
+ wDrawPix_t sy,
+ wDrawColor color,
+ wDrawOpts opts )
{
int mode;
RECT rect;
- if (d == NULL)
+ if (d == NULL) {
return;
+ }
setDrawBrush( d, color, opts );
if (opts & wDrawOptTransparent) {
mode = R2_NOTXORPEN;
- }
- else {
+ } else {
mode = R2_COPYPEN;
}
SetROP2(d->hDc, mode);
- rect.left = XINCH2PIX(d,px);
- rect.right = XINCH2PIX(d,px+sx);
- rect.top = YINCH2PIX(d,py+sy);
- rect.bottom = YINCH2PIX(d,py);
+ rect.left = XDRAWPIX2WINPIX(d,px);
+ rect.right = XDRAWPIX2WINPIX(d,px+sx);
+ rect.top = YDRAWPIX2WINPIX(d,py+sy);
+ rect.bottom = YDRAWPIX2WINPIX(d,py);
if ( rect.right < 0 ||
- rect.bottom < 0 )
+ rect.bottom < 0 ) {
return;
- if ( rect.left < 0 )
+ }
+ if ( rect.left < 0 ) {
rect.left = 0;
- if ( rect.top < 0 )
+ }
+ if ( rect.top < 0 ) {
rect.top = 0;
+ }
if ( rect.left > d->w ||
- rect.top > d->h )
+ rect.top > d->h ) {
return;
- if ( rect.right > d->w )
+ }
+ if ( rect.right > d->w ) {
rect.right = d->w;
- if ( rect.bottom > d->h )
+ }
+ if ( rect.bottom > d->h ) {
rect.bottom = d->h;
+ }
Rectangle( d->hDc, rect.left, rect.top, rect.right, rect.bottom );
if (d->hWnd) {
rect.top--;
@@ -973,7 +1006,7 @@ void wDrawFilledRectangle(
}
#ifdef DRAWFILLPOLYLOG
- static FILE * logF;
+static FILE * logF;
#endif
static dynArr_t wFillPoints_da;
@@ -994,34 +1027,34 @@ static dynArr_t wFillType_da;
*/
static void addPoint(
- wDraw_p d,
- int pk,
- coOrd * pp,
- BYTE type, RECT * pr)
+ wDraw_p d,
+ int pk,
+ coOrd * pp,
+ BYTE type, RECT * pr)
{
- POINT p;
- p.x = XINCH2PIX(d, pp->x);
- p.y = YINCH2PIX(d, pp->y);
+ POINT p;
+ p.x = XDRAWPIX2WINPIX(d, pp->x);
+ p.y = YDRAWPIX2WINPIX(d, pp->y);
#ifdef DRAWFILLPOLYLOG
- fprintf(logF, " q[%d] = {%d,%d}\n", pk, p.x, p.y);
+ fprintf(logF, " q[%d] = {%d,%d}\n", pk, p.x, p.y);
#endif
- DYNARR_N(POINT, wFillPoints_da, pk) = p;
- DYNARR_N(BYTE, wFillType_da, pk) = type;
-
- if (p.x < pr->left) {
- pr->left = p.x;
- }
- if (p.x > pr->right) {
- pr->right = p.x;
- }
- if (p.y < pr->top) {
- pr->top = p.y;
- }
- if (p.y > pr->bottom) {
- pr->bottom = p.y;
- }
+ DYNARR_N(POINT, wFillPoints_da, pk) = p;
+ DYNARR_N(BYTE, wFillType_da, pk) = type;
+
+ if (p.x < pr->left) {
+ pr->left = p.x;
+ }
+ if (p.x > pr->right) {
+ pr->right = p.x;
+ }
+ if (p.y < pr->top) {
+ pr->top = p.y;
+ }
+ if (p.y > pr->bottom) {
+ pr->bottom = p.y;
+ }
}
/**
@@ -1041,208 +1074,190 @@ static void addPoint(
*/
void wDrawPolygon(
- wDraw_p d,
- wPos_t node[][2],
- wPolyLine_e type[],
- wIndex_t cnt,
- wDrawColor color,
- wDrawWidth dw,
- wDrawLineType_e lt,
- wDrawOpts opts,
- int fill,
- int open)
+ wDraw_p d,
+ wDrawPix_t node[][2],
+ wPolyLine_e type[],
+ wIndex_t cnt,
+ wDrawColor color,
+ wDrawWidth dw,
+ wDrawLineType_e lt,
+ wDrawOpts opts,
+ int fill,
+ int open)
{
- RECT rect;
- int i, prevNode, nextNode;
- int pointCount = 0;
- coOrd endPoint0, endPoint1, controlPoint0, controlPoint1;
- coOrd point, startingPoint;
- BOOL rc;
- int closed = 0;
-
- if (d == NULL) {
- return;
- }
-
- // make sure the array for the points is large enough
- // worst case are rounded corners that require 4 points
- DYNARR_RESET(POINT,wFillPoints_da);
- DYNARR_SET(POINT,wFillPoints_da,(cnt + 1) * 4);
- DYNARR_RESET(BYTE,wFillType_da);
- DYNARR_SET(POINT,wFillType_da, (cnt + 1) * 4);
-
- BeginPath(d->hDc);
-
- if (fill) {
+ RECT rect;
+ int i, prevNode, nextNode;
+ int pointCount = 0;
+ coOrd endPoint0, endPoint1, controlPoint0, controlPoint1;
+ coOrd point, startingPoint;
+ BOOL rc;
+ int closed = 0;
+
+ if (d == NULL) {
+ return;
+ }
+
+ // make sure the array for the points is large enough
+ // worst case are rounded corners that require 4 points
+ DYNARR_RESET(POINT,wFillPoints_da);
+ DYNARR_SET(POINT,wFillPoints_da,(cnt + 1) * 4);
+ DYNARR_RESET(BYTE,wFillType_da);
+ DYNARR_SET(POINT,wFillType_da, (cnt + 1) * 4);
+
+ BeginPath(d->hDc);
+
+ if (fill) {
int mode;
- setDrawBrush(d, color, opts);
+ setDrawBrush(d, color, opts);
if (opts & wDrawOptTransparent) {
mode = R2_NOTXORPEN;
- }
- else {
+ } else {
mode = R2_COPYPEN;
}
SetROP2(d->hDc, mode);
- } else {
- setDrawMode(d, dw, lt, color, opts);
- }
+ } else {
+ setDrawMode(d, dw, lt, color, opts);
+ }
- rect.left = rect.right = XINCH2PIX(d,node[cnt-1][0]-1);
- rect.top = rect.bottom = YINCH2PIX(d,node[cnt-1][1]+1);
+ rect.left = rect.right = XDRAWPIX2WINPIX(d,node[cnt-1][0]-1);
+ rect.top = rect.bottom = YDRAWPIX2WINPIX(d,node[cnt-1][1]+1);
#ifdef DRAWFILLPOLYLOG
- logF = fopen("log.txt", "a");
- fprintf(logF, "\np[%d] = {%d,%d}\n", cnt-1, node[0][0], node[0][1]);
+ logF = fopen("log.txt", "a");
+ fprintf(logF, "\np[%d] = {%d,%d}\n", cnt-1, node[0][0], node[0][1]);
#endif
- for (i=0; i<cnt; i++) {
- wPolyLine_e type1;
- point.x = node[i][0];
- point.y = node[i][1];
- if (type != NULL)
+ for (i=0; i<cnt; i++) {
+ wPolyLine_e type1;
+ point.x = node[i][0];
+ point.y = node[i][1];
+ if (type != NULL) {
type1 = type[i];
- else
+ } else {
type1 = wPolyLineStraight;
+ }
+
+ if (type1 == wPolyLineRound || type1 == wPolyLineSmooth) {
+ prevNode = (i == 0) ? cnt - 1 : i - 1;
+ nextNode = (i == cnt - 1) ? 0 : i + 1;
+
+ // calculate distance to neighboring nodes
+ int prevXDistance = (wWinPix_t)(node[i][0] - node[prevNode][0]);
+ int prevYDistance = (wWinPix_t)(node[i][1] - node[prevNode][1]);
+ int nextXDistance = (wWinPix_t)(node[nextNode][0]-node[i][0]);
+ int nextYDistance = (wWinPix_t)(node[nextNode][1]-node[i][1]);
+
+ // distance from node to endpoints of curve is half the line length
+ endPoint0.x = (prevXDistance/2)+node[prevNode][0];
+ endPoint0.y = (prevYDistance/2)+node[prevNode][1];
+ endPoint1.x = (nextXDistance/2)+node[i][0];
+ endPoint1.y = (nextYDistance/2)+node[i][1];
+
+ if (type1 == wPolyLineRound) {
+ double distNext = (nextXDistance*nextXDistance + nextYDistance * nextYDistance);
+ double distPrev = (prevXDistance*prevXDistance + prevYDistance * prevYDistance);
+ // but should be half of the shortest line length (equidistant from node) for round
+ if ((distPrev > 0) && (distNext > 0)) {
+ double ratio = sqrt(distPrev / distNext);
+ if (distPrev < distNext) {
+ endPoint1.x = ((nextXDistance*ratio) / 2) + node[i][0];
+ endPoint1.y = ((nextYDistance*ratio) / 2) + node[i][1];
+ } else {
+ endPoint0.x = node[i][0] - (prevXDistance / (2 * ratio));
+ endPoint0.y = node[i][1] - (prevYDistance / (2 * ratio));
+ }
+ }
+ // experience says that the best look is achieved if the
+ // control points are in the middle between end point and node
+ controlPoint0.x = (node[i][0] - endPoint0.x) / 2 + endPoint0.x;
+ controlPoint0.y = (node[i][1] - endPoint0.y) / 2 + endPoint0.y;
+
+ controlPoint1.x = (endPoint1.x - node[i][0]) / 2 + node[i][0];
+ controlPoint1.y = (endPoint1.y - node[i][1]) / 2 + node[i][1];
+ } else {
+ controlPoint0 = point;
+ controlPoint1 = point;
+ }
+ }
+
+ if (i==0) {
+ if (type1 == wPolyLineStraight || open) {
+ // for straight lines or open shapes use the starting point as passed
+ addPoint(d, pointCount++, &point, PT_MOVETO, &rect);
+ startingPoint = point;
+ } else {
+ // for Bezier begin with the calculated starting point
+ addPoint(d, pointCount++, &endPoint0, PT_MOVETO, &rect);
+ addPoint(d, pointCount++, &controlPoint0, PT_BEZIERTO, &rect);
+ addPoint(d, pointCount++, &controlPoint1, PT_BEZIERTO, &rect);
+ addPoint(d, pointCount++, &endPoint1, PT_BEZIERTO, &rect);
+ startingPoint = endPoint0;
+ }
+ } else {
+ if (type1 == wPolyLineStraight || (open && (i==cnt-1))) {
+ addPoint(d, pointCount++, &point, PT_LINETO, &rect);
+ } else {
+ if (i==cnt-1 && !open) {
+ closed = TRUE;
+ }
+ addPoint(d, pointCount++, &endPoint0, PT_LINETO, &rect);
+ addPoint(d, pointCount++, &controlPoint0, PT_BEZIERTO, &rect);
+ addPoint(d, pointCount++, &controlPoint1, PT_BEZIERTO, &rect);
+ addPoint(d, pointCount++, &endPoint1,
+ PT_BEZIERTO | (closed ? PT_CLOSEFIGURE : 0), &rect);
+ }
+ }
+ }
- if (type1 == wPolyLineRound || type1 == wPolyLineSmooth) {
- prevNode = (i == 0) ? cnt - 1 : i - 1;
- nextNode = (i == cnt - 1) ? 0 : i + 1;
-
- // calculate distance to neighboring nodes
- int prevXDistance = node[i][0] - node[prevNode][0];
- int prevYDistance = node[i][1] - node[prevNode][1];
- int nextXDistance = node[nextNode][0]-node[i][0];
- int nextYDistance = node[nextNode][1]-node[i][1];
-
- // distance from node to endpoints of curve is half the line length
- endPoint0.x = (prevXDistance/2)+node[prevNode][0];
- endPoint0.y = (prevYDistance/2)+node[prevNode][1];
- endPoint1.x = (nextXDistance/2)+node[i][0];
- endPoint1.y = (nextYDistance/2)+node[i][1];
-
- if (type1 == wPolyLineRound) {
- double distNext = (nextXDistance*nextXDistance + nextYDistance * nextYDistance);
- double distPrev = (prevXDistance*prevXDistance + prevYDistance * prevYDistance);
- // but should be half of the shortest line length (equidistant from node) for round
- if ((distPrev > 0) && (distNext > 0)) {
- double ratio = sqrt(distPrev / distNext);
- if (distPrev < distNext) {
- endPoint1.x = ((nextXDistance*ratio) / 2) + node[i][0];
- endPoint1.y = ((nextYDistance*ratio) / 2) + node[i][1];
- } else {
- endPoint0.x = node[i][0] - (prevXDistance / (2 * ratio));
- endPoint0.y = node[i][1] - (prevYDistance / (2 * ratio));
- }
- }
- // experience says that the best look is achieved if the
- // control points are in the middle between end point and node
- controlPoint0.x = (node[i][0] - endPoint0.x) / 2 + endPoint0.x;
- controlPoint0.y = (node[i][1] - endPoint0.y) / 2 + endPoint0.y;
-
- controlPoint1.x = (endPoint1.x - node[i][0]) / 2 + node[i][0];
- controlPoint1.y = (endPoint1.y - node[i][1]) / 2 + node[i][1];
- } else {
- controlPoint0 = point;
- controlPoint1 = point;
- }
- }
-
- if (i==0) {
- if (type1 == wPolyLineStraight || open) {
- // for straight lines or open shapes use the starting point as passed
- addPoint(d, pointCount++, &point, PT_MOVETO, &rect);
- startingPoint = point;
- } else {
- // for Bezier begin with the calculated starting point
- addPoint(d, pointCount++, &endPoint0, PT_MOVETO, &rect);
- addPoint(d, pointCount++, &controlPoint0, PT_BEZIERTO, &rect);
- addPoint(d, pointCount++, &controlPoint1, PT_BEZIERTO, &rect);
- addPoint(d, pointCount++, &endPoint1, PT_BEZIERTO, &rect);
- startingPoint = endPoint0;
- }
- } else {
- if (type1 == wPolyLineStraight || (open && (i==cnt-1))) {
- addPoint(d, pointCount++, &point, PT_LINETO, &rect);
- } else {
- if (i==cnt-1 && !open) {
- closed = TRUE;
- }
- addPoint(d, pointCount++, &endPoint0, PT_LINETO, &rect);
- addPoint(d, pointCount++, &controlPoint0, PT_BEZIERTO, &rect);
- addPoint(d, pointCount++, &controlPoint1, PT_BEZIERTO, &rect);
- addPoint(d, pointCount++, &endPoint1,
- PT_BEZIERTO | (closed ? PT_CLOSEFIGURE : 0), &rect);
- }
- }
- }
-
- if (!open && !closed) {
- addPoint(d, pointCount++, &startingPoint, PT_LINETO, &rect);
- }
- rc = PolyDraw(d->hDc, wFillPoints_da.ptr, wFillType_da.ptr, pointCount);
-
- EndPath(d->hDc);
-
- if (fill && !open) {
- FillPath(d->hDc);
- } else {
- StrokePath(d->hDc);
- }
-
- if (d->hWnd) {
- rect.top--;
- rect.left--;
- rect.bottom++;
- rect.right++;
- myInvalidateRect(d, &rect);
- }
+ if (!open && !closed) {
+ addPoint(d, pointCount++, &startingPoint, PT_LINETO, &rect);
+ }
+ rc = PolyDraw(d->hDc, wFillPoints_da.ptr, wFillType_da.ptr, pointCount);
+
+ EndPath(d->hDc);
+
+ if (fill && !open) {
+ FillPath(d->hDc);
+ } else {
+ StrokePath(d->hDc);
+ }
+
+ if (d->hWnd) {
+ rect.top--;
+ rect.left--;
+ rect.bottom++;
+ rect.right++;
+ myInvalidateRect(d, &rect);
+ }
}
#define MAX_FILLCIRCLE_POINTS (30)
void wDrawFilledCircle(
- wDraw_p d,
- wPos_t x,
- wPos_t y,
- wPos_t r,
- wDrawColor color,
- wDrawOpts opts )
+ wDraw_p d,
+ wDrawPix_t x,
+ wDrawPix_t y,
+ wDrawPix_t r,
+ wDrawColor color,
+ wDrawOpts opts )
{
POINT p0, p1;
RECT rect;
- static wPos_t circlePts[MAX_FILLCIRCLE_POINTS][2];
- int inx, cnt;
- double dang;
-
- p0.x = XINCH2PIX(d,x-r);
- p0.y = YINCH2PIX(d,y+r)+1;
- p1.x = XINCH2PIX(d,x+r);
- p1.y = YINCH2PIX(d,y-r)+1;
-
- setDrawBrush( d, color, opts );
- if ( noNegDrawArgs > 0 && ( p0.x < 0 || p0.y < 0 ) ) {
- if ( r > MAX_FILLCIRCLE_POINTS )
- cnt = MAX_FILLCIRCLE_POINTS;
- else if ( r > 8 )
- cnt = r;
- else
- cnt = 8;
- dang = 360.0/cnt;
- for ( inx=0; inx<cnt; inx++ ) {
- circlePts[inx][0] = x + (int)(r * mswcos( inx*dang ) + 0.5 );
- circlePts[inx][1] = y + (int)(r * mswsin( inx*dang ) + 0.5 );
- }
- //wDrawFilledPolygon( d, circlePts, NULL, cnt, color, opts );
- wDrawPolygon(d, circlePts, NULL, cnt, color, 1, wDrawLineSolid,opts, TRUE, FALSE );
- } else {
- Ellipse( d->hDc, p0.x, p0.y, p1.x, p1.y );
- if (d->hWnd) {
- rect.top = p0.y;
- rect.bottom = p1.y;
- rect.left = p0.x;
- rect.right = p1.x;
- myInvalidateRect( d, &rect );
- }
+ static wDrawPix_t circlePts[MAX_FILLCIRCLE_POINTS][2];
+
+ p0.x = XDRAWPIX2WINPIX(d,x-r);
+ p0.y = YDRAWPIX2WINPIX(d,y+r);
+ p1.x = XDRAWPIX2WINPIX(d,x+r);
+ p1.y = YDRAWPIX2WINPIX(d,y-r);
+
+ setDrawBrush( d, color, opts );
+ Ellipse( d->hDc, p0.x, p0.y, p1.x, p1.y );
+ if (d->hWnd) {
+ rect.top = p0.y;
+ rect.bottom = p1.y;
+ rect.left = p0.x;
+ rect.right = p1.x;
+ myInvalidateRect( d, &rect );
}
}
@@ -1256,22 +1271,23 @@ void wDrawFilledCircle(
void wDrawSaveImage(
- wDraw_p bd )
+ wDraw_p bd )
{
- if ( bd->hBmBackup ) {
+ if ( bd->hBmBackup ) {
SelectObject( bd->hDcBackup, bd->hBmBackupOld );
DeleteObject( bd->hBmBackup );
bd->hBmBackup = (HBITMAP)0;
}
- if ( bd->hDcBackup == (HDC)0 )
- bd->hDcBackup = CreateCompatibleDC( bd->hDc );
+ if ( bd->hDcBackup == (HDC)0 ) {
+ bd->hDcBackup = CreateCompatibleDC( bd->hDc );
+ }
bd->hBmBackup = CreateCompatibleBitmap( bd->hDc, bd->w, bd->h );
bd->hBmBackupOld = SelectObject( bd->hDcBackup, bd->hBmBackup );
BitBlt( bd->hDcBackup, 0, 0, bd->w, bd->h, bd->hDc, 0, 0, SRCCOPY );
}
void wDrawRestoreImage(
- wDraw_p bd )
+ wDraw_p bd )
{
if ( bd->hBmBackup == (HBITMAP)0 ) {
mswFail( "wDrawRestoreImage: hBmBackup == 0" );
@@ -1307,14 +1323,14 @@ void wDrawClear( wDraw_p d )
void wDrawSetSize(
- wDraw_p d,
- wPos_t width,
- wPos_t height, void * redraw)
+ wDraw_p d,
+ wWinPix_t width,
+ wWinPix_t height, void * redraw)
{
d->w = width;
d->h = height;
if (!SetWindowPos( d->hWnd, HWND_TOP, 0, 0,
- d->w, d->h, SWP_NOMOVE|SWP_NOZORDER)) {
+ d->w, d->h, SWP_NOMOVE|SWP_NOZORDER)) {
mswFail("wDrawSetSize: SetWindowPos");
}
/*wRedraw( d );*/
@@ -1322,9 +1338,9 @@ void wDrawSetSize(
void wDrawGetSize(
- wDraw_p d,
- wPos_t * width,
- wPos_t * height )
+ wDraw_p d,
+ wWinPix_t * width,
+ wWinPix_t * height )
{
*width = d->w-2;
*height = d->h-2;
@@ -1348,18 +1364,18 @@ double wDrawGetMaxRadius( wDraw_p d )
}
void wDrawClip(
- wDraw_p d,
- wPos_t x,
- wPos_t y,
- wPos_t w,
- wPos_t h )
+ wDraw_p d,
+ wDrawPix_t x,
+ wDrawPix_t y,
+ wDrawPix_t w,
+ wDrawPix_t h )
{
- int ix0, iy0, ix1, iy1;
+ wWinPix_t ix0, iy0, ix1, iy1;
HRGN hRgnClip;
- ix0 = XINCH2PIX(d,x);
- iy0 = YINCH2PIX(d,y);
- ix1 = XINCH2PIX(d,x+w);
- iy1 = YINCH2PIX(d,y+h);
+ ix0 = XDRAWPIX2WINPIX(d,x);
+ iy0 = YDRAWPIX2WINPIX(d,y);
+ ix1 = XDRAWPIX2WINPIX(d,x+w);
+ iy1 = YDRAWPIX2WINPIX(d,y+h);
/* Note: Ydim is upside down so iy1<iy0 */
hRgnClip = CreateRectRgn( ix0, iy1, ix1, iy0 );
SelectClipRgn( d->hDc, hRgnClip );
@@ -1370,9 +1386,96 @@ void wDrawClip(
void wRedraw( wDraw_p d )
{
wDrawClear( d );
- if (d->drawRepaint)
+ if (d->drawRepaint) {
d->drawRepaint( d, d->data, 0, 0 );
+ }
}
+
+/*
+ *****************************************************************************
+ *
+ * Cursor handling
+ *
+ *****************************************************************************
+ */
+
+
+extern long dontHideCursor;
+static wCursor_t curCursor = wCursorNormal;
+
+void DoSetCursor()
+{
+ switch (curCursor) {
+ case wCursorNormal:
+ default:
+ SetCursor(LoadCursor(NULL, IDC_ARROW));
+ break;
+
+ case wCursorWait:
+ SetCursor(LoadCursor(NULL, IDC_WAIT));
+ break;
+
+ case wCursorCross:
+ SetCursor(LoadCursor(NULL, IDC_CROSS));
+ break;
+
+ case wCursorIBeam:
+ SetCursor(LoadCursor(NULL, IDC_IBEAM));
+ break;
+
+ case wCursorQuestion:
+ SetCursor(LoadCursor(NULL, IDC_HELP));
+ break;
+
+ case wCursorHand:
+ SetCursor(LoadCursor(NULL, IDC_HAND));
+ break;
+
+ case wCursorNo:
+ SetCursor(LoadCursor(NULL, IDC_NO));
+ break;
+
+ case wCursorSizeAll:
+ SetCursor(LoadCursor(NULL, IDC_SIZEALL));
+ break;
+
+ case wCursorSizeNESW:
+ SetCursor(LoadCursor(NULL, IDC_SIZENESW));
+ break;
+
+ case wCursorSizeNWSE:
+ SetCursor(LoadCursor(NULL, IDC_SIZENWSE));
+ break;
+
+ case wCursorSizeNS:
+ SetCursor(LoadCursor(NULL, IDC_SIZENS));
+ break;
+
+ case wCursorSizeWE:
+ SetCursor(LoadCursor(NULL, IDC_SIZEWE));
+ break;
+
+ case wCursorAppStart:
+ SetCursor(LoadCursor(NULL, IDC_APPSTARTING));
+ break;
+
+ case wCursorNone:
+ if (!dontHideCursor) {
+ SetCursor(NULL);
+ }
+ break;
+ }
+
+}
+
+void wSetCursor(wDraw_p win,
+ wCursor_t cursor)
+{
+ curCursor = cursor;
+ DoSetCursor();
+}
+
+
/*
*****************************************************************************
@@ -1383,25 +1486,27 @@ void wRedraw( wDraw_p d )
*/
struct wDrawBitMap_t {
- wDrawBitMap_p next;
- wPos_t x;
- wPos_t y;
- wPos_t w;
- wPos_t h;
- char * bmx;
- wDrawColor color;
- HBITMAP bm;
- };
-wDrawBitMap_p bmRoot = NULL;
-
+ wDrawBitMap_p next;
+ wDrawPix_t x;
+ wDrawPix_t y;
+ wDrawPix_t w;
+ wDrawPix_t h;
+ char * bmx;
+ wDrawColor color;
+ HBITMAP bm;
+};
+static wDrawBitMap_p bmRoot = NULL;
+
+extern wDrawColor drawColorWhite;
+extern wDrawColor drawColorBlack;
void wDrawBitMap(
- wDraw_p d,
- wDrawBitMap_p bm,
- wPos_t px,
- wPos_t py,
- wDrawColor dc,
- wDrawOpts dopt )
+ wDraw_p d,
+ wDrawBitMap_p bm,
+ wDrawPix_t px,
+ wDrawPix_t py,
+ wDrawColor dc,
+ wDrawOpts dopt )
{
HDC bmDc;
HBITMAP oldBm;
@@ -1409,50 +1514,53 @@ void wDrawBitMap(
int x0, y0;
RECT rect;
- x0 = XINCH2PIX(d,px-bm->x);
- y0 = YINCH2PIX(d,py-bm->y+bm->h);
+ x0 = XDRAWPIX2WINPIX(d,px-bm->x);
+ y0 = YDRAWPIX2WINPIX(d,py-bm->y+bm->h);
#ifdef LATER
- if ( noNegDrawArgs > 0 && ( x0 < 0 || y0 < 0 ) )
+ if ( noNegDrawArgs > 0 && ( x0 < 0 || y0 < 0 ) ) {
return;
+ }
#endif
- if (dc == wDrawColorWhite) {
+ if (dc == drawColorWhite) {
mode = clrOp;
- dc = wDrawColorBlack;
+ dc = drawColorBlack;
} else {
mode = setOp;
}
if ( bm->color != dc ) {
- if ( bm->bm )
+ if ( bm->bm ) {
DeleteObject( bm->bm );
- bm->bm = mswCreateBitMap( mswGetColor(d->hasPalette,dc) /*colorPalette.palPalEntry[dc]*/, RGB( 255, 255, 255 ),
- RGB( 255, 255, 255 ), bm->w, bm->h, bm->bmx );
+ }
+ bm->bm = mswCreateBitMap( mswGetColor(d->hasPalette,
+ dc) /*colorPalette.palPalEntry[dc]*/, RGB( 255, 255, 255 ),
+ RGB( 255, 255, 255 ), (wWinPix_t)bm->w, (wWinPix_t)bm->h, bm->bmx );
bm->color = dc;
}
bmDc = CreateCompatibleDC( d->hDc );
setDrawMode( d, 0, wDrawLineSolid, dc, dopt );
oldBm = SelectObject( bmDc, bm->bm );
- BitBlt( d->hDc, x0, y0, bm->w, bm->h, bmDc, 0, 0, mode );
+ BitBlt( d->hDc, x0, y0, (wWinPix_t)bm->w, (wWinPix_t)bm->h, bmDc, 0, 0, mode );
SelectObject( bmDc, oldBm );
DeleteDC( bmDc );
if (d->hWnd) {
- rect.top = y0-1;
- rect.bottom = rect.top+bm->h+1;
- rect.left = x0-1;
- rect.right = rect.left+bm->w+1;
- myInvalidateRect( d, &rect );
+ rect.top = y0-1;
+ rect.bottom = rect.top+ (wWinPix_t)bm->h+1;
+ rect.left = x0-1;
+ rect.right = rect.left+ (wWinPix_t)bm->w+1;
+ myInvalidateRect( d, &rect );
}
}
wDrawBitMap_p wDrawBitMapCreate(
- wDraw_p d,
- int w,
- int h,
- int x,
- int y,
- const unsigned char * bits )
+ wDraw_p d,
+ int w,
+ int h,
+ int x,
+ int y,
+ const unsigned char * bits )
{
wDrawBitMap_p bm;
int bmSize = ((w+7)/8) * h;
@@ -1484,22 +1592,18 @@ wDrawBitMap_p wDrawBitMapCreate(
*****************************************************************************
*/
-int doSetFocus = 1;
+static int doSetFocus = 1;
-long FAR PASCAL XEXPORT mswDrawPush(
- HWND hWnd,
- UINT message,
- UINT wParam,
- LONG lParam )
+LRESULT FAR PASCAL XEXPORT mswDrawPush(
+ HWND hWnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam )
{
-#ifdef WIN32
- long inx = GetWindowLong( hWnd, GWL_ID );
-#else
- short inx = GetWindowWord( hWnd, GWW_ID );
-#endif
+ wIndex_t inx = (wIndex_t)GetWindowLongPtr( hWnd, GWL_ID );
wDraw_p b;
- short int ix, iy;
- wPos_t x, y;
+ wWinPix_t ix, iy;
+ wDrawPix_t x, y;
HDC hDc;
PAINTSTRUCT ps;
wAction_t action;
@@ -1518,7 +1622,7 @@ long FAR PASCAL XEXPORT mswDrawPush(
b->hBmTemp = 0;
b->hBmOld = 0;
} else {
- b->hDc = CreateCompatibleDC( hDc );
+ b->hDc = CreateCompatibleDC( hDc );
b->hBmMain = CreateCompatibleBitmap( hDc, b->w, b->h );
b->hBmTemp = CreateCompatibleBitmap( hDc, b->w, b->h );
b->hBmOld = SelectObject( b->hDc, b->hBmMain );
@@ -1529,7 +1633,10 @@ long FAR PASCAL XEXPORT mswDrawPush(
}
b->wFactor = (double)GetDeviceCaps( b->hDc, LOGPIXELSX );
b->hFactor = (double)GetDeviceCaps( b->hDc, LOGPIXELSY );
- b->DPI = 96.0; /*min( b->wFactor, b->hFactor );*/
+ double dpi;
+ /** @prefs [Preference] ScreenDPI=96.0 Sets DPI of screen */
+ wPrefGetFloat(PREFSECTION, DPISET, &dpi, 96.0);
+ b->DPI = dpi;
b->hWnd = hWnd;
SetROP2( b->hDc, R2_WHITE );
Rectangle( b->hDc, 0, 0, b->w, b->h );
@@ -1548,116 +1655,137 @@ long FAR PASCAL XEXPORT mswDrawPush(
if (b->hWnd) {
if ( b->option & BD_DIRECT ) {
} else {
- hDc = GetDC( b->hWnd );
+ hDc = GetDC( b->hWnd );
//- DeleteObject( b->hBmOld );
- DeleteObject( b->hBmMain );
- DeleteObject( b->hBmTemp );
- b->hBmMain = CreateCompatibleBitmap( hDc, b->w, b->h );
- b->hBmTemp = CreateCompatibleBitmap( hDc, b->w, b->h );
+ DeleteObject( b->hBmMain );
+ DeleteObject( b->hBmTemp );
+ b->hBmMain = CreateCompatibleBitmap( hDc, b->w, b->h );
+ b->hBmTemp = CreateCompatibleBitmap( hDc, b->w, b->h );
//- b->hBmOld = SelectObject( b->hDc, b->hBmMain );
- ReleaseDC( b->hWnd, hDc );
- SetROP2( b->hDc, R2_WHITE );
- Rectangle( b->hDc, 0, 0, b->w, b->h );
+ ReleaseDC( b->hWnd, hDc );
+ SetROP2( b->hDc, R2_WHITE );
+ Rectangle( b->hDc, 0, 0, b->w, b->h );
}
}
/*if (b->drawResize)
b->drawResize( b, b->size );*/
- if (b->drawRepaint)
+ if (b->drawRepaint) {
b->drawRepaint( b, b->data, 0, 0 );
- return 0;
+ }
+ return (LRESULT)0;
case WM_MOUSEMOVE:
activeWnd = GetActiveWindow();
focusWnd = GetFocus();
if (focusWnd != hWnd) {
b = (wDraw_p)mswMapIndex( inx );
- if (!b)
+ if (!b) {
break;
- if ( !((wControl_p)b->parent) )
+ }
+ if ( !((wControl_p)b->parent) ) {
break;
- if ( ((wControl_p)b->parent)->hWnd != activeWnd )
+ }
+ if ( ((wControl_p)b->parent)->hWnd != activeWnd ) {
break;
+ }
}
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
case WM_LBUTTONDBLCLK:
- if (message == WM_LBUTTONDOWN)
+ case WM_MBUTTONUP:
+ case WM_MBUTTONDOWN:
+ if (message == WM_LBUTTONDOWN) {
action = wActionLDown;
- else if (message == WM_RBUTTONDOWN)
+ } else if (message == WM_RBUTTONDOWN) {
action = wActionRDown;
- else if (message == WM_LBUTTONUP)
+ } else if (message == WM_LBUTTONUP) {
action = wActionLUp;
- else if (message == WM_RBUTTONUP)
+ } else if (message == WM_RBUTTONUP) {
action = wActionRUp;
- else if (message == WM_LBUTTONDBLCLK)
+ } else if (message == WM_MBUTTONUP) {
+ action = wActionMUp;
+ } else if (message == WM_MBUTTONDOWN) {
+ action = wActionMDown;
+ } else if (message == WM_LBUTTONDBLCLK) {
action = wActionLDownDouble;
- else {
- if ( (wParam & MK_LBUTTON) != 0)
+ } else {
+ if ( (wParam & MK_LBUTTON) != 0) {
action = wActionLDrag;
- else if ( (wParam & MK_RBUTTON) != 0)
+ } else if ( (wParam & MK_RBUTTON) != 0) {
action = wActionRDrag;
- else
+ } else if ( (wParam & MK_MBUTTON) != 0) {
+ action = wActionMDrag;
+ } else {
action = wActionMove;
+ }
}
b = (wDraw_p)mswMapIndex( inx );
- if (!b)
+ if (!b) {
break;
- if (doSetFocus && message != WM_MOUSEMOVE)
+ }
+ if (doSetFocus && message != WM_MOUSEMOVE) {
SetFocus( ((wControl_p)b->parent)->hWnd );
+ }
if ( (b->option&BD_NOCAPTURE) == 0 ) {
- if (message == WM_LBUTTONDOWN || message == WM_RBUTTONDOWN)
+ if (message == WM_LBUTTONDOWN || message == WM_RBUTTONDOWN) {
SetCapture( b->hWnd );
- else if (message == WM_LBUTTONUP || message == WM_RBUTTONUP)
+ } else if (message == WM_LBUTTONUP || message == WM_RBUTTONUP) {
ReleaseCapture();
+ }
}
ix = LOWORD( lParam );
iy = HIWORD( lParam );
- x = XPIX2INCH( b, ix );
- y = YPIX2INCH( b, iy );
+ x = XWINPIX2DRAWPIX( b, ix );
+ y = YWINPIX2DRAWPIX( b, iy );
b->lastX = x;
b->lastY = y;
- if (b->action)
+ if (b->action) {
b->action( b, b->data, action, x, y );
- if (b->hWnd)
+ }
+ if (b->hWnd) {
UpdateWindow(b->hWnd);
- return 0;
+ }
+ return (LRESULT)0;
case WM_CHAR:
b = (wDraw_p)mswMapIndex( inx );
extChar = wAccelKey_None;
if (lParam & 0x01000000L)
- switch( wParam ) {
- case VK_DELETE: extChar = wAccelKey_Del; break;
- case VK_INSERT: extChar = wAccelKey_Ins; break;
- case VK_HOME: extChar = wAccelKey_Home; break;
- case VK_END: extChar = wAccelKey_End; break;
- case VK_PRIOR: extChar = wAccelKey_Pgup; break;
- case VK_NEXT: extChar = wAccelKey_Pgdn; break;
- case VK_UP: extChar = wAccelKey_Up; break;
- case VK_DOWN: extChar = wAccelKey_Down; break;
- case VK_RIGHT: extChar = wAccelKey_Right; break;
- case VK_LEFT: extChar = wAccelKey_Left; break;
- case VK_BACK: extChar = wAccelKey_Back; break;
- case VK_F1: extChar = wAccelKey_F1; break;
- case VK_F2: extChar = wAccelKey_F2; break;
- case VK_F3: extChar = wAccelKey_F3; break;
- case VK_F4: extChar = wAccelKey_F4; break;
- case VK_F5: extChar = wAccelKey_F5; break;
- case VK_F6: extChar = wAccelKey_F6; break;
- case VK_F7: extChar = wAccelKey_F7; break;
- case VK_F8: extChar = wAccelKey_F8; break;
- case VK_F9: extChar = wAccelKey_F9; break;
- case VK_F10: extChar = wAccelKey_F10; break;
- case VK_F11: extChar = wAccelKey_F11; break;
- case VK_F12: extChar = wAccelKey_F12; break;
- }
+ switch( wParam ) {
+ case VK_DELETE: extChar = wAccelKey_Del; break;
+ case VK_INSERT: extChar = wAccelKey_Ins; break;
+ case VK_HOME: extChar = wAccelKey_Home; break;
+ case VK_END: extChar = wAccelKey_End; break;
+ case VK_PRIOR: extChar = wAccelKey_Pgup; break;
+ case VK_NEXT: extChar = wAccelKey_Pgdn; break;
+ case VK_UP: extChar = wAccelKey_Up; break;
+ case VK_DOWN: extChar = wAccelKey_Down; break;
+ case VK_RIGHT: extChar = wAccelKey_Right; break;
+ case VK_LEFT: extChar = wAccelKey_Left; break;
+ case VK_BACK: extChar = wAccelKey_Back; break;
+ case VK_F1: extChar = wAccelKey_F1; break;
+ case VK_F2: extChar = wAccelKey_F2; break;
+ case VK_F3: extChar = wAccelKey_F3; break;
+ case VK_F4: extChar = wAccelKey_F4; break;
+ case VK_F5: extChar = wAccelKey_F5; break;
+ case VK_F6: extChar = wAccelKey_F6; break;
+ case VK_F7: extChar = wAccelKey_F7; break;
+ case VK_F8: extChar = wAccelKey_F8; break;
+ case VK_F9: extChar = wAccelKey_F9; break;
+ case VK_F10: extChar = wAccelKey_F10; break;
+ case VK_F11: extChar = wAccelKey_F11; break;
+ case VK_F12: extChar = wAccelKey_F12; break;
+ }
if (b && b->action) {
- if (extChar != wAccelKey_None)
- b->action( b, b->data, wActionExtKey + ( (int)extChar << 8 ), b->lastX, b->lastY );
- else
- b->action( b, b->data, wActionText + ( wParam << 8 ), b->lastX, b->lastY );
+ if (extChar != wAccelKey_None) {
+ b->action( b, b->data, wActionExtKey + ( (int)extChar << 8 ), b->lastX,
+ b->lastY );
+ } else {
+ b->action( b, b->data, wActionText + ( (int)wParam << 8 ), b->lastX,
+ b->lastY );
+ }
}
- return 0;
+ return (LRESULT)0;
case WM_PAINT:
b = (wDraw_p)mswMapIndex( inx );
@@ -1673,17 +1801,17 @@ long FAR PASCAL XEXPORT mswDrawPush(
}
HBITMAP hBmOld = SelectObject( b->hDc, b->hBmMain );
- if (bDrawMainBM) {
- BitBlt(hDc, rect.left, rect.top,
- rect.right - rect.left, rect.bottom - rect.top,
- b->hDc, rect.left, rect.top,
- SRCCOPY);
- }
+ if (bDrawMainBM) {
+ BitBlt(hDc, rect.left, rect.top,
+ rect.right - rect.left, rect.bottom - rect.top,
+ b->hDc, rect.left, rect.top,
+ SRCCOPY);
+ }
SelectObject( b->hDc, b->bCopiedMain?b->hBmTemp:b->hBmMain );
BitBlt( hDc, rect.left, rect.top,
- rect.right-rect.left, rect.bottom-rect.top,
- b->hDc, rect.left, rect.top,
- bDrawMainBM?SRCAND:SRCCOPY);
+ rect.right-rect.left, rect.bottom-rect.top,
+ b->hDc, rect.left, rect.top,
+ bDrawMainBM?SRCAND:SRCCOPY);
SelectObject( b->hDc, hBmOld );
EndPaint( hWnd, &ps );
b->bCopiedMain = FALSE;
@@ -1703,6 +1831,13 @@ long FAR PASCAL XEXPORT mswDrawPush(
}
}
break;
+
+ case WM_SETCURSOR:
+ // Set cursor based on wSetCursor
+ DoSetCursor();
+ // return TRUE to suppress my parent from overriding me
+ return TRUE;
+
default:
break;
}
@@ -1710,10 +1845,11 @@ long FAR PASCAL XEXPORT mswDrawPush(
}
-static LRESULT drawMsgProc( wDraw_p b, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
+static LRESULT drawMsgProc( wDraw_p b, HWND hWnd, UINT message, WPARAM wParam,
+ LPARAM lParam )
{
wAction_t action;
-
+
switch( message ) {
case WM_MOUSEWHEEL:
/* handle mouse wheel events */
@@ -1738,9 +1874,10 @@ static LRESULT drawMsgProc( wDraw_p b, HWND hWnd, UINT message, WPARAM wParam, L
action = wActionWheelDown;
}
}
- if (b->action)
+ if (b->action) {
b->action( b, b->data, action, b->lastX, b->lastY );
- return 0;
+ }
+ return (LRESULT)0;
case WM_MOUSEHWHEEL:
if ( GET_KEYSTATE_WPARAM(wParam) & (MK_SHIFT|MK_MBUTTON)) {
if ( GET_WHEEL_DELTA_WPARAM(wParam) > 0 ) {
@@ -1749,9 +1886,10 @@ static LRESULT drawMsgProc( wDraw_p b, HWND hWnd, UINT message, WPARAM wParam, L
action = wActionScrollLeft;
}
}
- if (b->action)
+ if (b->action) {
b->action( b, b->data, action, b->lastX, b->lastY );
- return 0;
+ }
+ return (LRESULT)0;
}
return DefWindowProc( hWnd, message, wParam, lParam );
@@ -1787,27 +1925,30 @@ static void drawDoneProc( wControl_p b )
d->hDcBackup = (HDC)0;
}
while (bmRoot) {
- if (bmRoot->bm)
+ if (bmRoot->bm) {
DeleteObject( bmRoot->bm );
+ }
bmRoot = bmRoot->next;
}
}
static callBacks_t drawCallBacks = {
- NULL,
- drawDoneProc,
- (messageCallback_p)drawMsgProc };
+ NULL,
+ drawDoneProc,
+ (messageCallback_p)drawMsgProc
+};
-wDraw_p drawList = NULL;
+static wDraw_p drawList = NULL;
void mswRedrawAll( void )
{
wDraw_p p;
for ( p=drawList; p; p=p->drawNext ) {
- if (p->drawRepaint)
+ if (p->drawRepaint) {
p->drawRepaint( p, p->data, 0, 0 );
+ }
}
}
@@ -1824,14 +1965,14 @@ void mswRepaintAll( void )
hDc = BeginPaint( b->hWnd, &ps );
HBITMAP hBmOld = SelectObject( b->hDc, b->hBmMain );
BitBlt( hDc, rect.left, rect.top,
- rect.right-rect.left, rect.bottom-rect.top,
- b->hDc, rect.left, rect.top,
- SRCCOPY );
+ rect.right-rect.left, rect.bottom-rect.top,
+ b->hDc, rect.left, rect.top,
+ SRCCOPY );
SelectObject( b->hDc, b->hBmTemp );
BitBlt( hDc, rect.left, rect.top,
- rect.right-rect.left, rect.bottom-rect.top,
- b->hDc, rect.left, rect.top,
- SRCAND );
+ rect.right-rect.left, rect.bottom-rect.top,
+ b->hDc, rect.left, rect.top,
+ SRCAND );
SelectObject( b->hDc, hBmOld );
EndPaint( b->hWnd, &ps );
}
@@ -1840,27 +1981,22 @@ void mswRepaintAll( void )
wDraw_p wDrawCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- long option,
- wPos_t w,
- wPos_t h,
- void * data,
- wDrawRedrawCallBack_p redrawProc,
- wDrawActionCallBack_p action )
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ long option,
+ wWinPix_t w,
+ wWinPix_t h,
+ void * data,
+ wDrawRedrawCallBack_p redrawProc,
+ wDrawActionCallBack_p action )
{
wDraw_p d;
RECT rect;
int index;
HDC hDc;
- if ( noNegDrawArgs < 0 ) {
- wPrefGetInteger( "msw tweak", "NoNegDrawArgs", &noNegDrawArgs, 0 );
- wPrefGetInteger( "msw tweak", "NoFlatEndCaps", &noFlatEndCaps, 0 );
- }
-
d = mswAlloc( parent, B_DRAW, NULL, sizeof *d, data, &index );
mswComputePos( (wControl_p)d, x, y );
d->w = w;
@@ -1870,9 +2006,9 @@ wDraw_p wDrawCreate(
d->option = option;
d->hWnd = CreateWindow( mswDrawWindowClassName, NULL,
- WS_CHILDWINDOW|WS_VISIBLE|WS_BORDER,
- d->x, d->y, w, h,
- ((wControl_p)parent)->hWnd, (HMENU)index, mswHInst, NULL );
+ WS_CHILDWINDOW|WS_VISIBLE|WS_BORDER,
+ d->x, d->y, w, h,
+ ((wControl_p)parent)->hWnd, (HMENU)(UINT_PTR)index, mswHInst, NULL );
if (d->hWnd == (HWND)0) {
mswFail( "CreateWindow(DRAW)" );
@@ -1909,7 +2045,7 @@ wDraw_p wDrawCreate(
*****************************************************************************
*/
-wDraw_p wBitMapCreate( wPos_t w, wPos_t h, int planes )
+wDraw_p wBitMapCreate( wWinPix_t w, wWinPix_t h, int planes )
{
wDraw_p d;
HDC hDc;
@@ -1926,7 +2062,7 @@ wDraw_p wBitMapCreate( wPos_t w, wPos_t h, int planes )
d->option = 0;
hDc = GetDC(mswHWnd);
- d->hDc = CreateCompatibleDC( hDc );
+ d->hDc = CreateCompatibleDC( hDc );
if ( d->hDc == (HDC)0 ) {
wNoticeEx( NT_ERROR, "CreateBitMap: CreateDC fails", "Ok", NULL );
return FALSE;
@@ -1934,11 +2070,13 @@ wDraw_p wBitMapCreate( wPos_t w, wPos_t h, int planes )
d->hBmMain = CreateCompatibleBitmap( hDc, d->w, d->h );
if ( d->hBmMain == (HBITMAP)0 ) {
wNoticeEx( NT_ERROR, "CreateBitMap: CreateBM Main fails", "Ok", NULL );
+ ReleaseDC(mswHWnd, hDc);
return FALSE;
}
d->hBmTemp = CreateCompatibleBitmap( hDc, d->w, d->h );
if ( d->hBmTemp == (HBITMAP)0 ) {
wNoticeEx( NT_ERROR, "CreateBitMap: CreateBM Temp fails", "Ok", NULL );
+ ReleaseDC(mswHWnd, hDc);
return FALSE;
}
d->hasPalette = (GetDeviceCaps(hDc,RASTERCAPS ) & RC_PALETTE) != 0;
@@ -1992,63 +2130,74 @@ wBool_t wBitMapDelete( wDraw_p d )
wBool_t
wBitMapWriteFile(wDraw_p d, const char * fileName)
{
- FIBITMAP *dib = NULL;
- FIBITMAP *dib2 = NULL;
- FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
- BOOL bSuccess = FALSE;
-
- if (d->hBmMain) {
-
- BITMAP bm;
- GetObject(d->hBmMain, sizeof(BITMAP), (LPSTR)&bm);
- dib = FreeImage_Allocate(bm.bmWidth, bm.bmHeight, bm.bmBitsPixel, 0, 0, 0);
- // The GetDIBits function clears the biClrUsed and biClrImportant BITMAPINFO members (dont't know why)
- // So we save these infos below. This is needed for palettized images only.
- int nColors = FreeImage_GetColorsUsed(dib);
- HDC dc = GetDC(NULL);
- GetDIBits(dc,
- d->hBmMain,
- 0,
- FreeImage_GetHeight(dib),
- FreeImage_GetBits(dib),
- FreeImage_GetInfo(dib),
- DIB_RGB_COLORS);
- ReleaseDC(NULL, dc);
-
- // restore BITMAPINFO members
- FreeImage_GetInfoHeader(dib)->biClrUsed = nColors;
- FreeImage_GetInfoHeader(dib)->biClrImportant = nColors;
- // we will get a 32 bit bitmap on Windows systems with invalid alpha
- // so it needs to be converted to 24 bits.
- // (see: https://sourceforge.net/p/freeimage/discussion/36110/thread/0699ce8e/ )
- dib2 = FreeImage_ConvertTo24Bits(dib);
- FreeImage_Unload(dib);
- }
-
- // Try to guess the file format from the file extension
- fif = FreeImage_GetFIFFromFilename(fileName);
- if (fif != FIF_UNKNOWN) {
- // Check that the dib can be saved in this format
- BOOL bCanSave;
-
- FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib2);
- if (image_type == FIT_BITMAP) {
- // standard bitmap type
- WORD bpp = FreeImage_GetBPP(dib2);
- bCanSave = (FreeImage_FIFSupportsWriting(fif) &&
- FreeImage_FIFSupportsExportBPP(fif, bpp));
- } else {
- // special bitmap type
- bCanSave = FreeImage_FIFSupportsExportType(fif, image_type);
- }
-
- if (bCanSave) {
- bSuccess = FreeImage_Save(fif, dib2, fileName, PNG_DEFAULT);
- return bSuccess;
- }
- }
- FreeImage_Unload(dib2);
-
- return bSuccess;
+ FIBITMAP *dib = NULL;
+ FIBITMAP *dib2 = NULL;
+ FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
+ BOOL bSuccess = FALSE;
+
+ if (d->hBmMain) {
+
+ BITMAP bm;
+ GetObject(d->hBmMain, sizeof(BITMAP), (LPSTR)&bm);
+ dib = FreeImage_Allocate(bm.bmWidth, bm.bmHeight, bm.bmBitsPixel, 0, 0, 0);
+ // The GetDIBits function clears the biClrUsed and biClrImportant BITMAPINFO members (dont't know why)
+ // So we save these infos below. This is needed for palettized images only.
+ int nColors = FreeImage_GetColorsUsed(dib);
+ HDC dc = GetDC(NULL);
+ GetDIBits(dc,
+ d->hBmMain,
+ 0,
+ FreeImage_GetHeight(dib),
+ FreeImage_GetBits(dib),
+ FreeImage_GetInfo(dib),
+ DIB_RGB_COLORS);
+ ReleaseDC(NULL, dc);
+
+ // restore BITMAPINFO members
+ FreeImage_GetInfoHeader(dib)->biClrUsed = nColors;
+ FreeImage_GetInfoHeader(dib)->biClrImportant = nColors;
+ // we will get a 32 bit bitmap on Windows systems with invalid alpha
+ // so it needs to be converted to 24 bits.
+ // (see: https://sourceforge.net/p/freeimage/discussion/36110/thread/0699ce8e/ )
+ dib2 = FreeImage_ConvertTo24Bits(dib);
+ FreeImage_Unload(dib);
+ }
+
+ // Try to guess the file format from the file extension
+ fif = FreeImage_GetFIFFromFilename(fileName);
+ if (fif != FIF_UNKNOWN) {
+ // Check that the dib can be saved in this format
+ BOOL bCanSave;
+
+ FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib2);
+ if (image_type == FIT_BITMAP) {
+ // standard bitmap type
+ WORD bpp = FreeImage_GetBPP(dib2);
+ bCanSave = (FreeImage_FIFSupportsWriting(fif) &&
+ FreeImage_FIFSupportsExportBPP(fif, bpp));
+ } else {
+ // special bitmap type
+ bCanSave = FreeImage_FIFSupportsExportType(fif, image_type);
+ }
+
+ if (bCanSave) {
+ int flags;
+
+ switch (fif) {
+ case FIF_JPEG:
+ flags = JPEG_QUALITYNORMAL;
+ break;
+ case FIF_PNG:
+ flags = PNG_DEFAULT;
+ break;
+ default:
+ flags = 0; // whatver the default is for the file format
+ }
+ bSuccess = FreeImage_Save(fif, dib2, fileName, flags);
+ }
+ }
+ FreeImage_Unload(dib2);
+
+ return bSuccess;
}
diff --git a/app/wlib/mswlib/mswedit.c b/app/wlib/mswlib/mswedit.c
index dc70ac3..db7409e 100644
--- a/app/wlib/mswlib/mswedit.c
+++ b/app/wlib/mswlib/mswedit.c
@@ -1,7 +1,7 @@
/** \file mswedit.c
* Text entry widgets
*/
-
+
/* XTrackCAD - Model Railroad CAD
* Copyright (C) 2005 Dave Bullis
*
@@ -17,12 +17,11 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-
+
#include <windows.h>
#include <string.h>
-#include <malloc.h>
#include <stdlib.h>
#include <stdio.h>
#include <commdlg.h>
@@ -31,72 +30,68 @@
struct wString_t {
- WOBJ_COMMON
- char * valueP;
- wIndex_t valueL;
- wStringCallBack_p action;
- };
+ WOBJ_COMMON
+ char * valueP;
+ wIndex_t valueL;
+ wStringCallBack_p action;
+ wBool_t enter_pressed; /**< flag if enter was pressed */
+};
#ifdef LATER
struct wInteger_t {
- WOBJ_COMMON
- long low, high;
- long * valueP;
- long oldValue;
- wIntegerCallBack_p action;
- };
+ WOBJ_COMMON
+ long low, high;
+ long * valueP;
+ long oldValue;
+ wIntegerCallBack_p action;
+};
struct wFloat_t {
- WOBJ_COMMON
- double low, high;
- double * valueP;
- double oldValue;
- wFloatCallBack_p action;
- };
+ WOBJ_COMMON
+ double low, high;
+ double * valueP;
+ double oldValue;
+ wFloatCallBack_p action;
+};
#endif // LATER
static XWNDPROC oldEditProc = NULL;
static XWNDPROC newEditProc;
-static void triggerString( wControl_p b );
+static void triggerString( wString_p b );
#ifdef LATER
static void triggerInteger( wControl_p b );
static void triggerFloat( wControl_p b );
#endif
-long FAR PASCAL _export pushEdit(
- HWND hWnd,
- UINT message,
- UINT wParam,
- LONG lParam )
+LRESULT FAR PASCAL _export pushEdit(
+ HWND hWnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam )
{
-#ifdef WIN32
- long inx = GetWindowLong( hWnd, GWL_ID );
-#else
- short inx = GetWindowWord( hWnd, GWW_ID );
-#endif
- wControl_p b = mswMapIndex(inx);
+ wIndex_t inx = (wIndex_t)GetWindowLongPtr( hWnd, GWL_ID );
+ wString_p b = (wString_p)mswMapIndex(inx);
- switch (message)
- {
+ switch (message) {
case WM_CHAR:
- if (b != NULL) {
- switch (wParam) {
- case VK_RETURN:
- triggerString(b);
- return (0L);
- break;
- case 0x1B:
- case 0x09:
- SetFocus(((wControl_p)(b->parent))->hWnd);
- SendMessage(((wControl_p)(b->parent))->hWnd, WM_CHAR,
- wParam, lParam);
- return 0L;
- }
- }
- break;
+ if (b != NULL) {
+ switch (wParam) {
+ case VK_RETURN:
+ triggerString(b);
+ return (LRESULT)0;
+ break;
+ case 0x1B:
+ case 0x09:
+ SetFocus(((wControl_p)(b->parent))->hWnd);
+ SendMessage(((wControl_p)(b->parent))->hWnd, WM_CHAR,
+ wParam, lParam);
+ return (LRESULT)0;
+ }
+ }
+ break;
}
return CallWindowProc(oldEditProc, hWnd, message, wParam, lParam);
@@ -112,61 +107,61 @@ long FAR PASCAL _export pushEdit(
void wStringSetValue(
- wString_p b,
- const char * arg )
+ wString_p b,
+ const char * arg )
{
WORD len = (WORD)strlen( arg );
- SendMessage( b->hWnd, WM_SETTEXT, 0, (DWORD)arg );
-#ifdef WIN32
- SendMessage( b->hWnd, EM_SETSEL, 0, -1 );
- SendMessage( b->hWnd, EM_SCROLLCARET, 0, 0L );
-#else
- SendMessage( b->hWnd, EM_SETSEL, 0, MAKELPARAM(len,len) );
-#endif
- SendMessage( b->hWnd, EM_SETMODIFY, FALSE, 0L );
+ SendMessage( b->hWnd, WM_SETTEXT, (WPARAM)0, (LPARAM)arg );
+ SendMessage( b->hWnd, EM_SETSEL, (WPARAM)0, (LPARAM)-1 );
+ SendMessage( b->hWnd, EM_SCROLLCARET, (WPARAM)0, (LPARAM)0 );
+ SendMessage( b->hWnd, EM_SETMODIFY, (WPARAM)FALSE, (LPARAM)0 );
}
void wStringSetWidth(
- wString_p b,
- wPos_t w )
+ wString_p b,
+ wWinPix_t w )
{
int rc;
b->w = w;
rc = SetWindowPos( b->hWnd, HWND_TOP, 0, 0,
- b->w, b->h, SWP_NOMOVE|SWP_NOZORDER );
+ b->w, b->h, SWP_NOMOVE|SWP_NOZORDER );
}
const char * wStringGetValue(
- wString_p b )
+ wString_p b )
{
static char buff[1024];
- SendMessage( b->hWnd, WM_GETTEXT, sizeof buff, (DWORD)buff );
+ SendMessage( b->hWnd, WM_GETTEXT, (WPARAM)sizeof buff, (LPARAM)buff );
return buff;
}
/**
* Get the string from a entry field. The returned pointer has to be free() after processing is complete.
- *
+ *
* \param bs IN string entry field
- *
+ *
* \return pointer to entered string or NULL if entry field is empty.
*/
static char *getString(wString_p bs)
{
- char *tmpBuffer = NULL;
- UINT chars = SendMessage(bs->hWnd, EM_LINELENGTH, (WPARAM)0, 0L);
-
- if (chars) {
- tmpBuffer = malloc(chars > sizeof(WORD)? chars + 1 : sizeof(WORD) + 1);
- *(WORD *)tmpBuffer = chars;
- SendMessage(bs->hWnd, (UINT)EM_GETLINE, 0, (LPARAM)tmpBuffer);
- tmpBuffer[chars] = '\0';
- }
+ char *tmpBuffer = NULL;
+ UINT chars = (UINT)SendMessage(bs->hWnd, EM_LINELENGTH, (WPARAM)0, (LPARAM)0);
+
+ if (chars) {
+ tmpBuffer = malloc(chars > sizeof(WORD)? chars + 1 : sizeof(WORD) + 1);
+ *(WORD *)tmpBuffer = chars;
+ SendMessage(bs->hWnd, (UINT)EM_GETLINE, (WPARAM)0, (LPARAM)tmpBuffer);
+ tmpBuffer[chars] = '\0';
+ } else {
+ tmpBuffer = malloc(2);
+ tmpBuffer[0] = '\n';
+ tmpBuffer[1] = '\0';
+ }
- return (tmpBuffer);
+ return (tmpBuffer);
}
/**
@@ -177,126 +172,126 @@ static char *getString(wString_p bs)
*/
static void triggerString(
- wControl_p b)
+ wString_p b)
{
- wString_p bs = (wString_p)b;
-
- char *enteredString = getString(bs);
- if (enteredString)
- {
- if (bs->valueP) {
- strcpy(bs->valueP, enteredString);
- }
- if (bs->action) {
- bs->action(enteredString, bs->data);
- }
+ const char *output = "\n";
+
+ char *enteredString = getString(b);
+ if (enteredString) {
+ if (b->valueP) {
+ strcpy(b->valueP, enteredString);
+ }
+ if (b->action) {
+ b->enter_pressed = TRUE;
+ b->action(output, b->data);
+ }
+
free(enteredString);
}
}
LRESULT stringProc(
- wControl_p b,
- HWND hWnd,
- UINT message,
- WPARAM wParam,
- LPARAM lParam)
+ wControl_p b,
+ HWND hWnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam)
{
- wString_p bs = (wString_p)b;
- int modified;
-
- switch (message) {
-
- case WM_COMMAND:
- switch (WCMD_PARAM_NOTF) {
- case EN_KILLFOCUS:
- modified = (int)SendMessage(bs->hWnd, (UINT)EM_GETMODIFY, 0, 0L);
- if (!modified) {
- break;
- }
-
- char *enteredString = getString(bs);
- if (enteredString) {
- if (bs->valueP) {
- strcpy(bs->valueP, enteredString);
- }
- if (bs->action) {
- bs->action(enteredString, bs->data);
- mswSetTrigger(NULL, NULL);
- }
- free(enteredString);
- }
- SendMessage(bs->hWnd, (UINT)EM_SETMODIFY, FALSE, 0L);
- }
- break;
- }
-
- return DefWindowProc(hWnd, message, wParam, lParam);
+ wString_p bs = (wString_p)b;
+ int modified;
+
+ switch (message) {
+
+ case WM_COMMAND:
+ switch (WCMD_PARAM_NOTF) {
+ case EN_KILLFOCUS:
+ modified = (int)SendMessage(bs->hWnd, (UINT)EM_GETMODIFY, (WPARAM)0, (LPARAM)0);
+ if (!modified) {
+ break;
+ }
+
+ char *enteredString = getString(bs);
+ if (enteredString) {
+ if (bs->valueP) {
+ strcpy(bs->valueP, enteredString);
+ }
+ if (bs->action) {
+ bs->action(enteredString, bs->data);
+ mswSetTrigger(NULL, NULL);
+ }
+ free(enteredString);
+ }
+ SendMessage(bs->hWnd, (UINT)EM_SETMODIFY, (WPARAM)FALSE, (LPARAM)0);
+ }
+ break;
+ }
+
+ return DefWindowProc(hWnd, message, wParam, lParam);
}
static callBacks_t stringCallBacks = {
- mswRepaintLabel,
- NULL,
- stringProc };
+ mswRepaintLabel,
+ NULL,
+ stringProc
+};
wString_p wStringCreate(
- wWin_p parent,
- POS_T x,
- POS_T y,
- const char * helpStr,
- const char * labelStr,
- long option,
- POS_T width,
- char *valueP,
- wIndex_t valueL,
- wStringCallBack_p action,
- void *data )
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ wWinPix_t width,
+ char *valueP,
+ wIndex_t valueL,
+ wStringCallBack_p action,
+ void *data )
{
wString_p b;
RECT rect;
int index;
DWORD style = 0;
- b = (wString_p)mswAlloc( parent, B_STRING, mswStrdup(labelStr), sizeof *b, data, &index );
+ b = (wString_p)mswAlloc( parent, B_STRING, mswStrdup(labelStr), sizeof *b, data,
+ &index );
mswComputePos( (wControl_p)b, x, y );
b->option = option;
b->valueP = valueP;
b->valueL = valueL;
b->labelY += 2;
b->action = action;
- if (option & BO_READONLY)
+ if (option & BO_READONLY) {
style |= ES_READONLY;
+ }
-#ifdef WIN32
b->hWnd = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL,
- ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | style,
- b->x, b->y,
- width, mswEditHeight,
- ((wControl_p)parent)->hWnd, (HMENU)index, mswHInst, NULL );
-#else
- b->hWnd = CreateWindow( "EDIT", NULL,
- ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | style,
- b->x, b->y,
- width, mswEditHeight,
- ((wControl_p)parent)->hWnd, (HMENU)index, mswHInst, NULL );
-#endif
+ ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | style,
+ b->x, b->y,
+ width, mswEditHeight,
+ ((wControl_p)parent)->hWnd, (HMENU)(UINT_PTR)index, mswHInst, NULL );
if (b->hWnd == NULL) {
mswFail("CreateWindow(STRING)");
return b;
}
newEditProc = MakeProcInstance( (XWNDPROC)pushEdit, mswHInst );
- oldEditProc = (XWNDPROC)GetWindowLong(b->hWnd, GWL_WNDPROC );
+ oldEditProc = (XWNDPROC)GetWindowLongPtr(b->hWnd, GWLP_WNDPROC);
+ SetWindowLongPtr(b->hWnd, GWLP_WNDPROC, (LONG_PTR)newEditProc);
+#ifdef _OLDCODE
+ oldEditProc = (XWNDPROC)GetWindowLongPtr(b->hWnd, GWL_WNDPROC );
SetWindowLong( b->hWnd, GWL_WNDPROC, (LONG)newEditProc );
+#endif // WIN64
if (b->valueP) {
- SendMessage( b->hWnd, WM_SETTEXT, 0, (DWORD)b->valueP );
+ SendMessage( b->hWnd, WM_SETTEXT, (WPARAM)0, (LPARAM)b->valueP );
}
- SendMessage( b->hWnd, EM_SETMODIFY, FALSE, 0L );
- if ( !mswThickFont )
- SendMessage( b->hWnd, WM_SETFONT, (WPARAM)mswLabelFont, 0L );
+ SendMessage( b->hWnd, EM_SETMODIFY, (WPARAM)FALSE, (LPARAM)0 );
+ SendMessage( b->hWnd, WM_SETFONT, (WPARAM)mswLabelFont, (LPARAM)0 );
+
GetWindowRect( b->hWnd, &rect );
b->w = rect.right - rect.left;
b->h = rect.bottom - rect.top;
@@ -322,8 +317,8 @@ wString_p wStringCreate(
void wIntegerSetValue(
- wInteger_p b,
- long arg )
+ wInteger_p b,
+ long arg )
{
b->oldValue = arg;
wsprintf( mswTmpBuff, "%ld", arg );
@@ -333,14 +328,14 @@ void wIntegerSetValue(
long wIntegerGetValue(
- wInteger_p b )
+ wInteger_p b )
{
return b->oldValue;
}
static void triggerInteger(
- wControl_p b )
+ wControl_p b )
{
wInteger_p bi = (wInteger_p)b;
int cnt;
@@ -349,17 +344,22 @@ static void triggerInteger(
if (bi->action) {
*(WPARAM*)&mswTmpBuff[0] = 78;
- cnt = (int)SendMessage( bi->hWnd, (UINT)EM_GETLINE, 0, (DWORD)(LPSTR)mswTmpBuff );
+ cnt = (int)SendMessage( bi->hWnd, (UINT)EM_GETLINE, 0,
+ (DWORD)(LPSTR)mswTmpBuff );
mswTmpBuff[cnt] = '\0';
- if (strcmp( mswTmpBuff, "-" )==0 )
+ if (strcmp( mswTmpBuff, "-" )==0 ) {
return;
+ }
value = strtol( mswTmpBuff, &cp, 10 );
- if (*cp != '\0' || value < bi->low || value > bi->high )
+ if (*cp != '\0' || value < bi->low || value > bi->high ) {
return;
- if (bi->oldValue == value)
+ }
+ if (bi->oldValue == value) {
return;
- if (bi->valueP)
+ }
+ if (bi->valueP) {
*bi->valueP = value;
+ }
bi->oldValue = value;
bi->action( value, bi->data );
}
@@ -367,31 +367,33 @@ static void triggerInteger(
LRESULT integerProc(
- wControl_p b,
- HWND hWnd,
- UINT message,
- WPARAM wParam,
- LPARAM lParam )
-{
+ wControl_p b,
+ HWND hWnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam )
+{
wInteger_p bi = (wInteger_p)b;
int inx;
int cnt;
long value;
- char * cp;
+ char * cp;
wBool_t ok;
int modified;
-
+
switch( message ) {
-
+
case WM_COMMAND:
switch (WCMD_PARAM_NOTF) {
case EN_KILLFOCUS:
ok = TRUE;
modified = (int)SendMessage( bi->hWnd, (UINT)EM_GETMODIFY, 0, 0L );
- if (!modified)
+ if (!modified) {
break;
+ }
*(WPARAM*)&mswTmpBuff[0] = 78;
- cnt = (int)SendMessage( bi->hWnd, (UINT)EM_GETLINE, 0, (DWORD)(LPSTR)mswTmpBuff );
+ cnt = (int)SendMessage( bi->hWnd, (UINT)EM_GETLINE, 0,
+ (DWORD)(LPSTR)mswTmpBuff );
mswTmpBuff[cnt] = '\0';
if (strcmp( mswTmpBuff, "-" )==0 && 0 >= bi->low && 0 <= bi->high ) {
value = 0;
@@ -400,23 +402,25 @@ LRESULT integerProc(
if (*cp != '\0' || value < bi->low || value > bi->high ) {
inx = GetWindowWord( bi->hWnd, GWW_ID );
if (wWinIsVisible(bi->parent)) {
- PostMessage( ((wControl_p)(bi->parent))->hWnd,
- WM_NOTVALID, inx, 0L );
+ PostMessage( ((wControl_p)(bi->parent))->hWnd,
+ WM_NOTVALID, inx, 0L );
return TRUE;
} else {
- if (value < bi->low)
+ if (value < bi->low) {
value = bi->low;
- else
+ } else {
value = bi->high;
+ }
sprintf( mswTmpBuff, "%ld", value );
SendMessage( bi->hWnd, (UINT)WM_SETTEXT, 0,
- (DWORD)(LPSTR)mswTmpBuff );
+ (DWORD)(LPSTR)mswTmpBuff );
}
}
}
bi->oldValue = value;
- if (bi->valueP)
+ if (bi->valueP) {
*bi->valueP = value;
+ }
if (bi->action) {
bi->action( value, bi->data );
mswSetTrigger( NULL, NULL );
@@ -427,21 +431,22 @@ LRESULT integerProc(
case WM_NOTVALID:
wsprintf( mswTmpBuff, "Please enter a value between %ld and %ld",
- bi->low, bi->high );
+ bi->low, bi->high );
if (bi->low > MININT && bi->high < MAXINT)
sprintf( mswTmpBuff,
- "Please enter an integer value between %ld and %ld",
- bi->low, bi->high );
+ "Please enter an integer value between %ld and %ld",
+ bi->low, bi->high );
else if (bi->low > MININT)
sprintf( mswTmpBuff,
- "Please enter an integer value greater or equal to %ld",
- bi->low );
+ "Please enter an integer value greater or equal to %ld",
+ bi->low );
else if (bi->high < MAXINT)
sprintf( mswTmpBuff,
- "Please enter an integer value less or equal to %ld",
- bi->high );
- else
+ "Please enter an integer value less or equal to %ld",
+ bi->high );
+ else {
strcpy( mswTmpBuff, "Please enter an integer value" );
+ }
MessageBox( bi->hWnd, mswTmpBuff, "Invalid entry", MB_OK );
SetFocus( bi->hWnd );
#ifdef WIN32
@@ -452,31 +457,32 @@ LRESULT integerProc(
#endif
return TRUE;
- }
-
+ }
+
return DefWindowProc( hWnd, message, wParam, lParam );
-}
+}
static callBacks_t integerCallBacks = {
- mswRepaintLabel,
- NULL,
- integerProc };
+ mswRepaintLabel,
+ NULL,
+ integerProc
+};
wInteger_p wIntegerCreate(
- wWin_p parent,
- POS_T x,
- POS_T y,
- const char * helpStr,
- const char * labelStr,
- long option,
- POS_T width,
- long low,
- long high,
- long *valueP,
- wIntegerCallBack_p action,
- void *data )
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ wWinPix_t width,
+ long low,
+ long high,
+ long *valueP,
+ wIntegerCallBack_p action,
+ void *data )
{
wInteger_p b;
RECT rect;
@@ -491,35 +497,35 @@ wInteger_p wIntegerCreate(
b->valueP = valueP;
b->labelY += 2;
b->action = action;
- if (option & BO_READONLY)
+ if (option & BO_READONLY) {
style |= ES_READONLY;
+ }
b->hWnd = CreateWindow( "EDIT", NULL,
- ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | style,
- b->x, b->y,
- width, mswEditHeight,
- ((wControl_p)parent)->hWnd, (HMENU)index, mswHInst, NULL );
+ ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | style,
+ b->x, b->y,
+ width, mswEditHeight,
+ ((wControl_p)parent)->hWnd, (HMENU)index, mswHInst, NULL );
if (b->hWnd == NULL) {
mswFail("CreateWindow(INTEGER)");
return b;
}
-#ifdef CONTROL3D
- Ctl3dSubclassCtl( b->hWnd);
-#endif
-
+
newEditProc = MakeProcInstance( (XWNDPROC)pushEdit, mswHInst );
oldEditProc = (XWNDPROC)GetWindowLong(b->hWnd, GWL_WNDPROC );
SetWindowLong( b->hWnd, GWL_WNDPROC, (LONG)newEditProc );
- if ( !mswThickFont )
+ if ( !mswThickFont ) {
SendMessage( b->hWnd, WM_SETFONT, (WPARAM)mswLabelFont, 0L );
+ }
if (b->valueP) {
wsprintf( mswTmpBuff, "%ld", *b->valueP );
SendMessage( b->hWnd, WM_SETTEXT, 0, (DWORD)(LPSTR)mswTmpBuff );
b->oldValue = *b->valueP;
- } else
+ } else {
b->oldValue = 0;
+ }
SendMessage( b->hWnd, EM_SETMODIFY, FALSE, 0L );
GetWindowRect( b->hWnd, &rect );
@@ -547,8 +553,8 @@ wInteger_p wIntegerCreate(
void wFloatSetValue(
- wFloat_p b,
- double arg )
+ wFloat_p b,
+ double arg )
{
b->oldValue = arg;
sprintf( mswTmpBuff, "%0.3f", arg );
@@ -558,67 +564,72 @@ void wFloatSetValue(
double wFloatGetValue(
- wFloat_p b )
+ wFloat_p b )
{
return b->oldValue;
}
static void triggerFloat(
- wControl_p b )
+ wControl_p b )
{
wFloat_p bf = (wFloat_p)b;
int cnt;
double value;
- char * cp;
+ char * cp;
if (bf->action) {
*(WPARAM*)&mswTmpBuff[0] = 78;
cnt = (int)SendMessage( bf->hWnd, (UINT)EM_GETLINE, 0,
- (DWORD)(LPSTR)mswTmpBuff );
+ (DWORD)(LPSTR)mswTmpBuff );
mswTmpBuff[cnt] = '\0';
- if (strcmp( mswTmpBuff, "-" )==0)
+ if (strcmp( mswTmpBuff, "-" )==0) {
return;
+ }
value = strtod( mswTmpBuff, &cp );
- if (*cp != '\0' || value < bf->low || value > bf->high )
+ if (*cp != '\0' || value < bf->low || value > bf->high ) {
return;
- if (bf->oldValue == value)
+ }
+ if (bf->oldValue == value) {
return;
+ }
bf->oldValue = value;
- if (bf->valueP)
- *bf->valueP = value;
+ if (bf->valueP) {
+ *bf->valueP = value;
+ }
bf->action( wFloatGetValue(bf), bf->data );
}
}
LRESULT floatProc(
- wControl_p b,
- HWND hWnd,
- UINT message,
- WPARAM wParam,
- LPARAM lParam )
-{
+ wControl_p b,
+ HWND hWnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam )
+{
wFloat_p bf = (wFloat_p)b;
int inx;
int cnt;
double value;
- char * cp;
+ char * cp;
wBool_t ok;
int modified;
switch( message ) {
-
+
case WM_COMMAND:
switch (HIWORD(lParam)) {
case EN_KILLFOCUS:
ok = TRUE;
modified = (int)SendMessage( bf->hWnd, (UINT)EM_GETMODIFY, 0, 0L );
- if (!modified)
+ if (!modified) {
break;
+ }
*(WPARAM*)&mswTmpBuff[0] = 78;
cnt = (int)SendMessage( bf->hWnd, (UINT)EM_GETLINE, 0,
- (DWORD)(LPSTR)mswTmpBuff );
+ (DWORD)(LPSTR)mswTmpBuff );
mswTmpBuff[cnt] = '\0';
if (strcmp( mswTmpBuff, "-" )==0 && 0 >= bf->low && 0 <= bf->high ) {
value = 0;
@@ -627,23 +638,25 @@ LRESULT floatProc(
if (*cp != '\0' || value < bf->low || value > bf->high ) {
inx = GetWindowWord( bf->hWnd, GWW_ID );
if (wWinIsVisible(bf->parent)) {
- PostMessage( ((wControl_p)(bf->parent))->hWnd,
- WM_NOTVALID, inx, 0L );
+ PostMessage( ((wControl_p)(bf->parent))->hWnd,
+ WM_NOTVALID, inx, 0L );
return TRUE;
} else {
- if (value < bf->low)
+ if (value < bf->low) {
value = bf->low;
- else
+ } else {
value = bf->high;
+ }
sprintf( mswTmpBuff, "%0.3f", value );
SendMessage( bf->hWnd, (UINT)WM_SETTEXT, 0,
- (DWORD)(LPSTR)mswTmpBuff );
+ (DWORD)(LPSTR)mswTmpBuff );
}
}
}
bf->oldValue = value;
- if (bf->valueP)
+ if (bf->valueP) {
*bf->valueP = value;
+ }
if (bf->action) {
bf->action( value, bf->data );
mswSetTrigger( NULL, NULL );
@@ -655,18 +668,19 @@ LRESULT floatProc(
case WM_NOTVALID:
if (bf->low > MINFLT && bf->high < MAXFLT)
sprintf( mswTmpBuff,
- "Please enter an float value between %0.3f and %0.3f",
- bf->low, bf->high );
+ "Please enter an float value between %0.3f and %0.3f",
+ bf->low, bf->high );
else if (bf->low > MINFLT)
sprintf( mswTmpBuff,
- "Please enter an float value greater or equal to %0.3f",
- bf->low );
+ "Please enter an float value greater or equal to %0.3f",
+ bf->low );
else if (bf->high < MAXFLT)
sprintf( mswTmpBuff,
- "Please enter an float value less or equal to %0.3f",
- bf->high );
- else
+ "Please enter an float value less or equal to %0.3f",
+ bf->high );
+ else {
strcpy( mswTmpBuff, "Please enter an float value" );
+ }
MessageBox( bf->hWnd, mswTmpBuff, "Invalid entry", MB_OK );
SetFocus( bf->hWnd );
#ifdef WIN32
@@ -677,30 +691,31 @@ LRESULT floatProc(
#endif
return TRUE;
- }
+ }
return DefWindowProc( hWnd, message, wParam, lParam );
-}
+}
static callBacks_t floatCallBacks = {
- mswRepaintLabel,
- NULL,
- floatProc };
+ mswRepaintLabel,
+ NULL,
+ floatProc
+};
wFloat_p wFloatCreate(
- wWin_p parent,
- POS_T x,
- POS_T y,
- const char * helpStr,
- const char * labelStr,
- long option,
- POS_T width,
- double low,
- double high,
- double *valueP,
- wFloatCallBack_p action,
- void *data )
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ wWinPix_t width,
+ double low,
+ double high,
+ double *valueP,
+ wFloatCallBack_p action,
+ void *data )
{
wFloat_p b;
RECT rect;
@@ -715,37 +730,38 @@ wFloat_p wFloatCreate(
b->valueP = valueP;
b->labelY += 2;
b->action = action;
- if (option & BO_READONLY)
+ if (option & BO_READONLY) {
style |= ES_READONLY;
+ }
b->hWnd = CreateWindow( "EDIT", NULL,
- ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | style,
- b->x, b->y,
- width, mswEditHeight,
- ((wControl_p)parent)->hWnd, (HMENU)index, mswHInst, NULL );
+ ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | style,
+ b->x, b->y,
+ width, mswEditHeight,
+ ((wControl_p)parent)->hWnd, (HMENU)index, mswHInst, NULL );
if (b->hWnd == NULL) {
mswFail("CreateWindow(FLOAT)");
return b;
}
-#ifdef CONTROL3D
- Ctl3dSubclassCtl( b->hWnd);
-#endif
-
+
newEditProc = MakeProcInstance( (XWNDPROC)pushEdit, mswHInst );
oldEditProc = (XWNDPROC)GetWindowLong(b->hWnd, GWL_WNDPROC );
SetWindowLong( b->hWnd, GWL_WNDPROC, (LONG)newEditProc );
if (b->valueP) {
- b->oldValue = *b->valueP;
- } else
- b->oldValue = 0.0;
- if (b->valueP)
- sprintf( mswTmpBuff, "%0.3f", *b->valueP );
- else
- strcpy( mswTmpBuff, "0.000" );
- if ( !mswThickFont )
+ b->oldValue = *b->valueP;
+ } else {
+ b->oldValue = 0.0;
+ }
+ if (b->valueP) {
+ sprintf( mswTmpBuff, "%0.3f", *b->valueP );
+ } else {
+ strcpy( mswTmpBuff, "0.000" );
+ }
+ if ( !mswThickFont ) {
SendMessage( b->hWnd, WM_SETFONT, (WPARAM)mswLabelFont, 0L );
+ }
SendMessage( b->hWnd, WM_SETTEXT, 0, (DWORD)(LPSTR)mswTmpBuff );
SendMessage( b->hWnd, EM_SETMODIFY, FALSE, 0L );
diff --git a/app/wlib/mswlib/mswint.h b/app/wlib/mswlib/mswint.h
index e560053..525a37c 100644
--- a/app/wlib/mswlib/mswint.h
+++ b/app/wlib/mswlib/mswint.h
@@ -1,15 +1,31 @@
+/** \file mswint.h
+ * Windows specific definitions and prototypes for wlib
+ */
+
+/* XTrackCAD - Model Railroad CAD
+ * Copyright (C) 2005 Dave Bullis
+ *
+ * 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 "wlib.h"
#include "mswlib.h"
-//#include "dynarr.h"
-#include "common.h"
-#ifndef WIN32
-/*#define CONTROL3D*/
-#endif
-#include "stdio.h"
+#include "dynarr.h"
-#ifdef CONTROL3D
-#include "ctl3d.h"
-#endif
+#include <FreeImage.h>
+#include <stdio.h>
#ifdef WIN32
#ifdef FAR
@@ -40,39 +56,39 @@
#endif
#ifndef CAST_AWAY_CONST
- #define CAST_AWAY_CONST (char *)
+#define CAST_AWAY_CONST (char *)
#endif
#define BOOL_T wBool_t
-#define POS_T wPos_t
#define INDEX_T wIndex_t
#define INTEGER_T wInteger_t
typedef enum {
- W_MAIN, W_POPUP,
- B_BUTTON, B_STRING, B_INTEGER, B_FLOAT,
- B_LIST, B_DROPLIST, B_COMBOLIST,
- B_RADIO, B_TOGGLE,
- B_DRAW, B_TEXT, B_MESSAGE, B_LINES,
- B_MENUITEM, B_CHOICEITEM, B_BOX,
- B_BITMAP } wType_e;
-
-typedef void (*repaintProcCallback_p)( HWND, wControl_p );
-typedef void (*doneProcCallback_p)( wControl_p b );
-typedef LRESULT (*messageCallback_p)( wControl_p, HWND, UINT, WPARAM, LPARAM );
-typedef void (*setTriggerCallback_p)( wControl_p b );
-typedef void (*setBusyCallback_p)( wControl_p, BOOL_T );
-typedef void (*showCallback_p)( wControl_p, BOOL_T );
-typedef void (*setPosCallback_p)( wControl_p, wPos_t, wPos_t );
+ W_MAIN, W_POPUP,
+ B_BUTTON, B_STRING, B_INTEGER, B_FLOAT,
+ B_LIST, B_DROPLIST, B_COMBOLIST,
+ B_RADIO, B_TOGGLE,
+ B_DRAW, B_TEXT, B_MESSAGE, B_LINES,
+ B_MENUITEM, B_CHOICEITEM, B_BOX,
+ B_BITMAP
+} wType_e;
+
+typedef void ( *repaintProcCallback_p )( HWND, wControl_p );
+typedef void ( *doneProcCallback_p )( wControl_p b );
+typedef LRESULT( *messageCallback_p )( wControl_p, HWND, UINT, WPARAM, LPARAM );
+typedef void ( *setTriggerCallback_p )( wControl_p b );
+typedef void ( *setBusyCallback_p )( wControl_p, BOOL_T );
+typedef void ( *showCallback_p )( wControl_p, BOOL_T );
+typedef void ( *setPosCallback_p )( wControl_p, wWinPix_t, wWinPix_t );
typedef struct {
- repaintProcCallback_p repaintProc;
- doneProcCallback_p doneProc;
- messageCallback_p messageProc;
- setBusyCallback_p setBusyProc;
- showCallback_p showProc;
- setPosCallback_p setPosProc;
- } callBacks_t;
+ repaintProcCallback_p repaintProc;
+ doneProcCallback_p doneProc;
+ messageCallback_p messageProc;
+ setBusyCallback_p setBusyProc;
+ showCallback_p showProc;
+ setPosCallback_p setPosProc;
+} callBacks_t;
#define CALLBACK_CNT (B_BOX+1)
extern callBacks_t *mswCallBacks[CALLBACK_CNT];
@@ -83,67 +99,68 @@ extern callBacks_t *mswCallBacks[CALLBACK_CNT];
wControl_p next; \
wControl_p synonym; \
wWin_p parent; \
- POS_T x, y; \
- POS_T w, h; \
+ wWinPix_t x, y; \
+ wWinPix_t w, h; \
long option; \
- POS_T labelX, labelY; \
+ wWinPix_t labelX, labelY; \
const char * labelStr; \
const char * helpStr; \
const char * tipStr; \
+ char * errStr; \
HWND hWnd; \
void * data;\
wControl_p focusChainNext; \
- wBool_t shown;
+ wBool_t shown; \
+ wBool_t hilite;
struct wControl_t {
- WOBJ_COMMON
- };
+ WOBJ_COMMON
+};
typedef struct {
- unsigned key;
- wDrawColor color;
- } wIconColorMap_t;
+ unsigned key;
+ wDrawColor color;
+} wIconColorMap_t;
#define mswIcon_bitmap (1)
#define mswIcon_pixmap (2)
struct wIcon_t {
- int type;
- wPos_t w; /**< width */
- wPos_t h; /**< height */
- wDrawColor color;
- int colorcnt; /**< number of colors */
- RGBQUAD *colormap;
- char *pixels; /**< pointer to pixel information */
- int transparent; /**< index of transparent color */
- };
+ int type;
+ wWinPix_t w; /**< width */
+ wWinPix_t h; /**< height */
+ wDrawColor color;
+ int colorcnt; /**< number of colors */
+ RGBQUAD *colormap;
+ char *pixels; /**< pointer to pixel information */
+ int transparent; /**< index of transparent color */
+};
struct wDraw_t {
- WOBJ_COMMON
- HDC hDc;
- double wFactor;
- double hFactor;
- double DPI;
- wDrawRedrawCallBack_p drawRepaint;
- wDrawActionCallBack_p action;
- HBITMAP hBmMain;
- HBITMAP hBmTemp;
- HBITMAP hBmOld;
- HPEN hPen;
- HBRUSH hBrush;
- wDraw_p drawNext;
- wBool_t hasPalette;
- int paletteClock;
- HBITMAP hBmBackup;
- HDC hDcBackup;
- HBITMAP hBmBackupOld;
- void *background;
- wBool_t bTempMode;
- wBool_t bCopiedMain;
-
- wPos_t lastX;
- wPos_t lastY;
-
- };
+ WOBJ_COMMON
+ HDC hDc;
+ double wFactor;
+ double hFactor;
+ double DPI;
+ wDrawRedrawCallBack_p drawRepaint;
+ wDrawActionCallBack_p action;
+ HBITMAP hBmMain;
+ HBITMAP hBmTemp;
+ HBITMAP hBmOld;
+ HPEN hPen;
+ HBRUSH hBrush;
+ wDraw_p drawNext;
+ wBool_t hasPalette;
+ int paletteClock;
+ HBITMAP hBmBackup;
+ HDC hDcBackup;
+ HBITMAP hBmBackupOld;
+ FIBITMAP *background;
+ wBool_t bTempMode;
+ wBool_t bCopiedMain;
+ wDrawPix_t lastX;
+ wDrawPix_t lastY;
+
+};
extern HINSTANCE mswHInst;
extern char mswTmpBuff[1024];
@@ -156,9 +173,7 @@ extern HFONT mswOldTextFont;
extern HFONT mswLabelFont;
extern wDrawColor wDrawColorWhite;
extern wDrawColor wDrawColorBlack;
-extern long mswThickFont;
extern double mswScale;
-extern double scaleIcon;
DWORD mswGetBaseStyle( wWin_p );
char * mswStrdup( const char * );
@@ -168,7 +183,7 @@ void mswResize( wWin_p );
wControl_p mswMapIndex( INDEX_T );
void mswButtPush( wControl_p );
void * mswAlloc( wWin_p, wType_e, const char *, int, void *, int * );
-void mswComputePos( wControl_p, wPos_t, wPos_t );
+void mswComputePos( wControl_p, wWinPix_t, wWinPix_t );
void mswAddButton( wControl_p, BOOL_T, const char * );
void mswRepaintLabel( HWND, wControl_p );
int mswRegister( wControl_p );
@@ -178,7 +193,7 @@ void mswSetFocus( wControl_p );
void mswSetTrigger( wControl_p, setTriggerCallback_p );
void mswMenuPush( wControl_p );
void mswCreateCheckBitmaps( void );
-long FAR PASCAL XEXPORT mswDrawPush( HWND, UINT, UINT, LONG );
+LRESULT FAR PASCAL XEXPORT mswDrawPush( HWND, UINT, WPARAM, LPARAM );
#ifdef WIN32
DWORD GetTextExtent( HDC, CHAR *, UINT );
#endif
@@ -186,7 +201,7 @@ void mswRedrawAll( void );
void mswRepaintAll( void );
HDC mswGetPrinterDC( void );
int mswMenuAccelerator( wWin_p, long );
-void mswMenuMove( wMenu_p, wPos_t, wPos_t );
+void mswMenuMove( wMenu_p, wWinPix_t, wWinPix_t );
void mswRegisterBitMap( HBITMAP );
void mswFontInit( void );
void mswInitColorPalette( void );
@@ -202,5 +217,5 @@ void deleteBitmaps( void );
void mswDrawIcon( HDC, int, int, wIcon_p, int, COLORREF, COLORREF );
/* gwin32.c*/
-char *g_win32_getlocale (void);
+char *g_win32_getlocale( void );
diff --git a/app/wlib/mswlib/mswlines.c b/app/wlib/mswlib/mswlines.c
index be1330d..a55618e 100644
--- a/app/wlib/mswlib/mswlines.c
+++ b/app/wlib/mswlib/mswlines.c
@@ -1,6 +1,5 @@
#include <windows.h>
#include <string.h>
-#include <malloc.h>
#include <stdlib.h>
#include <commdlg.h>
#include <math.h>
@@ -15,10 +14,10 @@
*/
struct wLine_t {
- WOBJ_COMMON
- int count;
- wLines_t * lines;
- };
+ WOBJ_COMMON
+ int count;
+ wLines_t * lines;
+};
static void repaintLines( HWND hWnd, wControl_p b )
{
@@ -45,24 +44,26 @@ static void repaintLines( HWND hWnd, wControl_p b )
static callBacks_t linesCallBacks = {
- repaintLines,
- NULL,
- NULL };
+ repaintLines,
+ NULL,
+ NULL
+};
wLine_p wLineCreate(
- wWin_p parent,
- const char * labelStr,
- int count,
- wLines_t * lines )
+ wWin_p parent,
+ const char * labelStr,
+ int count,
+ wLines_t * lines )
{
wLine_p b;
wLines_p lp;
- POS_T minX, maxX, minY, maxY;
+ wWinPix_t minX, maxX, minY, maxY;
int index;
- if (count <= 0)
+ if (count <= 0) {
return NULL;
+ }
b = (wLine_p)mswAlloc( parent, B_LINES, labelStr, sizeof *b, NULL, &index );
b->count = count;
b->lines = lines;
@@ -71,22 +72,30 @@ wLine_p wLineCreate(
minX = maxX = lp->x0;
minY = maxY = lp->y0;
for (lp=lines; lp<&b->lines[count]; lp++) {
- if (minX > lp->x0)
+ if (minX > lp->x0) {
minX = lp->x0;
- if (maxX < lp->x0)
+ }
+ if (maxX < lp->x0) {
maxX = lp->x0;
- if (minY > lp->y0)
+ }
+ if (minY > lp->y0) {
minY = lp->y0;
- if (maxY < lp->y0)
+ }
+ if (maxY < lp->y0) {
maxY = lp->y0;
- if (minX > lp->x1)
+ }
+ if (minX > lp->x1) {
minX = lp->x1;
- if (maxX < lp->x1)
+ }
+ if (maxX < lp->x1) {
maxX = lp->x1;
- if (minY > lp->y1)
+ }
+ if (minY > lp->y1) {
minY = lp->y1;
- if (maxY < lp->y1)
+ }
+ if (maxY < lp->y1) {
maxY = lp->y1;
+ }
}
b->x = minX;
b->y = minY;
diff --git a/app/wlib/mswlib/mswlist.c b/app/wlib/mswlib/mswlist.c
index 95ecec3..c955c25 100644
--- a/app/wlib/mswlib/mswlist.c
+++ b/app/wlib/mswlib/mswlist.c
@@ -1,6 +1,5 @@
#include <windows.h>
#include <string.h>
-#include <malloc.h>
#include <stdlib.h>
#include <commdlg.h>
#include <math.h>
@@ -20,73 +19,75 @@ static XWNDPROC oldComboProc = NULL;
static XWNDPROC newComboProc;
struct wList_t {
- WOBJ_COMMON
- int count;
- int last;
- long * valueP;
- wListCallBack_p action;
- wBool_t editable;
- int colCnt;
- wPos_t * colWidths;
- wBool_t * colRightJust;
- const char * * colTitles;
- wPos_t maxWidth;
- wPos_t scrollPos;
- HWND hScrollWnd;
- wPos_t scrollH;
- wPos_t dragPos;
- int dragCol;
- wPos_t dragColWidth;
- };
+ WOBJ_COMMON
+ int count;
+ int last;
+ long * valueP;
+ wListCallBack_p action;
+ wBool_t editable;
+ int colCnt;
+ wWinPix_t * colWidths;
+ wBool_t * colRightJust;
+ const char * * colTitles;
+ wWinPix_t maxWidth;
+ wWinPix_t scrollPos;
+ HWND hScrollWnd;
+ wWinPix_t scrollH;
+ wWinPix_t dragPos;
+ int dragCol;
+ wWinPix_t dragColWidth;
+};
typedef struct {
- void * itemContext;
- wIcon_p bm;
- wBool_t selected;
- } listData;
+ void * itemContext;
+ wIcon_p bm;
+ wBool_t selected;
+} listData;
static int LIST_HEIGHT = 19;
static int listTitleHeight = 16;
void wListClear(
- wList_p b )
+ wList_p b )
{
UINT msg;
- if (b->type==B_LIST)
+ if (b->type==B_LIST) {
msg = LB_RESETCONTENT;
- else
+ } else {
msg = CB_RESETCONTENT;
- SendMessage( b->hWnd, msg, 0, 0 );
+ }
+ SendMessage( b->hWnd, msg, (WPARAM)0, (LPARAM)0 );
b->last = -1;
b->count = 0;
}
-void wListSetSize( wList_p bl, wPos_t w, wPos_t h )
+void wListSetSize( wList_p bl, wWinPix_t w, wWinPix_t h )
{
int rc;
RECT rect;
- wPos_t y;
+ wWinPix_t y;
bl->w = w;
bl->h = h;
- y = bl->y;
- if ( bl->hScrollWnd && bl->maxWidth > bl->w )
+ y = bl->y;
+ if ( bl->hScrollWnd && bl->maxWidth > bl->w ) {
h -= bl->scrollH;
+ }
if ( bl->colTitles ) {
h -= listTitleHeight;
y += listTitleHeight;
}
rc = SetWindowPos( bl->hWnd, HWND_TOP, 0, 0,
- w, h, SWP_NOMOVE|SWP_NOZORDER);
+ w, h, SWP_NOMOVE|SWP_NOZORDER);
if ( bl->hScrollWnd ) {
if ( bl->maxWidth > bl->w ) {
GetClientRect( bl->hWnd, &rect );
rc = SetWindowPos( bl->hScrollWnd, HWND_TOP, bl->x, y+rect.bottom+2,
- bl->w, bl->scrollH, SWP_NOZORDER);
+ bl->w, bl->scrollH, SWP_NOZORDER);
ShowWindow( bl->hScrollWnd, SW_SHOW );
} else {
ShowWindow( bl->hScrollWnd, SW_HIDE );
@@ -97,104 +98,111 @@ void wListSetSize( wList_p bl, wPos_t w, wPos_t h )
void wListSetIndex(
- wList_p bl,
- int index )
+ wList_p bl,
+ int index )
{
listData * ldp;
wListGetCount(bl);
- if ( index >= bl->count )
+ if ( index >= bl->count ) {
index = bl->count-1;
- if ( bl->last == index && index == -1 )
+ }
+ if ( bl->last == index && index == -1 ) {
return;
+ }
if ( bl->type==B_LIST && (bl->option&BL_MANY) != 0 ) {
- if ( bl->last != -1 )
- SendMessage( bl->hWnd, LB_SETSEL, 0, MAKELPARAM(bl->last,0) );
- if ( index >= 0 )
- SendMessage( bl->hWnd, LB_SETSEL, 1, MAKELPARAM(index, 0) );
+ if ( bl->last != -1 ) {
+ SendMessage( bl->hWnd, LB_SETSEL, (WPARAM)0, (LPARAM)bl->last );
+ }
+ if ( index >= 0 ) {
+ SendMessage( bl->hWnd, LB_SETSEL, (WPARAM)1, (LPARAM)index );
+ }
} else {
SendMessage( bl->hWnd,
- bl->type==B_LIST?LB_SETCURSEL:CB_SETCURSEL, index, 0 );
+ bl->type==B_LIST?LB_SETCURSEL:CB_SETCURSEL, (WPARAM)index, (LPARAM)0 );
}
if ( bl->last >= 0 ) {
ldp = (listData*)SendMessage( bl->hWnd,
- (bl->type==B_LIST?LB_GETITEMDATA:CB_GETITEMDATA),
- bl->last, 0L );
- if ( ldp && ldp!=(void*)LB_ERR )
+ (bl->type==B_LIST?LB_GETITEMDATA:CB_GETITEMDATA),
+ (WPARAM)bl->last, (LPARAM)0 );
+ if ( ldp && ldp!=(void*)LB_ERR ) {
ldp->selected = FALSE;
+ }
}
if ( index >= 0 ) {
ldp = (listData*)SendMessage( bl->hWnd,
- (bl->type==B_LIST?LB_GETITEMDATA:CB_GETITEMDATA),
- index, 0L );
- if ( ldp && ldp!=(void*)LB_ERR )
+ (bl->type==B_LIST?LB_GETITEMDATA:CB_GETITEMDATA),
+ (WPARAM)index, (LPARAM)0 );
+ if ( ldp && ldp!=(void*)LB_ERR ) {
ldp->selected = TRUE;
+ }
}
/*if (b->option&BL_ICON)*/
- InvalidateRect( bl->hWnd, NULL, FALSE );
+ InvalidateRect( bl->hWnd, NULL, FALSE );
bl->last = index;
}
wIndex_t wListGetIndex(
- wList_p b )
+ wList_p b )
{
return b->last;
}
void wListSetActive(
- wList_p b,
- int inx,
- wBool_t active )
+ wList_p b,
+ int inx,
+ wBool_t active )
{
}
void wListSetEditable(
- wList_p b,
- wBool_t editable )
+ wList_p b,
+ wBool_t editable )
{
b->editable = editable;
}
void wListSetValue(
- wList_p bl,
- const char * val )
+ wList_p bl,
+ const char * val )
{
if ( bl->type == B_DROPLIST ) {
- SendMessage( bl->hWnd, WM_SETTEXT, 0, (DWORD)(LPSTR)val );
+ SendMessage( bl->hWnd, WM_SETTEXT, (WPARAM)0, (LPARAM)val );
bl->last = -1;
}
}
wIndex_t wListFindValue(
- wList_p bl,
- const char * val )
+ wList_p bl,
+ const char * val )
{
wIndex_t inx;
WORD cnt;
wListGetCount(bl);
for ( inx = 0; inx < bl->count ; inx++ ) {
cnt = (int)SendMessage( bl->hWnd,
- (bl->type==B_LIST?LB_GETTEXT:CB_GETLBTEXT), inx,
- (DWORD)(LPSTR)mswTmpBuff );
+ (bl->type==B_LIST?LB_GETTEXT:CB_GETLBTEXT), (WPARAM)inx,
+ (LPARAM)mswTmpBuff );
mswTmpBuff[cnt] = '\0';
- if ( strcmp( val, mswTmpBuff ) == 0 )
+ if ( strcmp( val, mswTmpBuff ) == 0 ) {
return inx;
+ }
}
return -1;
}
wIndex_t wListGetValues(
- wList_p bl,
- char * s,
- int siz,
- void * * listContextRef,
- void * * itemContextRef )
+ wList_p bl,
+ char * s,
+ int siz,
+ void * * listContextRef,
+ void * * itemContextRef )
{
WORD cnt;
WORD msg;
@@ -204,15 +212,16 @@ wIndex_t wListGetValues(
msg = WM_GETTEXT;
inx = sizeof mswTmpBuff;
} else {
- if ( bl->last < 0 )
+ if ( bl->last < 0 ) {
goto EMPTY;
+ }
if ( bl->type==B_LIST ) {
msg = LB_GETTEXT;
} else {
msg = CB_GETLBTEXT;
}
}
- cnt = (int)SendMessage( bl->hWnd, msg, inx, (DWORD)(LPSTR)mswTmpBuff );
+ cnt = (int)SendMessage( bl->hWnd, msg, (WPARAM)inx, (LPARAM)mswTmpBuff );
mswTmpBuff[cnt] = '\0';
if (s) {
strncpy(s, mswTmpBuff, siz);
@@ -220,29 +229,32 @@ wIndex_t wListGetValues(
}
if (bl->last >= 0) {
ldp = (listData*)SendMessage( bl->hWnd,
- (bl->type==B_LIST?LB_GETITEMDATA:CB_GETITEMDATA),
- bl->last, 0L );
- if ( ldp==(listData*)LB_ERR )
+ (bl->type==B_LIST?LB_GETITEMDATA:CB_GETITEMDATA),
+ (WPARAM)bl->last, (LPARAM)0 );
+ if ( ldp==(listData*)LB_ERR ) {
ldp = NULL;
+ }
} else {
ldp = NULL;
}
EMPTY:
- if (itemContextRef)
+ if (itemContextRef) {
*itemContextRef = (ldp?ldp->itemContext:NULL);
- if (listContextRef)
+ }
+ if (listContextRef) {
*listContextRef = bl->data;
+ }
return bl->last;
}
wBool_t wListSetValues(
- wList_p b,
- wIndex_t inx,
- const char * labelStr,
- wIcon_p bm,
- void * itemData )
+ wList_p b,
+ wIndex_t inx,
+ const char * labelStr,
+ wIcon_p bm,
+ void * itemData )
{
- listData * ldp;
+ listData * ldp;
WORD curSel = -1;
ldp = (listData*)malloc( sizeof *ldp );
ldp->itemContext = itemData;
@@ -250,40 +262,40 @@ wBool_t wListSetValues(
ldp->selected = FALSE;
if ( (b->option&BL_MANY) == 0 )
curSel = (WORD)SendMessage( b->hWnd,
- (UINT)b->type==B_LIST?LB_GETCURSEL:CB_GETCURSEL,
- (WPARAM)0,
- (DWORD)0L );
+ (UINT)b->type==B_LIST?LB_GETCURSEL:CB_GETCURSEL,
+ (WPARAM)0,
+ (LPARAM)0 );
SendMessage( b->hWnd,
- (UINT)b->type==B_LIST?LB_DELETESTRING:CB_DELETESTRING,
- (WPARAM)inx,
- (DWORD)0L );
+ (UINT)b->type==B_LIST?LB_DELETESTRING:CB_DELETESTRING,
+ (WPARAM)inx,
+ (LPARAM)0 );
inx = (wIndex_t)SendMessage( b->hWnd,
- (UINT)b->type==B_LIST?LB_INSERTSTRING:CB_INSERTSTRING,
- (WPARAM)inx,
- (DWORD)(LPSTR)labelStr );
+ (UINT)b->type==B_LIST?LB_INSERTSTRING:CB_INSERTSTRING,
+ (WPARAM)inx,
+ (LPARAM)labelStr );
SendMessage( b->hWnd,
- (UINT)b->type==B_LIST?LB_SETITEMDATA:CB_SETITEMDATA,
- (WPARAM)inx,
- (DWORD)ldp );
+ (UINT)b->type==B_LIST?LB_SETITEMDATA:CB_SETITEMDATA,
+ (WPARAM)inx,
+ (LPARAM)ldp );
if ( (b->option&BL_MANY) == 0 && curSel == (WORD)inx)
- SendMessage( b->hWnd,
- (UINT)b->type==B_LIST?LB_SETCURSEL:CB_SETCURSEL,
- (WPARAM)inx,
- (DWORD)0L );
+ SendMessage( b->hWnd,
+ (UINT)b->type==B_LIST?LB_SETCURSEL:CB_SETCURSEL,
+ (WPARAM)inx,
+ (LPARAM)0 );
/*if (b->option&BL_ICON)*/
- InvalidateRect( b->hWnd, NULL, FALSE );
+ InvalidateRect( b->hWnd, NULL, FALSE );
return TRUE;
}
void wListDelete(
- wList_p b,
- wIndex_t inx )
+ wList_p b,
+ wIndex_t inx )
{
SendMessage( b->hWnd,
- (UINT)b->type==B_LIST?LB_DELETESTRING:CB_DELETESTRING,
- (WPARAM)inx,
- (DWORD)0L );
+ (UINT)b->type==B_LIST?LB_DELETESTRING:CB_DELETESTRING,
+ (WPARAM)inx,
+ (LPARAM)0 );
}
@@ -301,69 +313,71 @@ void wListSelectAll( wList_p bl )
// mark all items selected
SendMessage( bl->hWnd,
- LB_SETSEL,
- (WPARAM)TRUE,
- (DWORD)-1L );
+ LB_SETSEL,
+ (WPARAM)TRUE,
+ (LPARAM)-1 );
- // and synchronize the internal data structures
+ // and synchronize the internal data structures
wListGetCount(bl);
for ( inx=0; inx<bl->count; inx++ ) {
ldp = (listData*)SendMessage( bl->hWnd,
- (bl->type==B_LIST?LB_GETITEMDATA:CB_GETITEMDATA),
- inx, 0L );
+ (bl->type==B_LIST?LB_GETITEMDATA:CB_GETITEMDATA),
+ (WPARAM)inx, (LPARAM)0 );
ldp->selected = TRUE;
SendMessage( bl->hWnd,
- (UINT)bl->type==B_LIST?LB_SETITEMDATA:CB_SETITEMDATA,
- (WPARAM)inx,
- (DWORD)ldp );
+ (UINT)bl->type==B_LIST?LB_SETITEMDATA:CB_SETITEMDATA,
+ (WPARAM)inx,
+ (LPARAM)ldp );
}
}
wIndex_t wListGetCount(
- wList_p bl )
-{
- bl->count = (int)SendMessage( bl->hWnd, (UINT)bl->type==B_LIST?LB_GETCOUNT:CB_GETCOUNT, 0, 0L );
+ wList_p bl )
+{
+ bl->count = (int)SendMessage( bl->hWnd,
+ (UINT)bl->type==B_LIST?LB_GETCOUNT:CB_GETCOUNT, (WPARAM)0, (LPARAM)0 );
return bl->count;
}
void * wListGetItemContext(
- wList_p bl,
- wIndex_t inx )
+ wList_p bl,
+ wIndex_t inx )
{
listData * ldp;
wListGetCount(bl);
- if ( inx < 0 || inx >= bl->count ) return NULL;
+ if ( inx < 0 || inx >= bl->count ) { return NULL; }
ldp = (listData*)SendMessage( bl->hWnd,
- (bl->type==B_LIST?LB_GETITEMDATA:CB_GETITEMDATA),
- inx, 0L );
+ (bl->type==B_LIST?LB_GETITEMDATA:CB_GETITEMDATA),
+ (WPARAM)inx, (LPARAM)0 );
return ((ldp&&ldp!=(void*)LB_ERR)?ldp->itemContext:NULL);
}
wBool_t wListGetItemSelected(
- wList_p bl,
- wIndex_t inx )
+ wList_p bl,
+ wIndex_t inx )
{
listData * ldp;
wListGetCount(bl);
- if ( inx < 0 || inx >= bl->count ) return FALSE;
+ if ( inx < 0 || inx >= bl->count ) { return FALSE; }
ldp = (listData*)SendMessage( bl->hWnd,
- (bl->type==B_LIST?LB_GETITEMDATA:CB_GETITEMDATA),
- inx, 0L );
+ (bl->type==B_LIST?LB_GETITEMDATA:CB_GETITEMDATA),
+ (WPARAM)inx, (LPARAM)0 );
return ((ldp&&ldp!=(void*)LB_ERR)?ldp->selected:FALSE);
}
wIndex_t wListGetSelectedCount(
- wList_p bl )
+ wList_p bl )
{
wIndex_t selcnt, inx;
wListGetCount(bl);
for ( selcnt=inx=0; inx<bl->count; inx++ )
- if ( wListGetItemSelected( bl, inx ) )
+ if ( wListGetItemSelected( bl, inx ) ) {
selcnt++;
+ }
return selcnt;
}
@@ -371,10 +385,10 @@ wIndex_t wListGetSelectedCount(
wIndex_t wListAddValue(
- wList_p b,
- const char * value,
- wIcon_p bm,
- void * itemContext )
+ wList_p b,
+ const char * value,
+ wIcon_p bm,
+ void * itemContext )
{
int nindex;
listData * ldp;
@@ -382,106 +396,116 @@ wIndex_t wListAddValue(
ldp->itemContext = itemContext;
ldp->bm = bm;
ldp->selected = FALSE;
- if ( value == NULL )
+ if ( value == NULL ) {
value = "";
+ }
b->count++;
nindex = (int)SendMessage(
- b->hWnd,
- (UINT)b->type==B_LIST?LB_ADDSTRING:CB_ADDSTRING,
- (WPARAM)0,
- (DWORD)value );
+ b->hWnd,
+ (UINT)b->type==B_LIST?LB_ADDSTRING:CB_ADDSTRING,
+ (WPARAM)0,
+ (LPARAM)value );
if (nindex == 0) {
SendMessage( b->hWnd,
- (UINT)b->type==B_LIST?LB_SETCURSEL:CB_SETCURSEL,
- (WPARAM)nindex,
- (DWORD)0 );
+ (UINT)b->type==B_LIST?LB_SETCURSEL:CB_SETCURSEL,
+ (WPARAM)nindex,
+ (LPARAM)0 );
b->last = 0;
}
SendMessage( b->hWnd,
- (UINT)b->type==B_LIST?LB_SETITEMDATA:CB_SETITEMDATA,
- (WPARAM)nindex,
- (DWORD)ldp );
+ (UINT)b->type==B_LIST?LB_SETITEMDATA:CB_SETITEMDATA,
+ (WPARAM)nindex,
+ (LPARAM)ldp );
return nindex;
}
int wListGetColumnWidths(
- wList_p bl,
- int colCnt,
- wPos_t * colWidths )
+ wList_p bl,
+ int colCnt,
+ wWinPix_t * colWidths )
{
wIndex_t inx;
- if ( bl->type != B_LIST )
+ if ( bl->type != B_LIST ) {
return 0;
- if ( bl->colWidths == NULL )
+ }
+ if ( bl->colWidths == NULL ) {
return 0;
+ }
for ( inx=0; inx<colCnt; inx++ ) {
- if ( inx < bl->colCnt )
+ if ( inx < bl->colCnt ) {
colWidths[inx] = bl->colWidths[inx];
- else
+ } else {
colWidths[inx] = 0;
+ }
}
return bl->colCnt;
}
static void listSetBusy(
- wControl_p b,
- BOOL_T busy)
+ wControl_p b,
+ BOOL_T busy)
{
wList_p bl = (wList_p)b;
EnableWindow( bl->hWnd, !(BOOL)busy );
- if ( bl->hScrollWnd )
+ if ( bl->hScrollWnd ) {
EnableWindow( bl->hScrollWnd, !(BOOL)busy );
+ }
}
static void listShow(
- wControl_p b,
- BOOL_T show)
+ wControl_p b,
+ BOOL_T show)
{
wList_p bl = (wList_p)b;
ShowWindow( bl->hWnd, show?SW_SHOW:SW_HIDE );
- if ( bl->hScrollWnd && bl->maxWidth > bl->w )
+ if ( bl->hScrollWnd && bl->maxWidth > bl->w ) {
ShowWindow( bl->hScrollWnd, show?SW_SHOW:SW_HIDE );
+ }
#ifdef SHOW_DOES_SETFOCUS
- if ( show && (bl->option&BO_READONLY)==0 )
+ if ( show && (bl->option&BO_READONLY)==0 ) {
hWnd = SetFocus( bl->hWnd );
+ }
#endif
}
static void listSetPos(
- wControl_p b,
- wPos_t x,
- wPos_t y )
+ wControl_p b,
+ wWinPix_t x,
+ wWinPix_t y )
{
wList_p bl = (wList_p)b;
- wPos_t x1, y1;
+ wWinPix_t x1, y1;
RECT rect;
-
+
bl->x = x1 = x;
bl->y = y1 = y;
- if ( bl->colTitles )
+ if ( bl->colTitles ) {
y1 += listTitleHeight;
+ }
if (!SetWindowPos( b->hWnd, HWND_TOP, x1, y1,
- CW_USEDEFAULT, CW_USEDEFAULT,
- SWP_NOSIZE|SWP_NOZORDER))
- mswFail("listSetPos");
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ SWP_NOSIZE|SWP_NOZORDER)) {
+ mswFail("listSetPos");
+ }
if ( bl->hScrollWnd && bl->maxWidth > bl->w ) {
GetClientRect( bl->hWnd, &rect );
if (!SetWindowPos( bl->hScrollWnd, HWND_TOP, x1, y1+rect.bottom+2,
- CW_USEDEFAULT, CW_USEDEFAULT,
- SWP_NOSIZE|SWP_NOZORDER))
- mswFail("listSetPos2");
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ SWP_NOSIZE|SWP_NOZORDER)) {
+ mswFail("listSetPos2");
+ }
}
}
static void listRepaintLabel(
- HWND hWnd,
- wControl_p b )
+ HWND hWnd,
+ wControl_p b )
{
wList_p bl = (wList_p)b;
HDC hDc;
@@ -492,11 +516,12 @@ static void listRepaintLabel(
const char * * title;
int inx;
int start;
- wPos_t colWidth;
+ wWinPix_t colWidth;
mswRepaintLabel( hWnd, b );
- if ( bl->colTitles == NULL )
+ if ( bl->colTitles == NULL ) {
return;
+ }
hDc = GetDC( hWnd );
start = bl->x-bl->scrollPos+2;
rc.top = bl->y;
@@ -506,7 +531,7 @@ static void listRepaintLabel(
hBrush = CreateSolidBrush( GetSysColor( COLOR_BTNFACE ) );
FillRect( hDc, &rc, hBrush );
SetBkColor( hDc, GetSysColor( COLOR_BTNFACE ) );
-
+
hFont = SelectObject( hDc, mswLabelFont );
hPen1 = CreatePen( PS_SOLID, 0, GetSysColor( COLOR_BTNTEXT ) );
hPen2 = CreatePen( PS_SOLID, 0, GetSysColor( COLOR_BTNHIGHLIGHT ) );
@@ -527,28 +552,31 @@ static void listRepaintLabel(
LineTo( hDc, rc.right-1, rc.top+1 );
rc.top += 2;
rc.bottom -= 1;
- for ( inx=0,title=bl->colTitles; inx<bl->colCnt&&*title&&start<bl->x+bl->w; inx++ ) {
+ for ( inx=0,title=bl->colTitles; inx<bl->colCnt&&*title
+ &&start<bl->x+bl->w; inx++ ) {
colWidth = bl->colWidths[inx];
if ( start+colWidth >= 3 ) {
rc.left = start;
- if ( rc.left < bl->x+2 )
+ if ( rc.left < bl->x+2 ) {
rc.left = bl->x+2;
+ }
rc.right = start+colWidth;
- if ( rc.right > bl->x+bl->w-1 )
+ if ( rc.right > bl->x+bl->w-1 ) {
rc.right = bl->x+bl->w-1;
+ }
ExtTextOut( hDc, start+1, rc.top+0,
- ETO_CLIPPED|ETO_OPAQUE, &rc,
- *title, strlen(*title), NULL );
+ ETO_CLIPPED|ETO_OPAQUE, &rc,
+ *title, (int)(strlen(*title)), NULL );
if ( start-bl->x >= 3 ) {
- SelectObject( hDc, hPen1 );
- MoveTo( hDc, start-1, rc.top-1 );
- LineTo( hDc, start-1, rc.bottom+3 );
- SelectObject( hDc, hPen2 );
- MoveTo( hDc, start, rc.top );
- LineTo( hDc, start, rc.bottom+1 );
- SelectObject( hDc, hPen3 );
- MoveTo( hDc, start-2, rc.top );
- LineTo( hDc, start-2, rc.bottom+1 );
+ SelectObject( hDc, hPen1 );
+ MoveTo( hDc, start-1, rc.top-1 );
+ LineTo( hDc, start-1, rc.bottom+3 );
+ SelectObject( hDc, hPen2 );
+ MoveTo( hDc, start, rc.top );
+ LineTo( hDc, start, rc.bottom+1 );
+ SelectObject( hDc, hPen3 );
+ MoveTo( hDc, start-2, rc.top );
+ LineTo( hDc, start-2, rc.bottom+1 );
}
}
title++;
@@ -581,15 +609,15 @@ static void listHandleFocusState( LPDRAWITEMSTRUCT lpdis, LPRECT rc )
LRESULT listProc(
- wControl_p b,
- HWND hWnd,
- UINT message,
- WPARAM wParam,
- LPARAM lParam )
-{
+ wControl_p b,
+ HWND hWnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam )
+{
wList_p bl = (wList_p)b;
int cnt, inx, selected;
- long len;
+ size_t len;
listData * ldp;
HDC hDc;
LPMEASUREITEMSTRUCT lpmis;
@@ -597,7 +625,8 @@ LRESULT listProc(
LPDRAWITEMSTRUCT lpdis;
RECT rc, rc1;
char * cp0, * cp1;
- wPos_t colWidth, x;
+ wWinPix_t x;
+ int colWidth;
int nPos;
HFONT hFont;
HPEN hPen;
@@ -606,353 +635,388 @@ LRESULT listProc(
COLORREF col;
if (bl) switch( message ) {
-
- case WM_COMMAND:
- notification = WCMD_PARAM_NOTF;
- switch (bl->type) {
- case B_LIST:
- switch (notification) {
- case LBN_SELCHANGE:
- case LBN_DBLCLK:
- if ( (bl->option&BL_DBLCLICK)!=0 ?
- notification!=LBN_DBLCLK :
- notification==LBN_DBLCLK )
- break;
- if ( (bl->option&BL_MANY) ) {
- wListGetCount(bl);
- for ( inx=0; inx<bl->count; inx++ ) {
- ldp = (listData*)SendMessage( bl->hWnd, LB_GETITEMDATA, inx, 0L );
- if ( ldp != NULL && ldp != (void*)LB_ERR ) {
- selected = ((long)SendMessage( bl->hWnd, LB_GETSEL, inx, 0L ) != 0L );
- if ( selected != ldp->selected ) {
- ldp->selected = selected;
- if ( selected ) {
- bl->last = inx;
- cnt = (int)SendMessage( bl->hWnd, LB_GETTEXT, bl->last, (DWORD)(LPSTR)mswTmpBuff );
- mswTmpBuff[cnt] = '\0';
- } else {
- mswTmpBuff[0] = '\0';
+
+ case WM_COMMAND:
+ notification = WCMD_PARAM_NOTF;
+ switch (bl->type) {
+ case B_LIST:
+ switch (notification) {
+ case LBN_SELCHANGE:
+ case LBN_DBLCLK:
+ if ( (bl->option&BL_DBLCLICK)!=0 ?
+ notification!=LBN_DBLCLK :
+ notification==LBN_DBLCLK ) {
+ break;
+ }
+ if ( (bl->option&BL_MANY) ) {
+ wListGetCount(bl);
+ for ( inx=0; inx<bl->count; inx++ ) {
+ ldp = (listData*)SendMessage( bl->hWnd, LB_GETITEMDATA, (WPARAM)inx,
+ (LPARAM)0 );
+ if ( ldp != NULL && ldp != (void*)LB_ERR ) {
+ selected = ((long)SendMessage( bl->hWnd, LB_GETSEL, (WPARAM)inx,
+ (LPARAM)0 ) != 0L );
+ if ( selected != ldp->selected ) {
+ ldp->selected = selected;
+ if ( selected ) {
+ bl->last = inx;
+ cnt = (int)SendMessage( bl->hWnd, LB_GETTEXT, (WPARAM)bl->last,
+ (LPARAM)mswTmpBuff );
+ mswTmpBuff[cnt] = '\0';
+ } else {
+ mswTmpBuff[0] = '\0';
+ }
+ if ( bl->action ) {
+ bl->action( inx, mswTmpBuff, selected?1:2, bl->data, ldp->itemContext );
+ }
+ if ( selected && bl->valueP ) {
+ *bl->valueP = bl->last;
+ }
+ }
}
- if ( bl->action )
- bl->action( inx, mswTmpBuff, selected?1:2, bl->data, ldp->itemContext );
- if ( selected && bl->valueP )
- *bl->valueP = bl->last;
}
+ } else {
+ bl->last = (int)SendMessage( bl->hWnd, LB_GETCURSEL, (WPARAM)0, (LPARAM)0 );
+ cnt = (int)SendMessage( bl->hWnd, LB_GETTEXT, (WPARAM)bl->last,
+ (LPARAM)mswTmpBuff );
+ mswTmpBuff[cnt] = '\0';
+ if (bl->action) {
+ ldp = (listData*)SendMessage( bl->hWnd, LB_GETITEMDATA,
+ (WPARAM)bl->last, (LPARAM)0 );
+ bl->action( bl->last, mswTmpBuff, 1, bl->data,
+ ((bl->last>=0&&ldp&&ldp!=(void*)LB_ERR)?ldp->itemContext:NULL) );
+ }
+ if (bl->valueP) {
+ *bl->valueP = bl->last;
+ }
+ }
+ break;
+
+ case LBN_KILLFOCUS:
+ if ( ( bl->option&BL_MANY ) == 0 &&
+ bl->last != (int)SendMessage( bl->hWnd, LB_GETCURSEL, (WPARAM)0, (LPARAM)0 ) ) {
+ (void)SendMessage( bl->hWnd, LB_SETCURSEL, (WPARAM)bl->last, (LPARAM)0 );
+ }
+ break;
+ }
+ break;
+
+ case B_DROPLIST:
+ case B_COMBOLIST:
+ switch (notification) {
+ case CBN_SELCHANGE:
+ case CBN_DBLCLK:
+ if ( (bl->type == B_DROPLIST) ||
+ ( (bl->option&BL_DBLCLICK)!=0 ?
+ notification!=CBN_DBLCLK :
+ notification==CBN_DBLCLK) ) {
+ break;
}
+
+ case CBN_CLOSEUP:
+ bl->last = (int)SendMessage( bl->hWnd, CB_GETCURSEL, (WPARAM)0, (LPARAM)0 );
+ if (bl->last < 0) {
+ break;
}
- } else {
- bl->last = (int)SendMessage( bl->hWnd, LB_GETCURSEL, 0, 0L );
- cnt = (int)SendMessage( bl->hWnd, LB_GETTEXT, bl->last,
- (DWORD)(LPSTR)mswTmpBuff );
- mswTmpBuff[cnt] = '\0';
if (bl->action) {
- ldp = (listData*)SendMessage( bl->hWnd, LB_GETITEMDATA,
- bl->last, 0L );
+ cnt = (int)SendMessage( bl->hWnd, CB_GETLBTEXT,
+ (WPARAM)bl->last, (LPARAM)mswTmpBuff );
+ ldp = (listData*)SendMessage( bl->hWnd, CB_GETITEMDATA,
+ (WPARAM)bl->last, (LPARAM)0 );
+ mswTmpBuff[cnt] = '\0';
bl->action( bl->last, mswTmpBuff, 1, bl->data,
- ((bl->last>=0&&ldp&&ldp!=(void*)LB_ERR)?ldp->itemContext:NULL) );
+ ((bl->last>=0&&ldp&&ldp!=(void*)LB_ERR)?ldp->itemContext:NULL) );
}
if (bl->valueP) {
*bl->valueP = bl->last;
}
- }
- break;
-
- case LBN_KILLFOCUS:
- if ( ( bl->option&BL_MANY ) == 0 &&
- bl->last != (int)SendMessage( bl->hWnd, LB_GETCURSEL, 0, 0L ) )
- (void)SendMessage( bl->hWnd, LB_SETCURSEL, bl->last, 0L );
- break;
- }
- break;
-
- case B_DROPLIST:
- case B_COMBOLIST:
- switch (notification) {
- case CBN_SELCHANGE:
- case CBN_DBLCLK:
- if ( (bl->type == B_DROPLIST) ||
- ( (bl->option&BL_DBLCLICK)!=0 ?
- notification!=CBN_DBLCLK :
- notification==CBN_DBLCLK) )
+ mswAllowBalloonHelp = TRUE;
+ /*SendMessage( bl->bWnd, CB_SETCURSEL, bl->last, 0L );*/
break;
- case CBN_CLOSEUP:
- bl->last = (int)SendMessage( bl->hWnd, CB_GETCURSEL, 0, 0L );
- if (bl->last < 0)
+ case CBN_KILLFOCUS:
+ inx = (int)SendMessage( bl->hWnd, CB_GETCURSEL, (WPARAM)0, (LPARAM)0 );
+ if ( bl->last != inx ) {
+ (void)SendMessage( bl->hWnd, CB_SETCURSEL, (WPARAM)bl->last, (LPARAM)0 );
+ }
break;
- if (bl->action) {
- cnt = (int)SendMessage( bl->hWnd, CB_GETLBTEXT, bl->last,
- (DWORD)(LPSTR)mswTmpBuff );
- ldp = (listData*)SendMessage( bl->hWnd, CB_GETITEMDATA,
- bl->last, 0L );
- mswTmpBuff[cnt] = '\0';
- bl->action( bl->last, mswTmpBuff, 1, bl->data,
- ((bl->last>=0&&ldp&&ldp!=(void*)LB_ERR)?ldp->itemContext:NULL) );
- }
- if (bl->valueP) {
- *bl->valueP = bl->last;
- }
- mswAllowBalloonHelp = TRUE;
- /*SendMessage( bl->bWnd, CB_SETCURSEL, bl->last, 0L );*/
- break;
- case CBN_KILLFOCUS:
- inx = (int)SendMessage( bl->hWnd, CB_GETCURSEL, 0, 0L );
- if ( bl->last != inx )
- (void)SendMessage( bl->hWnd, CB_SETCURSEL, bl->last, 0L );
- break;
-
- case CBN_DROPDOWN:
- mswAllowBalloonHelp = FALSE;
- break;
+ case CBN_DROPDOWN:
+ mswAllowBalloonHelp = FALSE;
+ break;
- case CBN_EDITCHANGE:
- bl->last = -1;
- if (bl->action) {
- cnt = (int)SendMessage( bl->hWnd, WM_GETTEXT, sizeof mswTmpBuff,
- (DWORD)(LPSTR)mswTmpBuff );
- mswTmpBuff[cnt] = '\0';
- bl->action( -1, mswTmpBuff, 1, bl->data, NULL );
+ case CBN_EDITCHANGE:
+ bl->last = -1;
+ if (bl->action) {
+ cnt = (int)SendMessage( bl->hWnd, WM_GETTEXT, (WPARAM)sizeof mswTmpBuff,
+ (LPARAM)mswTmpBuff );
+ mswTmpBuff[cnt] = '\0';
+ bl->action( -1, mswTmpBuff, 1, bl->data, NULL );
+ }
+ break;
}
break;
}
break;
- }
- break;
- case WM_MEASUREITEM:
- lpmis = (LPMEASUREITEMSTRUCT)lParam;
- hDc = GetDC( hWnd );
- if ( bl->type == B_LIST )
- hFont = SelectObject( hDc, mswLabelFont );
- GetTextMetrics( hDc, &tm );
- lpmis->itemHeight = tm.tmHeight;
- if ( bl->type == B_LIST )
- SelectObject( hDc, hFont );
- ReleaseDC( hWnd, hDc );
- break;
+ case WM_MEASUREITEM:
+ lpmis = (LPMEASUREITEMSTRUCT)lParam;
+ hDc = GetDC( hWnd );
+ if ( bl->type == B_LIST ) {
+ hFont = SelectObject( hDc, mswLabelFont );
+ }
+ GetTextMetrics( hDc, &tm );
+ lpmis->itemHeight = tm.tmHeight;
+ if ( bl->type == B_LIST ) {
+ SelectObject( hDc, hFont );
+ }
+ ReleaseDC( hWnd, hDc );
+ break;
- case WM_DRAWITEM:
- lpdis = (LPDRAWITEMSTRUCT)lParam;
- if (lpdis->itemID == -1) {
- listHandleFocusState(lpdis, &lpdis->rcItem);
- return TRUE;
- }
- ldp = (listData*)SendMessage( bl->hWnd,
- (bl->type==B_LIST?LB_GETITEMDATA:CB_GETITEMDATA),
- lpdis->itemID, 0L );
- rc = lpdis->rcItem;
- if (lpdis->itemAction & (ODA_DRAWENTIRE|ODA_SELECT|ODA_FOCUS)) {
- if( bl->type == B_LIST )
- hFont = SelectObject( lpdis->hDC, mswLabelFont );
- cnt = (int)SendMessage( lpdis->hwndItem,
- (bl->type==B_LIST?LB_GETTEXT:CB_GETLBTEXT),
- lpdis->itemID, (LONG)(LPSTR)mswTmpBuff );
- mswTmpBuff[cnt] = '\0';
- if ( lpdis->itemState & ODS_SELECTED ) {
- SetTextColor( lpdis->hDC, GetSysColor( COLOR_HIGHLIGHTTEXT ) );
- SetBkColor( lpdis->hDC, GetSysColor( COLOR_HIGHLIGHT ) );
- } else {
- SetTextColor( lpdis->hDC, GetSysColor( COLOR_WINDOWTEXT ) );
- SetBkColor( lpdis->hDC, GetSysColor( COLOR_WINDOW ) );
+ case WM_DRAWITEM:
+ lpdis = (LPDRAWITEMSTRUCT)lParam;
+ if (lpdis->itemID == -1) {
+ listHandleFocusState(lpdis, &lpdis->rcItem);
+ return TRUE;
}
- rc1 = rc;
- rc1.left -= bl->scrollPos;
- for ( inx=0,cp0=mswTmpBuff; inx<bl->colCnt&&cp0&&rc1.left<rc.right; inx++ ) {
- if ( inx>=bl->colCnt-1 || (cp1=strchr(cp0,'\t')) == NULL ) {
- len = strlen( cp0 );
- cp1=cp0 + len; // JBB, to avoid an MSC error below where cp1 has not been defined.
- } else {
- len = cp1-cp0;
- cp1 ++;
+ ldp = (listData*)SendMessage( bl->hWnd,
+ (bl->type==B_LIST?LB_GETITEMDATA:CB_GETITEMDATA),
+ (WPARAM)lpdis->itemID, (LPARAM)0);
+ rc = lpdis->rcItem;
+ if (lpdis->itemAction & (ODA_DRAWENTIRE|ODA_SELECT|ODA_FOCUS)) {
+ if( bl->type == B_LIST ) {
+ hFont = SelectObject( lpdis->hDC, mswLabelFont );
}
- if ( bl->colWidths ) {
- colWidth = bl->colWidths[inx];
+ cnt = (int)SendMessage( lpdis->hwndItem,
+ (bl->type==B_LIST?LB_GETTEXT:CB_GETLBTEXT),
+ (WPARAM)lpdis->itemID, (LPARAM)mswTmpBuff );
+ mswTmpBuff[cnt] = '\0';
+ if ( lpdis->itemState & ODS_SELECTED ) {
+ SetTextColor( lpdis->hDC, GetSysColor( COLOR_HIGHLIGHTTEXT ) );
+ SetBkColor( lpdis->hDC, GetSysColor( COLOR_HIGHLIGHT ) );
} else {
- colWidth = rc.right;
+ SetTextColor( lpdis->hDC, GetSysColor( COLOR_WINDOWTEXT ) );
+ SetBkColor( lpdis->hDC, GetSysColor( COLOR_WINDOW ) );
}
- if ( inx == 0 && ldp && ldp!=(void*)LB_ERR && ldp->bm ) {
- if (mswPalette) {
- SelectPalette( lpdis->hDC, mswPalette, 0 );
- cnt = RealizePalette( lpdis->hDC );
+ rc1 = rc;
+ rc1.left -= bl->scrollPos;
+ for ( inx=0,cp0=mswTmpBuff; inx<bl->colCnt&&cp0&&rc1.left<rc.right; inx++ ) {
+ if ( inx>=bl->colCnt-1 || (cp1=strchr(cp0,'\t')) == NULL ) {
+ len = strlen( cp0 );
+ cp1=cp0 + len; // JBB, to avoid an MSC error below where cp1 has not been defined.
+ } else {
+ len = cp1-cp0;
+ cp1 ++;
+ }
+ if ( bl->colWidths ) {
+ colWidth = bl->colWidths[inx];
+ } else {
+ colWidth = rc.right;
+ }
+ if ( inx == 0 && ldp && ldp!=(void*)LB_ERR && ldp->bm ) {
+ if (mswPalette) {
+ SelectPalette( lpdis->hDC, mswPalette, 0 );
+ cnt = RealizePalette( lpdis->hDC );
+ }
+ hPen = SelectObject( lpdis->hDC, CreatePen( PS_SOLID, 0,
+ GetSysColor( COLOR_WINDOW ) ) );
+ hBrush = SelectObject( lpdis->hDC,
+ CreateSolidBrush( GetSysColor( COLOR_WINDOW ) ) );
+ Rectangle( lpdis->hDC, rc1.left, rc1.top, rc1.right, rc1.bottom );
+ DeleteObject( SelectObject( lpdis->hDC, hPen ) );
+ DeleteObject( SelectObject( lpdis->hDC, hBrush ) );
+
+ col = RGB( (ldp->bm->colormap[ 1 ]).rgbRed,
+ (ldp->bm->colormap[ 1 ]).rgbGreen,
+ (ldp->bm->colormap[ 1 ]).rgbBlue );
+ mswDrawIcon( lpdis->hDC, rc1.left+2, rc.top+0, ldp->bm, 0, col, col);
+
+ rc1.left += ldp->bm->w+6;
+ colWidth -= ldp->bm->w+6;
}
- hPen = SelectObject( lpdis->hDC, CreatePen( PS_SOLID, 0, GetSysColor( COLOR_WINDOW ) ) );
- hBrush = SelectObject( lpdis->hDC, CreateSolidBrush( GetSysColor( COLOR_WINDOW ) ) );
- Rectangle( lpdis->hDC, rc1.left, rc1.top, rc1.right, rc1.bottom );
- DeleteObject( SelectObject( lpdis->hDC, hPen ) );
- DeleteObject( SelectObject( lpdis->hDC, hBrush ) );
-
- col = RGB( (ldp->bm->colormap[ 1 ]).rgbRed,
- (ldp->bm->colormap[ 1 ]).rgbGreen,
- (ldp->bm->colormap[ 1 ]).rgbBlue );
- mswDrawIcon( lpdis->hDC, rc1.left+2, rc.top+0, ldp->bm, 0, col, col);
-
- rc1.left += ldp->bm->w+6;
- colWidth -= ldp->bm->w+6;
+ if ( inx>=bl->colCnt-1 || (rc1.right = rc1.left + colWidth) > rc.right ) {
+ rc1.right = rc.right;
+ }
+ if ( rc1.right > 0 && rc1.left+3 < rc.right ) {
+ ExtTextOut( lpdis->hDC, rc1.left+3, rc1.top+1,
+ ETO_CLIPPED | ETO_OPAQUE, &rc1,
+ (LPSTR)cp0, (int)len, NULL );
+ }
+ rc1.left = rc1.right;
+ cp0 = cp1;
}
- if ( inx>=bl->colCnt-1 || (rc1.right = rc1.left + colWidth) > rc.right )
- rc1.right = rc.right;
- if ( rc1.right > 0 && rc1.left+3 < rc.right ) {
- ExtTextOut( lpdis->hDC, rc1.left+3, rc1.top+1,
- ETO_CLIPPED | ETO_OPAQUE, &rc1,
- (LPSTR)cp0, (int)len, NULL );
+ if ( lpdis->itemState & ODS_SELECTED ) {
+ SetTextColor( lpdis->hDC, GetSysColor( COLOR_WINDOWTEXT ) );
+ SetBkColor( lpdis->hDC, GetSysColor( COLOR_WINDOW ) );
}
- rc1.left = rc1.right;
- cp0 = cp1;
- }
- if ( lpdis->itemState & ODS_SELECTED ) {
- SetTextColor( lpdis->hDC, GetSysColor( COLOR_WINDOWTEXT ) );
- SetBkColor( lpdis->hDC, GetSysColor( COLOR_WINDOW ) );
- }
- if (lpdis->itemState & ODS_FOCUS) {
- DrawFocusRect( lpdis->hDC, &rc );
+ if (lpdis->itemState & ODS_FOCUS) {
+ DrawFocusRect( lpdis->hDC, &rc );
+ }
+ if ( bl->type == B_LIST) {
+ SelectObject( lpdis->hDC, hFont );
+ }
+ return (LRESULT)TRUE;
}
- if ( bl->type == B_LIST)
- SelectObject( lpdis->hDC, hFont );
- return TRUE;
- }
-
- break;
- case WM_HSCROLL:
- len = ((long)bl->maxWidth)-((long)bl->w);
- if ( len <= 0 )
- return 0;
- switch ( WSCROLL_PARAM_CODE ) {
- case SB_LEFT:
- if ( bl->scrollPos == 0 )
- return 0;
- bl->scrollPos = 0;
break;
- case SB_LINELEFT:
- case SB_PAGELEFT:
- if ( bl->scrollPos == 0 )
- return 0;
- for ( inx=colWidth=0; inx<bl->colCnt; inx++ ) {
- if ( colWidth+bl->colWidths[inx] >= bl->scrollPos ) {
- bl->scrollPos = colWidth;
- break;
- }
- colWidth += bl->colWidths[inx];
+
+ case WM_HSCROLL:
+ len = ((long)bl->maxWidth)-((long)bl->w);
+ if ( len <= 0 ) {
+ return (LRESULT)0;
}
- break;
- case SB_LINERIGHT:
- case SB_PAGERIGHT:
- if ( bl->scrollPos >= len )
- return 0;
- for ( inx=colWidth=0; inx<bl->colCnt; inx++ ) {
- if ( colWidth >= bl->scrollPos ) {
- bl->scrollPos = colWidth+bl->colWidths[inx];
- break;
+ switch ( WSCROLL_PARAM_CODE ) {
+ case SB_LEFT:
+ if ( bl->scrollPos == 0 ) {
+ return (LRESULT)0;
+ }
+ bl->scrollPos = 0;
+ break;
+ case SB_LINELEFT:
+ case SB_PAGELEFT:
+ if ( bl->scrollPos == 0 ) {
+ return (LRESULT)0;
+ }
+ for ( inx=colWidth=0; inx<bl->colCnt; inx++ ) {
+ if ( colWidth+bl->colWidths[inx] >= bl->scrollPos ) {
+ bl->scrollPos = colWidth;
+ break;
+ }
+ colWidth += bl->colWidths[inx];
}
- colWidth += bl->colWidths[inx];
+ break;
+ case SB_LINERIGHT:
+ case SB_PAGERIGHT:
+ if ( bl->scrollPos >= len ) {
+ return (LRESULT)0;
+ }
+ for ( inx=colWidth=0; inx<bl->colCnt; inx++ ) {
+ if ( colWidth >= bl->scrollPos ) {
+ bl->scrollPos = colWidth+bl->colWidths[inx];
+ break;
+ }
+ colWidth += bl->colWidths[inx];
+ }
+ break;
+ case SB_RIGHT:
+ if ( bl->scrollPos >= len ) {
+ return (LRESULT)0;
+ }
+ bl->scrollPos = (int)len;
+ break;
+ case SB_THUMBTRACK:
+ return (LRESULT)0;
+ case SB_THUMBPOSITION:
+ nPos = (int)WSCROLL_PARAM_NPOS;
+ bl->scrollPos = (int)(len*nPos/100);
+ break;
+ case SB_ENDSCROLL:
+ return (LRESULT)0;
}
- break;
- case SB_RIGHT:
- if ( bl->scrollPos >= len )
- return 0;
- bl->scrollPos = (int)len;
- break;
- case SB_THUMBTRACK:
- return 0;
- case SB_THUMBPOSITION:
- nPos = (int)WSCROLL_PARAM_NPOS;
- bl->scrollPos = (int)(len*nPos/100);
- break;
- case SB_ENDSCROLL:
- return 0;
- }
- if ( bl->scrollPos > len ) bl->scrollPos = (int)len;
- if ( bl->scrollPos < 0 ) bl->scrollPos = 0;
- nPos = (int)(((long)bl->scrollPos)*100L/len+0.5);
- SetScrollPos( bl->hScrollWnd, SB_CTL, nPos, TRUE );
- InvalidateRect( bl->hWnd, NULL, FALSE );
- listRepaintLabel( ((wControl_p)(bl->parent))->hWnd, (wControl_p)bl );
- return 0;
-
- case WM_LBUTTONDOWN:
- if ( bl->type != B_LIST )
- break;
- if ( bl->colCnt <= 1 )
- break;
- x = bl->dragPos = LOWORD(lParam)+bl->scrollPos-4;
- bl->dragCol = -1;
- for ( inx=0; inx<bl->colCnt; inx++ ) {
- x -= bl->colWidths[inx];
- if ( x < -5 ) break;
- if ( x <= 0 ) { bl->dragCol = inx; break; }
- if ( x > bl->colWidths[inx+1] ) continue;
- if ( x <= 10 ) { bl->dragCol = inx; break; }
- }
- if ( bl->dragCol >= 0 )
- bl->dragColWidth = bl->colWidths[inx];
- return 0L;
+ if ( bl->scrollPos > len ) { bl->scrollPos = (int)len; }
+ if ( bl->scrollPos < 0 ) { bl->scrollPos = 0; }
+ nPos = (int)(((long)bl->scrollPos)*100L/len+0.5);
+ SetScrollPos( bl->hScrollWnd, SB_CTL, nPos, TRUE );
+ InvalidateRect( bl->hWnd, NULL, FALSE );
+ listRepaintLabel( ((wControl_p)(bl->parent))->hWnd, (wControl_p)bl );
+ return (LRESULT)0;
+
+ case WM_LBUTTONDOWN:
+ if ( bl->type != B_LIST ) {
+ break;
+ }
+ if ( bl->colCnt <= 1 ) {
+ break;
+ }
+ x = bl->dragPos = LOWORD(lParam)+bl->scrollPos-4;
+ bl->dragCol = -1;
+ for ( inx=0; inx<bl->colCnt; inx++ ) {
+ x -= bl->colWidths[inx];
+ if ( x < -5 ) { break; }
+ if ( x <= 0 ) { bl->dragCol = inx; break; }
+ if ( x > bl->colWidths[inx+1] ) { continue; }
+ if ( x <= 10 ) { bl->dragCol = inx; break; }
+ }
+ if ( bl->dragCol >= 0 ) {
+ bl->dragColWidth = bl->colWidths[inx];
+ }
+ return (LRESULT)0;
#ifdef LATER
- case WM_MOUSEMOVE:
- if ( (wParam&MK_LBUTTON) == 0 )
- break;
- if ( bl->type != B_LIST )
- break;
- if ( bl->colCnt <= 1 )
- break;
- x = LOWORD(lParam)+bl->scrolPos;
- for ( inx=0; inx<bl->colCnt; inx++ ) {
- x -= bl->colWidths[inx];
- if ( x <= 0 )
+ case WM_MOUSEMOVE:
+ if ( (wParam&MK_LBUTTON) == 0 ) {
break;
- }
- return 0L;
+ }
+ if ( bl->type != B_LIST ) {
+ break;
+ }
+ if ( bl->colCnt <= 1 ) {
+ break;
+ }
+ x = LOWORD(lParam)+bl->scrolPos;
+ for ( inx=0; inx<bl->colCnt; inx++ ) {
+ x -= bl->colWidths[inx];
+ if ( x <= 0 ) {
+ break;
+ }
+ }
+ return (LRESULT)0;
#endif
- case WM_MOUSEMOVE:
- if ( (wParam&MK_LBUTTON) == 0 )
- break;
- case WM_LBUTTONUP:
- if ( bl->type != B_LIST )
- break;
- if ( bl->colCnt <= 1 )
- break;
- if ( bl->dragCol < 0 )
- break;
- x = LOWORD(lParam)+bl->scrollPos-4-bl->dragPos; /* WIN32??? */
- bl->colWidths[bl->dragCol] = bl->dragColWidth+x;
- if ( bl->colWidths[bl->dragCol] < 0 )
- bl->colWidths[bl->dragCol] = 0;
- for ( bl->maxWidth=inx=0; inx<bl->colCnt; inx++ )
- bl->maxWidth += bl->colWidths[inx];
- if ( bl->maxWidth <= bl->w ) {
- x = bl->w - bl->maxWidth;
- bl->colWidths[bl->colCnt-1] += x;
- bl->maxWidth = bl->w;
- bl->scrollPos = 0;
- } else {
- if ( bl->scrollPos+bl->w > bl->maxWidth ) {
- bl->scrollPos = bl->maxWidth - bl->w;
+ case WM_MOUSEMOVE:
+ if ( (wParam&MK_LBUTTON) == 0 ) {
+ break;
+ }
+ case WM_LBUTTONUP:
+ if ( bl->type != B_LIST ) {
+ break;
+ }
+ if ( bl->colCnt <= 1 ) {
+ break;
+ }
+ if ( bl->dragCol < 0 ) {
+ break;
}
+ x = LOWORD(lParam)+bl->scrollPos-4-bl->dragPos; /* WIN32??? */
+ bl->colWidths[bl->dragCol] = bl->dragColWidth+x;
+ if ( bl->colWidths[bl->dragCol] < 0 ) {
+ bl->colWidths[bl->dragCol] = 0;
+ }
+ for ( bl->maxWidth=inx=0; inx<bl->colCnt; inx++ ) {
+ bl->maxWidth += bl->colWidths[inx];
+ }
+ if ( bl->maxWidth <= bl->w ) {
+ x = bl->w - bl->maxWidth;
+ bl->colWidths[bl->colCnt-1] += x;
+ bl->maxWidth = bl->w;
+ bl->scrollPos = 0;
+ } else {
+ if ( bl->scrollPos+bl->w > bl->maxWidth ) {
+ bl->scrollPos = bl->maxWidth - bl->w;
+ }
+ }
+ InvalidateRect( bl->hWnd, NULL, FALSE );
+ listRepaintLabel( ((wControl_p)(bl->parent))->hWnd, (wControl_p)bl );
+ return (LRESULT)0;
+
}
- InvalidateRect( bl->hWnd, NULL, FALSE );
- listRepaintLabel( ((wControl_p)(bl->parent))->hWnd, (wControl_p)bl );
- return 0L;
- }
-
return DefWindowProc( hWnd, message, wParam, lParam );
-}
+}
-long FAR PASCAL _export pushList(
- HWND hWnd,
- UINT message,
- UINT wParam,
- LONG lParam )
+LRESULT FAR PASCAL _export pushList(
+ HWND hWnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam )
{
/* Catch <Return> and cause focus to leave control */
-#ifdef WIN32
+ wIndex_t inx = (wIndex_t)GetWindowLongPtr(hWnd, GWL_ID);
+ wControl_p b = mswMapIndex(inx);
+#ifdef OLDCODE
long inx = GetWindowLong( hWnd, GWL_ID );
-#else
- short inx = GetWindowWord( hWnd, GWW_ID );
-#endif
wControl_p b = mswMapIndex( inx );
+#endif
switch (message) {
case WM_CHAR:
@@ -961,12 +1025,12 @@ long FAR PASCAL _export pushList(
case 0x0D:
case 0x1B:
case 0x09:
- SetFocus( ((wControl_p)(b->parent))->hWnd );
+ SetFocus( ((wControl_p)(b->parent))->hWnd );
SendMessage( ((wControl_p)(b->parent))->hWnd, WM_CHAR,
- wParam, lParam );
+ wParam, lParam );
/*SendMessage( ((wControl_p)(b->parent))->hWnd, WM_COMMAND,
inx, MAKELONG( hWnd, EN_KILLFOCUS ) );*/
- return 0L;
+ return (LRESULT)0;
}
}
break;
@@ -974,18 +1038,14 @@ long FAR PASCAL _export pushList(
return CallWindowProc( oldListProc, hWnd, message, wParam, lParam );
}
-long FAR PASCAL _export pushCombo(
- HWND hWnd,
- UINT message,
- UINT wParam,
- LONG lParam )
+LRESULT FAR PASCAL _export pushCombo(
+ HWND hWnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam )
{
/* Catch <Return> and cause focus to leave control */
-#ifdef WIN32
- long inx = GetWindowLong( hWnd, GWL_ID );
-#else
- short inx = GetWindowWord( hWnd, GWW_ID );
-#endif
+ wIndex_t inx = (wIndex_t)GetWindowLongPtr( hWnd, GWL_ID );
wControl_p b = mswMapIndex( inx );
switch (message) {
@@ -995,12 +1055,12 @@ long FAR PASCAL _export pushCombo(
case 0x0D:
case 0x1B:
case 0x09:
- SetFocus( ((wControl_p)(b->parent))->hWnd );
+ SetFocus( ((wControl_p)(b->parent))->hWnd );
SendMessage( ((wControl_p)(b->parent))->hWnd, WM_CHAR,
- wParam, lParam );
+ wParam, lParam );
/*SendMessage( ((wControl_p)(b->parent))->hWnd, WM_COMMAND,
inx, MAKELONG( hWnd, EN_KILLFOCUS ) );*/
- return 0L;
+ return (LRESULT)0;
}
}
break;
@@ -1009,37 +1069,39 @@ long FAR PASCAL _export pushCombo(
}
static callBacks_t listCallBacks = {
- listRepaintLabel,
- NULL,
- listProc,
- listSetBusy,
- listShow,
- listSetPos };
+ listRepaintLabel,
+ NULL,
+ listProc,
+ listSetBusy,
+ listShow,
+ listSetPos
+};
static wList_p listCreate(
- int typ,
- const char *className,
- long style,
- wWin_p parent,
- POS_T x,
- POS_T y,
- const char * helpStr,
- const char * labelStr,
- long option,
- long number,
- POS_T width,
- long *valueP,
- wListCallBack_p action,
- void *data,
- wBool_t addFocus,
- int *indexR )
-{
+ int typ,
+ const char *className,
+ long style,
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ long number,
+ wWinPix_t width,
+ long *valueP,
+ wListCallBack_p action,
+ void *data,
+ wBool_t addFocus,
+ int *indexR )
+{
wList_p b;
- RECT rect;
+ RECT rect;
int index;
- b = (wList_p)mswAlloc( parent, typ, mswStrdup(labelStr), sizeof *b, data, &index );
+ b = (wList_p)mswAlloc( parent, typ, mswStrdup(labelStr), sizeof *b, data,
+ &index );
mswComputePos( (wControl_p)b, x, y );
b->option = option;
b->count = 0;
@@ -1054,18 +1116,14 @@ static wList_p listCreate(
b->dragCol = -1;
b->hWnd = CreateWindow( className, NULL,
- style | WS_CHILD | WS_VISIBLE | mswGetBaseStyle(parent), b->x, b->y,
- width, LIST_HEIGHT*(int)number,
- ((wControl_p)parent)->hWnd, (HMENU)index, mswHInst, NULL );
+ style | WS_CHILD | WS_VISIBLE | mswGetBaseStyle(parent), b->x, b->y,
+ width, LIST_HEIGHT*(int)number,
+ ((wControl_p)parent)->hWnd, (HMENU)(UINT_PTR)index, mswHInst, NULL );
if (b->hWnd == NULL) {
mswFail("CreateWindow(LIST)");
return b;
}
-#ifdef CONTROL3D
- Ctl3dSubclassCtl( b->hWnd );
-#endif
-
GetWindowRect( b->hWnd, &rect );
b->w = rect.right - rect.left;
b->h = rect.bottom - rect.top;
@@ -1078,40 +1136,49 @@ static wList_p listCreate(
if (addFocus) {
mswChainFocus( (wControl_p)b );
if (b->type == B_LIST) {
- newListProc = MakeProcInstance( (XWNDPROC)pushList, mswHInst );
- oldListProc = (XWNDPROC)GetWindowLong( b->hWnd, GWL_WNDPROC );
- SetWindowLong( b->hWnd, GWL_WNDPROC, (LONG)newListProc );
+ newListProc = MakeProcInstance((XWNDPROC)pushList, mswHInst);
+ oldListProc = (XWNDPROC)GetWindowLongPtr(b->hWnd, GWLP_WNDPROC);
+ SetWindowLongPtr(b->hWnd, GWLP_WNDPROC, (LONG_PTR)newListProc);
+#ifdef _OLDCODE
+ oldListProc = (XWNDPROC)GetWindowLong(b->hWnd, GWL_WNDPROC);
+ SetWindowLong(b->hWnd, GWL_WNDPROC, (LONG)newListProc);
+#endif
} else {
- newComboProc = MakeProcInstance( (XWNDPROC)pushCombo, mswHInst );
- oldComboProc = (XWNDPROC)GetWindowLong( b->hWnd, GWL_WNDPROC );
- SetWindowLong( b->hWnd, GWL_WNDPROC, (LONG)newComboProc );
+ newComboProc = MakeProcInstance((XWNDPROC)pushCombo, mswHInst);
+ oldComboProc = (XWNDPROC)GetWindowLongPtr(b->hWnd, GWLP_WNDPROC);
+ SetWindowLongPtr(b->hWnd, GWLP_WNDPROC, (LONG_PTR)newComboProc);
+#ifdef _OLDCODE
+ oldComboProc = (XWNDPROC)GetWindowLong(b->hWnd, GWL_WNDPROC);
+ SetWindowLong(b->hWnd, GWL_WNDPROC, (LONG)newComboProc);
+#endif
}
}
- if ( indexR )
+ if ( indexR ) {
*indexR = index;
- if ( !mswThickFont )
- SendMessage( b->hWnd, WM_SETFONT, (WPARAM)mswLabelFont, 0L );
+ }
+
+ SendMessage( b->hWnd, WM_SETFONT, (WPARAM)mswLabelFont, (LPARAM)0 );
return b;
}
wList_p wListCreate(
- wWin_p parent,
- POS_T x,
- POS_T y,
- const char * helpStr,
- const char * labelStr,
- long option,
- long number,
- POS_T width,
- int colCnt,
- wPos_t * colWidths,
- wBool_t * colRightJust,
- const char * * colTitles,
- long *valueP,
- wListCallBack_p action,
- void *data )
-{
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ long number,
+ wWinPix_t width,
+ int colCnt,
+ wWinPix_t * colWidths,
+ wBool_t * colRightJust,
+ const char * * colTitles,
+ long *valueP,
+ wListCallBack_p action,
+ void *data )
+{
long bs;
wList_p bl;
static int dbu = 0;
@@ -1120,25 +1187,28 @@ wList_p wListCreate(
int i;
bs = LBS_NOTIFY | WS_VSCROLL | WS_BORDER | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS;
- if (option & BL_MANY)
+ if (option & BL_MANY) {
bs |= LBS_MULTIPLESEL|LBS_EXTENDEDSEL;
- if (option & BL_SORT)
+ }
+ if (option & BL_SORT) {
bs |= LBS_SORT;
- if ( colCnt > 1 )
+ }
+ if ( colCnt > 1 ) {
bs |= WS_HSCROLL;
+ }
if ( colTitles ) {
y += listTitleHeight;
number -= 1;
}
bl = listCreate( B_LIST, "LISTBOX", bs, parent, x, y, helpStr,
- labelStr, option, number, width, valueP, action, data, TRUE, &index );
+ labelStr, option, number, width, valueP, action, data, TRUE, &index );
if ( colTitles ) {
bl->y -= listTitleHeight;
bl->h += listTitleHeight;
- }
+ }
if ( colCnt > 1 ) {
bl->colCnt = colCnt;
- bl->colWidths = (int*)malloc( colCnt * sizeof *bl->colWidths );
+ bl->colWidths = (wWinPix_t*)malloc( colCnt * sizeof *bl->colWidths );
bl->colRightJust = (wBool_t*)malloc( colCnt * sizeof *bl->colRightJust );
bl->colTitles = colTitles;
bl->maxWidth = 0;
@@ -1148,11 +1218,13 @@ wList_p wListCreate(
bl->maxWidth += bl->colWidths[i];
}
bl->hScrollWnd = CreateWindow( "ScrollBar", NULL,
- SBS_HORZ | SBS_BOTTOMALIGN | WS_CHILD | WS_VISIBLE | mswGetBaseStyle(parent), bl->x, bl->y,
- width, CW_USEDEFAULT,
- ((wControl_p)parent)->hWnd, (HMENU)index, mswHInst, NULL );
- if (bl->hScrollWnd == NULL)
+ SBS_HORZ | SBS_BOTTOMALIGN | WS_CHILD | WS_VISIBLE | mswGetBaseStyle(parent),
+ bl->x, bl->y,
+ width, CW_USEDEFAULT,
+ ((wControl_p)parent)->hWnd, (HMENU)(UINT_PTR)index, mswHInst, NULL );
+ if (bl->hScrollWnd == NULL) {
mswFail("CreateWindow(LISTSCROLL)");
+ }
SetScrollRange( bl->hScrollWnd, SB_CTL, 0, 100, TRUE );
GetWindowRect( bl->hScrollWnd, &rect );
bl->scrollH = rect.bottom - rect.top+2;
@@ -1162,49 +1234,52 @@ wList_p wListCreate(
wList_p wDropListCreate(
- wWin_p parent,
- POS_T x,
- POS_T y,
- const char * helpStr,
- const char * labelStr,
- long option,
- long number,
- POS_T width,
- long *valueP,
- wListCallBack_p action,
- void *data )
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ long number,
+ wWinPix_t width,
+ long *valueP,
+ wListCallBack_p action,
+ void *data )
{
long bs;
- if ( (option&BL_EDITABLE) != 0 )
+ if ( (option&BL_EDITABLE) != 0 ) {
bs = CBS_DROPDOWN;
- else
+ } else {
bs = CBS_DROPDOWNLIST;
+ }
bs |= WS_VSCROLL | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS;
- if (option & BL_SORT)
+ if (option & BL_SORT) {
bs |= CBS_SORT;
+ }
return listCreate( B_DROPLIST, "COMBOBOX", bs, parent, x, y, helpStr,
- labelStr, option, number, width, valueP, action, data, TRUE, NULL );
+ labelStr, option, number, width, valueP, action, data, TRUE, NULL );
}
wList_p wComboListCreate(
- wWin_p parent,
- POS_T x,
- POS_T y,
- const char * helpStr,
- const char * labelStr,
- long option,
- long number,
- POS_T width,
- long *valueP,
- wListCallBack_p action,
- void *data )
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ long number,
+ wWinPix_t width,
+ long *valueP,
+ wListCallBack_p action,
+ void *data )
{
long bs;
bs = CBS_SIMPLE | WS_VSCROLL | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS;
- if (option & BL_SORT)
+ if (option & BL_SORT) {
bs |= CBS_SORT;
+ }
return listCreate( B_COMBOLIST, "COMBOBOX", bs, parent, x, y, helpStr,
- labelStr, option, number, width, valueP, action, data, FALSE, NULL );
+ labelStr, option, number, width, valueP, action, data, FALSE, NULL );
}
diff --git a/app/wlib/mswlib/mswmenu.c b/app/wlib/mswlib/mswmenu.c
index d56e24d..0a2851d 100644
--- a/app/wlib/mswlib/mswmenu.c
+++ b/app/wlib/mswlib/mswmenu.c
@@ -18,20 +18,18 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#define OEMRESOURCE
#include <windows.h>
#include <string.h>
-#include <malloc.h>
#include <stdlib.h>
#include <commdlg.h>
#include <math.h>
#include <ctype.h>
#include <assert.h>
-#include "misc.h"
#include "mswint.h"
#include "i18n.h"
@@ -49,8 +47,8 @@ typedef enum { MM_BUTT, MM_MENU, MM_BAR, MM_POPUP } mmtype_e;
typedef struct wMenuItem_t * wMenuItem_p;
struct radioButtonGroup {
- int firstButton; /* id of first button in group */
- int lastButton; /* id of last button in group */
+ int firstButton; /* id of first button in group */
+ int lastButton; /* id of last button in group */
};
/* NOTE: first field must be the same as WOBJ_COMMON */
@@ -62,58 +60,58 @@ struct radioButtonGroup {
wMenuItem_p mnext;
struct wMenuItem_t {
- MOBJ_COMMON
- };
+ MOBJ_COMMON
+};
struct wMenu_t {
- MOBJ_COMMON
- mmtype_e mmtype;
- wMenuItem_p first, last;
- struct radioButtonGroup *radioGroup;
- HMENU menu;
- wButton_p button;
- wMenuTraceCallBack_p traceFunc;
- void * traceData;
- };
+ MOBJ_COMMON
+ mmtype_e mmtype;
+ wMenuItem_p first, last;
+ struct radioButtonGroup *radioGroup;
+ HMENU menu;
+ wButton_p button;
+ wMenuTraceCallBack_p traceFunc;
+ void * traceData;
+};
struct wMenuPush_t {
- MOBJ_COMMON
- wMenu_p mparent;
- wMenuCallBack_p action;
- long acclKey;
- wBool_t enabled;
- };
+ MOBJ_COMMON
+ wMenu_p mparent;
+ wMenuCallBack_p action;
+ long acclKey;
+ wBool_t enabled;
+};
struct wMenuRadio_t {
- MOBJ_COMMON
- wMenu_p mparent;
- wMenuCallBack_p action;
- long acclKey;
- wBool_t enabled;
- };
+ MOBJ_COMMON
+ wMenu_p mparent;
+ wMenuCallBack_p action;
+ long acclKey;
+ wBool_t enabled;
+};
struct wMenuToggle_t {
- MOBJ_COMMON
- wMenu_p mparent;
- wMenuToggleCallBack_p action;
- long acclKey;
- wBool_t enabled;
- };
+ MOBJ_COMMON
+ wMenu_p mparent;
+ wMenuCallBack_p action;
+ long acclKey;
+ wBool_t enabled;
+};
typedef struct wMenuListItem_t * wMenuListItem_p;
struct wMenuList_t {
- MOBJ_COMMON
- wMenuListItem_p left, right;
- wMenu_p mlparent;
- int max;
- int count;
- wMenuListCallBack_p action;
- };
+ MOBJ_COMMON
+ wMenuListItem_p left, right;
+ wMenu_p mlparent;
+ int max;
+ int count;
+ wMenuListCallBack_p action;
+};
struct wMenuListItem_t {
- MOBJ_COMMON
- wMenuListItem_p left, right;
- wMenuListCallBack_p action;
- };
+ MOBJ_COMMON
+ wMenuListItem_p left, right;
+ wMenuListCallBack_p action;
+};
#define UNCHECK (0)
#define CHECK (1)
@@ -140,17 +138,18 @@ char * mswStrdup( const char * str )
if (str) {
ret = (char*)malloc( strlen(str)+1 );
strcpy( ret, str );
- } else
+ } else {
ret = NULL;
+ }
return ret;
}
static LRESULT menuPush(
- wControl_p b,
- HWND hWnd,
- UINT message,
- WPARAM wParam,
- LPARAM lParam )
+ wControl_p b,
+ HWND hWnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam )
{
wMenuItem_p m = (wMenuItem_p)b;
wBool_t set;
@@ -166,29 +165,34 @@ static LRESULT menuPush(
mswFail( "pushMenu" );
break;
case M_PUSH:
- if (((wMenuPush_p)m)->action)
+ if (((wMenuPush_p)m)->action) {
((wMenuPush_p)m)->action(((wMenuPush_p)m)->data);
+ }
break;
case M_TOGGLE:
set = wMenuToggleGet((wMenuToggle_p)m);
set = !set;
wMenuToggleSet((wMenuToggle_p)m,set);
- if (((wMenuToggle_p)m)->action)
- ((wMenuToggle_p)m)->action(set, ((wMenuPush_p)m)->data);
+ if (((wMenuToggle_p)m)->action) {
+ ((wMenuToggle_p)m)->action(((wMenuPush_p)m)->data);
+ }
break;
case M_LISTITEM:
- if (((wMenuListItem_p)m)->action)
+ if (((wMenuListItem_p)m)->action) {
((wMenuListItem_p)m)->action(0, "", ((wMenuListItem_p)m)->data);
+ }
break;
case M_RADIO:
- if (((wMenuRadio_p)m)->action)
+ if (((wMenuRadio_p)m)->action) {
((wMenuRadio_p)m)->action(((wMenuRadio_p)m)->data);
+ }
break;
}
- return 0L;
+ return (LRESULT)0;
}
if ( (m->parentMenu)->traceFunc ) {
- (m->parentMenu)->traceFunc( m->parentMenu, m->labelStr, ((wMenu_p)m->parentMenu)->traceData );
+ (m->parentMenu)->traceFunc( m->parentMenu, m->labelStr,
+ ((wMenu_p)m->parentMenu)->traceData );
}
return DefWindowProc( hWnd, message, wParam, lParam );
}
@@ -199,24 +203,26 @@ static void menuDone( wControl_p b )
switch ( m->mtype ) {
case M_MENU:
if ( ((wMenu_p)m)->mmtype == MM_BUTT ||
- ((wMenu_p)m)->mmtype == MM_POPUP )
+ ((wMenu_p)m)->mmtype == MM_POPUP ) {
DestroyMenu( ((wMenu_p)m)->menu );
+ }
break;
}
}
static callBacks_t menuItemCallBacks = {
- NULL,
- menuDone,
- menuPush };
+ NULL,
+ menuDone,
+ menuPush
+};
static wMenuItem_p createMenuItem(
- wMenu_p m,
- mtype_e mtype,
- const char * helpStr,
- const char * labelStr,
- int size )
+ wMenu_p m,
+ mtype_e mtype,
+ const char * helpStr,
+ const char * labelStr,
+ int size )
{
wMenuItem_p mi;
@@ -255,29 +261,31 @@ static wMenuItem_p createMenuItem(
typedef struct {
- long acclKey;
- wMenuPush_p mp;
- wAccelKeyCallBack_p action;
- wAccelKey_e key;
- void * data;
- } acclTable_t, *acclTable_p;
-dynArr_t acclTable_da;
+ long acclKey;
+ wMenuPush_p mp;
+ wAccelKeyCallBack_p action;
+ wAccelKey_e key;
+ void * data;
+} acclTable_t, *acclTable_p;
+static dynArr_t acclTable_da;
#define acclTable(N) DYNARR_N( acclTable_t, acclTable_da, N )
int mswMenuAccelerator(
- wWin_p win,
- long acclKey )
+ wWin_p win,
+ long acclKey )
{
acclTable_p at;
if ( ((wControl_p)win)->type != W_MAIN &&
- ((wControl_p)win)->type != W_POPUP )
+ ((wControl_p)win)->type != W_POPUP ) {
return 0;
+ }
for ( at = &acclTable(0); at<&acclTable(acclTable_da.cnt); at++ ) {
if (at->acclKey == acclKey) {
if (at->mp) {
- if (at->mp->enabled && at->mp->action)
+ if (at->mp->enabled && at->mp->action) {
at->mp->action(at->mp->data);
+ }
return 1;
} else if (at->action) {
at->action( at->key, at->data );
@@ -293,40 +301,40 @@ int mswMenuAccelerator(
static long acclKeyMap[] = {
- 0, /* wAccelKey_None, */
- VK_DELETE, /* wAccelKey_Del, */
- VK_INSERT, /* wAccelKey_Ins, */
- VK_HOME, /* wAccelKey_Home, */
- VK_END, /* wAccelKey_End, */
- VK_PRIOR, /* wAccelKey_Pgup, */
- VK_NEXT, /* wAccelKey_Pgdn, */
- VK_UP, /* wAccelKey_Up, */
- VK_DOWN, /* wAccelKey_Down, */
- VK_RIGHT, /* wAccelKey_Right, */
- VK_LEFT, /* wAccelKey_Left, */
- VK_BACK, /* wAccelKey_Back, */
- VK_F1, /* wAccelKey_F1, */
- VK_F2, /* wAccelKey_F2, */
- VK_F3, /* wAccelKey_F3, */
- VK_F4, /* wAccelKey_F4, */
- VK_F5, /* wAccelKey_F5, */
- VK_F6, /* wAccelKey_F6, */
- VK_F7, /* wAccelKey_F7, */
- VK_F8, /* wAccelKey_F8, */
- VK_F9, /* wAccelKey_F9, */
- VK_F10, /* wAccelKey_F10, */
- VK_F11, /* wAccelKey_F11, */
- VK_F12, /* wAccelKey_F12, */
- VK_ADD, /* wAccelKey_Numpad_Add, */
- VK_SUBTRACT /* wAccelKey_Numpad_Subtract, */
- };
+ 0, /* wAccelKey_None, */
+ VK_DELETE, /* wAccelKey_Del, */
+ VK_INSERT, /* wAccelKey_Ins, */
+ VK_HOME, /* wAccelKey_Home, */
+ VK_END, /* wAccelKey_End, */
+ VK_PRIOR, /* wAccelKey_Pgup, */
+ VK_NEXT, /* wAccelKey_Pgdn, */
+ VK_UP, /* wAccelKey_Up, */
+ VK_DOWN, /* wAccelKey_Down, */
+ VK_RIGHT, /* wAccelKey_Right, */
+ VK_LEFT, /* wAccelKey_Left, */
+ VK_BACK, /* wAccelKey_Back, */
+ VK_F1, /* wAccelKey_F1, */
+ VK_F2, /* wAccelKey_F2, */
+ VK_F3, /* wAccelKey_F3, */
+ VK_F4, /* wAccelKey_F4, */
+ VK_F5, /* wAccelKey_F5, */
+ VK_F6, /* wAccelKey_F6, */
+ VK_F7, /* wAccelKey_F7, */
+ VK_F8, /* wAccelKey_F8, */
+ VK_F9, /* wAccelKey_F9, */
+ VK_F10, /* wAccelKey_F10, */
+ VK_F11, /* wAccelKey_F11, */
+ VK_F12, /* wAccelKey_F12, */
+ VK_ADD, /* wAccelKey_Numpad_Add, */
+ VK_SUBTRACT /* wAccelKey_Numpad_Subtract, */
+};
void wAttachAccelKey(
- wAccelKey_e key,
- int modifier,
- wAccelKeyCallBack_p action,
- void * data )
+ wAccelKey_e key,
+ int modifier,
+ wAccelKeyCallBack_p action,
+ void * data )
{
acclTable_t * ad;
if ( key < 1 || key > wAccelKey_Numpad_Subtract ) {
@@ -350,132 +358,133 @@ void wAttachAccelKey(
*****************************************************************************
*/
-HBITMAP GetMyCheckBitmaps(UINT fuCheck)
-{
- COLORREF crBackground; /* background color */
- HBRUSH hbrBackground; /* background brush */
- HBRUSH hbrTargetOld; /* original background brush */
- HDC hdcSource; /* source device context */
- HDC hdcTarget; /* target device context */
- HBITMAP hbmpCheckboxes; /* handle to check-box bitmap */
- BITMAP bmCheckbox; /* structure for bitmap data */
- HBITMAP hbmpSourceOld; /* handle to original source bitmap */
- HBITMAP hbmpTargetOld; /* handle to original target bitmap */
- HBITMAP hbmpCheck; /* handle to check-mark bitmap */
- RECT rc; /* rectangle for check-box bitmap */
- WORD wBitmapX; /* width of check-mark bitmap */
- WORD wBitmapY; /* height of check-mark bitmap */
-
- /* Get the menu background color and create a solid brush
- with that color. */
-
- crBackground = GetSysColor(COLOR_MENU);
- hbrBackground = CreateSolidBrush(crBackground);
-
- /* Create memory device contexts for the source and
- destination bitmaps. */
-
- hdcSource = CreateCompatibleDC((HDC) NULL);
- hdcTarget = CreateCompatibleDC(hdcSource);
-
- /* Get the size of the system default check-mark bitmap and
- create a compatible bitmap of the same size. */
-
- wBitmapX = GetSystemMetrics(SM_CXMENUCHECK);
- wBitmapY = GetSystemMetrics(SM_CYMENUCHECK);
-
- hbmpCheck = CreateCompatibleBitmap(hdcSource, wBitmapX,
- wBitmapY);
-
- /* Select the background brush and bitmap into the target DC. */
-
- hbrTargetOld = SelectObject(hdcTarget, hbrBackground);
- hbmpTargetOld = SelectObject(hdcTarget, hbmpCheck);
-
- /* Use the selected brush to initialize the background color
- of the bitmap in the target device context. */
-
- PatBlt(hdcTarget, 0, 0, wBitmapX, wBitmapY, PATCOPY);
-
- /* Load the predefined check box bitmaps and select it
- into the source DC. */
-
- hbmpCheckboxes = LoadBitmap((HINSTANCE) NULL,
- (LPTSTR) OBM_CHECKBOXES);
-
- hbmpSourceOld = SelectObject(hdcSource, hbmpCheckboxes);
-
- /* Fill a BITMAP structure with information about the
- check box bitmaps, and then find the upper-left corner of
- the unchecked check box or the checked check box. */
-
- GetObject(hbmpCheckboxes, sizeof(BITMAP), &bmCheckbox);
-
+HBITMAP GetMyCheckBitmaps(UINT fuCheck)
+{
+ COLORREF crBackground; /* background color */
+ HBRUSH hbrBackground; /* background brush */
+ HBRUSH hbrTargetOld; /* original background brush */
+ HDC hdcSource; /* source device context */
+ HDC hdcTarget; /* target device context */
+ HBITMAP hbmpCheckboxes; /* handle to check-box bitmap */
+ BITMAP bmCheckbox; /* structure for bitmap data */
+ HBITMAP hbmpSourceOld; /* handle to original source bitmap */
+ HBITMAP hbmpTargetOld; /* handle to original target bitmap */
+ HBITMAP hbmpCheck; /* handle to check-mark bitmap */
+ RECT rc; /* rectangle for check-box bitmap */
+ WORD wBitmapX; /* width of check-mark bitmap */
+ WORD wBitmapY; /* height of check-mark bitmap */
+ WORD wMenuH; /* height of menu line */
+
+ /* Get the menu background color and create a solid brush
+ with that color. */
+
+ crBackground = GetSysColor(COLOR_MENU);
+ hbrBackground = CreateSolidBrush(crBackground);
+
+ /* Create memory device contexts for the source and
+ destination bitmaps. */
+
+ hdcSource = CreateCompatibleDC((HDC) NULL);
+ hdcTarget = CreateCompatibleDC(hdcSource);
+
+ /* Get the size of the system default check-mark bitmap and
+ create a compatible bitmap of the same size. */
+
+ wBitmapX = GetSystemMetrics(SM_CXMENUCHECK);
+ wBitmapY = GetSystemMetrics(SM_CYMENUCHECK);
+ wMenuH = GetSystemMetrics(SM_CYMENU);
+
+ hbmpCheck = CreateCompatibleBitmap(hdcSource, wBitmapX,
+ wBitmapY);
+
+ /* Select the background brush and bitmap into the target DC. */
+
+ hbrTargetOld = SelectObject(hdcTarget, hbrBackground);
+ hbmpTargetOld = SelectObject(hdcTarget, hbmpCheck);
+
+ /* Use the selected brush to initialize the background color
+ of the bitmap in the target device context. */
+
+ PatBlt(hdcTarget, 0, 0, wBitmapX, wBitmapY, PATCOPY);
+
+ /* Load the predefined check box bitmaps and select it
+ into the source DC. */
+
+ hbmpCheckboxes = LoadBitmap((HINSTANCE) NULL,
+ (LPTSTR) OBM_CHECKBOXES);
+
+ hbmpSourceOld = SelectObject(hdcSource, hbmpCheckboxes);
+
+ /* Fill a BITMAP structure with information about the
+ check box bitmaps, and then find the upper-left corner of
+ the unchecked check box or the checked check box. */
+
+ GetObject(hbmpCheckboxes, sizeof(BITMAP), &bmCheckbox);
+
switch( fuCheck ) {
-
+
case UNCHECK:
- rc.left = 0;
- rc.right = (bmCheckbox.bmWidth / 4);
- rc.top = 0;
- rc.bottom = (bmCheckbox.bmHeight / 3);
- break;
- case CHECK:
- rc.left = (bmCheckbox.bmWidth / 4);
- rc.right = (bmCheckbox.bmWidth / 4) * 2;
- rc.top = 0;
- rc.bottom = (bmCheckbox.bmHeight / 3);
+ rc.left = 0;
+ rc.right = (bmCheckbox.bmWidth / 4);
+ rc.top = 0;
+ rc.bottom = (bmCheckbox.bmHeight / 3);
+ break;
+ case CHECK:
+ rc.left = (bmCheckbox.bmWidth / 4);
+ rc.right = (bmCheckbox.bmWidth / 4) * 2;
+ rc.top = 0;
+ rc.bottom = (bmCheckbox.bmHeight / 3);
break;
case RADIOCHECK:
- rc.left = (bmCheckbox.bmWidth / 4);
- rc.right = (bmCheckbox.bmWidth / 4) * 2;
- rc.top = (bmCheckbox.bmHeight / 3) + 1;
- rc.bottom = (bmCheckbox.bmHeight / 3) * 2;
+ rc.left = (bmCheckbox.bmWidth / 4);
+ rc.right = (bmCheckbox.bmWidth / 4) * 2;
+ rc.top = (bmCheckbox.bmHeight / 3);
+ rc.bottom = (bmCheckbox.bmHeight / 3) * 2;
break;
case RADIOUNCHECK:
- rc.top = (bmCheckbox.bmHeight / 3) + 1;
- rc.bottom = (bmCheckbox.bmHeight / 3) * 2;
- rc.left = 0;
- rc.right = (bmCheckbox.bmWidth / 4);
+ rc.top = (bmCheckbox.bmHeight / 3);
+ rc.bottom = (bmCheckbox.bmHeight / 3) * 2;
+ rc.left = 0;
+ rc.right = (bmCheckbox.bmWidth / 4);
break;
}
-
- /* Copy the appropriate bitmap into the target DC. If the
- check-box bitmap is larger than the default check-mark
- bitmap, use StretchBlt to make it fit; otherwise, just
- copy it. */
-
- if (((rc.right - rc.left) > (int) wBitmapX) ||
- ((rc.bottom - rc.top) > (int) wBitmapY))
- {
- StretchBlt(hdcTarget, 0, 0, wBitmapX, wBitmapY,
- hdcSource, rc.left, rc.top, rc.right - rc.left,
- rc.bottom - rc.top, SRCCOPY);
- }
-
- else
- {
- BitBlt(hdcTarget, 0, 0, rc.right - rc.left,
- rc.bottom - rc.top,
- hdcSource, rc.left, rc.top, SRCCOPY);
- }
-
- /* Select the old source and destination bitmaps into the
- source and destination DCs, and then delete the DCs and
- the background brush. */
-
- SelectObject(hdcSource, hbmpSourceOld);
- SelectObject(hdcTarget, hbrTargetOld);
- hbmpCheck = SelectObject(hdcTarget, hbmpTargetOld);
-
- DeleteObject(hbrBackground);
- DeleteObject(hdcSource);
- DeleteObject(hdcTarget);
-
- /* Return a handle to the new check-mark bitmap. */
-
- return hbmpCheck;
-}
+
+ /* Copy the appropriate bitmap into the target DC. If the
+ check-box bitmap is larger than the default check-mark
+ bitmap, use StretchBlt to make it fit; otherwise, just
+ copy it. */
+ if (((rc.right - rc.left) > (int) wBitmapX) ||
+ ((rc.bottom - rc.top) > (int) wBitmapY)) {
+ StretchBlt(hdcTarget, 0, 0, wBitmapX, wBitmapY,
+ hdcSource, rc.left, rc.top, rc.right - rc.left,
+ rc.bottom - rc.top, SRCCOPY);
+ }
+
+ else {
+ // Center it vertically
+ WORD dy = (wMenuH > wBitmapY) ? (wMenuH - wBitmapY) / 2 : 0;
+ BitBlt(hdcTarget, 0, dy, rc.right - rc.left,
+ rc.bottom - rc.top,
+ hdcSource, rc.left, rc.top, SRCCOPY);
+ }
+
+ /* Select the old source and destination bitmaps into the
+ source and destination DCs, and then delete the DCs and
+ the background brush. */
+
+ SelectObject(hdcSource, hbmpSourceOld);
+ SelectObject(hdcTarget, hbrTargetOld);
+ hbmpCheck = SelectObject(hdcTarget, hbmpTargetOld);
+
+ DeleteObject(hbrBackground);
+ DeleteObject(hdcSource);
+ DeleteObject(hdcTarget);
+
+ /* Return a handle to the new check-mark bitmap. */
+
+ return hbmpCheck;
+}
void mswCreateCheckBitmaps()
{
@@ -487,12 +496,12 @@ void mswCreateCheckBitmaps()
}
wMenuRadio_p wMenuRadioCreate(
- wMenu_p m,
- const char * helpStr,
- const char * labelStr,
- long acclKey,
- wMenuCallBack_p action,
- void *data )
+ wMenu_p m,
+ const char * helpStr,
+ const char * labelStr,
+ long acclKey,
+ wMenuCallBack_p action,
+ void *data )
{
wMenuRadio_p mi;
int rc;
@@ -536,8 +545,9 @@ wMenuRadio_p wMenuRadioCreate(
ac = tolower( ac );
}
vk = VkKeyScan( ac );
- if ( vk & 0xFF00 )
+ if ( vk & 0xFF00 ) {
modifier |= WKEY_SHIFT;
+ }
acclTable(acclTable_da.cnt-1).acclKey = (modifier<<8) | (vk&0x00FF);
acclTable(acclTable_da.cnt-1).mp = (wMenuPush_p)mi;
}
@@ -545,7 +555,8 @@ wMenuRadio_p wMenuRadioCreate(
/* add the correct bitmaps for radio buttons */
- rc = SetMenuItemBitmaps(m->menu, mi->index, FALSE, uncheckedRadio, checkedRadio );
+ rc = SetMenuItemBitmaps(m->menu, mi->index, FALSE, uncheckedRadio,
+ checkedRadio );
if( m->radioGroup == NULL ) {
m->radioGroup = malloc( sizeof( struct radioButtonGroup ));
@@ -562,25 +573,26 @@ void wMenuRadioSetActive(wMenuRadio_p mi )
{
BOOL rc;
- rc = CheckMenuRadioItem( mi->mparent->menu,
- mi->mparent->radioGroup->firstButton,
- mi->mparent->radioGroup->lastButton,
- mi->index,
- MF_BYCOMMAND );
-}
+ rc = CheckMenuRadioItem( mi->mparent->menu,
+ mi->mparent->radioGroup->firstButton,
+ mi->mparent->radioGroup->lastButton,
+ mi->index,
+ MF_BYCOMMAND );
+}
wMenuPush_p wMenuPushCreate(
- wMenu_p m,
- const char * helpStr,
- const char * labelStr,
- long acclKey,
- wMenuCallBack_p action,
- void *data )
+ wMenu_p m,
+ const char * helpStr,
+ const char * labelStr,
+ long acclKey,
+ wMenuCallBack_p action,
+ void *data )
{
wMenuPush_p mi;
int rc;
- char *label = malloc(strlen(labelStr) + 30 ); /**< The label and sufficient space for the keyboard shortcut */
+ char *label = malloc(strlen(labelStr) +
+ 30 ); /**< The label and sufficient space for the keyboard shortcut */
char *cp;
char ac;
UINT vk;
@@ -620,8 +632,9 @@ wMenuPush_p wMenuPushCreate(
ac = tolower( ac );
}
vk = VkKeyScan( ac );
- if ( vk & 0xFF00 )
+ if ( vk & 0xFF00 ) {
modifier |= WKEY_SHIFT;
+ }
acclTable(acclTable_da.cnt-1).acclKey = (modifier<<8) | (vk&0x00FF);
acclTable(acclTable_da.cnt-1).mp = mi;
}
@@ -632,19 +645,19 @@ wMenuPush_p wMenuPushCreate(
void wMenuPushEnable(
- wMenuPush_p mi,
- BOOL_T enable )
+ wMenuPush_p mi,
+ BOOL_T enable )
{
EnableMenuItem( mi->mparent->menu, mi->index,
- MF_BYCOMMAND|(enable?MF_ENABLED:(MF_DISABLED|MF_GRAYED)) );
+ MF_BYCOMMAND|(enable?MF_ENABLED:(MF_DISABLED|MF_GRAYED)) );
mi->enabled = enable;
}
wMenu_p wMenuMenuCreate(
- wMenu_p m,
- const char * helpStr,
- const char * labelStr )
+ wMenu_p m,
+ const char * helpStr,
+ const char * labelStr )
{
wMenu_p mm;
int rc;
@@ -655,13 +668,14 @@ wMenu_p wMenuMenuCreate(
/*mm->parent = (wControl_p)m;*/
mm->first = mm->last = NULL;
- rc = AppendMenu( m->menu, MF_STRING|MF_ENABLED|MF_POPUP, (UINT)mm->menu, mm->labelStr );
+ rc = AppendMenu( m->menu, MF_STRING|MF_ENABLED|MF_POPUP, (UINT_PTR)(mm->menu),
+ mm->labelStr );
return mm;
}
void wMenuSeparatorCreate(
- wMenu_p m )
+ wMenu_p m )
{
int rc;
createMenuItem( m, M_SEPARATOR, NULL, NULL, sizeof *(wMenuItem_p)NULL );
@@ -678,8 +692,8 @@ void wMenuSeparatorCreate(
static void appendItem(
- wMenuListItem_p ml,
- wMenuListItem_p mi )
+ wMenuListItem_p ml,
+ wMenuListItem_p mi )
{
mi->right = ml->right;
ml->right->left = mi;
@@ -689,7 +703,7 @@ static void appendItem(
static void removeItem(
- wMenuListItem_p mi )
+ wMenuListItem_p mi )
{
mi->left->right = mi->right;
mi->right->left = mi->left;
@@ -698,10 +712,10 @@ static void removeItem(
wMenuList_p wMenuListCreate(
- wMenu_p m,
- const char * helpStr,
- int max,
- wMenuListCallBack_p action )
+ wMenu_p m,
+ const char * helpStr,
+ int max,
+ wMenuListCallBack_p action )
{
wMenuList_p mi;
mi = (wMenuList_p)createMenuItem( m, M_LIST, helpStr, NULL, sizeof *mi );
@@ -727,8 +741,9 @@ int getMlistOrigin( wMenu_p m, wMenuList_p ml )
count++;
break;
case M_LIST:
- if (mi == (wMenuItem_p)ml)
+ if (mi == (wMenuItem_p)ml) {
return count;
+ }
count += ((wMenuList_p)mi)->count;
break;
default:
@@ -740,10 +755,10 @@ int getMlistOrigin( wMenu_p m, wMenuList_p ml )
void wMenuListAdd(
- wMenuList_p ml,
- int index,
- const char * labelStr,
- void * data )
+ wMenuList_p ml,
+ int index,
+ const char * labelStr,
+ void * data )
{
int origin;
wMenuListItem_p wl_p;
@@ -752,7 +767,8 @@ void wMenuListAdd(
int rc;
origin = getMlistOrigin(ml->mlparent, ml);
- for ( count=0,wl_p=ml->right; wl_p!=(wMenuListItem_p)ml; count++,wl_p=wl_p->right ) {
+ for ( count=0,wl_p=ml->right; wl_p!=(wMenuListItem_p)ml;
+ count++,wl_p=wl_p->right ) {
if (wl_p->labelStr != NULL && strcmp( labelStr, wl_p->labelStr ) == 0) {
/* move item */
if (count != index) {
@@ -770,34 +786,37 @@ void wMenuListAdd(
removeItem( ml->left );
add:
ml->count--;
- if (wl_p->labelStr )
+ if (wl_p->labelStr ) {
free( CAST_AWAY_CONST wl_p->labelStr );
+ }
wl_p->labelStr = mswStrdup( labelStr );
} else {
wl_p = (wMenuListItem_p)createMenuItem( NULL, M_LISTITEM, NULL,
- labelStr, sizeof *wl_p );
+ labelStr, sizeof *wl_p );
}
((wMenuListItem_p)wl_p)->data = data;
((wMenuListItem_p)wl_p)->action = ml->action;
- if (index < 0 || index > ml->count)
+ if (index < 0 || index > ml->count) {
index = ml->count;
+ }
for ( mi=(wMenuListItem_p)ml,count=0; count<index; mi=mi->right,count++);
rc = InsertMenu( ml->mlparent->menu, origin+index,
- MF_BYPOSITION|MF_STRING, wl_p->index, wl_p->labelStr );
+ MF_BYPOSITION|MF_STRING, wl_p->index, wl_p->labelStr );
appendItem( mi, wl_p );
ml->count++;
}
void wMenuListDelete(
- wMenuList_p ml,
- const char * labelStr )
+ wMenuList_p ml,
+ const char * labelStr )
{
int origin, count;
wMenuListItem_p wl_p;
origin = getMlistOrigin(ml->mlparent, ml);
- for ( count=0,wl_p=ml->right; wl_p!=(wMenuListItem_p)ml; count++,wl_p=wl_p->right ) {
+ for ( count=0,wl_p=ml->right; wl_p!=(wMenuListItem_p)ml;
+ count++,wl_p=wl_p->right ) {
if (wl_p->labelStr != NULL && strcmp( labelStr, wl_p->labelStr ) == 0) {
/* delete item */
mswUnregister( wl_p->index );
@@ -812,27 +831,30 @@ void wMenuListDelete(
const char * wMenuListGet(
- wMenuList_p ml,
- int index,
- void ** data )
+ wMenuList_p ml,
+ int index,
+ void ** data )
{
int origin, count;
wMenuListItem_p wl_p;
- if (index >= ml->count)
+ if (index >= ml->count) {
return NULL;
+ }
origin = getMlistOrigin(ml->mlparent, ml);
for ( count=0,wl_p=ml->right; wl_p&&count<index; count++,wl_p=wl_p->right );
- if (wl_p==NULL)
+ if (wl_p==NULL) {
return NULL;
- if ( data )
+ }
+ if ( data ) {
*data = wl_p->data;
+ }
return wl_p->labelStr;
}
void wMenuListClear(
- wMenuList_p ml )
+ wMenuList_p ml )
{
int origin, count;
wMenuListItem_p wl_p, wl_q;
@@ -852,13 +874,13 @@ void wMenuListClear(
wMenuToggle_p wMenuToggleCreate(
- wMenu_p m,
- const char * helpStr,
- const char * labelStr,
- long acclKey,
- wBool_t set,
- wMenuToggleCallBack_p action,
- void * data )
+ wMenu_p m,
+ const char * helpStr,
+ const char * labelStr,
+ long acclKey,
+ wBool_t set,
+ wMenuCallBack_p action,
+ void * data )
{
wMenuToggle_p mt;
int rc;
@@ -868,7 +890,8 @@ wMenuToggle_p wMenuToggleCreate(
UINT vk;
long modifier;
- mt = (wMenuToggle_p)createMenuItem( m, M_TOGGLE, helpStr, labelStr, sizeof *mt );
+ mt = (wMenuToggle_p)createMenuItem( m, M_TOGGLE, helpStr, labelStr,
+ sizeof *mt );
/*setAcclKey( m->parent, m->menu, mt->menu_item, acclKey );*/
mt->action = action;
mt->data = data;
@@ -909,8 +932,9 @@ wMenuToggle_p wMenuToggleCreate(
ac = tolower( ac );
}
vk = VkKeyScan( ac );
- if ( vk & 0xFF00 )
+ if ( vk & 0xFF00 ) {
modifier |= WKEY_SHIFT;
+ }
acclTable(acclTable_da.cnt-1).acclKey = (modifier<<8) | (vk&0x00FF);
acclTable(acclTable_da.cnt-1).mp = (wMenuPush_p)mt;
}
@@ -922,30 +946,33 @@ wMenuToggle_p wMenuToggleCreate(
wBool_t wMenuToggleGet(
- wMenuToggle_p mt )
+ wMenuToggle_p mt )
{
- return (GetMenuState( mt->mparent->menu, mt->index, MF_BYCOMMAND ) & MF_CHECKED) != 0;
+ return (GetMenuState( mt->mparent->menu, mt->index,
+ MF_BYCOMMAND ) & MF_CHECKED) != 0;
}
wBool_t wMenuToggleSet(
- wMenuToggle_p mt,
- wBool_t set )
+ wMenuToggle_p mt,
+ wBool_t set )
{
wBool_t rc;
- CheckMenuItem( mt->mparent->menu, mt->index, MF_BYCOMMAND|(set?MF_CHECKED:MF_UNCHECKED) );
- rc = (GetMenuState( mt->mparent->menu, mt->index, MF_BYCOMMAND ) & MF_CHECKED) != 0;
+ CheckMenuItem( mt->mparent->menu, mt->index,
+ MF_BYCOMMAND|(set?MF_CHECKED:MF_UNCHECKED) );
+ rc = (GetMenuState( mt->mparent->menu, mt->index,
+ MF_BYCOMMAND ) & MF_CHECKED) != 0;
return rc;
}
void wMenuToggleEnable(
- wMenuToggle_p mt,
- wBool_t enable )
+ wMenuToggle_p mt,
+ wBool_t enable )
{
EnableMenuItem( mt->mparent->menu, mt->index,
- MF_BYCOMMAND|(enable?MF_ENABLED:(MF_DISABLED|MF_GRAYED)) );
+ MF_BYCOMMAND|(enable?MF_ENABLED:(MF_DISABLED|MF_GRAYED)) );
mt->enabled = enable;
-}
+}
/*
*****************************************************************************
@@ -957,39 +984,40 @@ void wMenuToggleEnable(
void mswMenuMove(
- wMenu_p m,
- wPos_t x,
- wPos_t y )
+ wMenu_p m,
+ wWinPix_t x,
+ wWinPix_t y )
{
wControl_p b;
b = (wControl_p)m->parent;
if (b && b->hWnd)
if (!SetWindowPos( b->hWnd, HWND_TOP, x, y,
- CW_USEDEFAULT, CW_USEDEFAULT,
- SWP_NOSIZE|SWP_NOZORDER))
- mswFail("mswMenuMove");
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ SWP_NOSIZE|SWP_NOZORDER)) {
+ mswFail("mswMenuMove");
+ }
}
static void pushMenuButt(
- void * data )
+ void * data )
{
wMenu_p m = (wMenu_p)data;
RECT rect;
mswAllowBalloonHelp = FALSE;
GetWindowRect( m->hWnd, &rect );
TrackPopupMenu( m->menu, TPM_LEFTALIGN, rect.left, rect.bottom,
- 0, ((wControl_p)(m->parent))->hWnd, NULL );
+ 0, ((wControl_p)(m->parent))->hWnd, NULL );
}
wMenu_p wMenuCreate(
- wWin_p parent,
- POS_T x,
- POS_T y,
- const char * helpStr,
- const char * labelStr,
- long option )
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option )
{
wMenu_p m;
wControl_p b;
@@ -1002,7 +1030,7 @@ wMenu_p wMenuCreate(
}
m = (wMenu_p)createMenuItem( NULL, M_MENU, helpStr, label, sizeof *m );
m->button = wButtonCreate( parent, x, y, helpStr, labelStr,
- buttOption, 0, pushMenuButt, (void*)m );
+ buttOption, 0, pushMenuButt, (void*)m );
b = (wControl_p)m->button;
m->parent = b->parent;
m->x = b->x;
@@ -1021,9 +1049,9 @@ wMenu_p wMenuCreate(
wMenu_p wMenuBarAdd(
- wWin_p w,
- const char * helpStr,
- const char * labelStr )
+ wWin_p w,
+ const char * helpStr,
+ const char * labelStr )
{
HMENU menu;
wMenu_p m;
@@ -1041,7 +1069,8 @@ wMenu_p wMenuBarAdd(
m->mmtype = MM_BAR;
m->first = m->last = NULL;
- rc = AppendMenu( menu, MF_STRING|MF_POPUP|MF_ENABLED, (UINT)m->menu, labelStr );
+ rc = AppendMenu( menu, MF_STRING|MF_POPUP|MF_ENABLED, (UINT_PTR)(m->menu),
+ labelStr );
DrawMenuBar( ((wControl_p)w)->hWnd );
return m;
@@ -1050,8 +1079,8 @@ wMenu_p wMenuBarAdd(
wMenu_p wMenuPopupCreate(
- wWin_p w,
- const char * labelStr )
+ wWin_p w,
+ const char * labelStr )
{
wMenu_p m;
long buttOption = 0;
@@ -1081,21 +1110,21 @@ void wMenuPopupShow( wMenu_p mp )
GetCursorPos( &pt );
TrackPopupMenu( mp->menu, TPM_LEFTALIGN, pt.x, pt.y, 0, mp->hWnd, NULL );
}
-
+
/*-----------------------------------------------------------------*/
void wMenuSetTraceCallBack(
- wMenu_p m,
- wMenuTraceCallBack_p func,
- void * data )
+ wMenu_p m,
+ wMenuTraceCallBack_p func,
+ void * data )
{
m->traceFunc = func;
m->traceData = data;
}
wBool_t wMenuAction(
- wMenu_p m,
- const char * label )
+ wMenu_p m,
+ const char * label )
{
wMenuItem_p mi;
wMenuToggle_p mt;
@@ -1106,10 +1135,11 @@ wBool_t wMenuAction(
case M_SEPARATOR:
break;
case M_PUSH:
- if ( ((wMenuPush_p)mi)->enabled == FALSE )
+ if ( ((wMenuPush_p)mi)->enabled == FALSE ) {
wBeep();
- else
+ } else {
((wMenuPush_p)mi)->action( ((wMenuPush_p)mi)->data );
+ }
break;
case M_TOGGLE:
mt = (wMenuToggle_p)mi;
@@ -1118,7 +1148,7 @@ wBool_t wMenuAction(
} else {
set = wMenuToggleGet( mt );
wMenuToggleSet( mt, !set );
- mt->action( set, mt->data );
+ mt->action( mt->data );
}
break;
case M_MENU:
diff --git a/app/wlib/mswlib/mswmisc.c b/app/wlib/mswlib/mswmisc.c
index 6b5f1c9..4bf9481 100644
--- a/app/wlib/mswlib/mswmisc.c
+++ b/app/wlib/mswlib/mswmisc.c
@@ -17,21 +17,20 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <shellapi.h>
#include <string.h>
-#include <malloc.h>
+#include <malloc.h> // required for heapinfo in function wMemStats
#include <stdlib.h>
#include <commdlg.h>
#include <math.h>
#include <stdio.h>
#include <assert.h>
#include <htmlhelp.h>
-#include "misc.h"
#include "mswint.h"
#include "i18n.h"
#include "FreeImage.h"
@@ -45,6 +44,7 @@
#define OFN_LONGFILENAMES 0x00200000L
char * mswStrdup(const char *);
+const char * GetCurCommandName(void);
#define PAUSE_TIMER (901)
#define ALARM_TIMER (902)
@@ -61,15 +61,14 @@ char * mswStrdup(const char *);
#define LABELFONTRESET
#else
#define LABELFONTDECL HFONT hFont;
-#define LABELFONTRESET if (!mswThickFont) {SelectObject( hDc, hFont );}
-#define LABELFONTSELECT if (!mswThickFont) {hFont = SelectObject( hDc, mswLabelFont );}
+#define LABELFONTRESET SelectObject( hDc, hFont );
+#define LABELFONTSELECT hFont = SelectObject( hDc, mswLabelFont );
#endif
/*
* EXPORTED VARIABLES
*/
-long debugWindow = 0;
HINSTANCE mswHInst;
HWND mswHWnd = (HWND)0;
@@ -77,37 +76,40 @@ const char *mswDrawWindowClassName = "DRAWWINDOW";
char mswTmpBuff[1024];
int mswEditHeight;
int mswAllowBalloonHelp = TRUE;
-int mswGroupStyle;
HFONT mswOldTextFont;
HFONT mswLabelFont;
-long mswThickFont = 1;
double mswScale = 1.0;
-double scaleIcon = 1.0; /**< Scaling factor for toolbar icons */
-
callBacks_t *mswCallBacks[CALLBACK_CNT];
-void closeBalloonHelp(void);
+void closeBalloonHelp(int inx);
static wControl_p getControlFromCursor(HWND, wWin_p *);
+
+#ifdef BALLOON_TRACE
+// To use:
+// change logFile defn in lprintf.c from static to EXPORT
+// Run with some debug flag set to ensure logFile is set
+extern FILE * logFile;
+#endif
/*
* LOCAL VARIABLES
*/
struct wWin_t {
- WOBJ_COMMON
- int validGeometry;
- int min_width;
- int max_width;
- int min_height;
- int max_height;
- wPos_t lastX, lastY;
- wPos_t padX, padY;
+ WOBJ_COMMON
+ int validGeometry;
+ int min_width;
+ int max_width;
+ int min_height;
+ int max_height;
+ wWinPix_t lastX, lastY;
+ wWinPix_t padX, padY;
wControl_p first, last;
wWinCallBack_p winProc;
BOOL_T busy;
#ifdef OWNERICON
HBITMAP wicon_bm;
- wPos_t wicon_w, wicon_h;
+ wWinPix_t wicon_w, wicon_h;
#endif
DWORD baseStyle;
wControl_p focusChainFirst;
@@ -131,15 +133,15 @@ static int mResizeBorderH;
static int mMenuH;
static int screenWidth = 0, screenHeight = 0;
-wWin_p mswWin = NULL;
-wWin_p winFirst, winLast;
+static wWin_p mswWin = NULL;
+static wWin_p winFirst, winLast;
static long count51 = 0;
-static UINT alarmTimer;
-static UINT pauseTimer;
-static UINT balloonHelpTimer = (UINT)0;
-static UINT triggerTimer;
+static UINT_PTR alarmTimer;
+static UINT_PTR pauseTimer;
+static UINT_PTR balloonHelpTimer = (UINT_PTR)0;
+static UINT_PTR triggerTimer;
static UINT balloonHelpTimeOut = 500;
static wControl_p balloonHelpButton = NULL;
@@ -160,7 +162,7 @@ static DWORD dwCookie;
typedef struct {
wControl_p b;
} controlMap_t;
-dynArr_t controlMap_da;
+static dynArr_t controlMap_da;
#define controlMap(N) DYNARR_N(controlMap_t,controlMap_da,N)
@@ -170,15 +172,11 @@ char *mswProfileFile;
static wBalloonHelp_t * balloonHelpStrings;
-static wCursor_t curCursor = wCursorNormal;
-
#ifdef HELPSTR
static FILE * helpStrF;
#endif
static int inMainWndProc = FALSE;
-int newHelp = 1;
-
static wBool_t mswWinBlockEnabled = TRUE;
static FILE * dumpControlsF;
@@ -187,19 +185,21 @@ static int dumpControls;
extern char *userLocale;
// list of supported fileformats for image files
-char * filterImageFiles[] = { N_("All image files"),
- "*.gif;*.jpg;*.jpeg;*.png;*.tif;*.tiff",
- N_("GIF files (*.gif)"),
- "*.gif",
- N_("JPEG files (*.jpeg,*.jpg)"),
- "*.jpg;*.jpeg",
- N_("PNG files (*.png)"),
- "*.png",
- N_("TIFF files (*.tiff, *.tif)"),
- "*.tif;*.tiff",
- N_("All files (*)"),
- "*",
- };
+static char * filterImageFiles[] = { N_("All image files"),
+ "*.gif;*.jpg;*.jpeg;*.png;*.tif;*.tiff",
+ N_("GIF files (*.gif)"),
+ "*.gif",
+ N_("JPEG files (*.jpeg,*.jpg)"),
+ "*.jpg;*.jpeg",
+ N_("PNG files (*.png)"),
+ "*.png",
+ N_("TIFF files (*.tiff, *.tif)"),
+ "*.tif;*.tiff",
+ N_("All files (*)"),
+ "*",
+ };
+
+static HICON hWindowIcon;
/*
*****************************************************************************
@@ -251,8 +251,8 @@ static void doDumpControls(void)
b = controlMap(inx).b;
if (b) {
- fprintf(dumpControlsF, "[%0.3d] [%x] %s %s %s\n", inx,
- (unsigned int)b->hWnd,
+ fprintf(dumpControlsF, "[%0.3d] [%p] %s %s %s\n", inx,
+ b->hWnd,
(b->type>=0&&b->type<=B_BOX?controlNames[b->type]:"NOTYPE"),
(b->labelStr?b->labelStr:"<NULL>"),
(b->helpStr?b->helpStr:"<NULL>"));
@@ -303,7 +303,8 @@ void mswRepaintLabel(HWND hWnd, wControl_p b)
LABELFONTSELECT
newBrush = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
oldBrush = SelectObject(hDc, newBrush);
- dw = GetTextExtent(hDc, CAST_AWAY_CONST b->labelStr, strlen(b->labelStr));
+ dw = GetTextExtent(hDc, CAST_AWAY_CONST b->labelStr,
+ (int)(strlen(b->labelStr)));
rect.left = b->labelX;
rect.top = b->labelY;
rect.right = b->labelX + LOWORD(dw);
@@ -313,7 +314,8 @@ void mswRepaintLabel(HWND hWnd, wControl_p b)
/*SetBkMode( hDc, OPAQUE );*/
SetBkColor(hDc, GetSysColor(COLOR_BTNFACE));
- if (!TextOut(hDc, b->labelX, b->labelY, b->labelStr, strlen(b->labelStr))) {
+ if (!TextOut(hDc, b->labelX, b->labelY, b->labelStr,
+ (int)(strlen(b->labelStr)))) {
mswFail("Repainting text label");
}
@@ -376,14 +378,16 @@ void * mswAlloc(
w->data = data;
w->focusChainNext = NULL;
w->shown = TRUE;
+ w->hilite = FALSE;
+ w->errStr = NULL;
return w;
}
void mswComputePos(
wControl_p b,
- wPos_t origX,
- wPos_t origY)
+ wWinPix_t origX,
+ wWinPix_t origY)
{
wWin_p w = b->parent;
@@ -403,14 +407,14 @@ void mswComputePos(
b->labelY = b->y+2;
if (b->labelStr) {
- int lab_l;
+ size_t lab_l;
HDC hDc;
DWORD dw;
LABELFONTDECL
hDc = GetDC(w->hWnd);
LABELFONTSELECT
lab_l = strlen(b->labelStr);
- dw = GetTextExtent(hDc, CAST_AWAY_CONST b->labelStr, lab_l);
+ dw = GetTextExtent(hDc, CAST_AWAY_CONST b->labelStr, (UINT)lab_l);
b->labelX -= LOWORD(dw) + 5;
LABELFONTRESET
ReleaseDC(w->hWnd, hDc);
@@ -557,7 +561,7 @@ void mswSetFocus(
b->parent->focusChainNext = b;
}
}
-
+
/*
******************************************************************************
*
@@ -569,10 +573,10 @@ void mswSetFocus(
static void getSavedSizeAndPos(
long option,
const char * nameStr,
- wPos_t *rw,
- wPos_t *rh,
- wPos_t *rx,
- wPos_t *ry,
+ wWinPix_t *rw,
+ wWinPix_t *rh,
+ wWinPix_t *rx,
+ wWinPix_t *ry,
int *showCmd)
{
char *cq;
@@ -580,14 +584,29 @@ static void getSavedSizeAndPos(
if ((option&F_RECALLPOS) && nameStr) {
int x, y, w, h;
+ int xadj, yadj;
const char *cp;
int state;
+ w = h = 0;
+ xadj = 1;
+ yadj = mTitleH + 1;
+ if (option & F_RESIZE) {
+ xadj += mResizeBorderW * 2;
+ yadj += mResizeBorderH * 2;
+ } else {
+ xadj += mFixBorderW * 2;
+ yadj += mFixBorderH * 2;
+ }
+ //if (option & F_MENUBAR) {
+ // yadj += mMenuH;
+ //}
+
if ((option & F_RESIZE) &&
(cp = wPrefGetStringBasic("msw window size", nameStr)) &&
- (state = (int)strtol(cp, &cq, 10), cp != cq) && // state is not used
- (cp = cq, w = (wPos_t)strtod(cp, &cq), cp != cq) &&
- (cp = cq, h = (int)strtod(cp, &cq), cp != cq)
+ (state = (int)strtol(cp, &cq, 10), cp != cq) && // state is not used
+ (cp = cq, w = (wWinPix_t)(strtod(cp, &cq)), cp != cq) &&
+ (cp = cq, h = (wWinPix_t)(strtod(cp, &cq)), cp != cq)
) {
if (w < 10) {
w = 10;
@@ -597,12 +616,12 @@ static void getSavedSizeAndPos(
h = 10;
}
- if (w > screenWidth) {
- w = screenWidth;
+ if (w > screenWidth - xadj) {
+ w = screenWidth - xadj;
}
- if (h > screenHeight) {
- h = screenHeight;
+ if (h > screenHeight - yadj) {
+ h = screenHeight - yadj;
}
*rw = w;
@@ -610,8 +629,8 @@ static void getSavedSizeAndPos(
}
if ((cp = wPrefGetStringBasic("msw window pos", nameStr)) &&
- (x = (wPos_t)strtod(cp, &cq), cp != cq) &&
- (cp = cq, y = (wPos_t)strtod(cp, &cq), cp != cq)
+ (x = (wWinPix_t)(strtod(cp, &cq)), cp != cq) &&
+ (cp = cq, y = (wWinPix_t)(strtod(cp, &cq)), cp != cq)
) {
if (y < 0) {
y = 0;
@@ -621,12 +640,17 @@ static void getSavedSizeAndPos(
x = 0;
}
- if (y > screenHeight-40) {
- y = screenHeight-40;
+ // Make sure we can see the dialog
+ xadj += 100;
+ yadj += 100;
+
+
+ if (y + h > screenHeight - yadj) {
+ y = screenHeight - yadj - h;
}
- if (x > screenWidth-40) {
- x = screenWidth-40;
+ if (x + w > screenWidth - xadj) {
+ x = screenWidth - xadj - w;
}
*rx = x;
@@ -636,7 +660,7 @@ static void getSavedSizeAndPos(
}
/**
- * Set min and max dimensions for a window.
+ * Set min and max dimensions for a window.
*
* \param min_width IN minimum width of window
* \param max_width IN maximum width of window
@@ -647,21 +671,21 @@ static void getSavedSizeAndPos(
* \param aspect_ration IN unused on Windows
*/
void wSetGeometry(wWin_p win,
- int min_width,
- int max_width,
- int min_height,
- int max_height,
- int base_width,
- int base_height,
- double aspect_ratio)
+ wWinPix_t min_width,
+ wWinPix_t max_width,
+ wWinPix_t min_height,
+ wWinPix_t max_height,
+ wWinPix_t base_width,
+ wWinPix_t base_height,
+ double aspect_ratio)
{
- win->validGeometry = TRUE; //remember that geometry was set
- win->min_width = min_width;
- win->max_width = max_width;
- win->min_height = min_height;
- win->max_height = max_height;
+ win->validGeometry = TRUE; //remember that geometry was set
+ win->min_width = min_width;
+ win->max_width = max_width;
+ win->min_height = min_height;
+ win->max_height = max_height;
- return;
+ return;
}
/**
@@ -671,13 +695,13 @@ void wSetGeometry(wWin_p win,
* \param typ IN type of window (W_MAIN or W_POPUP)
* \param option IN options for window creation
* \param classname IN pre-registered window class
- * \param style IN
+ * \param style IN
* \param labelStr IN window title
* \param winProc IN callback procedure
* \param w IN default window width
* \param h IN default window height
* \param data IN ??
- * \param nameStr IN name of window
+ * \param nameStr IN name of window
* \param pShowCmd IN/OUT window show option (maximize or show normal)
* \return window data structure
*/
@@ -690,15 +714,15 @@ static wWin_p winCommonCreate(
long style,
const char * labelStr,
wWinCallBack_p winProc,
- wPos_t w,
- wPos_t h,
+ wWinPix_t w,
+ wWinPix_t h,
void * data,
const char * nameStr,
int * pShowCmd)
{
wWin_p win;
int index;
- wPos_t ww, hh, xx, yy;
+ wWinPix_t ww, hh, xx, yy;
RECT rect;
win = (wWin_p)mswAlloc(NULL, typ, mswStrdup(labelStr), sizeof *win, data,
&index);
@@ -715,6 +739,8 @@ static wWin_p winCommonCreate(
if (typ == W_MAIN) {
*pShowCmd = ((option & F_MAXIMIZE) ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL);
+ } else {
+ *pShowCmd = SW_HIDE; //Make sure to hide first
}
if (xx != CW_USEDEFAULT) {
@@ -774,6 +800,10 @@ static wWin_p winCommonCreate(
win->nameStr = mswStrdup(nameStr);
+ //HICON hIcon1 = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(101), IMAGE_ICON, 32, 32, LR_DEFAULTSIZE);
+ SendMessage(win->hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hWindowIcon);
+ SendMessage(win->hWnd, WM_SETICON, ICON_BIG, (LPARAM)hWindowIcon);
+
if (typ == W_MAIN) {
mswInitColorPalette();
}
@@ -806,8 +836,8 @@ void wInitAppName(char *_appName)
wWin_p wWinMainCreate(
const char * name,
- POS_T x,
- POS_T y,
+ wWinPix_t x,
+ wWinPix_t y,
const char * helpStr,
const char * labelStr,
const char * nameStr,
@@ -816,7 +846,6 @@ wWin_p wWinMainCreate(
void * data)
{
wWin_p w;
- RECT rect;
const char * appDir;
const char * libDir;
int showCmd;
@@ -825,7 +854,7 @@ wWin_p wWinMainCreate(
TEXTMETRIC tm;
char *pos;
char * configName;
- long maximize;
+ long maximize;
/* check for configuration name */
if (pos = strchr(name, ';')) {
@@ -862,14 +891,9 @@ wWin_p wWinMainCreate(
/* length of path + \ + length of filename + . + length of extension + \0 */
helpFile = (char*)malloc(strlen(libDir) + 1 + strlen(appName) + 1 + 3 + 1);
wsprintf(helpFile, "%s\\%s.chm", libDir, appName);
- wPrefGetInteger("msw tweak", "ThickFont", &mswThickFont, 0);
- wPrefGetInteger("draw", "maximized", &maximize, 0L);
- option |= (maximize ? F_MAXIMIZE : 0);
-
- wPrefGetFloat(PREFSECTION, LARGEICON, &scaleIcon, 1.0);
- if (scaleIcon < 1.0) scaleIcon = 1.0;
- if (scaleIcon > 2.0) scaleIcon = 2.0;
+ wPrefGetInteger("draw", "maximized", &maximize, 0L);
+ option |= (maximize ? F_MAXIMIZE : 0);
showCmd = SW_SHOW;
w = winCommonCreate(NULL, W_MAIN, option|F_RESIZE, "MswMainWindow",
@@ -877,26 +901,22 @@ wWin_p wWinMainCreate(
nameStr, &showCmd);
mswHWnd = w->hWnd;
- if (!mswThickFont) {
- SendMessage(w->hWnd, WM_SETFONT, (WPARAM)mswLabelFont, 0L);
- hDc = GetDC(w->hWnd);
- GetTextMetrics(hDc, &tm);
- mswEditHeight = tm.tmHeight+2;
- ReleaseDC(w->hWnd, hDc);
- }
+ SendMessage(mswHWnd, WM_SETFONT, (WPARAM)mswLabelFont, (LPARAM)0);
+ hDc = GetDC(mswHWnd);
+ GetTextMetrics(hDc, &tm);
+ mswEditHeight = tm.tmHeight+2;
+ ReleaseDC(mswHWnd, hDc);
- ShowWindow(w->hWnd, showCmd);
- UpdateWindow(w->hWnd);
- GetWindowRect(w->hWnd, &rect);
- GetClientRect(w->hWnd, &rect);
+ ShowWindow(mswHWnd, showCmd);
+ UpdateWindow(mswHWnd);
w->busy = FALSE;
return w;
}
wWin_p wWinPopupCreate(
wWin_p parent,
- POS_T x,
- POS_T y,
+ wWinPix_t x,
+ wWinPix_t y,
const char * helpStr,
const char * labelStr,
const char * nameStr,
@@ -1077,7 +1097,7 @@ static wAccelKey_e translateExtKey(UINT wParam)
}
-long notModKey;
+static long notModKey;
int mswTranslateAccelerator(
HWND hWnd,
LPMSG pMsg)
@@ -1091,7 +1111,7 @@ int mswTranslateAccelerator(
return FALSE;
}
- acclKey = pMsg->wParam;
+ acclKey = (long)pMsg->wParam;
b = getControlFromCursor(pMsg->hwnd, &win);
if (win == NULL) {
@@ -1112,7 +1132,7 @@ int mswTranslateAccelerator(
}
if (acclKey == (long)VK_F1) {
- closeBalloonHelp();
+ closeBalloonHelp(1);
if (!b && win) {
wHelp(win->helpStr);
@@ -1162,14 +1182,14 @@ int mswTranslateAccelerator(
-void wGetDisplaySize(POS_T * width, POS_T * height)
+void wGetDisplaySize(wWinPix_t * width, wWinPix_t * height)
{
*width = screenWidth;
*height = screenHeight;
}
-void wWinGetSize(wWin_p w, POS_T * width, POS_T * height)
+void wWinGetSize(wWin_p w, wWinPix_t * width, wWinPix_t * height)
{
RECT rect;
GetWindowRect(w->hWnd, &rect);
@@ -1181,7 +1201,7 @@ void wWinGetSize(wWin_p w, POS_T * width, POS_T * height)
}
-void wWinSetSize(wWin_p w, POS_T width, POS_T height)
+void wWinSetSize(wWin_p w, wWinPix_t width, wWinPix_t height)
{
RECT rect;
w->w = width;
@@ -1224,33 +1244,24 @@ static void blockingLoop(void)
static void savePos(wWin_p win)
{
- WINDOWPLACEMENT windowPlace;
- wPos_t w, h;
+ wWinPix_t w, h;
RECT rect;
if (win->nameStr &&
IsWindowVisible(win->hWnd) /*&& !IsIconic( win->hWnd )*/) {
- windowPlace.length = sizeof windowPlace;
- GetWindowPlacement(win->hWnd, &windowPlace);
+ GetWindowRect(win->hWnd, &rect);
if (win->option&F_RECALLPOS) {
char posStr[20];
wsprintf(posStr, "%d %d",
- windowPlace.rcNormalPosition.left,
- windowPlace.rcNormalPosition.top);
+ rect.left,
+ rect.top);
wPrefSetString("msw window pos", win->nameStr, posStr);
if (win->option&F_RESIZE) {
GetClientRect(win->hWnd, &rect);
- w = windowPlace.rcNormalPosition.right - windowPlace.rcNormalPosition.left;
- h = windowPlace.rcNormalPosition.bottom - windowPlace.rcNormalPosition.top;
- w -= mResizeBorderW*2;
- h -= mResizeBorderH*2 + mTitleH;
-
- if (win->option&F_MENUBAR) {
- h -= mMenuH;
- }
-
+ w = rect.right - rect.left;
+ h = rect.bottom - rect.top;
wsprintf(posStr, "%d %d %d",
0, // unused
w, h);
@@ -1265,7 +1276,7 @@ void wWinShow(
wWin_p win,
BOOL_T show)
{
- wPos_t x, y;
+ wWinPix_t x, y;
wWin_p win1;
win->busy = TRUE;
@@ -1292,6 +1303,11 @@ void wWinShow(
win->centerWin = FALSE;
win->shown = TRUE;
+ // Clear hilites
+ for (wControl_p controlP = win->first; controlP; controlP = controlP->next) {
+ controlP->hilite = FALSE;
+ }
+
if (mswHWnd == (HWND)0 || !IsIconic(mswHWnd)) {
ShowWindow(win->hWnd, SW_SHOW);
@@ -1429,73 +1445,13 @@ const char * wWinGetTitle(
void wWinClear(
wWin_p win,
- wPos_t x,
- wPos_t y,
- wPos_t width,
- wPos_t height)
+ wWinPix_t x,
+ wWinPix_t y,
+ wWinPix_t width,
+ wWinPix_t height)
{
}
-void wSetCursor(wDraw_p win,
- wCursor_t cursor)
-{
- switch (cursor) {
- case wCursorNormal:
- default:
- SetCursor(LoadCursor(NULL, IDC_ARROW));
- break;
-
- case wCursorWait:
- SetCursor(LoadCursor(NULL, IDC_WAIT));
- break;
-
- case wCursorCross:
- SetCursor(LoadCursor(NULL, IDC_CROSS));
- break;
-
- case wCursorIBeam:
- SetCursor(LoadCursor(NULL, IDC_IBEAM));
- break;
-
- case wCursorQuestion:
- SetCursor(LoadCursor(NULL, IDC_HELP));
- break;
-
- case wCursorHand:
- SetCursor(LoadCursor(NULL, IDC_HAND));
- break;
-
- case wCursorNo:
- SetCursor(LoadCursor(NULL, IDC_NO));
- break;
-
- case wCursorSizeAll:
- SetCursor(LoadCursor(NULL, IDC_SIZEALL));
- break;
-
- case wCursorSizeNESW:
- SetCursor(LoadCursor(NULL, IDC_SIZENESW));
- break;
-
- case wCursorSizeNWSE:
- SetCursor(LoadCursor(NULL, IDC_SIZENWSE));
- break;
-
- case wCursorSizeNS:
- SetCursor(LoadCursor(NULL, IDC_SIZENS));
- break;
-
- case wCursorSizeWE:
- SetCursor(LoadCursor(NULL, IDC_SIZEWE));
- break;
-
- case wCursorAppStart:
- SetCursor(LoadCursor(NULL, IDC_APPSTARTING));
- break;
- }
-
- curCursor = cursor;
-}
void wWinDoCancel(wWin_p win)
{
@@ -1667,44 +1623,44 @@ const char * wControlGetHelp(wControl_p b)
}
-wPos_t wLabelWidth(const char * labelStr)
+wWinPix_t wLabelWidth(const char * labelStr)
{
- int lab_l;
+ size_t lab_l;
HDC hDc;
DWORD dw;
LABELFONTDECL
hDc = GetDC(mswHWnd);
lab_l = strlen(labelStr);
LABELFONTSELECT
- dw = GetTextExtent(hDc, CAST_AWAY_CONST labelStr, lab_l);
+ dw = GetTextExtent(hDc, CAST_AWAY_CONST labelStr, (UINT)lab_l);
LABELFONTRESET
ReleaseDC(mswHWnd, hDc);
return LOWORD(dw) + 5;
}
-wPos_t wControlGetWidth(
+wWinPix_t wControlGetWidth(
wControl_p b) /* Control */
{
return b->w;
}
-wPos_t wControlGetHeight(
+wWinPix_t wControlGetHeight(
wControl_p b) /* Control */
{
return b->h;
}
-wPos_t wControlGetPosX(
+wWinPix_t wControlGetPosX(
wControl_p b) /* Control */
{
return b->x;
}
-wPos_t wControlGetPosY(
+wWinPix_t wControlGetPosY(
wControl_p b) /* Control */
{
return b->y;
@@ -1713,21 +1669,21 @@ wPos_t wControlGetPosY(
void wControlSetPos(
wControl_p b,
- wPos_t x,
- wPos_t y)
+ wWinPix_t x,
+ wWinPix_t y)
{
b->labelX = x;
b->labelY = y+2;
if (b->labelStr) {
- int lab_l;
+ size_t lab_l;
HDC hDc;
DWORD dw;
LABELFONTDECL
hDc = GetDC(b->parent->hWnd);
LABELFONTSELECT
lab_l = strlen(b->labelStr);
- dw = GetTextExtent(hDc, CAST_AWAY_CONST b->labelStr, lab_l);
+ dw = GetTextExtent(hDc, CAST_AWAY_CONST b->labelStr, (UINT)lab_l);
b->labelX -= LOWORD(dw) + 5;
LABELFONTRESET
ReleaseDC(b->parent->hWnd, hDc);
@@ -1757,14 +1713,14 @@ void wControlSetLabel(
if (b->type == B_RADIO ) {
;
} else {
- int lab_l;
+ size_t lab_l;
HDC hDc;
DWORD dw;
LABELFONTDECL
hDc = GetDC(b->parent->hWnd);
lab_l = strlen(labelStr);
LABELFONTSELECT
- dw = GetTextExtent(hDc, CAST_AWAY_CONST labelStr, lab_l);
+ dw = GetTextExtent(hDc, CAST_AWAY_CONST labelStr, (UINT)lab_l);
LABELFONTRESET
b->labelX = b->x - LOWORD(dw) - 5;
ReleaseDC(b->parent->hWnd, hDc);
@@ -1791,33 +1747,36 @@ void wControlHilite(
HDC hDc;
HPEN oldPen, newPen;
int oldMode;
- LOGBRUSH logBrush = { BS_SOLID, CONTROLHILITECOLOR, (ULONG_PTR)NULL };
+ LOGBRUSH logBrush = { BS_SOLID, CONTROLHILITECOLOR, (ULONG_PTR)NULL };
if (b == NULL) {
return;
}
- if (!IsWindowVisible(b->parent->hWnd)) {
+ if ((b->parent==NULL) || (!IsWindowVisible(b->parent->hWnd))
+ || (!IsWindowVisible(b->hWnd))) {
+ b->hilite = FALSE;
return;
}
- if (!IsWindowVisible(b->hWnd)) {
+ if (b->hilite == hilite) {
return;
}
+ b->hilite = hilite;
hDc = GetDC(b->parent->hWnd);
- newPen = ExtCreatePen(PS_GEOMETRIC | PS_SOLID | PS_ENDCAP_ROUND | PS_JOIN_BEVEL,
- CONTROLHILITEWIDTH,
- &logBrush,
- 0,
- NULL);
+ newPen = ExtCreatePen(PS_GEOMETRIC | PS_SOLID | PS_ENDCAP_ROUND | PS_JOIN_BEVEL,
+ CONTROLHILITEWIDTH,
+ &logBrush,
+ 0,
+ NULL);
oldPen = SelectObject(hDc, newPen);
oldMode = SetROP2(hDc, R2_NOTXORPEN);
- Rectangle(hDc,
- b->x - CONTROLHILITEWIDTH - 1,
- b->y - CONTROLHILITEWIDTH - 1,
- b->x + b->w + CONTROLHILITEWIDTH + 1,
- b->y + b->h + CONTROLHILITEWIDTH + 1);
+ Rectangle(hDc,
+ b->x - CONTROLHILITEWIDTH - 1,
+ b->y - CONTROLHILITEWIDTH - 1,
+ b->x + b->w + CONTROLHILITEWIDTH + 1,
+ b->y + b->h + CONTROLHILITEWIDTH + 1);
SetROP2(hDc, oldMode);
SelectObject(hDc, oldPen);
DeleteObject(newPen);
@@ -1840,7 +1799,7 @@ void wMessage(
{
HDC hDc;
int oldRop;
- POS_T h;
+ wWinPix_t h;
RECT rect;
LABELFONTDECL
@@ -1855,30 +1814,30 @@ void wMessage(
Rectangle(hDc, 0, h, w->w, h);
SetROP2(hDc, oldRop);
LABELFONTSELECT
- TextOut(hDc, 0, h, msg, strlen(msg));
+ TextOut(hDc, 0, h, msg, (int)(strlen(msg)));
LABELFONTRESET
ReleaseDC(w->hWnd, hDc);
}
/**
* Open a document using an external application
- *
+ *
* \param file
* \return TRUE on success, FALSE on error
- *
+ *
*/
unsigned wOpenFileExternal(char *file)
{
- HINSTANCE res;
+ HINSTANCE res;
- res = ShellExecute(mswHWnd, "open", file, NULL, NULL, SW_SHOW);
+ res = ShellExecute(mswHWnd, "open", file, NULL, NULL, SW_SHOW);
- if ((int)res <= 32) {
- wNoticeEx(NT_ERROR, "Error when opening file!", "Cancel", NULL);
- return(FALSE);
- }
+ if ((UINT_PTR)res <= 32) {
+ wNoticeEx(NT_ERROR, "Error when opening file!", "Cancel", NULL);
+ return(FALSE);
+ }
- return(TRUE);
+ return(TRUE);
}
void wExit(int rc)
@@ -1886,7 +1845,6 @@ void wExit(int rc)
INDEX_T inx;
wControl_p b;
mswPutCustomColors();
- wPrefFlush();
for (inx=controlMap_da.cnt-1; inx>=0; inx--) {
b = controlMap(inx).b;
@@ -1903,6 +1861,8 @@ void wExit(int rc)
}
}
+ wPrefFlush("");
+
for (inx=controlMap_da.cnt-1; inx>=0; inx--) {
b = controlMap(inx).b;
@@ -1923,7 +1883,7 @@ void wExit(int rc)
}
if (helpInitted) {
- WinHelp(mswHWnd, helpFile, HELP_QUIT, 0L);
+ WinHelp(mswHWnd, helpFile, HELP_QUIT, (DWORD)0);
helpInitted = FALSE;
}
@@ -2155,7 +2115,7 @@ int wNotice3(
}
/**
- * Show help text for the given topic.
+ * Show help text for the given topic.
*
* \param topic The topic. if NULL the index page is shown.
*/
@@ -2165,14 +2125,14 @@ void wHelp(
{
char *pszHelpTopic;
HWND hwndHelp;
- char *theTopic = "index";
+ const char *theTopic = "index";
- if (topic) {
- theTopic = topic;
- }
+ if (topic) {
+ theTopic = topic;
+ }
if (!helpInitted) {
- HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD)&dwCookie) ;
+ HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD_PTR)&dwCookie) ;
helpInitted = TRUE;
}
@@ -2199,11 +2159,12 @@ void doHelpMenu(void * context)
HH_FTS_QUERY ftsQuery;
if (!helpInitted) {
- HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD)&dwCookie) ;
+ HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD_PTR)&dwCookie) ;
helpInitted = TRUE;
}
- switch ((int)(long)context) {
+ const char * topic;
+ switch ((int)(INT_PTR)context) {
case 1: /* Contents */
HtmlHelp(mswHWnd, helpFile, HH_DISPLAY_TOC, (DWORD_PTR)NULL);
break;
@@ -2215,15 +2176,14 @@ void doHelpMenu(void * context)
ftsQuery.fTitleOnly = FALSE;
ftsQuery.pszSearchQuery = NULL;
ftsQuery.pszWindow = NULL;
- HtmlHelp(mswHWnd, helpFile, HH_DISPLAY_SEARCH,(DWORD)&ftsQuery);
+ HtmlHelp(mswHWnd, helpFile, HH_DISPLAY_SEARCH,(DWORD_PTR)&ftsQuery);
break;
case 3: /*Context*/
- const char * topic;
- topic = GetCurCommandName();
- wHelp(topic);
- break;
+ topic = GetCurCommandName();
+ wHelp(topic);
+ break;
default:
return;
@@ -2232,8 +2192,9 @@ void doHelpMenu(void * context)
helpInitted = TRUE;
}
-void wDoAccelHelp(wAccelKey_e key, void * context) {
- doHelpMenu(context);
+void wDoAccelHelp(wAccelKey_e key, void * context)
+{
+ doHelpMenu(context);
}
void wMenuAddHelp(
@@ -2267,88 +2228,108 @@ void wControlSetBalloonText(wControl_p b, const char * text)
b->tipStr = mswStrdup(text);
}
-
-void startBalloonHelp(void)
+void openBalloonHelp(wControl_p b, int dx, int dy)
{
HDC hDc;
DWORD extent;
RECT rect;
POINT pt;
- wBalloonHelp_t * bh;
- const char * hs;
HFONT hFont;
-
- if (!balloonHelpStrings) {
- return;
+ const char * msg;
+ if (b->errStr) {
+ msg = b->errStr;
+ } else {
+ msg = b->tipStr;
+ if (!balloonHelpEnable) {
+#ifdef BALLOON_TRACE
+ fprintf(logFile, "openBalloon !Enable state %d\n", balloonHelpState);
+ fflush(logFile);
+#endif
+ return;
+ }
}
-
- if (!balloonHelpEnable) {
+#ifdef BALLOON_TRACE
+ fprintf(logFile, "openBalloon %s state %d\n", msg, balloonHelpState);
+ fflush(logFile);
+#endif
+ if (!balloonHelpHWnd) {
return;
}
+ int w, h;
+ hDc = GetDC(balloonHelpHWnd);
+ hFont = SelectObject(hDc, mswLabelFont);
+ extent = GetTextExtent(hDc, CAST_AWAY_CONST msg, (int)(strlen(msg)));
+ w = LOWORD(extent);
+ h = HIWORD(extent);
- if (balloonHelpHWnd) {
- if (balloonHelpButton->tipStr) {
- hs = balloonHelpButton->tipStr;
- } else {
- hs = balloonHelpButton->helpStr;
-
- if (!hs) {
- return;
- }
+ if (b->type == B_RADIO ||
+ b->type == B_TOGGLE) {
+ pt.y = b->h;
+ } else {
+ GetClientRect(b->hWnd, &rect);
+ pt.y = rect.bottom;
+ }
- for (bh = balloonHelpStrings; bh->name && strcmp(bh->name,hs) != 0; bh++);
+ pt.x = dx;
+ pt.y -= dy;
+ ClientToScreen(b->hWnd, &pt);
- if (!bh->name || !bh->value) {
- return;
- }
+ if (pt.x + w + 2 > screenWidth) {
+ pt.x = screenWidth - (w + 2);
+ }
- balloonHelpButton->tipStr = hs = bh->value;
- }
+ if (pt.x < 0) {
+ pt.x = 0;
+ }
- if (newHelp) {
- wControlSetBalloon(balloonHelpButton, 0, 0, hs);
- } else {
- int w, h;
- hDc = GetDC(balloonHelpHWnd);
- hFont = SelectObject(hDc, mswLabelFont);
- extent = GetTextExtent(hDc, CAST_AWAY_CONST hs, strlen(hs));
- w = LOWORD(extent);
- h = HIWORD(extent);
- pt.x = 0;
-
- if (balloonHelpButton->type == B_RADIO ||
- balloonHelpButton->type == B_TOGGLE) {
- pt.y = balloonHelpButton->h;
- } else {
- GetClientRect(balloonHelpButton->hWnd, &rect);
- pt.y = rect.bottom;
- }
+ SetWindowPos(balloonHelpHWnd, HWND_TOPMOST, pt.x, pt.y, w + 6, h + 4,
+ SWP_SHOWWINDOW | SWP_NOACTIVATE);
+ if (!b->errStr) {
+ SetBkColor(hDc, GetSysColor(COLOR_INFOBK));
+ SetTextColor(hDc, GetSysColor(COLOR_INFOTEXT));
+ } else {
+ SetBkColor(hDc, GetSysColor(COLOR_HIGHLIGHT));
+ SetTextColor(hDc, GetSysColor(COLOR_HIGHLIGHTTEXT));
+ }
+ TextOut(hDc, 2, 1, msg, (int)(strlen(msg)));
+ SelectObject(hDc, hFont);
+ ReleaseDC(balloonHelpHWnd, hDc);
+ balloonHelpState = balloonHelpShow;
+ balloonControlButton = b;
+}
- ClientToScreen(balloonHelpButton->hWnd, &pt);
- if (pt.x + w+2 > screenWidth) {
- pt.x = screenWidth-(w+2);
- }
- if (pt.x < 0) {
- pt.x = 0;
- }
+void startBalloonHelp(void)
+{
+ wBalloonHelp_t * bh;
- SetWindowPos(balloonHelpHWnd, HWND_TOPMOST, pt.x, pt.y, w+6, h+4,
- SWP_SHOWWINDOW|SWP_NOACTIVATE);
- SetBkColor(hDc, GetSysColor(COLOR_INFOBK));
- TextOut(hDc, 2, 1, hs, strlen(hs));
- SelectObject(hDc, hFont);
- ReleaseDC(balloonHelpHWnd, hDc);
+ if (!balloonHelpButton->tipStr) {
+ if (!balloonHelpStrings) {
+ return;
+ }
+ for (bh = balloonHelpStrings; bh->name
+ && strcmp(bh->name, balloonHelpButton->helpStr) != 0; bh++);
+ if (!bh->name || !bh->value) {
+ balloonHelpButton->tipStr = _(balloonHelpButton->helpStr);
+ } else {
+ balloonHelpButton->tipStr = _(bh->value);
}
}
+
+ openBalloonHelp(balloonHelpButton, 0, 0);
}
-void closeBalloonHelp(void)
+
+void closeBalloonHelp(int inx)
{
+#ifdef BALLOON_TRACE
+ fprintf(logFile, "closeBallonHelp %d state=%d\n", inx, balloonHelpState);
+ fflush(logFile);
+#endif
if (balloonHelpTimer) {
KillTimer(mswHWnd, balloonHelpTimer);
- balloonHelpTimer = 0;
+ balloonHelpTimer = (UINT_PTR)0;
}
if (balloonHelpState == balloonHelpShow)
@@ -2360,56 +2341,26 @@ void closeBalloonHelp(void)
}
-void wControlSetBalloon(wControl_p b, wPos_t dx, wPos_t dy, const char * msg)
+void wControlSetBalloon(wControl_p b, wWinPix_t dx, wWinPix_t dy,
+ const char * msg)
{
- HDC hDc;
- DWORD extent;
- RECT rect;
- POINT pt;
- HFONT hFont;
-
if (msg) {
- int w, h;
- hDc = GetDC(balloonHelpHWnd);
- hFont = SelectObject(hDc, mswLabelFont);
- extent = GetTextExtent(hDc, CAST_AWAY_CONST msg, strlen(msg));
- w = LOWORD(extent);
- h = HIWORD(extent);
-
- if (b->type == B_RADIO ||
- b->type == B_TOGGLE) {
- pt.y = b->h;
- } else {
- GetClientRect(b->hWnd, &rect);
- pt.y = rect.bottom;
+ if (b->errStr) {
+ free(b->errStr);
}
-
- pt.x = dx;
- pt.y -= dy;
- ClientToScreen(b->hWnd, &pt);
-
- if (pt.x + w+2 > screenWidth) {
- pt.x = screenWidth-(w+2);
- }
-
- if (pt.x < 0) {
- pt.x = 0;
- }
-
- SetWindowPos(balloonHelpHWnd, HWND_TOPMOST, pt.x, pt.y, w+6, h+4,
- SWP_SHOWWINDOW|SWP_NOACTIVATE);
- SetBkColor(hDc, GetSysColor(COLOR_INFOBK));
- TextOut(hDc, 2, 1, msg, strlen(msg));
- SelectObject(hDc, hFont);
- ReleaseDC(balloonHelpHWnd, hDc);
- balloonHelpState = balloonHelpShow;
- balloonControlButton = b;
+ b->errStr = mswStrdup(msg);
+ openBalloonHelp(b, dx, dy);
} else {
- closeBalloonHelp();
+ if (b->errStr) {
+ free(b->errStr);
+ }
+ b->errStr = NULL;
+ closeBalloonHelp(2);
}
}
+
int wGetKeyState(void)
{
int rc, keyState;
@@ -2467,19 +2418,20 @@ struct wFilSel_t {
char *
GetImageFileFormats(void)
{
- char *filter = malloc(2048);
- char *current = filter;
- char *message;
+ char *filter = malloc(2048);
+ char *current = filter;
+ char *message;
- for (int i = 0; i < sizeof(filterImageFiles) / sizeof(filterImageFiles[0]); i += 2) {
- message = gettext(filterImageFiles[i]);
- strcpy(current, message);
- current += strlen(message) + 1;
- strcpy(current, filterImageFiles[i + 1]);
- current += strlen(current) + 1;
- }
- *current = '\0';
- return(filter);
+ for (int i = 0; i < sizeof(filterImageFiles) / sizeof(filterImageFiles[0]);
+ i += 2) {
+ message = gettext(filterImageFiles[i]);
+ strcpy(current, message);
+ current += strlen(message) + 1;
+ strcpy(current, filterImageFiles[i + 1]);
+ current += strlen(current) + 1;
+ }
+ *current = '\0';
+ return(filter);
}
/**
@@ -2515,12 +2467,11 @@ int wFilSelect(
memset(&ofn, 0, sizeof ofn);
ofn.lStructSize = sizeof ofn;
ofn.hwndOwner = mswHWnd;
- if (fs->option == FS_PICTURES) {
- ofn.lpstrFilter = GetImageFileFormats();
- }
- else {
- ofn.lpstrFilter = fs->extList;
- }
+ if (fs->option == FS_PICTURES) {
+ ofn.lpstrFilter = GetImageFileFormats();
+ } else {
+ ofn.lpstrFilter = fs->extList;
+ }
ofn.nFilterIndex = 0;
selFileName = malloc(SELECTEDFILENAME_BUFFERSIZE);
@@ -2613,7 +2564,7 @@ struct wFilSel_t * wFilSelCreate(
{
char * cp;
struct wFilSel_t * ret;
- int len;
+ size_t len;
ret = (struct wFilSel_t*)malloc(sizeof *ret);
ret->parent = parent;
ret->mode = mode;
@@ -2671,7 +2622,7 @@ const char * wMemStats(void)
", Unknown Heap Status");
return msg;
}
-
+
/*
*****************************************************************************
*
@@ -2750,8 +2701,7 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
int inx;
wWin_p w;
wControl_p b, oldW;
- int child = ((GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD) != 0);
- POS_T newW, newH;
+ wWinPix_t newW, newH;
RECT rect;
PAINTSTRUCT ps;
HWND hWnd2;
@@ -2759,23 +2709,24 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
HDC hDc;
wAccelKey_e extChar;
+ LPMINMAXINFO pMMI;
switch (message) {
- case WM_GETMINMAXINFO:
- LPMINMAXINFO pMMI = (LPMINMAXINFO)lParam;
- inx = GetWindowWord(hWnd, 0);
-
- if (inx >= CONTROL_BASE && inx <= controlMap_da.cnt) {
- w = (wWin_p)controlMap(inx - CONTROL_BASE).b;
- if (w != NULL) {
- if (w->validGeometry) {
- pMMI->ptMaxTrackSize.x = w->max_width;
- pMMI->ptMaxTrackSize.y = w->max_height;
- pMMI->ptMinTrackSize.x = w->min_width;
- pMMI->ptMinTrackSize.y = w->min_height;
- }
- }
- }
- return(0);
+ case WM_GETMINMAXINFO:
+ pMMI = (LPMINMAXINFO)lParam;
+ inx = GetWindowWord(hWnd, 0);
+
+ if (inx >= CONTROL_BASE && inx <= controlMap_da.cnt) {
+ w = (wWin_p)controlMap(inx - CONTROL_BASE).b;
+ if (w != NULL) {
+ if (w->validGeometry) {
+ pMMI->ptMaxTrackSize.x = w->max_width;
+ pMMI->ptMaxTrackSize.y = w->max_height;
+ pMMI->ptMinTrackSize.x = w->min_width;
+ pMMI->ptMinTrackSize.y = w->min_height;
+ }
+ }
+ }
+ return (LRESULT)0;
case WM_MOUSEWHEEL:
inx = GetWindowWord(hWnd, 0);
@@ -2785,14 +2736,14 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
if (mswCallBacks[b->type] != NULL &&
mswCallBacks[b->type]->messageProc)
return mswCallBacks[b->type]->messageProc((wControl_p)b, hWnd,
- message, wParam, lParam);
+ message, wParam, lParam);
- return (0);
+ return (LRESULT)0;
- case WM_DRAWITEM:
case WM_COMMAND:
+ closeBalloonHelp(3);
+ case WM_DRAWITEM:
case WM_MEASUREITEM:
- closeBalloonHelp();
if (WCMD_PARAM_ID < CONTROL_BASE || WCMD_PARAM_ID > (WPARAM)controlMap_da.cnt) {
break;
@@ -2808,10 +2759,10 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
// draw the bitmap
mswDrawIcon(((LPDRAWITEMSTRUCT)lParam)->hDC, 0, 0, (wIcon_p)(b->data), FALSE,
(COLORREF)0, (COLORREF)0);
- return (TRUE);
+ return (LRESULT)TRUE;
} else {
mswSetFocus(b);
- ret = 0L;
+ ret = 0;
if (!inMainWndProc) {
inMainWndProc = TRUE;
@@ -2824,7 +2775,7 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
inMainWndProc = FALSE;
}
- return ret;
+ return (LRESULT)ret;
}
case WM_PAINT:
@@ -2846,7 +2797,7 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
}
EndPaint(hWnd, &ps);
- return 1L;
+ return (LRESULT)1;
}
break;
@@ -2876,8 +2827,8 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
case SIZE_MAXIMIZED:
case SIZE_MINIMIZED:
case SIZE_RESTORED:
- newW = LOWORD(lParam);
- newH = HIWORD(lParam);
+ newW = LOWORD(lParam);
+ newH = HIWORD(lParam);
if (newW <= 0 || newH <= 0) {
break;
@@ -2895,8 +2846,8 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
if (w->winProc) {
w->winProc(w, wResize_e, NULL, w->data);
- w->winProc(w, wState_e, NULL, w->data);
- }
+ w->winProc(w, wState_e, NULL, w->data);
+ }
break;
@@ -2924,7 +2875,7 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
if (mswCallBacks[w->type] != NULL &&
mswCallBacks[w->type]->messageProc)
return mswCallBacks[w->type]->messageProc((wControl_p)w, hWnd,
- message, wParam, lParam);
+ message, wParam, lParam);
break;
}
@@ -2942,9 +2893,20 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
}
b = getControlFromCursor(hWnd, NULL);
- closeBalloonHelp();
+ closeBalloonHelp(4);
if (b && b->type == B_DRAW) {
+ // Change Num keypad to a special code to emulate cursor keys
+ if (wParam == VK_UP ||
+ wParam == VK_DOWN ||
+ wParam == VK_RIGHT ||
+ wParam == VK_LEFT ||
+ wParam == VK_INSERT ||
+ wParam == VK_DELETE) {
+ if ((lParam & 0x1000000) == 0) {
+ lParam |= 0x1000000;
+ }
+ }
return SendMessage(b->hWnd, WM_CHAR, wParam, lParam);
}
@@ -2959,7 +2921,7 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
if (mswCallBacks[B_BUTTON] != NULL &&
mswCallBacks[B_BUTTON]->messageProc) {
ret = mswCallBacks[B_BUTTON]->messageProc(b, b->hWnd,
- WM_COMMAND, wParam, lParam);
+ WM_COMMAND, wParam, lParam);
}
inMainWndProc = FALSE;
@@ -2967,7 +2929,7 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
}
}
- return 0L;
+ return (LRESULT)0;
case 0x1B:
@@ -2979,7 +2941,7 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
if (mswCallBacks[B_BUTTON] != NULL &&
mswCallBacks[B_BUTTON]->messageProc) {
ret = mswCallBacks[B_BUTTON]->messageProc(b, b->hWnd,
- WM_COMMAND, wParam, lParam);
+ WM_COMMAND, wParam, lParam);
}
inMainWndProc = FALSE;
@@ -2988,7 +2950,7 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
}
mswSetTrigger((wControl_p)TRIGGER_TIMER, NULL);
- return 0L;
+ return (LRESULT)0;
case 0x20:
@@ -3002,7 +2964,7 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
if (mswCallBacks[b->type] != NULL &&
mswCallBacks[b->type]->messageProc) {
ret = mswCallBacks[b->type]->messageProc(b, b->hWnd,
- WM_COMMAND, MAKELPARAM(LOWORD(wParam), BN_CLICKED), (LPARAM)(b->hWnd));
+ WM_COMMAND, MAKELPARAM(LOWORD(wParam), BN_CLICKED), (LPARAM)(b->hWnd));
}
inMainWndProc = FALSE;
@@ -3010,7 +2972,7 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
}
}
- return 0L;
+ return (LRESULT)0;
case 0x09:
@@ -3041,16 +3003,16 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
}
}
- return 0L;
+ return (LRESULT)0;
}
/* Not a Draw control */
MessageBeep(MB_ICONHAND);
- return 0L;
+ return (LRESULT)0;
break;
case WM_ENABLE:
- if (wParam == 1) { /* WIN32??? */
+ if (wParam == (WPARAM)1) {
hWnd2 = SetFocus(hWnd);
}
@@ -3068,53 +3030,72 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
break;
}
- closeBalloonHelp();
+ closeBalloonHelp(5);
wHelp(b->helpStr);
- return 0L;
+ return (LRESULT)0;
case WM_SETCURSOR:
- /*if (any buttons down)
- break;*/
- wSetCursor(NULL, curCursor);
+ // Set normal Arrow cursor, DefWindowProc can override it
+ SetCursor(LoadCursor(NULL, IDC_ARROW));
if (!mswAllowBalloonHelp) {
- return TRUE;
+ break;
}
if (IsIconic(mswHWnd)) {
- return TRUE;
+ break;
}
b = getControlFromCursor(hWnd, NULL);
+#ifdef BALLOON_TRACE
+ fprintf(logFile, "SETCURSOR %s\n", b ? b->helpStr : "NULL");
+ fflush(logFile);
+#endif
if (b == balloonControlButton) {
- return TRUE;
+ //closeBalloonHelp(61);
+ break;
}
- if (/*(!IsWindowEnabled(hWnd))*/ GetActiveWindow() != hWnd ||
- (!b) || b->type == B_DRAW || b->helpStr == NULL) {
- closeBalloonHelp();
- return TRUE;
+ if (GetActiveWindow() != hWnd) {
+ closeBalloonHelp(62);
+ break;
+ }
+ if (!b) {
+ closeBalloonHelp(63);
+ break;
+ }
+ if (b->type == B_DRAW) {
+ closeBalloonHelp(64);
+ break;
+ }
+ if (b->helpStr == NULL) {
+ closeBalloonHelp(65);
+ break;
}
if (b != balloonHelpButton) {
- closeBalloonHelp();
+ closeBalloonHelp(7);
}
-
+#ifdef BALLOON_TRACE
+ fprintf(logFile, "SETCURSOR state %d\n", balloonHelpState);
+ fflush(logFile);
+#endif
if (balloonHelpState != balloonHelpIdle) {
- return TRUE;
+ break;
}
balloonHelpTimer = SetTimer(mswHWnd, BALLOONHELP_TIMER,
balloonHelpTimeOut, NULL);
- if (balloonHelpTimer == (UINT)0) {
- return TRUE;
+ if (balloonHelpTimer == (UINT_PTR)0) {
+ break;
}
balloonHelpState = balloonHelpWait;
balloonHelpButton = b;
- return TRUE;
+ break;
+
case WM_SYSCOMMAND:
inx = GetWindowWord(hWnd, 0);
@@ -3146,7 +3127,7 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
}
wWinShow(w, FALSE);
- return 0L;
+ return (LRESULT)0;
case WM_CLOSE:
inx = GetWindowWord(hWnd, 0);
@@ -3168,13 +3149,13 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
(w->winProc(w, wClose_e, NULL, NULL));
}
- return 0L;
+ return (LRESULT)0;
}
case WM_DESTROY:
if (hWnd == mswHWnd) {
PostQuitMessage(0L);
- return 0L;
+ return (LRESULT)0;
}
break;
@@ -3192,15 +3173,15 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
}
} else if (wParam == BALLOONHELP_TIMER) {
KillTimer(hWnd, balloonHelpTimer);
- balloonHelpTimer = (UINT)0;
+ balloonHelpTimer = (UINT_PTR)0;
startBalloonHelp();
}
- return 0L;
+ return (LRESULT)0;
case WM_MENUSELECT:
mswAllowBalloonHelp = TRUE;
- closeBalloonHelp();
+ closeBalloonHelp(8);
break;
case WM_WINDOWPOSCHANGED:
@@ -3221,12 +3202,12 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
case 51:
count51++;
- /*return NULL;*/
+ /*return NULL;*/
case WM_PALETTECHANGED:
if (wParam == (WPARAM)hWnd) {
- return 0L;
+ return (LRESULT)0;
}
case WM_QUERYNEWPALETTE:
@@ -3240,12 +3221,12 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
InvalidateRect(hWnd, NULL, TRUE);
}
- return inx;
+ return (LRESULT)inx;
}
case WM_ACTIVATE:
if (LOWORD(wParam) == WA_INACTIVE) {
- closeBalloonHelp();
+ closeBalloonHelp(9);
}
break;
@@ -3272,7 +3253,7 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
inMainWndProc = FALSE;
}
- return ret;
+ return (LRESULT)ret;
case WM_LBUTTONDOWN:
case WM_MOUSEMOVE:
@@ -3297,7 +3278,7 @@ MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
inMainWndProc = FALSE;
}
- return ret;
+ return (LRESULT)ret;
default:
;
@@ -3379,7 +3360,7 @@ static BOOL InitApplication(HINSTANCE hinstCurrent)
wc.cbWndExtra = 4;
if (!RegisterClass(&wc)) {
- mswFail("RegisterClass(drawClass)");
+ mswFail("RegisterClass(drawClass)");
return FALSE;
}
@@ -3401,11 +3382,11 @@ int PASCAL WinMain(HINSTANCE hinstCurrent, HINSTANCE hinstPrevious,
char **argv;
int argc;
- if (!hinstPrevious) {
- if (!InitApplication(hinstCurrent)) {
- return FALSE;
- }
- }
+ if (!hinstPrevious) {
+ if (!InitApplication(hinstCurrent)) {
+ return FALSE;
+ }
+ }
mswHInst = hinstCurrent;
mTitleH = GetSystemMetrics(SM_CYCAPTION) - 1;
@@ -3419,6 +3400,7 @@ int PASCAL WinMain(HINSTANCE hinstCurrent, HINSTANCE hinstPrevious,
mswLabelFont = GetStockObject(DEFAULT_GUI_FONT);
hDc = GetDC(0);
mswScale = GetDeviceCaps(hDc, LOGPIXELSX) / 96.0;
+ hWindowIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(101));
if (mswScale < 1.0) {
mswScale = 1.0;
@@ -3467,5 +3449,5 @@ int PASCAL WinMain(HINSTANCE hinstCurrent, HINSTANCE hinstPrevious,
HtmlHelp(NULL, NULL, HH_UNINITIALIZE, (DWORD)dwCookie);
}
- return msg.wParam;
+ return (int)msg.wParam;
}
diff --git a/app/wlib/mswlib/mswmsg.c b/app/wlib/mswlib/mswmsg.c
index 6445299..154d89d 100644
--- a/app/wlib/mswlib/mswmsg.c
+++ b/app/wlib/mswlib/mswmsg.c
@@ -1,6 +1,5 @@
#include <windows.h>
#include <string.h>
-#include <malloc.h>
#include <stdlib.h>
#include <commdlg.h>
#include <math.h>
@@ -21,20 +20,15 @@
#define SCALE_LARGE 1.6
#define SCALE_SMALL 0.8
-#ifdef CONTROL3D
-static int messageHeight = 18;
-#endif
-
struct wMessage_t {
- WOBJ_COMMON
- long flags;
- const char * message;
- };
+ WOBJ_COMMON
+ long flags;
+ const char * message;
+};
-#ifndef CONTROL3D
static void repaintMessage(
- HWND hWnd,
- wControl_p b )
+ HWND hWnd,
+ wControl_p b )
{
wMessage_p bm = (wMessage_p)b;
HDC hDc;
@@ -46,33 +40,29 @@ static void repaintMessage(
hDc = GetDC( hWnd );
- if ( !mswThickFont )
- hFont = SelectObject( hDc, mswLabelFont );
+ hFont = SelectObject( hDc, mswLabelFont );
- switch( wMessageSetFont( ((wMessage_p)b)->flags ))
- {
- case BM_LARGE:
- scale = SCALE_LARGE;
- break;
- case BM_SMALL:
- scale = SCALE_SMALL;
- break;
+ switch( wMessageSetFont( ((wMessage_p)b)->flags )) {
+ case BM_LARGE:
+ scale = SCALE_LARGE;
+ break;
+ case BM_SMALL:
+ scale = SCALE_SMALL;
+ break;
}
- /* is a non-standard text height required? */
- if( scale != 1.0 )
- {
+ /* is a non-standard text height required? */
+ if( scale != 1.0 ) {
/* if yes, get information about the standard font used */
GetObject( GetStockObject( DEFAULT_GUI_FONT ), sizeof( LOGFONT ), &msgFont );
/* change the height */
- msgFont.lfHeight = (long)((double)msgFont.lfHeight * scale);
+ msgFont.lfHeight = (long)((double)msgFont.lfHeight * scale);
/* create and activate the new font */
hFont = SelectObject( hDc, CreateFontIndirect( &msgFont ) );
} else {
- if ( !mswThickFont )
- hFont = SelectObject( hDc, mswLabelFont );
+ hFont = SelectObject( hDc, mswLabelFont );
}
GetTextMetrics(hDc, &textMetrics);
@@ -83,137 +73,107 @@ static void repaintMessage(
rect.left = bm->x;
SetBkColor( hDc, GetSysColor( COLOR_BTNFACE ) );
- ExtTextOut( hDc, bm->x, bm->y + ((bm->h + 2 - textMetrics.tmHeight) / 2), ETO_CLIPPED|ETO_OPAQUE, &rect, bm->message, strlen( bm->message ), NULL );
+ ExtTextOut( hDc, bm->x, bm->y + ((bm->h + 2 - textMetrics.tmHeight) / 2),
+ ETO_CLIPPED|ETO_OPAQUE, &rect, bm->message, (int)(strlen( bm->message )),
+ NULL );
if( scale != 1.0 )
/* in case we did create a new font earlier, delete it now */
+ {
DeleteObject( SelectObject( hDc, GetStockObject( DEFAULT_GUI_FONT )));
- else
- if ( !mswThickFont )
- SelectObject( hDc, hFont );
+ } else {
+ SelectObject( hDc, hFont );
+ }
ReleaseDC( hWnd, hDc );
}
-#endif
void wMessageSetValue(
- wMessage_p b,
- const char * arg )
+ wMessage_p b,
+ const char * arg )
{
- if (b->message)
+ if (b->message) {
free( CAST_AWAY_CONST b->message );
- if (arg)
+ }
+ if (arg) {
b->message = mswStrdup( arg );
- else
+ } else {
b->message = NULL;
-#ifdef CONTROL3D
- SetWindowText( b->hWnd, arg );
-#else
+ }
+
repaintMessage( ((wControl_p)(b->parent))->hWnd, (wControl_p)b );
-#endif
+
}
void wMessageSetWidth(
- wMessage_p b,
- wPos_t width )
+ wMessage_p b,
+ wWinPix_t width )
{
b->w = width;
-#ifdef CONTROL3D
- SetWindowPos( b->hWnd, HWND_TOP, CW_USEDEFAULT, CW_USEDEFAULT,
- width, messageHeight, SWP_NOMOVE );
-#endif
+
}
-wPos_t wMessageGetWidth(const char *string)
+wWinPix_t wMessageGetWidth(const char *string)
{
return(wLabelWidth(string));
}
-wPos_t wMessageGetHeight( long flags )
+wWinPix_t wMessageGetHeight( long flags )
{
-#ifdef CONTROL3D
- return messageHeight;
-#else
double scale = 1.0;
- if( flags & BM_LARGE )
+ if( flags & BM_LARGE ) {
scale = SCALE_LARGE;
- if( flags & BM_SMALL )
+ }
+ if( flags & BM_SMALL ) {
scale = SCALE_SMALL;
+ }
+
+ return((wWinPix_t)((mswEditHeight) * scale ));
- return((wPos_t)((mswEditHeight) * scale ));
-#endif
}
static void mswMessageSetBusy(
- wControl_p b,
- BOOL_T busy )
+ wControl_p b,
+ BOOL_T busy )
{
}
-#ifndef CONTROL3D
-static callBacks_t messageCallBacks = {
- repaintMessage,
- NULL,
- NULL,
- mswMessageSetBusy };
-#endif
+static callBacks_t messageCallBacks = {
+ repaintMessage,
+ NULL,
+ NULL,
+ mswMessageSetBusy
+};
wMessage_p wMessageCreateEx(
- wWin_p parent,
- POS_T x,
- POS_T y,
- const char * helpStr,
- POS_T width,
- const char *message,
- long flags )
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ wWinPix_t width,
+ const char *message,
+ long flags )
{
wMessage_p b;
int index;
-
-#ifdef CONTROL3D
- RECT rect;
-#endif
-
+
+
b = (wMessage_p)mswAlloc( parent, B_MESSAGE, NULL, sizeof *b, NULL, &index );
mswComputePos( (wControl_p)b, x, y );
b->option |= BO_READONLY;
b->message = mswStrdup( message );
b->flags = flags;
-#ifdef CONTROL3D
- if ( width <= 0 && strlen(b->message) > 0 ) {
- width = wLabelWidth( b->message );
- }
-
- b->hWnd = CreateWindow( "STATIC", NULL,
- SS_LEFTNOWORDWRAP | WS_CHILD | WS_VISIBLE,
- b->x, b->y,
- width, messageHeight,
- ((wControl_p)parent)->hWnd, (HMENU)index, mswHInst, NULL );
- if (b->hWnd == NULL) {
- mswFail("CreateWindow(MESSAGE)");
- return b;
- }
-
- if ( !mswThickFont )
- SendMessage( b->hWnd, WM_SETFONT, (WPARAM)mswLabelFont, 0L );
- SetWindowText( b->hWnd, message );
-
- GetWindowRect( b->hWnd, &rect );
- b->w = rect.right - rect.left;
- b->h = rect.bottom - rect.top;
-#else
b->w = width;
b->h = wMessageGetHeight( flags ) + 1;
repaintMessage( ((wControl_p)parent)->hWnd, (wControl_p)b );
-#endif
+
mswAddButton( (wControl_p)b, FALSE, helpStr );
-#ifndef CONTROL3D
mswCallBacks[B_MESSAGE] = &messageCallBacks;
-#endif
+
return b;
}
diff --git a/app/wlib/mswlib/mswpref.c b/app/wlib/mswlib/mswpref.c
index 201171a..e65b0dd 100644
--- a/app/wlib/mswlib/mswpref.c
+++ b/app/wlib/mswlib/mswpref.c
@@ -1,17 +1,15 @@
#include <windows.h>
#include <string.h>
-#include <malloc.h>
#include <stdlib.h>
#include <commdlg.h>
#include <math.h>
#include <stdio.h>
-#include "misc.h"
#include "mswint.h"
#include <shlobj.h>
#include <Shlwapi.h>
#if _MSC_VER >=1400
- #define stricmp _stricmp
+#define stricmp _stricmp
#endif
char * mswStrdup( const char * );
@@ -27,38 +25,41 @@ static char appWorkDirName[MAX_PATH];
const char * wGetAppLibDir( void )
{
- char *cp;
- char module_name[MAX_PATH];
+ char *cp;
+ char module_name[MAX_PATH];
- if (appLibDirName[0] != '\0') {
- return appLibDirName;
- }
+ if (appLibDirName[0] != '\0') {
+ return appLibDirName;
+ }
- GetModuleFileName( mswHInst, module_name, sizeof module_name );
- cp = strrchr( module_name, '\\' );
- if (cp)
- *cp = '\0';
+ GetModuleFileName( mswHInst, module_name, sizeof module_name );
+ cp = strrchr( module_name, '\\' );
+ if (cp) {
+ *cp = '\0';
+ }
#ifdef XTRKCAD_CMAKE_BUILD
- strcpy(appLibDirName, module_name);
- strcat(appLibDirName, "\\..\\share\\xtrkcad");
- _fullpath( appLibDirName, appLibDirName, MAX_PATH );
- return appLibDirName;
-#endif
-
- strcpy(appLibDirName, module_name);
- return appLibDirName;
+ strncpy(appLibDirName, module_name, sizeof(appLibDirName));
+ size_t len = sizeof(appLibDirName)-strlen(appLibDirName)-1;
+ strncat(appLibDirName, "\\..\\share\\xtrkcad", len);
+ _fullpath( appLibDirName, appLibDirName, MAX_PATH );
+ return appLibDirName;
+#endif
+
+ strncpy(appLibDirName, module_name, sizeof(appLibDirName));
+ appLibDirName[sizeof(appLibDirName)-1] = '\0';
+ return appLibDirName;
}
/**
- * Gets the working directory for the application. At least the INI file is stored here.
+ * Gets the working directory for the application. At least the INI file is stored here.
* The working directory can be specified manually by creating a file called xtrkcad0.ini
- * in the application lib dir (the directory where the .EXE is located).
+ * in the application lib dir (the directory where the .EXE is located).
*
* [workdir]
* path=somepath
- *
+ *
* when somepath is set to the keyword "installdir", the install directory for the EXE is
* used.
*
@@ -67,209 +68,302 @@ const char * wGetAppLibDir( void )
*/
const char * wGetAppWorkDir( void )
{
- char *cp;
- int rc;
- if ( appWorkDirName[0] != 0 ) {
- return appWorkDirName;
- }
- wGetAppLibDir();
- sprintf( mswTmpBuff, "%s\\xtrkcad0.ini", appLibDirName );
- rc = GetPrivateProfileString( "workdir", "path", "", appWorkDirName, sizeof appWorkDirName, mswTmpBuff );
- if ( rc!=0 ) {
- if ( stricmp( appWorkDirName, "installdir" ) == 0 ) {
- strcpy( appWorkDirName, appLibDirName );
- } else {
- cp = &appWorkDirName[strlen(appWorkDirName)-1];
- while (cp>appWorkDirName && *cp == '\\') *cp-- = 0;
- }
- return appWorkDirName;
- }
-
- if (SHGetSpecialFolderPath( NULL, mswTmpBuff, CSIDL_APPDATA, 0 ) == 0 ) {
- wNoticeEx( NT_ERROR, "Cannot get user's profile directory", "Exit", NULL );
- wExit(0);
- } else {
- sprintf( appWorkDirName, "%s\\%s", mswTmpBuff, "XTrackCad" );
- if( !PathIsDirectory( appWorkDirName )) {
- if( !CreateDirectory( appWorkDirName, NULL )) {
- wNoticeEx( NT_ERROR, "Cannot create user's profile directory", "Exit", NULL );
- wExit(0);
- }
- }
- }
-
- return appWorkDirName;
+ char *cp;
+ int rc;
+ if ( appWorkDirName[0] != 0 ) {
+ return appWorkDirName;
+ }
+ wGetAppLibDir();
+ snprintf( mswTmpBuff, sizeof(mswTmpBuff), "%s\\xtrkcad0.ini", appLibDirName );
+ rc = GetPrivateProfileString( "workdir", "path", "", appWorkDirName,
+ sizeof appWorkDirName, mswTmpBuff );
+ if ( rc!=0 ) {
+ if ( stricmp( appWorkDirName, "installdir" ) == 0 ) {
+ strncpy( appWorkDirName, appLibDirName, sizeof(appWorkDirName) );
+ appWorkDirName[sizeof(appWorkDirName)-1] = '\0';
+ } else {
+ cp = &appWorkDirName[strlen(appWorkDirName)-1];
+ while (cp>appWorkDirName && *cp == '\\') {
+ *cp-- = 0;
+ }
+ }
+ return appWorkDirName;
+ }
+
+ if (SHGetSpecialFolderPath( NULL, mswTmpBuff, CSIDL_APPDATA, 0 ) == 0 ) {
+ wNoticeEx( NT_ERROR, "Cannot get user's profile directory", "Exit", NULL );
+ wExit(0);
+ } else {
+ snprintf( appWorkDirName, sizeof(appWorkDirName), "%s\\%s", mswTmpBuff,
+ "XTrackCad" );
+ if( !PathIsDirectory( appWorkDirName )) {
+ if( !CreateDirectory( appWorkDirName, NULL )) {
+ wNoticeEx( NT_ERROR, "Cannot create user's profile directory", "Exit", NULL );
+ wExit(0);
+ }
+ }
+ }
+
+ return appWorkDirName;
}
-/** Get the user's home directory. The environment variable HOME is
- * assumed to contain the proper directory.
+/** Get the user's Documents directory.
*
- * \return pointer to the user's home directory
+ * \return pointer to the user's Documents directory
*/
const char *wGetUserHomeDir( void )
{
- if (SHGetSpecialFolderPath( NULL, mswTmpBuff, CSIDL_PERSONAL, 0 ) == 0 ) {
- wNoticeEx( NT_ERROR, "Cannot get user's home directory", "Exit", NULL );
- wExit(0);
- return( NULL );
- } else {
- return( mswTmpBuff );
- }
+ if (SHGetSpecialFolderPath( NULL, mswTmpBuff, CSIDL_PERSONAL, 0 ) == 0 ) {
+ wNoticeEx( NT_ERROR, "Cannot get user's documents directory", "Exit", NULL );
+ wExit(0);
+ return( NULL );
+ } else {
+ return( mswTmpBuff );
+ }
}
typedef struct {
- char * section;
- char * name;
- BOOL_T present;
- BOOL_T dirty;
- char * val;
- } prefs_t;
-dynArr_t prefs_da;
+ char * section;
+ char * name;
+ BOOL_T present;
+ BOOL_T dirty;
+ char * val;
+} prefs_t;
+
+static dynArr_t prefs_da;
#define prefs(N) DYNARR_N(prefs_t,prefs_da,N)
-void wPrefSetString( const char * section, const char * name, const char * sval )
+void wPrefSetString( const char * section, const char * name,
+ const char * sval )
{
- prefs_t * p;
-
- for (p=&prefs(0); p<&prefs(prefs_da.cnt); p++) {
- if ( strcmp( p->section, section ) == 0 && strcmp( p->name, name ) == 0 ) {
- if (p->val)
- free(p->val);
- p->dirty = TRUE;
- p->val = mswStrdup( sval );
- return;
- }
- }
- DYNARR_APPEND( prefs_t, prefs_da, 10 );
- p = &prefs(prefs_da.cnt-1);
- p->name = mswStrdup(name);
- p->section = mswStrdup(section);
- p->dirty = TRUE;
- p->val = mswStrdup(sval);
+ prefs_t * p;
+
+ for (p=&prefs(0); p<&prefs(prefs_da.cnt); p++) {
+ if ( strcmp( p->section, section ) == 0 && strcmp( p->name, name ) == 0 ) {
+ if (p->val) {
+ free(p->val);
+ }
+ p->dirty = TRUE;
+ p->val = mswStrdup( sval );
+ return;
+ }
+ }
+ DYNARR_APPEND( prefs_t, prefs_da, 10 );
+ p = &prefs(prefs_da.cnt-1);
+ p->name = mswStrdup(name);
+ p->section = mswStrdup(section);
+ p->dirty = TRUE;
+ p->val = mswStrdup(sval);
}
+void wPrefsLoad(char * name)
+{
+ prefs_t *p;
+ for (int i= 0; i<prefs_da.cnt; i++) {
+ p = &prefs(i);
+ if (!name || !name[0]) {
+ name = mswProfileFile;
+ }
+ int rc = GetPrivateProfileString( p->section, p->name, "", mswTmpBuff,
+ sizeof mswTmpBuff, name );
+ if (rc==0) {
+ continue;
+ }
+ p->val = mswStrdup(mswTmpBuff);
+ }
+}
char * wPrefGetStringBasic( const char * section, const char * name )
{
- prefs_t * p;
- int rc;
-
- for (p=&prefs(0); p<&prefs(prefs_da.cnt); p++) {
- if ( strcmp( p->section, section ) == 0 && strcmp( p->name, name ) == 0 ) {
- return p->val;
- }
- }
- rc = GetPrivateProfileString( section, name, "", mswTmpBuff, sizeof mswTmpBuff, mswProfileFile );
- if (rc==0)
- return NULL;
- DYNARR_APPEND( prefs_t, prefs_da, 10 );
- p = &prefs(prefs_da.cnt-1);
- p->name = mswStrdup(name);
- p->section = mswStrdup(section);
- p->dirty = FALSE;
- p->val = mswStrdup(mswTmpBuff);
- return p->val;
+ prefs_t * p;
+ int rc;
+
+ for (p=&prefs(0); p<&prefs(prefs_da.cnt); p++) {
+ if ( strcmp( p->section, section ) == 0 && strcmp( p->name, name ) == 0 ) {
+ return p->val;
+ }
+ }
+
+ rc = GetPrivateProfileString( section, name, "", mswTmpBuff, sizeof mswTmpBuff,
+ mswProfileFile );
+ if (rc==0) {
+ return NULL;
+ }
+ DYNARR_APPEND( prefs_t, prefs_da, 10 );
+ p = &prefs(prefs_da.cnt-1);
+ p->name = mswStrdup(name);
+ p->section = mswStrdup(section);
+ p->dirty = FALSE;
+ p->val = mswStrdup(mswTmpBuff);
+ return p->val;
}
void wPrefSetInteger( const char * section, const char * name, long lval )
{
- char tmp[20];
-
- sprintf( tmp, "%ld", lval );
- wPrefSetString( section, name, tmp );
+ char tmp[20];
+
+ snprintf( tmp, sizeof(tmp), "%ld", lval );
+ wPrefSetString( section, name, tmp );
}
wBool_t wPrefGetIntegerBasic(
- const char * section,
- const char * name,
- long *res,
- long def )
+ const char * section,
+ const char * name,
+ long *res,
+ long def )
{
- const char * cp;
- char * cp1;
-
- cp = wPrefGetStringBasic( section, name );
- if (cp == NULL) {
- *res = def;
- return FALSE;
- }
- *res = strtol(cp,&cp1,0);
- if (cp==cp1) {
- *res = def;
- return FALSE;
- }
- return TRUE;
+ const char * cp;
+ char * cp1;
+
+ cp = wPrefGetStringBasic( section, name );
+ if (cp == NULL) {
+ *res = def;
+ return FALSE;
+ }
+ *res = strtol(cp,&cp1,0);
+ if (cp==cp1) {
+ *res = def;
+ return FALSE;
+ }
+ return TRUE;
}
void wPrefSetFloat(
- const char * section, /* Section */
- const char * name, /* Name */
- double lval ) /* Value */
+ const char * section, /* Section */
+ const char * name, /* Name */
+ double lval ) /* Value */
/*
*/
{
- char tmp[20];
+ char tmp[20];
- sprintf(tmp, "%0.6f", lval );
- wPrefSetString( section, name, tmp );
+ snprintf(tmp, sizeof(tmp), "%0.6f", lval );
+ wPrefSetString( section, name, tmp );
}
wBool_t wPrefGetFloatBasic(
- const char * section, /* Section */
- const char * name, /* Name */
- double * res, /* Address of result */
- double def ) /* Default value */
+ const char * section, /* Section */
+ const char * name, /* Name */
+ double * res, /* Address of result */
+ double def ) /* Default value */
/*
*/
{
- const char * cp;
- char * cp1;
-
- cp = wPrefGetStringBasic( section, name );
- if (cp == NULL) {
- *res = def;
- return FALSE;
- }
- *res = strtod(cp, &cp1);
- if (cp == cp1) {
- *res = def;
- return FALSE;
- }
- return TRUE;
+ const char * cp;
+ char * cp1;
+
+ cp = wPrefGetStringBasic( section, name );
+ if (cp == NULL) {
+ *res = def;
+ return FALSE;
+ }
+ *res = strtod(cp, &cp1);
+ if (cp == cp1) {
+ *res = def;
+ return FALSE;
+ }
+ return TRUE;
}
-void wPrefFlush( void )
+void wPrefFlush( char * name )
{
- prefs_t * p;
-
- for (p=&prefs(0); p<&prefs(prefs_da.cnt); p++) {
- if ( p->dirty )
- WritePrivateProfileString( p->section, p->name, p->val, mswProfileFile );
- }
- WritePrivateProfileString( NULL, NULL, NULL, mswProfileFile );
+ prefs_t * p;
+
+ for (p=&prefs(0); p<&prefs(prefs_da.cnt); p++) {
+ if (name && name[0]) {
+ WritePrivateProfileString( p->section, p->name, p->val, name );
+ } else if (p->dirty) {
+ WritePrivateProfileString( p->section, p->name, p->val, mswProfileFile );
+ }
+ }
+ if (name && name[0]) {
+ WritePrivateProfileString( NULL, NULL, NULL, name );
+ } else {
+ WritePrivateProfileString( NULL, NULL, NULL, mswProfileFile );
+ }
}
void wPrefReset(
- void )
+ void )
/*
*/
{
- prefs_t * p;
-
- for (p=&prefs(0); p<&prefs(prefs_da.cnt); p++) {
- if (p->section)
- free( p->section );
- if (p->name)
- free( p->name );
- if (p->val)
- free( p->val );
- }
- prefs_da.cnt = 0;
+ prefs_t * p;
+
+ for (p=&prefs(0); p<&prefs(prefs_da.cnt); p++) {
+ if (p->section) {
+ free( p->section );
+ }
+ if (p->name) {
+ free( p->name );
+ }
+ if (p->val) {
+ free( p->val );
+ }
+ }
+ prefs_da.cnt = 0;
}
+
+/**
+ * Split a line from the config file ie. an ini-file into separate tokens. The
+ * line is split into sections, name of value and value following. Pointers
+ * to the respective token are returned. These are zero-terminated.
+ * If a token is not present, NULL is returned instead.
+ * The input line is modified.
+ *
+ * \param line input line, modified during excution of function
+ * \param section section if present
+ * \param name name of config value if present
+ * \param value name of value if present
+ */
+
+void
+wPrefTokenize(char* line, char** section, char** name, char** value)
+{
+ *section = NULL;
+ *name = NULL;
+ *value = NULL;
+
+ if (*line == '[') {
+ *section = strtok(line, "[]");
+ } else {
+ *name = strtok(line, "=");
+ *value = strtok(NULL, "\n");
+ }
+}
+
+/**
+ * A valid line for a config file is created from the individual elements.
+ * Values not need for specific statement are ignored. Eg. when section is
+ * present, name and value are not used.
+ * The caller has to make sure, that the return buffer is large enough.
+ *
+ * \param section section, returned inside squared brackets
+ * \param name name, left side of '='
+ * \param value value, right side of '='
+ * \param result pointer to buffer for formated line.
+ */
+
+void
+wPrefFormatLine(const char* section, const char* name,
+ const char* value, char* result)
+{
+ if (!value || *value == '\0') {
+ value = "";
+ }
+
+ if (section) {
+ sprintf(result, "[%s]", section);
+ }
+ else {
+ sprintf(result, "%s=%s", name, value);
+ }
+}
+
diff --git a/app/wlib/mswlib/mswprint.c b/app/wlib/mswlib/mswprint.c
index 13756c7..9a7f65b 100644
--- a/app/wlib/mswlib/mswprint.c
+++ b/app/wlib/mswlib/mswprint.c
@@ -1,12 +1,8 @@
#include <windows.h>
#include <string.h>
-#include <malloc.h>
#include <stdlib.h>
#include <commdlg.h>
#include <math.h>
-#ifndef WIN32
-#include <print.h>
-#endif
#include "mswint.h"
/*
@@ -18,13 +14,9 @@
*/
-struct wDraw_t print_d;
+static struct wDraw_t print_d;
-#ifdef WIN32
-struct tagPDA printDlg;
-#else
-struct tagPD printDlg;
-#endif
+static struct tagPDA printDlg;
static int printStatus = FALSE;
static DOCINFO docInfo;
static double tBorder = 0.0, rBorder = 0.0, bBorder = 0.0, lBorder = 0.0;
@@ -35,7 +27,7 @@ static HPALETTE newPrintPalette;
static HPALETTE oldPrintPalette;
-void wPrintClip( wPos_t x, wPos_t y, wPos_t w, wPos_t h )
+void wPrintClip( wDrawPix_t x, wDrawPix_t y, wDrawPix_t w, wDrawPix_t h )
{
wDrawClip( &print_d, x, y, w, h );
}
@@ -49,11 +41,11 @@ void getPageDim( HDC hDc )
int res_w, res_h, size_w, size_h;
rc = Escape( hDc, GETPHYSPAGESIZE, 0, NULL, (LPPOINT)&dims );
if (rc <0) {
- mswFail( "GETPHYPAGESIZE" );
+ mswFail( "GETPHYPAGESIZE" );
}
rc = Escape( hDc, GETPRINTINGOFFSET, 0, NULL, (LPPOINT)&offs );
if (rc <0) {
- mswFail( "GETPRINTINGOFFSET" );
+ mswFail( "GETPRINTINGOFFSET" );
}
print_d.wFactor = (double)GetDeviceCaps( hDc, LOGPIXELSX );
print_d.hFactor = (double)GetDeviceCaps( hDc, LOGPIXELSY );
@@ -122,17 +114,18 @@ static wBool_t printInit( void )
while (*temp) {
if (*temp == ',') {
*temp++ = 0;
- while( *temp == ' ' )
+ while( *temp == ' ' ) {
temp++;
- if (!ptrDrvr)
+ }
+ if (!ptrDrvr) {
ptrDrvr = temp;
- else {
+ } else {
ptrPort = temp;
break;
}
- }
- else
+ } else {
temp = AnsiNext(temp);
+ }
}
strcpy( ptrDrvrDvr, ptrDrvr );
strcat( ptrDrvrDvr, ".drv" );
@@ -141,9 +134,11 @@ static wBool_t printInit( void )
return FALSE;
}
if (( extDeviceMode = GetProcAddress( hDriver, "ExtDeviceMode" )) != NULL) {
- size = extDeviceMode( mswHWnd, (HANDLE)hDriver, (LPDEVMODE)NULL, (LPSTR)ptrDevice, (LPSTR)ptrPort, (LPDEVMODE)NULL, (LPSTR)NULL, 0 );
+ size = extDeviceMode( mswHWnd, (HANDLE)hDriver, (LPDEVMODE)NULL,
+ (LPSTR)ptrDevice, (LPSTR)ptrPort, (LPDEVMODE)NULL, (LPSTR)NULL, 0 );
printMode = (DEVMODE*)malloc( size );
- rc = extDeviceMode( mswHWnd, (HANDLE)hDriver, (LPDEVMODE)printMode, (LPSTR)ptrDevice, (LPSTR)ptrPort, (LPDEVMODE)NULL, (LPSTR)NULL, DM_OUT_BUFFER );
+ rc = extDeviceMode( mswHWnd, (HANDLE)hDriver, (LPDEVMODE)printMode,
+ (LPSTR)ptrDevice, (LPSTR)ptrPort, (LPDEVMODE)NULL, (LPSTR)NULL, DM_OUT_BUFFER );
#ifdef LATER
if (rc != IDOK && rc != IDCANCEL) {
mswFail( "printInit: extDeviceMode" );
@@ -167,7 +162,7 @@ static wBool_t printInit( void )
}
getPageDim( hDc );
DeleteDC( hDc );
-
+
FreeLibrary( hDriver );
#endif
printerOk = TRUE;
@@ -196,9 +191,9 @@ void wPrintSetup( wPrintSetupCallBack_p callback )
if (PrintDlg(&printDlg) != 0 && printDlg.hDC) {
getPageDim( printDlg.hDC );
}
- if ( callback ) {
- callback( TRUE );
- }
+ //if ( callback ) {
+ // callback( TRUE );
+ //}
}
const char* wPrintGetName()
@@ -208,9 +203,9 @@ const char* wPrintGetName()
DEVNAMES* pDevNames = GlobalLock(hDevNames);
if (pDevNames == NULL) {
strcpy(sPrinterName, "Printer");
- }
- else {
- strncpy(sPrinterName, (char*)pDevNames + pDevNames->wDeviceOffset, sizeof sPrinterName - 1);
+ } else {
+ strncpy(sPrinterName, (char*)pDevNames + pDevNames->wDeviceOffset,
+ sizeof sPrinterName - 1);
sPrinterName[sizeof sPrinterName - 1] = '\0';
}
GlobalUnlock( hDevNames );
@@ -218,15 +213,15 @@ const char* wPrintGetName()
}
void wPrintGetMargins(
- double * tMargin,
- double * rMargin,
- double * bMargin,
- double * lMargin )
+ double * tMargin,
+ double * rMargin,
+ double * bMargin,
+ double * lMargin )
{
- if ( tMargin ) *tMargin = tBorder;
- if ( rMargin ) *rMargin = rBorder;
- if ( bMargin ) *bMargin = bBorder;
- if ( lMargin ) *lMargin = lBorder;
+ if ( tMargin ) { *tMargin = tBorder; }
+ if ( rMargin ) { *rMargin = rBorder; }
+ if ( bMargin ) { *bMargin = bBorder; }
+ if ( lMargin ) { *lMargin = lBorder; }
}
@@ -247,16 +242,17 @@ HDC mswGetPrinterDC( void )
printDlg.lStructSize = sizeof printDlg;
printDlg.hwndOwner = NULL;
printDlg.Flags = PD_RETURNDC|PD_NOPAGENUMS|PD_NOSELECTION;
- if (PrintDlg(&printDlg) != 0)
+ if (PrintDlg(&printDlg) != 0) {
return printDlg.hDC;
- else
+ } else {
return (HDC)0;
+ }
}
static wBool_t printAbort = FALSE;
-HWND hAbortDlgWnd;
-FARPROC lpAbortDlg, lpAbortProc;
+static HWND hAbortDlgWnd;
+static FARPROC lpAbortDlg, lpAbortProc;
static int pageNumber;
int FAR PASCAL mswAbortDlg( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
@@ -297,51 +293,55 @@ wBool_t wPrintDocStart( const char * title, int fpageCount, int * copiesP )
if (print_d.hDc == (HDC)0) {
return FALSE;
}
- printStatus = TRUE;
- docInfo.cbSize = sizeof docInfo;
- docInfo.lpszDocName = title;
- docInfo.lpszOutput = NULL;
- lpAbortDlg = MakeProcInstance( (FARPROC)mswAbortDlg, mswHInst );
- lpAbortProc = MakeProcInstance( (FARPROC)mswAbortProc, mswHInst );
- SetAbortProc( print_d.hDc, (ABORTPROC)lpAbortProc );
- if (StartDoc( print_d.hDc, &docInfo ) < 0) {
- MessageBox( mswHWnd, "Unable to start print job",
- NULL, MB_OK|MB_ICONHAND );
- FreeProcInstance( lpAbortDlg );
- FreeProcInstance( lpAbortProc );
- DeleteDC( print_d.hDc );
- return FALSE;
- }
- printAbort = FALSE;
- hAbortDlgWnd = CreateDialog( mswHInst, "MswAbortDlg", mswHWnd,
- (DLGPROC)lpAbortDlg );
- /*SetDlgItemText( hAbortDlgWnd, IDM_PRINTAPP, title );*/
- SetWindowText( hAbortDlgWnd, title );
- ShowWindow( hAbortDlgWnd, SW_NORMAL );
- UpdateWindow( hAbortDlgWnd );
- EnableWindow( mswHWnd, FALSE );
- if (copiesP)
- *copiesP = printDlg.nCopies;
- if (printDlg.nCopies>1)
- pageCount *= printDlg.nCopies;
- if ( (GetDeviceCaps( printDlg.hDC, RASTERCAPS ) & RC_PALETTE) ) {
- newPrintPalette = mswCreatePalette();
- oldPrintPalette = SelectPalette( printDlg.hDC, newPrintPalette, 0 );
- RealizePalette( printDlg.hDC );
- }
- return TRUE;
+ printStatus = TRUE;
+ docInfo.cbSize = sizeof docInfo;
+ docInfo.lpszDocName = title;
+ docInfo.lpszOutput = NULL;
+ lpAbortDlg = MakeProcInstance( (FARPROC)mswAbortDlg, mswHInst );
+ lpAbortProc = MakeProcInstance( (FARPROC)mswAbortProc, mswHInst );
+ SetAbortProc( print_d.hDc, (ABORTPROC)lpAbortProc );
+ if (StartDoc( print_d.hDc, &docInfo ) < 0) {
+ MessageBox( mswHWnd, "Unable to start print job",
+ NULL, MB_OK|MB_ICONHAND );
+ FreeProcInstance( lpAbortDlg );
+ FreeProcInstance( lpAbortProc );
+ DeleteDC( print_d.hDc );
+ return FALSE;
+ }
+ printAbort = FALSE;
+ hAbortDlgWnd = CreateDialog( mswHInst, "MswAbortDlg", mswHWnd,
+ (DLGPROC)lpAbortDlg );
+ /*SetDlgItemText( hAbortDlgWnd, IDM_PRINTAPP, title );*/
+ SetWindowText( hAbortDlgWnd, title );
+ ShowWindow( hAbortDlgWnd, SW_NORMAL );
+ UpdateWindow( hAbortDlgWnd );
+ EnableWindow( mswHWnd, FALSE );
+ if (copiesP) {
+ *copiesP = printDlg.nCopies;
+ }
+ if (printDlg.nCopies>1) {
+ pageCount *= printDlg.nCopies;
+ }
+ if ( (GetDeviceCaps( printDlg.hDC, RASTERCAPS ) & RC_PALETTE) ) {
+ newPrintPalette = mswCreatePalette();
+ oldPrintPalette = SelectPalette( printDlg.hDC, newPrintPalette, 0 );
+ RealizePalette( printDlg.hDC );
+ }
+ return TRUE;
}
wDraw_p wPrintPageStart( void )
{
char pageL[80];
- if (!printStatus)
+ if (!printStatus) {
return NULL;
+ }
pageNumber++;
- if (pageCount > 0)
+ if (pageCount > 0) {
wsprintf( pageL, "Page %d of %d", pageNumber, pageCount );
- else
+ } else {
wsprintf( pageL, "Page %d", pageNumber );
+ }
SetDlgItemText( hAbortDlgWnd, IDM_PRINTPAGE, pageL );
StartPage( printDlg.hDC );
#ifdef LATER
@@ -374,15 +374,16 @@ wBool_t wPrintQuit( void )
void wPrintDocEnd( void )
{
- if (!printStatus)
+ if (!printStatus) {
return;
+ }
EndDoc( printDlg.hDC );
if ( newPrintPalette ) {
SelectPalette( printDlg.hDC, oldPrintPalette, 0 );
DeleteObject( newPrintPalette );
newPrintPalette = (HPALETTE)0;
}
-
+
EnableWindow( mswHWnd, TRUE );
DestroyWindow( hAbortDlgWnd );
FreeProcInstance( lpAbortDlg );
@@ -401,7 +402,8 @@ wBool_t wPrintNewPrinter( const char * printer )
return TRUE;
}
-wBool_t wPrintNewMargin( const char * name, double t, double b, double l, double r )
+wBool_t wPrintNewMargin( const char * name, double t, double b, double l,
+ double r )
{
return TRUE;
}
diff --git a/app/wlib/mswlib/mswsplash.c b/app/wlib/mswlib/mswsplash.c
index 172b563..848bd00 100644
--- a/app/wlib/mswlib/mswsplash.c
+++ b/app/wlib/mswlib/mswsplash.c
@@ -2,27 +2,26 @@
* Splash window for Windows
*/
- /* XTrkCad - Model Railroad CAD
- * Copyright (C) 2007 Martin Fischer
- *
- * 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.
- */
+/* XTrkCad - Model Railroad CAD
+* Copyright (C) 2007 Martin Fischer
+*
+* 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 <windows.h>
#include <string.h>
-#include <malloc.h>
#include <stdlib.h>
#include <commdlg.h>
#include <math.h>
@@ -41,13 +40,13 @@ static HWND hSplash;
static LPWORD lpwAlign( LPWORD lpIn )
{
- ULONG ul;
+ ULONGLONG ul;
- ul = (ULONG) lpIn;
- ul +=3;
- ul >>=2;
- ul <<=2;
- return (LPWORD) ul;
+ ul = (ULONGLONG) lpIn;
+ ul +=3;
+ ul >>=2;
+ ul <<=2;
+ return (LPWORD) ul;
}
/**
@@ -57,7 +56,7 @@ static LPWORD lpwAlign( LPWORD lpIn )
BOOL
PaintBitmap( HWND hWnd, HBITMAP hBmp )
{
- HDC hdc, hdcMem;
+ HDC hdc, hdcMem;
RECT rect;
HGDIOBJ oldObject;
@@ -66,19 +65,19 @@ PaintBitmap( HWND hWnd, HBITMAP hBmp )
/* get device context for destination window ( the dialog control ) */
hdc = GetDC( hWnd );
GetClientRect( hWnd, &rect );
-
+
/* create a memory dc holding the bitmap */
hdcMem = CreateCompatibleDC( hdc );
oldObject = SelectObject( hdcMem, hBmp );
- /*
- show it in the upper left corner
- the window is created with the size of the bitmap, so there is no need
- for any special transformation
+ /*
+ show it in the upper left corner
+ the window is created with the size of the bitmap, so there is no need
+ for any special transformation
*/
BitBlt( hdc, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top,
- hdcMem, 0, 0, SRCCOPY );
+ hdcMem, 0, 0, SRCCOPY );
/* release the DCs that are not needed any more */
SelectObject(hdcMem, oldObject);
@@ -89,31 +88,31 @@ PaintBitmap( HWND hWnd, HBITMAP hBmp )
}
/**
- * This is the dialog procedure for the splash window. Main activity is to
+ * This is the dialog procedure for the splash window. Main activity is to
* catch the WM_PAINT message and draw the logo bitmap into that area.
*/
-BOOL CALLBACK
+BOOL CALLBACK
SplashDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
{
static HWND hWndBmp;
static HBITMAP hBmp;
switch( msg ) {
- case WM_INITDIALOG:
- /* bitmap handle is passed at dialog creation */
- hBmp = (HBITMAP)lParam;
-
- hWndBmp = GetDlgItem( hDlg, IDBITMAP );
- return TRUE;
- case WM_PAINT:
- /* paint the logo bitmap */
- PaintBitmap( hWndBmp, hBmp );
- break;
- case WM_DESTROY:
- /* destroy the bitmap */
- DeleteObject( hBmp );
- break;
+ case WM_INITDIALOG:
+ /* bitmap handle is passed at dialog creation */
+ hBmp = (HBITMAP)lParam;
+
+ hWndBmp = GetDlgItem( hDlg, IDBITMAP );
+ return TRUE;
+ case WM_PAINT:
+ /* paint the logo bitmap */
+ PaintBitmap( hWndBmp, hBmp );
+ break;
+ case WM_DESTROY:
+ /* destroy the bitmap */
+ DeleteObject( hBmp );
+ break;
}
return FALSE;
}
@@ -133,7 +132,7 @@ int
wCreateSplash( char *appname, char *appver )
{
HGLOBAL hgbl;
- LPDLGTEMPLATE lpdt;
+ LPDLGTEMPLATE lpdt;
LPWORD lpw;
LPDLGITEMTEMPLATE lpdit;
int cxDlgUnit, cyDlgUnit;
@@ -148,61 +147,66 @@ wCreateSplash( char *appname, char *appver )
cyDlgUnit = HIWORD(GetDialogBaseUnits());
/* load the logo bitmap */
- sprintf( logoPath, "%s\\logo.bmp", wGetAppLibDir());
- hBmp = LoadImage( mswHInst, logoPath, IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE );
- if( !hBmp )
+ snprintf( logoPath, sizeof(logoPath), "%s\\logo.bmp", wGetAppLibDir());
+ hBmp = LoadImage( mswHInst, logoPath, IMAGE_BITMAP, 0, 0,
+ LR_DEFAULTCOLOR | LR_LOADFROMFILE );
+ if( !hBmp ) {
return( 0 );
+ }
- /* get info about the loaded logo file */
+ /* get info about the loaded logo file */
GetObject( hBmp, sizeof(BITMAP), (LPVOID)&bmp );
/* calculate the size of dialog box */
cx = (bmp.bmWidth * 4) / cxDlgUnit; /* start with the size of the bitmap */
- cy = (bmp.bmHeight * 8) / cyDlgUnit + 20; /* 20 is enough for two lines of text and some room */
+ cy = (bmp.bmHeight * 8) / cyDlgUnit +
+ 20; /* 20 is enough for two lines of text and some room */
/* allocate memory block for dialog template */
hgbl = GlobalAlloc(GMEM_ZEROINIT, 1024);
- if (!hgbl)
+ if (!hgbl) {
return -1;
- lpdt = (LPDLGTEMPLATE)GlobalLock(hgbl);
+ }
+ lpdt = (LPDLGTEMPLATE)GlobalLock(hgbl);
- /* Define a dialog box. */
- lpdt->style = WS_POPUP | WS_BORDER | WS_VISIBLE | DS_MODALFRAME | DS_CENTER;
- lpdt->cdit = 3; // number of controls
- lpdt->x = 0; lpdt->y = 0;
- lpdt->cx = cx; lpdt->cy = cy;
+ /* Define a dialog box. */
+ lpdt->style = WS_POPUP | WS_BORDER | WS_VISIBLE | DS_MODALFRAME | DS_CENTER;
+ lpdt->cdit = 3; // number of controls
+ lpdt->x = 0; lpdt->y = 0;
+ lpdt->cx = cx; lpdt->cy = cy;
- lpw = (LPWORD) (lpdt + 1);
- *lpw++ = 0; /* no menu */
- *lpw++ = 0; /* predefined dialog box class (by default) */
- *lpw++ = 0;
+ lpw = (LPWORD) (lpdt + 1);
+ *lpw++ = 0; /* no menu */
+ *lpw++ = 0; /* predefined dialog box class (by default) */
+ *lpw++ = 0;
/* add the static control for the logo bitmap */
lpdit = (LPDLGITEMTEMPLATE)lpwAlign(lpw);
lpdit->x = 0; lpdit->y = 0;
- lpdit->cx = (SHORT)((bmp.bmWidth * 4) / cxDlgUnit);
+ lpdit->cx = (SHORT)((bmp.bmWidth * 4) / cxDlgUnit);
lpdit->cy = (SHORT)((bmp.bmHeight * 8) / cyDlgUnit);
- lpdit->id = IDBITMAP;
- lpdit->style = WS_CHILD | WS_VISIBLE | SS_LEFT;
- lpw = (LPWORD) (lpdit + 1);
- *lpw++ = 0xFFFF;
- *lpw++ = 0x0082; /* static class */
+ lpdit->id = IDBITMAP;
+ lpdit->style = WS_CHILD | WS_VISIBLE | SS_LEFT;
+ lpw = (LPWORD) (lpdit + 1);
+ *lpw++ = 0xFFFF;
+ *lpw++ = 0x0082; /* static class */
- lpw += 1+MultiByteToWideChar (CP_ACP, 0, "Logo should be here...", -1, (LPWSTR)lpw, 50);
+ lpw += 1+MultiByteToWideChar (CP_ACP, 0, "Logo should be here...", -1,
+ (LPWSTR)lpw, 50);
/* add the static control for the program title */
lpdit = (LPDLGITEMTEMPLATE)lpwAlign(lpw);
lpdit->x = 2; lpdit->y = (short)( 1 + (bmp.bmHeight * 8) / cyDlgUnit );
- lpdit->cx = cx - 2; lpdit->cy = cyDlgUnit;
- lpdit->id = IDAPPNAME;
- lpdit->style = WS_CHILD | WS_VISIBLE | SS_CENTER;
- lpw = (LPWORD) (lpdit + 1);
- *lpw++ = 0xFFFF;
- *lpw++ = 0x0082; /* static class */
-
- /* create the title string */
+ lpdit->cx = cx - 2; lpdit->cy = cyDlgUnit;
+ lpdit->id = IDAPPNAME;
+ lpdit->style = WS_CHILD | WS_VISIBLE | SS_CENTER;
+ lpw = (LPWORD) (lpdit + 1);
+ *lpw++ = 0xFFFF;
+ *lpw++ = 0x0082; /* static class */
+
+ /* create the title string */
pszBuf = malloc( strlen( appname ) + strlen( appver ) + 2 );
if (!pszBuf) {
GlobalUnlock(hgbl);
@@ -216,26 +220,27 @@ wCreateSplash( char *appname, char *appver )
/* add the static control for the loading message */
lpdit = (LPDLGITEMTEMPLATE)lpwAlign(lpw);
lpdit->x = 2; lpdit->y = (short)(bmp.bmHeight * 8) / cyDlgUnit + 10;
- lpdit->cx = cx - 2; lpdit->cy = cyDlgUnit;
- lpdit->id = IDMESSAGE;
- lpdit->style = WS_CHILD | WS_VISIBLE | SS_LEFT;
- lpw = (LPWORD) (lpdit + 1);
- *lpw++ = 0xFFFF;
- *lpw++ = 0x0082; /* static class */
+ lpdit->cx = cx - 2; lpdit->cy = cyDlgUnit;
+ lpdit->id = IDMESSAGE;
+ lpdit->style = WS_CHILD | WS_VISIBLE | SS_LEFT;
+ lpw = (LPWORD) (lpdit + 1);
+ *lpw++ = 0xFFFF;
+ *lpw++ = 0x0082; /* static class */
- lpw += 1+MultiByteToWideChar (CP_ACP, 0, "Starting Application...", -1, (LPWSTR)lpw, 50);
+ lpw += 1+MultiByteToWideChar (CP_ACP, 0, "Starting Application...", -1,
+ (LPWSTR)lpw, 50);
/* create the dialog */
- GlobalUnlock(hgbl);
- hSplash = CreateDialogIndirectParam( mswHInst, (LPDLGTEMPLATE) hgbl,
- mswHWnd, (DLGPROC)SplashDlgProc, (LPARAM)hBmp );
-
+ GlobalUnlock(hgbl);
+ hSplash = CreateDialogIndirectParam( mswHInst, (LPDLGTEMPLATE) hgbl,
+ mswHWnd, (DLGPROC)SplashDlgProc, (LPARAM)hBmp );
+
/* free allocated memory */
- GlobalFree(hgbl);
+ GlobalFree(hgbl);
free( pszBuf );
/* that's it */
- return 1;
+ return 1;
}
@@ -243,9 +248,9 @@ wCreateSplash( char *appname, char *appver )
* Update the progress message inside the splash window
* msg text message to display
* return nonzero if ok
- */
+ */
-int
+int
wSetSplashInfo( char *msg )
{
if( msg ) {
@@ -266,4 +271,5 @@ wDestroySplash(void)
{
DestroyWindow( hSplash );
return;
-} \ No newline at end of file
+}
+
diff --git a/app/wlib/mswlib/mswstatus.c b/app/wlib/mswlib/mswstatus.c
index f9d72f4..7473ec8 100644
--- a/app/wlib/mswlib/mswstatus.c
+++ b/app/wlib/mswlib/mswstatus.c
@@ -39,10 +39,10 @@
*/
void wStatusSetValue(
- wStatus_p b,
- const char * arg)
+ wStatus_p b,
+ const char * arg)
{
- wMessageSetValue((wMessage_p)b, arg);
+ wMessageSetValue((wMessage_p)b, arg);
}
/**
* Create a window for a simple text.
@@ -58,14 +58,14 @@ void wStatusSetValue(
*/
wStatus_p wStatusCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * labelStr,
- wPos_t width,
- const char *message)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * labelStr,
+ wWinPix_t width,
+ const char *message)
{
- return (wStatus_p)wMessageCreateEx(parent, x, y, labelStr, width, message, 0);
+ return (wStatus_p)wMessageCreateEx(parent, x, y, labelStr, width, message, 0);
}
/**
@@ -75,10 +75,10 @@ wStatus_p wStatusCreate(
* \return expected width of message box
*/
-wPos_t
+wWinPix_t
wStatusGetWidth(const char *testString)
{
- return (wMessageGetWidth(testString));
+ return (wMessageGetWidth(testString));
}
/**
@@ -88,10 +88,10 @@ wStatusGetWidth(const char *testString)
* \return text height
*/
-wPos_t wStatusGetHeight(
- long flags)
+wWinPix_t wStatusGetHeight(
+ long flags)
{
- return (wMessageGetHeight(flags));
+ return (wMessageGetHeight(flags));
}
/**
@@ -103,8 +103,8 @@ wPos_t wStatusGetHeight(
*/
void wStatusSetWidth(
- wStatus_p b,
- wPos_t width)
+ wStatus_p b,
+ wWinPix_t width)
{
- wMessageSetWidth((wMessage_p)b, width);
-} \ No newline at end of file
+ wMessageSetWidth((wMessage_p)b, width);
+}
diff --git a/app/wlib/mswlib/mswtext.c b/app/wlib/mswlib/mswtext.c
index 0a0ce88..93c97b8 100644
--- a/app/wlib/mswlib/mswtext.c
+++ b/app/wlib/mswlib/mswtext.c
@@ -17,12 +17,11 @@
*
* 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.
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <windows.h>
#include <string.h>
-#include <malloc.h>
#include <stdlib.h>
#include <commdlg.h>
#include <math.h>
@@ -38,44 +37,38 @@
*/
static LOGFONT fixedFont = {
- /* Initial default values */
- -18, 0, /* H, W */
- 0, /* A */
- 0,
- FW_REGULAR,
- 0, 0, 0,/* I, U, SO */
- ANSI_CHARSET,
- 0, /* OP */
- 0, /* CP */
- 0, /* Q */
- FIXED_PITCH|FF_MODERN, /* P&F */
- "Courier"
-};
+ /* Initial default values */
+ -18, 0, /* H, W */
+ 0, /* A */
+ 0,
+ FW_REGULAR,
+ 0, 0, 0,/* I, U, SO */
+ ANSI_CHARSET,
+ 0, /* OP */
+ 0, /* CP */
+ 0, /* Q */
+ FIXED_PITCH|FF_MODERN, /* P&F */
+ "Courier"
+ };
static HFONT fixedTextFont, prevTextFont;
struct wText_t {
- WOBJ_COMMON
- HANDLE hText;
+ WOBJ_COMMON
+ HANDLE hText;
};
-BOOL_T textPrintAbort = FALSE;
-
void wTextClear(
- wText_p b)
+ wText_p b)
{
- long rc;
- rc = SendMessage(b->hWnd, EM_SETREADONLY, 0, 0L);
-#ifdef WIN32
- rc = SendMessage(b->hWnd, EM_SETSEL, 0, -1);
-#else
- rc = SendMessage(b->hWnd, EM_SETSEL, 1, MAKELONG(0, -1));
-#endif
- rc = SendMessage(b->hWnd, WM_CLEAR, 0, 0L);
+ LRESULT rc;
+ rc = SendMessage(b->hWnd, EM_SETREADONLY, (WPARAM)0, (LPARAM)0);
+ rc = SendMessage(b->hWnd, EM_SETSEL, (WPARAM)0, (LPARAM)-1);
+ rc = SendMessage(b->hWnd, WM_CLEAR, (WPARAM)0, (LPARAM)0);
- if (b->option&BO_READONLY) {
- rc = SendMessage(b->hWnd, EM_SETREADONLY, 1, 0L);
- }
+ if (b->option&BO_READONLY) {
+ rc = SendMessage(b->hWnd, EM_SETREADONLY, (WPARAM)1, (LPARAM)0);
+ }
}
/**
@@ -90,200 +83,200 @@ void wTextClear(
*/
void wTextAppend(
- wText_p b,
- const char * text)
+ wText_p b,
+ const char * text)
{
- char *cp;
- char *buffer;
- char *extText;
- int textSize;
- int len = strlen(text);
-
- if (!len) {
- return;
- }
-
- for (cp = (char *)text; *cp; cp++) {
- if (*cp == '\n') {
- len++;
- }
- }
-
- extText = malloc(len + 1 + 10);
-
- for (cp=extText; *text; cp++,text++) {
- if (*text == '\n') {
- *cp++ = '\r';
- *cp = '\n';
- } else {
- *cp = *text;
- }
- }
-
- *cp = '\0';
- textSize = GetWindowTextLength(b->hWnd);
- buffer = malloc((textSize + len + 1) * sizeof(char));
-
- if (buffer) {
- GetWindowText(b->hWnd, buffer, textSize + 1);
- strcat(buffer, extText);
- SetWindowText(b->hWnd, buffer);
- free(extText);
- free(buffer);
- } else {
- abort();
- }
-
- if (b->option&BO_READONLY) {
- SendMessage(b->hWnd, EM_SETREADONLY, 1, 0L);
- }
+ char *cp;
+ char *buffer;
+ char *extText;
+ int textSize;
+ size_t len = strlen(text);
+
+ if (!len) {
+ return;
+ }
+
+ for (cp = (char *)text; *cp; cp++) {
+ if (*cp == '\n') {
+ len++;
+ }
+ }
+
+ extText = malloc(len + 1 + 10);
+
+ for (cp=extText; *text; cp++,text++) {
+ if (*text == '\n') {
+ *cp++ = '\r';
+ *cp = '\n';
+ } else {
+ *cp = *text;
+ }
+ }
+
+ *cp = '\0';
+ textSize = GetWindowTextLength(b->hWnd);
+ buffer = malloc((textSize + len + 1) * sizeof(char));
+
+ if (buffer) {
+ GetWindowText(b->hWnd, buffer, textSize + 1);
+ strcat(buffer, extText);
+ SetWindowText(b->hWnd, buffer);
+ free(extText);
+ free(buffer);
+ } else {
+ abort();
+ }
+
+ if (b->option&BO_READONLY) {
+ SendMessage(b->hWnd, EM_SETREADONLY, (WPARAM)1, (LPARAM)0);
+ }
// scroll to bottom of text box
- SendMessage(b->hWnd, EM_LINESCROLL, 0, 10000L);
+ SendMessage(b->hWnd, EM_LINESCROLL, (WPARAM)0, (LPARAM)10000);
}
BOOL_T wTextSave(
- wText_p b,
- const char * fileName)
+ wText_p b,
+ const char * fileName)
{
- FILE * f;
- int lc, l, len;
- char line[255];
- f = wFileOpen(fileName, "w");
-
- if (f == NULL) {
- MessageBox(((wControl_p)(b->parent))->hWnd, "TextSave", "", MB_OK|MB_ICONHAND);
- return FALSE;
- }
-
- lc = (int)SendMessage(b->hWnd, EM_GETLINECOUNT, 0, 0L);
-
- for (l=0; l<lc; l++) {
- *(WORD*)line = sizeof(line)-1;
- len = (int)SendMessage(b->hWnd, EM_GETLINE, l, (DWORD)(LPSTR)line);
- line[len] = '\0';
- fprintf(f, "%s\n", line);
- }
-
- fclose(f);
- return TRUE;
+ FILE * f;
+ int lc, l, len;
+ char line[255];
+ f = wFileOpen(fileName, "w");
+
+ if (f == NULL) {
+ MessageBox(((wControl_p)(b->parent))->hWnd, "TextSave", "", MB_OK|MB_ICONHAND);
+ return FALSE;
+ }
+
+ lc = (int)SendMessage(b->hWnd, EM_GETLINECOUNT, (WPARAM)0, (LPARAM)0);
+
+ for (l=0; l<lc; l++) {
+ *(WORD*)line = sizeof(line)-1;
+ len = (int)SendMessage(b->hWnd, EM_GETLINE, (WPARAM)l, (LPARAM)line);
+ line[len] = '\0';
+ fprintf(f, "%s\n", line);
+ }
+
+ fclose(f);
+ return TRUE;
}
BOOL_T wTextPrint(
- wText_p b)
+ wText_p b)
{
- int lc, l, len;
- char line[255];
- HDC hDc;
- int lineSpace;
- int linesPerPage;
- int currentLine;
- int IOStatus;
- TEXTMETRIC textMetric;
- DOCINFO docInfo;
- hDc = mswGetPrinterDC();
+ int lc, l, len;
+ char line[255];
+ HDC hDc;
+ int lineSpace;
+ int linesPerPage;
+ int currentLine;
+ int IOStatus;
+ TEXTMETRIC textMetric;
+ DOCINFO docInfo;
+ hDc = mswGetPrinterDC();
HFONT hFont, hOldFont;
- if (hDc == (HDC)0) {
- MessageBox(((wControl_p)(b->parent))->hWnd, "Print", "Cannot print",
- MB_OK|MB_ICONHAND);
- return FALSE;
- }
+ if (hDc == (HDC)0) {
+ MessageBox(((wControl_p)(b->parent))->hWnd, "Print", "Cannot print",
+ MB_OK|MB_ICONHAND);
+ return FALSE;
+ }
- docInfo.cbSize = sizeof(DOCINFO);
- docInfo.lpszDocName = "XTrkcad Log";
- docInfo.lpszOutput = (LPSTR)NULL;
+ docInfo.cbSize = sizeof(DOCINFO);
+ docInfo.lpszDocName = "XTrkcad Log";
+ docInfo.lpszOutput = (LPSTR)NULL;
- // Retrieve a handle to the monospaced stock font.
+ // Retrieve a handle to the monospaced stock font.
hFont = (HFONT)GetStockObject(ANSI_FIXED_FONT);
hOldFont = (HFONT)SelectObject(hDc, hFont);
- if (StartDoc(hDc, &docInfo) < 0) {
- MessageBox(((wControl_p)(b->parent))->hWnd, "Unable to start print job", NULL,
- MB_OK|MB_ICONHAND);
- DeleteDC(hDc);
- return FALSE;
- }
-
- StartPage(hDc);
-
- GetTextMetrics(hDc, &textMetric);
- lineSpace = textMetric.tmHeight + textMetric.tmExternalLeading;
- linesPerPage = GetDeviceCaps(hDc, VERTRES) / lineSpace;
- currentLine = 1;
- lc = (int)SendMessage(b->hWnd, EM_GETLINECOUNT, 0, 0L);
- IOStatus = 0;
-
- for (l=0; l<lc; l++) {
- *(WORD*)line = sizeof(line)-1;
- len = (int)SendMessage(b->hWnd, EM_GETLINE, l, (DWORD)(LPSTR)line);
- TextOut(hDc, 0, currentLine*lineSpace, line, len);
-
- if (++currentLine > linesPerPage) {
- IOStatus = EndPage(hDc);
- if (IOStatus < 0 || textPrintAbort) {
- break;
- }
- StartPage(hDc);
+ if (StartDoc(hDc, &docInfo) < 0) {
+ MessageBox(((wControl_p)(b->parent))->hWnd, "Unable to start print job", NULL,
+ MB_OK|MB_ICONHAND);
+ DeleteDC(hDc);
+ return FALSE;
+ }
+
+ StartPage(hDc);
+
+ GetTextMetrics(hDc, &textMetric);
+ lineSpace = textMetric.tmHeight + textMetric.tmExternalLeading;
+ linesPerPage = GetDeviceCaps(hDc, VERTRES) / lineSpace;
+ currentLine = 1;
+ lc = (int)SendMessage(b->hWnd, EM_GETLINECOUNT, (WPARAM)0, (LPARAM)0);
+ IOStatus = 0;
+
+ for (l=0; l<lc; l++) {
+ *(WORD*)line = sizeof(line)-1;
+ len = (int)SendMessage(b->hWnd, EM_GETLINE, (WPARAM)l, (LPARAM)line);
+ TextOut(hDc, 0, currentLine*lineSpace, line, len);
+
+ if (++currentLine > linesPerPage) {
+ IOStatus = EndPage(hDc);
+ if (IOStatus < 0 ) {
+ break;
+ }
+ StartPage(hDc);
currentLine = 1;
}
- }
+ }
- if (IOStatus >= 0 && !textPrintAbort) {
- EndPage(hDc);
- EndDoc(hDc);
- }
+ if (IOStatus >= 0 ) {
+ EndPage(hDc);
+ EndDoc(hDc);
+ }
SelectObject(hDc, hOldFont);
- DeleteDC(hDc);
- return TRUE;
+ DeleteDC(hDc);
+ return TRUE;
}
wBool_t wTextGetModified(
- wText_p b)
+ wText_p b)
{
- int rc;
- rc = (int)SendMessage(b->hWnd, EM_GETMODIFY, 0, 0L);
- return (wBool_t)rc;
+ int rc;
+ rc = (int)SendMessage(b->hWnd, EM_GETMODIFY, (WPARAM)0, (LPARAM)0);
+ return (wBool_t)rc;
}
/**
* Get the size of the text in the text control including terminating '\0'. Note that
* the text actually might be shorter if the text includes CRs.
- *
+ *
* \param b IN text control
* \return required buffer size
*/
int wTextGetSize(
- wText_p b)
+ wText_p b)
{
int len;
len = GetWindowTextLength(b->hWnd);
- return len + 1;
+ return len + 1;
}
-/**
+/**
* Get the text from a textentry. The buffer must be large enough for the text and
* the terminating \0.
* In case the string contains carriage returns these are removed. The returned string
- * will be shortened accordingly.
+ * will be shortened accordingly.
* To get the complete contents the buffer size must be equal or greater then the return
* value of wTextGetSize()
- *
+ *
* \param b IN text entry
* \param t IN/OUT buffer for text
- * \param s IN size of buffer
+ * \param s IN size of buffer
*/
-
+
void wTextGetText(
- wText_p b,
- char * t,
- int s)
+ wText_p b,
+ char * t,
+ int s)
{
char *buffer = malloc(s);
char *ptr = buffer;
@@ -302,157 +295,154 @@ void wTextGetText(
void wTextSetReadonly(
- wText_p b,
- wBool_t ro)
+ wText_p b,
+ wBool_t ro)
{
- if (ro) {
- b->option |= BO_READONLY;
- } else {
- b->option &= ~BO_READONLY;
- }
+ if (ro) {
+ b->option |= BO_READONLY;
+ } else {
+ b->option &= ~BO_READONLY;
+ }
- SendMessage(b->hWnd, EM_SETREADONLY, ro, 0L);
+ SendMessage(b->hWnd, EM_SETREADONLY, (WPARAM)ro, (LPARAM)0);
}
void wTextSetSize(
- wText_p bt,
- wPos_t width,
- wPos_t height)
+ wText_p bt,
+ wWinPix_t width,
+ wWinPix_t height)
{
- bt->w = width;
- bt->h = height;
+ bt->w = width;
+ bt->h = height;
- if (!SetWindowPos(bt->hWnd, HWND_TOP, 0, 0,
- bt->w, bt->h, SWP_NOMOVE|SWP_NOZORDER)) {
- mswFail("wTextSetSize: SetWindowPos");
- }
+ if (!SetWindowPos(bt->hWnd, HWND_TOP, 0, 0,
+ bt->w, bt->h, SWP_NOMOVE|SWP_NOZORDER)) {
+ mswFail("wTextSetSize: SetWindowPos");
+ }
}
void wTextComputeSize(
- wText_p bt,
- int rows,
- int lines,
- wPos_t * w,
- wPos_t * h)
+ wText_p bt,
+ wWinPix_t rows,
+ wWinPix_t lines,
+ wWinPix_t * w,
+ wWinPix_t * h)
{
- static wPos_t scrollV_w = -1;
- static wPos_t scrollH_h = -1;
- HDC hDc;
- TEXTMETRIC metrics;
-
- if (scrollV_w < 0) {
- scrollV_w = GetSystemMetrics(SM_CXVSCROLL);
- }
-
- if (scrollH_h < 0) {
- scrollH_h = GetSystemMetrics(SM_CYHSCROLL);
- }
-
- hDc = GetDC(bt->hWnd);
- GetTextMetrics(hDc, &metrics);
- *w = rows * metrics.tmAveCharWidth + scrollV_w;
- *h = lines * (metrics.tmHeight + metrics.tmExternalLeading);
- ReleaseDC(bt->hWnd, hDc);
-
- if (bt->option&BT_HSCROLL) {
- *h += scrollH_h;
- }
+ static wWinPix_t scrollV_w = -1;
+ static wWinPix_t scrollH_h = -1;
+ HDC hDc;
+ TEXTMETRIC metrics;
+
+ if (scrollV_w < 0) {
+ scrollV_w = GetSystemMetrics(SM_CXVSCROLL);
+ }
+
+ if (scrollH_h < 0) {
+ scrollH_h = GetSystemMetrics(SM_CYHSCROLL);
+ }
+
+ hDc = GetDC(bt->hWnd);
+ GetTextMetrics(hDc, &metrics);
+ *w = rows * metrics.tmAveCharWidth + scrollV_w;
+ *h = lines * (metrics.tmHeight + metrics.tmExternalLeading);
+ ReleaseDC(bt->hWnd, hDc);
+
+ if (bt->option&BT_HSCROLL) {
+ *h += scrollH_h;
+ }
}
void wTextSetPosition(
- wText_p bt,
- int pos)
+ wText_p bt,
+ int pos)
{
- long rc;
- rc = SendMessage(bt->hWnd, EM_LINESCROLL, 0, MAKELONG(-65535, 0));
+ LRESULT rc;
+ rc = SendMessage(bt->hWnd, EM_LINESCROLL, (WPARAM)0, (LPARAM)MAKELONG(-65535,
+ 0));
}
static void textDoneProc(wControl_p b)
{
- wText_p t = (wText_p)b;
- HDC hDc;
- hDc = GetDC(t->hWnd);
- SelectObject(hDc, mswOldTextFont);
- ReleaseDC(t->hWnd, hDc);
+ wText_p t = (wText_p)b;
+ HDC hDc;
+ hDc = GetDC(t->hWnd);
+ SelectObject(hDc, mswOldTextFont);
+ ReleaseDC(t->hWnd, hDc);
}
static callBacks_t textCallBacks = {
- mswRepaintLabel,
- textDoneProc,
- NULL
+ mswRepaintLabel,
+ textDoneProc,
+ NULL
};
wText_p wTextCreate(
- wWin_p parent,
- POS_T x,
- POS_T y,
- const char * helpStr,
- const char * labelStr,
- long option,
- POS_T width,
- POS_T height)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ wWinPix_t width,
+ wWinPix_t height)
{
- wText_p b;
- DWORD style;
- RECT rect;
- int index;
- b = mswAlloc(parent, B_TEXT, labelStr, sizeof *b, NULL, &index);
- mswComputePos((wControl_p)b, x, y);
- b->option = option;
- style = ES_MULTILINE | ES_LEFT | ES_AUTOVSCROLL | ES_WANTRETURN |
- WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL;
+ wText_p b;
+ DWORD style;
+ RECT rect;
+ int index;
+ b = mswAlloc(parent, B_TEXT, labelStr, sizeof *b, NULL, &index);
+ mswComputePos((wControl_p)b, x, y);
+ b->option = option;
+ style = ES_MULTILINE | ES_LEFT | ES_AUTOVSCROLL | ES_WANTRETURN |
+ WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL;
#ifdef BT_HSCROLL
- if (option & BT_HSCROLL) {
- style |= WS_HSCROLL | ES_AUTOHSCROLL;
- }
+ if (option & BT_HSCROLL) {
+ style |= WS_HSCROLL | ES_AUTOHSCROLL;
+ }
#endif
- /* if (option & BO_READONLY)
- style |= ES_READONLY;*/
- b->hWnd = CreateWindow("EDIT", NULL,
- style, b->x, b->y,
- width, height,
- ((wControl_p)parent)->hWnd, (HMENU)index, mswHInst, NULL);
-
- if (b->hWnd == NULL) {
- mswFail("CreateWindow(TEXT)");
- return b;
- }
-
-#ifdef CONTROL3D
- Ctl3dSubclassCtl(b->hWnd);
-#endif
+ /* if (option & BO_READONLY)
+ style |= ES_READONLY;*/
+ b->hWnd = CreateWindow("EDIT", NULL,
+ style, b->x, b->y,
+ width, height,
+ ((wControl_p)parent)->hWnd, (HMENU)(UINT_PTR)index, mswHInst, NULL);
+
+ if (b->hWnd == NULL) {
+ mswFail("CreateWindow(TEXT)");
+ return b;
+ }
+
+ if (option & BT_FIXEDFONT) {
+ if (fixedTextFont == (HFONT)0) {
+ fixedTextFont = CreateFontIndirect(&fixedFont);
+ }
+
+ SendMessage(b->hWnd, WM_SETFONT, (WPARAM)fixedTextFont, (LPARAM)MAKELONG(1, 0));
+ } else {
+ SendMessage(b->hWnd, WM_SETFONT, (WPARAM)mswLabelFont, (LPARAM)0);
+ }
+
+ b->hText = (HANDLE)SendMessage(b->hWnd, EM_GETHANDLE, (WPARAM)0, (LPARAM)0);
+
+ if (option & BT_CHARUNITS) {
+ wWinPix_t w, h;
+ wTextComputeSize(b, width, height, &w, &h);
+
+ if (!SetWindowPos(b->hWnd, HWND_TOP, 0, 0,
+ w, h, SWP_NOMOVE|SWP_NOZORDER)) {
+ mswFail("wTextCreate: SetWindowPos");
+ }
+ }
- if (option & BT_FIXEDFONT) {
- if (fixedTextFont == (HFONT)0) {
- fixedTextFont = CreateFontIndirect(&fixedFont);
- }
-
- SendMessage(b->hWnd, WM_SETFONT, (WPARAM)fixedTextFont, (LPARAM)MAKELONG(1, 0));
- } else if (!mswThickFont) {
- SendMessage(b->hWnd, WM_SETFONT, (WPARAM)mswLabelFont, 0L);
- }
-
- b->hText = (HANDLE)SendMessage(b->hWnd, EM_GETHANDLE, 0, 0L);
-
- if (option & BT_CHARUNITS) {
- wPos_t w, h;
- wTextComputeSize(b, width, height, &w, &h);
-
- if (!SetWindowPos(b->hWnd, HWND_TOP, 0, 0,
- w, h, SWP_NOMOVE|SWP_NOZORDER)) {
- mswFail("wTextCreate: SetWindowPos");
- }
- }
-
- GetWindowRect(b->hWnd, &rect);
- b->w = rect.right - rect.left;
- b->h = rect.bottom - rect.top;
- mswAddButton((wControl_p)b, FALSE, helpStr);
- mswCallBacks[B_TEXT] = &textCallBacks;
- return b;
+ GetWindowRect(b->hWnd, &rect);
+ b->w = rect.right - rect.left;
+ b->h = rect.bottom - rect.top;
+ mswAddButton((wControl_p)b, FALSE, helpStr);
+ mswCallBacks[B_TEXT] = &textCallBacks;
+ return b;
}
diff --git a/app/wlib/mswlib/simple-gettext.c b/app/wlib/mswlib/simple-gettext.c
index 412eece..592e3a3 100644
--- a/app/wlib/mswlib/simple-gettext.c
+++ b/app/wlib/mswlib/simple-gettext.c
@@ -1,4 +1,4 @@
-/* \file simple-gettext.c
+/* \file simple-gettext.c
* a simplified version of gettext.
* Copyright (C) 1995, 1996, 1997, 1999,
* 2005 Free Software Foundation, Inc.
@@ -17,7 +17,7 @@
*
* 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/* This is a simplified version of gettext written by Ulrich Drepper.
@@ -28,8 +28,8 @@
*/
/*
- * Based on the simple-gettext from GnuPG a version appropriate for the
- * needs of XTrackCAD was derived. This is a workaround for any compiler
+ * Based on the simple-gettext from GnuPG a version appropriate for the
+ * needs of XTrackCAD was derived. This is a workaround for any compiler
* specifics or runtime library dependencies. mf 26.07.09
*/
@@ -50,10 +50,10 @@
#include "mswint.h"
#if _MSC_VER > 1300
- #define stricmp _stricmp
- #define strnicmp _strnicmp
- #define strdup _strdup
- #define fileno _fileno
+#define stricmp _stricmp
+#define strnicmp _strnicmp
+#define strdup _strdup
+#define fileno _fileno
#endif
typedef unsigned long u32;
@@ -67,60 +67,56 @@ typedef unsigned long u32;
/* Header for binary .mo file format. */
-struct mo_file_header
-{
- /* The magic number. */
- u32 magic;
- /* The revision number of the file format. */
- u32 revision;
- /* The number of strings pairs. */
- u32 nstrings;
- /* Offset of table with start offsets of original strings. */
- u32 orig_tab_offset;
- /* Offset of table with start offsets of translation strings. */
- u32 trans_tab_offset;
- /* Size of hashing table. */
- u32 hash_tab_size;
- /* Offset of first hashing entry. */
- u32 hash_tab_offset;
+struct mo_file_header {
+ /* The magic number. */
+ u32 magic;
+ /* The revision number of the file format. */
+ u32 revision;
+ /* The number of strings pairs. */
+ u32 nstrings;
+ /* Offset of table with start offsets of original strings. */
+ u32 orig_tab_offset;
+ /* Offset of table with start offsets of translation strings. */
+ u32 trans_tab_offset;
+ /* Size of hashing table. */
+ u32 hash_tab_size;
+ /* Offset of first hashing entry. */
+ u32 hash_tab_offset;
};
-struct string_desc
-{
- /* Length of addressed string. */
- u32 length;
- /* Offset of string in file. */
- u32 offset;
+struct string_desc {
+ /* Length of addressed string. */
+ u32 length;
+ /* Offset of string in file. */
+ u32 offset;
};
-struct overflow_space_s
-{
- struct overflow_space_s *next;
- u32 idx;
- char d[1];
+struct overflow_space_s {
+ struct overflow_space_s *next;
+ u32 idx;
+ char d[1];
};
-struct loaded_domain
-{
- char *data;
- int must_swap;
- u32 nstrings;
- char *mapped; /* 0 = not yet mapped, 1 = mapped,
+struct loaded_domain {
+ char *data;
+ int must_swap;
+ u32 nstrings;
+ char *mapped; /* 0 = not yet mapped, 1 = mapped,
2 = mapped to
overflow space */
- struct overflow_space_s *overflow_space;
- struct string_desc *orig_tab;
- struct string_desc *trans_tab;
- u32 hash_size;
- u32 *hash_tab;
+ struct overflow_space_s *overflow_space;
+ struct string_desc *orig_tab;
+ struct string_desc *trans_tab;
+ u32 hash_size;
+ u32 *hash_tab;
};
static struct loaded_domain *the_domain;
/**
* Translate the input string from UTF8 to Windows codepage.
- *
+ *
* \param str IN string in UTF-8 format to translate.
* \param len IN number of chars to translate
* \param dummy IN ?
@@ -129,7 +125,7 @@ static struct loaded_domain *the_domain;
char *
utf8_to_native( char *str, unsigned int len, int dummy )
{
- /* maximum output length is size of string * 2 */
+ /* maximum output length is size of string * 2 */
int buflen = (len + 1) * 2;
char *buf = malloc( buflen );
int wcharLen;
@@ -143,22 +139,24 @@ utf8_to_native( char *str, unsigned int len, int dummy )
/* the system codepage, we need to take two steps */
/* 1. convert from UTF-8 to UTF-16 */
- wcharLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)str, -1, (LPWSTR)buf, buflen / 2 );
-
+ wcharLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)str, -1, (LPWSTR)buf,
+ buflen / 2 );
+
/* 2. convert from UTF-8 to system codepage */
- WideCharToMultiByte(CP_ACP, 0, (LPWSTR)buf, wcharLen, resBuffer, len + 1, NULL, NULL );
+ WideCharToMultiByte(CP_ACP, 0, (LPWSTR)buf, wcharLen, resBuffer, len + 1, NULL,
+ NULL );
}
free(buf);
- return( resBuffer );
+ return( resBuffer );
}
static u32
do_swap_u32( u32 i )
{
- return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
+ return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
}
#define SWAPIT(flag, data) ((flag) ? do_swap_u32(data) : (data) )
@@ -174,205 +172,203 @@ do_swap_u32( u32 i )
static unsigned long
hash_string( const char *str_param )
{
- unsigned long int hval, g;
- const char *str = str_param;
-
- hval = 0;
- while (*str != '\0')
- {
- hval <<= 4;
- hval += (unsigned long int) *str++;
- g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4));
- if (g != 0)
- {
- hval ^= g >> (HASHWORDBITS - 8);
- hval ^= g;
+ unsigned long int hval, g;
+ const char *str = str_param;
+
+ hval = 0;
+ while (*str != '\0') {
+ hval <<= 4;
+ hval += (unsigned long int) *str++;
+ g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4));
+ if (g != 0) {
+ hval ^= g >> (HASHWORDBITS - 8);
+ hval ^= g;
+ }
}
- }
- return hval;
+ return hval;
}
static struct loaded_domain *
load_domain( const char *filename )
{
- FILE *fp;
- size_t size;
- struct stat st;
- struct mo_file_header *data = NULL;
- struct loaded_domain *domain = NULL;
- size_t to_read;
- char *read_ptr;
-
- fp = fopen( filename, "rb" );
- if( !fp )
- return NULL; /* can't open the file */
- /* we must know about the size of the file */
- if( fstat( fileno(fp ), &st )
- || (size = (size_t)st.st_size) != st.st_size
- || size < sizeof (struct mo_file_header) ) {
- fclose( fp );
- return NULL;
- }
-
- data = malloc( size );
- if( !data ) {
- fclose( fp );
- return NULL; /* out of memory */
- }
-
- to_read = size;
- read_ptr = (char *) data;
- do {
- unsigned long int nb = fread( read_ptr, 1, to_read, fp );
- if( nb < to_read ) {
- fclose (fp);
- free(data);
- return NULL; /* read error */
+ FILE *fp;
+ size_t size;
+ struct stat st;
+ struct mo_file_header *data = NULL;
+ struct loaded_domain *domain = NULL;
+ size_t to_read;
+ char *read_ptr;
+
+ fp = fopen( filename, "rb" );
+ if( !fp ) {
+ return NULL; /* can't open the file */
}
- read_ptr += nb;
- to_read -= nb;
- } while( to_read > 0 );
- fclose (fp);
-
- /* Using the magic number we can test whether it really is a message
- * catalog file. */
- if( data->magic != MAGIC && data->magic != MAGIC_SWAPPED ) {
- /* The magic number is wrong: not a message catalog file. */
- free( data );
- return NULL;
- }
-
- domain = calloc( 1, sizeof *domain );
- if( !domain ) {
- free( data );
- return NULL;
- }
- domain->data = (char *) data;
- domain->must_swap = data->magic != MAGIC;
-
- /* Fill in the information about the available tables. */
- switch( SWAPIT(domain->must_swap, data->revision) ) {
- case 0:
- domain->nstrings = SWAPIT(domain->must_swap, data->nstrings);
- domain->orig_tab = (struct string_desc *)
- ((char *) data + SWAPIT(domain->must_swap, data->orig_tab_offset));
- domain->trans_tab = (struct string_desc *)
- ((char *) data + SWAPIT(domain->must_swap, data->trans_tab_offset));
- domain->hash_size = SWAPIT(domain->must_swap, data->hash_tab_size);
- domain->hash_tab = (u32 *)
- ((char *) data + SWAPIT(domain->must_swap, data->hash_tab_offset));
- break;
-
- default: /* This is an invalid revision. */
- free( data );
- free( domain );
- return NULL;
- }
-
- /* Allocate an array to keep track of code page mappings. */
- domain->mapped = calloc( 1, domain->nstrings );
- if( !domain->mapped ) {
- free( data );
- free( domain );
- return NULL;
- }
-
- return domain;
+ /* we must know about the size of the file */
+ if( fstat( fileno(fp ), &st )
+ || (size = (size_t)st.st_size) != st.st_size
+ || size < sizeof (struct mo_file_header) ) {
+ fclose( fp );
+ return NULL;
+ }
+
+ data = malloc( size );
+ if( !data ) {
+ fclose( fp );
+ return NULL; /* out of memory */
+ }
+
+ to_read = size;
+ read_ptr = (char *) data;
+ do {
+ unsigned long int nb = (unsigned int)fread( read_ptr, 1, to_read, fp );
+ if( nb < to_read ) {
+ fclose (fp);
+ free(data);
+ return NULL; /* read error */
+ }
+ read_ptr += nb;
+ to_read -= nb;
+ } while( to_read > 0 );
+ fclose (fp);
+
+ /* Using the magic number we can test whether it really is a message
+ * catalog file. */
+ if( data->magic != MAGIC && data->magic != MAGIC_SWAPPED ) {
+ /* The magic number is wrong: not a message catalog file. */
+ free( data );
+ return NULL;
+ }
+
+ domain = calloc( 1, sizeof *domain );
+ if( !domain ) {
+ free( data );
+ return NULL;
+ }
+ domain->data = (char *) data;
+ domain->must_swap = data->magic != MAGIC;
+
+ /* Fill in the information about the available tables. */
+ switch( SWAPIT(domain->must_swap, data->revision) ) {
+ case 0:
+ domain->nstrings = SWAPIT(domain->must_swap, data->nstrings);
+ domain->orig_tab = (struct string_desc *)
+ ((char *) data + SWAPIT(domain->must_swap, data->orig_tab_offset));
+ domain->trans_tab = (struct string_desc *)
+ ((char *) data + SWAPIT(domain->must_swap, data->trans_tab_offset));
+ domain->hash_size = SWAPIT(domain->must_swap, data->hash_tab_size);
+ domain->hash_tab = (u32 *)
+ ((char *) data + SWAPIT(domain->must_swap, data->hash_tab_offset));
+ break;
+
+ default: /* This is an invalid revision. */
+ free( data );
+ free( domain );
+ return NULL;
+ }
+
+ /* Allocate an array to keep track of code page mappings. */
+ domain->mapped = calloc( 1, domain->nstrings );
+ if( !domain->mapped ) {
+ free( data );
+ free( domain );
+ return NULL;
+ }
+
+ return domain;
}
/**
* Set the file used for translations. Pass a NULL to disable
- * translation. A new filename may be set at anytime. WARNING:
- * After changing the filename you should not access any data
+ * translation. A new filename may be set at anytime. WARNING:
+ * After changing the filename you should not access any data
* retrieved by gettext().
*/
int
set_gettext_file ( const char *filename, const char *regkey )
{
- struct loaded_domain *domain = NULL;
-
- if( filename && *filename ) {
- if( filename[0] == '/'
- || ( isalpha(filename[0])
- && filename[1] == ':'
- && (filename[2] == '/' || filename[2] == '\\') )
- ) {
- /* absolute path - use it as is */
- domain = load_domain( filename );
+ struct loaded_domain *domain = NULL;
+
+ if( filename && *filename ) {
+ if( filename[0] == '/'
+ || ( isalpha(filename[0])
+ && filename[1] == ':'
+ && (filename[2] == '/' || filename[2] == '\\') )
+ ) {
+ /* absolute path - use it as is */
+ domain = load_domain( filename );
+ }
+ if (!domain) {
+ return -1;
+ }
+ }
+
+ if( the_domain ) {
+ struct overflow_space_s *os, *os2;
+ free( the_domain->data );
+ free( the_domain->mapped );
+ for (os=the_domain->overflow_space; os; os = os2) {
+ os2 = os->next;
+ free (os);
+ }
+ free( the_domain );
+ the_domain = NULL;
}
- if (!domain)
- return -1;
- }
-
- if( the_domain ) {
- struct overflow_space_s *os, *os2;
- free( the_domain->data );
- free( the_domain->mapped );
- for (os=the_domain->overflow_space; os; os = os2) {
- os2 = os->next;
- free (os);
- }
- free( the_domain );
- the_domain = NULL;
- }
- the_domain = domain;
- return 0;
+ the_domain = domain;
+ return 0;
}
/**
- * Return the required string from the message table. Before returning the result,
+ * Return the required string from the message table. Before returning the result,
* codepage translation from UTF8 to current codepage is performed.
*/
static const char*
get_string( struct loaded_domain *domain, u32 idx )
{
- struct overflow_space_s *os;
- char *p;
-
- p = domain->data + SWAPIT(domain->must_swap, domain->trans_tab[idx].offset);
- if (!domain->mapped[idx])
- {
- size_t plen, buflen;
- char *buf;
-
- domain->mapped[idx] = 1;
-
- plen = strlen (p);
- buf = utf8_to_native (p, plen, -1);
- buflen = strlen (buf);
- if (buflen <= plen){
- strcpy (p, buf);
- free( buf );
- } else {
- /* There is not enough space for the translation - store it
- in the overflow_space else and mark that in the mapped
- array. Because we expect that this won't happen too
- often, we use a simple linked list. */
- os = malloc (sizeof *os + buflen);
- if (os)
- {
- os->idx = idx;
- strcpy (os->d, buf);
- os->next = domain->overflow_space;
- domain->overflow_space = os;
- p = os->d;
- }
- else
- p = "ERROR in GETTEXT MALLOC";
- free (buf);
- }
- }
- else if (domain->mapped[idx] == 2)
- { /* We need to get the string from the overflow_space. */
- for (os=domain->overflow_space; os; os = os->next)
- if (os->idx == idx)
- return (const char*)os->d;
- p = "ERROR in GETTEXT\n";
- }
- return (const char*)p;
+ struct overflow_space_s *os;
+ char *p;
+
+ p = domain->data + SWAPIT(domain->must_swap, domain->trans_tab[idx].offset);
+ if (!domain->mapped[idx]) {
+ size_t plen, buflen;
+ char *buf;
+
+ domain->mapped[idx] = 1;
+
+ plen = strlen (p);
+ buf = utf8_to_native (p, (unsigned int)plen, -1);
+ buflen = strlen (buf);
+ if (buflen <= plen) {
+ strcpy (p, buf);
+ free( buf );
+ } else {
+ /* There is not enough space for the translation - store it
+ in the overflow_space else and mark that in the mapped
+ array. Because we expect that this won't happen too
+ often, we use a simple linked list. */
+ os = malloc (sizeof *os + buflen);
+ if (os) {
+ os->idx = idx;
+ strcpy (os->d, buf);
+ os->next = domain->overflow_space;
+ domain->overflow_space = os;
+ p = os->d;
+ } else {
+ p = "ERROR in GETTEXT MALLOC";
+ }
+ free (buf);
+ }
+ } else if (domain->mapped[idx] == 2) {
+ /* We need to get the string from the overflow_space. */
+ for (os=domain->overflow_space; os; os = os->next)
+ if (os->idx == idx) {
+ return (const char*)os->d;
+ }
+ p = "ERROR in GETTEXT\n";
+ }
+ return (const char*)p;
}
/**
@@ -382,78 +378,85 @@ get_string( struct loaded_domain *domain, u32 idx )
char *
gettext( const char *msgid )
{
- struct loaded_domain *domain;
- size_t act = 0;
- size_t top, bottom;
-
- if( !(domain = the_domain) )
- goto not_found;
-
- /* Locate the MSGID and its translation. */
- if( domain->hash_size > 2 && domain->hash_tab ) {
- /* Use the hashing table. */
- u32 len = strlen (msgid);
- u32 hash_val = hash_string (msgid);
- u32 idx = hash_val % domain->hash_size;
- u32 incr = 1 + (hash_val % (domain->hash_size - 2));
- u32 nstr = SWAPIT (domain->must_swap, domain->hash_tab[idx]);
-
- if ( !nstr ) /* Hash table entry is empty. */
- goto not_found;
-
- if( SWAPIT(domain->must_swap,
- domain->orig_tab[nstr - 1].length) == len
- && !strcmp( msgid,
- domain->data + SWAPIT(domain->must_swap,
- domain->orig_tab[nstr - 1].offset)) )
- return (char *)get_string( domain, nstr - 1 );
-
- for(;;) {
- if (idx >= domain->hash_size - incr)
- idx -= domain->hash_size - incr;
- else
- idx += incr;
-
- nstr = SWAPIT(domain->must_swap, domain->hash_tab[idx]);
- if( !nstr )
- goto not_found; /* Hash table entry is empty. */
-
- if ( SWAPIT(domain->must_swap,
- domain->orig_tab[nstr - 1].length) == len
- && !strcmp (msgid,
- domain->data + SWAPIT(domain->must_swap,
- domain->orig_tab[nstr - 1].offset)))
- return (char *)get_string( domain, nstr-1 );
+ struct loaded_domain *domain;
+ size_t act = 0;
+ size_t top, bottom;
+
+ if( !(domain = the_domain) ) {
+ goto not_found;
+ }
+
+ /* Locate the MSGID and its translation. */
+ if( domain->hash_size > 2 && domain->hash_tab ) {
+ /* Use the hashing table. */
+ u32 len = (u32)strlen (msgid);
+ u32 hash_val = hash_string (msgid);
+ u32 idx = hash_val % domain->hash_size;
+ u32 incr = 1 + (hash_val % (domain->hash_size - 2));
+ u32 nstr = SWAPIT (domain->must_swap, domain->hash_tab[idx]);
+
+ if ( !nstr ) { /* Hash table entry is empty. */
+ goto not_found;
+ }
+
+ if( SWAPIT(domain->must_swap,
+ domain->orig_tab[nstr - 1].length) == len
+ && !strcmp( msgid,
+ domain->data + SWAPIT(domain->must_swap,
+ domain->orig_tab[nstr - 1].offset)) ) {
+ return (char *)get_string( domain, nstr - 1 );
+ }
+
+ for(;;) {
+ if (idx >= domain->hash_size - incr) {
+ idx -= domain->hash_size - incr;
+ } else {
+ idx += incr;
+ }
+
+ nstr = SWAPIT(domain->must_swap, domain->hash_tab[idx]);
+ if( !nstr ) {
+ goto not_found; /* Hash table entry is empty. */
+ }
+
+ if ( SWAPIT(domain->must_swap,
+ domain->orig_tab[nstr - 1].length) == len
+ && !strcmp (msgid,
+ domain->data + SWAPIT(domain->must_swap,
+ domain->orig_tab[nstr - 1].offset))) {
+ return (char *)get_string( domain, nstr-1 );
+ }
+ }
+ /* NOTREACHED */
+ }
+
+ /* Now we try the default method: binary search in the sorted
+ array of messages. */
+ bottom = 0;
+ top = domain->nstrings;
+ while( bottom < top ) {
+ int cmp_val;
+
+ act = (bottom + top) / 2;
+ cmp_val = strcmp(msgid, domain->data
+ + SWAPIT(domain->must_swap,
+ domain->orig_tab[act].offset));
+ if (cmp_val < 0) {
+ top = act;
+ } else if (cmp_val > 0) {
+ bottom = act + 1;
+ } else {
+ return (char *)get_string( domain, (int)(act) );
+ }
}
- /* NOTREACHED */
- }
-
- /* Now we try the default method: binary search in the sorted
- array of messages. */
- bottom = 0;
- top = domain->nstrings;
- while( bottom < top ) {
- int cmp_val;
-
- act = (bottom + top) / 2;
- cmp_val = strcmp(msgid, domain->data
- + SWAPIT(domain->must_swap,
- domain->orig_tab[act].offset));
- if (cmp_val < 0)
- top = act;
- else if (cmp_val > 0)
- bottom = act + 1;
- else
- return (char *)get_string( domain, act );
- }
-
- not_found:
- return (char *)msgid;
+
+not_found:
+ return (char *)msgid;
}
/**
- * This is the main initialization function for simple gettext. The message file is
- * opened and read into memory. The function must be called once before translating
+ * This is the main initialization function for simple gettext. The message file is
+ * opened and read into memory. The function must be called once before translating
* a string.
*
* The message files are expected to be in a directory named in the UNIXish form en_US
@@ -474,12 +477,13 @@ bindtextdomain( char *domainname, char *dirname )
loc = g_win32_getlocale();
/* make sure that path does not end with trailing slash */
- if( dirname[ strlen(dirname) ] == '/' )
+ if( dirname[ strlen(dirname) ] == '/' ) {
dirname[ strlen(dirname) ] = '\0';
+ }
/* allocate buffer for filename, 20 bytes should be enough for extension etc. */
dir = malloc( strlen( domainname ) + strlen( dirname ) + strlen( loc ) + 20 );
-
+
if( dir ) {
/* create the full filename */
sprintf( dir, "%s/%s/LC_MESSAGES/%s.mo", dirname, loc, domainname );
@@ -487,18 +491,18 @@ bindtextdomain( char *domainname, char *dirname )
set_gettext_file( dir, NULL );
free( dir );
}
-
+
free( loc );
return( NULL );
}
/**
- * This is a dummy function to maintain source code compatibility
+ * This is a dummy function to maintain source code compatibility
* with other implementations of gettext.
* For this implementation, UTF-8 input encoding is assumed
*
* \param domainname IN domain
- * \param codeset In codeset
+ * \param codeset In codeset
* \return always NULL
*/
@@ -509,7 +513,7 @@ bind_textdomain_codeset(char *domainname, char *codeset )
}
/**
- * This is a dummy function to maintain source code compatibility
+ * This is a dummy function to maintain source code compatibility
* with other implementations of gettext.
*
* \param domainname IN domain
diff --git a/app/wlib/mswlib/sysinfo.c b/app/wlib/mswlib/sysinfo.c
new file mode 100644
index 0000000..b4745f5
--- /dev/null
+++ b/app/wlib/mswlib/sysinfo.c
@@ -0,0 +1,138 @@
+/** \file sysinfo.c
+ * Collect info about runtime environment
+*/
+
+/* XTrkCad - Model Railroad CAD
+ * Copyright (C) 2024 Martin Fischer
+ *
+ * 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 <process.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <Windows.h>
+#include <fileapi.h>
+#include <shlobj.h>
+#include <Shlwapi.h>
+
+#include <wlib.h>
+#include "mswint.h"
+
+#ifdef WINDOWS
+#define itoa(a,b,c) _itoa(a,b,c)
+#define getpid() _getpid()
+#endif
+
+static char buffer[MAX_PATH + 1];
+
+/**
+ * Return the path to a temporary directory. The directory is not created.
+ * The result is put into a buffer and is only valid immediately after the call.
+ *
+ * \return pointer to fully qualified directory path
+ */
+
+char *
+wGetTempPath()
+{
+ unsigned retChars;
+
+ retChars = GetTempPath(MAX_PATH + 1, buffer);
+
+ if (retChars <= MAX_PATH + 1) {
+ char str[20];
+ strcat(buffer, "xtc");
+ itoa(getpid(), str, 10);
+ strcat(buffer, str);
+ }
+
+ return(buffer);
+}
+
+/**
+ * Get the Windows version. This function uses the Windows ver command to
+ * retrieve the OS version. The result is put into a buffer and is only
+ * valid immediately after the call.
+ *
+ * \return buffer containing the zero terminated string
+ *
+ */
+
+char *
+wGetOSVersion()
+{
+ FILE* pPipe;
+ pPipe = _popen("ver", "r");
+
+ while (fgets(buffer, sizeof(buffer), pPipe))
+ ;
+
+ if (buffer[strlen(buffer) -1] == '\n')
+ buffer[strlen(buffer) -1 ] = '\0';
+ _pclose(pPipe);
+
+ return(buffer);
+}
+
+/**
+ * Get the name of the configuration file.
+ *
+ * \return pointer to the filename.
+ *
+ */
+
+char *
+wGetProfileFilename()
+{
+ return(mswProfileFile);
+}
+
+/**
+ * Get the name of the current user. The result is put into a buffer and is only
+ * valid immediately after the call.
+ *
+ * \return buffer containing the zero terminated string
+ *
+ */
+
+char *
+wGetUserID()
+{
+ DWORD bufferSize = sizeof(buffer);
+
+ GetUserName(buffer, &bufferSize);
+
+ return(buffer);
+}
+
+/** Get the user's profile directory. Other than on UNIX Windows differentiates
+ * between the home directory and and the profile directory.
+ *
+ * \return pointer to the user's profile directory
+ */
+
+const char* wGetUserHomeRootDir(void)
+{
+ if (SHGetSpecialFolderPath(NULL, mswTmpBuff, CSIDL_PROFILE, 0) == 0) {
+ wNoticeEx(NT_ERROR, "Cannot get user's profile directory", "Exit", NULL);
+ wExit(0);
+ return(NULL);
+ }
+ else {
+ return(mswTmpBuff);
+ }
+}
diff --git a/app/wlib/mswlib/unittest/CMakeLists.txt b/app/wlib/mswlib/unittest/CMakeLists.txt
index b91c1ff..9bebe2b 100644
--- a/app/wlib/mswlib/unittest/CMakeLists.txt
+++ b/app/wlib/mswlib/unittest/CMakeLists.txt
@@ -1,11 +1,23 @@
# build unit tests for the xtrkcad Windows library
add_executable(utf8test
+ "")
+
+target_sources(utf8test
+ PRIVATE
utf8test.c
../utf8conv.c
- )
+)
target_link_libraries(utf8test
- ${LIBS})
+ PRIVATE
+ xtrkcad-wlib
+ ${CMOCKA_LIBRARIES}
+)
add_test(UTF8ConversionTest utf8test)
+
+set_target_properties(
+ utf8test
+ PROPERTIES FOLDER UnitTests
+ )
diff --git a/app/wlib/mswlib/utf8conv.c b/app/wlib/mswlib/utf8conv.c
index 62ada76..2363df9 100644
--- a/app/wlib/mswlib/utf8conv.c
+++ b/app/wlib/mswlib/utf8conv.c
@@ -19,10 +19,9 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <malloc.h>
#include <stdbool.h>
#include <string.h>
@@ -43,29 +42,29 @@
bool
wSystemToUTF8(const char *inString, char *outString, unsigned outStringLength)
{
- unsigned int cnt = 2 * (strlen(inString) + 1);
- char *tempBuffer = malloc(cnt);
-
- // convert to wide character (UTF16)
- MultiByteToWideChar(CP_ACP,
- 0,
- inString,
- -1,
- (LPWSTR)tempBuffer,
- cnt);
-
- // convert from wide char to UTF-8
- WideCharToMultiByte(CP_UTF8,
- 0,
- (LPCWCH)tempBuffer,
- -1,
- (LPSTR)outString,
- outStringLength,
- NULL,
- NULL);
-
- free(tempBuffer);
- return true;
+ unsigned int cnt = 2 * (unsigned int)(strlen(inString) + 1);
+ char *tempBuffer = malloc(cnt);
+
+ // convert to wide character (UTF16)
+ MultiByteToWideChar(CP_ACP,
+ 0,
+ inString,
+ -1,
+ (LPWSTR)tempBuffer,
+ cnt);
+
+ // convert from wide char to UTF-8
+ WideCharToMultiByte(CP_UTF8,
+ 0,
+ (LPCWCH)tempBuffer,
+ -1,
+ (LPSTR)outString,
+ outStringLength,
+ NULL,
+ NULL);
+
+ free(tempBuffer);
+ return true;
}
/**
@@ -81,43 +80,43 @@ wSystemToUTF8(const char *inString, char *outString, unsigned outStringLength)
bool
wUTF8ToSystem(const char *inString, char *outString, unsigned outStringLength)
{
- unsigned int cnt = 2 * (strlen(inString) + 1);
- char *tempBuffer = malloc(cnt);
-
- // convert to wide character (UTF16)
- MultiByteToWideChar(CP_UTF8,
- 0,
- inString,
- -1,
- (LPWSTR)tempBuffer,
- cnt);
-
-
- cnt = WideCharToMultiByte(CP_ACP,
- 0,
- (LPCWCH)tempBuffer,
- -1,
- (LPSTR)outString,
- 0L,
- NULL,
- NULL);
-
- if (outStringLength <= cnt) {
- return (false);
- }
-
- // convert from wide char to system codepage
- WideCharToMultiByte(CP_ACP,
- 0,
- (LPCWCH)tempBuffer,
- -1,
- (LPSTR)outString,
- outStringLength,
- NULL,
- NULL);
-
- free(tempBuffer);
- return true;
+ unsigned int cnt = 2 * (int)(strlen(inString) + 1);
+ char *tempBuffer = malloc(cnt);
+
+ // convert to wide character (UTF16)
+ MultiByteToWideChar(CP_UTF8,
+ 0,
+ inString,
+ -1,
+ (LPWSTR)tempBuffer,
+ cnt);
+
+
+ cnt = WideCharToMultiByte(CP_ACP,
+ 0,
+ (LPCWCH)tempBuffer,
+ -1,
+ (LPSTR)outString,
+ 0L,
+ NULL,
+ NULL);
+
+ if (outStringLength <= cnt) {
+ return (false);
+ }
+
+ // convert from wide char to system codepage
+ WideCharToMultiByte(CP_ACP,
+ 0,
+ (LPCWCH)tempBuffer,
+ -1,
+ (LPSTR)outString,
+ outStringLength,
+ NULL,
+ NULL);
+
+ free(tempBuffer);
+ return true;
}
/**
@@ -131,80 +130,80 @@ wUTF8ToSystem(const char *inString, char *outString, unsigned outStringLength)
bool wIsUTF8(const char * string)
{
- if (!string) {
- return 0;
- }
-
- const unsigned char * bytes = (const unsigned char *)string;
- while (*bytes) {
- if ((// ASCII
- // use bytes[0] <= 0x7F to allow ASCII control characters
- bytes[0] == 0x09 ||
- bytes[0] == 0x0A ||
- bytes[0] == 0x0D ||
- (0x20 <= bytes[0] && bytes[0] <= 0x7E)
- )
- ) {
- bytes += 1;
- continue;
- }
-
- if ((// non-overlong 2-byte
- (0xC2 <= bytes[0] && bytes[0] <= 0xDF) &&
- (0x80 <= bytes[1] && bytes[1] <= 0xBF)
- )
- ) {
- bytes += 2;
- continue;
- }
-
- if ((// excluding overlongs
- bytes[0] == 0xE0 &&
- (0xA0 <= bytes[1] && bytes[1] <= 0xBF) &&
- (0x80 <= bytes[2] && bytes[2] <= 0xBF)
- ) ||
- (// straight 3-byte
- ((0xE1 <= bytes[0] && bytes[0] <= 0xEC) ||
- bytes[0] == 0xEE ||
- bytes[0] == 0xEF) &&
- (0x80 <= bytes[1] && bytes[1] <= 0xBF) &&
- (0x80 <= bytes[2] && bytes[2] <= 0xBF)
- ) ||
- (// excluding surrogates
- bytes[0] == 0xED &&
- (0x80 <= bytes[1] && bytes[1] <= 0x9F) &&
- (0x80 <= bytes[2] && bytes[2] <= 0xBF)
- )
- ) {
- bytes += 3;
- continue;
- }
-
- if ((// planes 1-3
- bytes[0] == 0xF0 &&
- (0x90 <= bytes[1] && bytes[1] <= 0xBF) &&
- (0x80 <= bytes[2] && bytes[2] <= 0xBF) &&
- (0x80 <= bytes[3] && bytes[3] <= 0xBF)
- ) ||
- (// planes 4-15
- (0xF1 <= bytes[0] && bytes[0] <= 0xF3) &&
- (0x80 <= bytes[1] && bytes[1] <= 0xBF) &&
- (0x80 <= bytes[2] && bytes[2] <= 0xBF) &&
- (0x80 <= bytes[3] && bytes[3] <= 0xBF)
- ) ||
- (// plane 16
- bytes[0] == 0xF4 &&
- (0x80 <= bytes[1] && bytes[1] <= 0x8F) &&
- (0x80 <= bytes[2] && bytes[2] <= 0xBF) &&
- (0x80 <= bytes[3] && bytes[3] <= 0xBF)
- )
- ) {
- bytes += 4;
- continue;
- }
-
- return false;
- }
-
- return true;
-} \ No newline at end of file
+ if (!string) {
+ return 0;
+ }
+
+ const unsigned char * bytes = (const unsigned char *)string;
+ while (*bytes) {
+ if ((// ASCII
+ // use bytes[0] <= 0x7F to allow ASCII control characters
+ bytes[0] == 0x09 ||
+ bytes[0] == 0x0A ||
+ bytes[0] == 0x0D ||
+ (0x20 <= bytes[0] && bytes[0] <= 0x7E)
+ )
+ ) {
+ bytes += 1;
+ continue;
+ }
+
+ if ((// non-overlong 2-byte
+ (0xC2 <= bytes[0] && bytes[0] <= 0xDF) &&
+ (0x80 <= bytes[1] && bytes[1] <= 0xBF)
+ )
+ ) {
+ bytes += 2;
+ continue;
+ }
+
+ if ((// excluding overlongs
+ bytes[0] == 0xE0 &&
+ (0xA0 <= bytes[1] && bytes[1] <= 0xBF) &&
+ (0x80 <= bytes[2] && bytes[2] <= 0xBF)
+ ) ||
+ (// straight 3-byte
+ ((0xE1 <= bytes[0] && bytes[0] <= 0xEC) ||
+ bytes[0] == 0xEE ||
+ bytes[0] == 0xEF) &&
+ (0x80 <= bytes[1] && bytes[1] <= 0xBF) &&
+ (0x80 <= bytes[2] && bytes[2] <= 0xBF)
+ ) ||
+ (// excluding surrogates
+ bytes[0] == 0xED &&
+ (0x80 <= bytes[1] && bytes[1] <= 0x9F) &&
+ (0x80 <= bytes[2] && bytes[2] <= 0xBF)
+ )
+ ) {
+ bytes += 3;
+ continue;
+ }
+
+ if ((// planes 1-3
+ bytes[0] == 0xF0 &&
+ (0x90 <= bytes[1] && bytes[1] <= 0xBF) &&
+ (0x80 <= bytes[2] && bytes[2] <= 0xBF) &&
+ (0x80 <= bytes[3] && bytes[3] <= 0xBF)
+ ) ||
+ (// planes 4-15
+ (0xF1 <= bytes[0] && bytes[0] <= 0xF3) &&
+ (0x80 <= bytes[1] && bytes[1] <= 0xBF) &&
+ (0x80 <= bytes[2] && bytes[2] <= 0xBF) &&
+ (0x80 <= bytes[3] && bytes[3] <= 0xBF)
+ ) ||
+ (// plane 16
+ bytes[0] == 0xF4 &&
+ (0x80 <= bytes[1] && bytes[1] <= 0x8F) &&
+ (0x80 <= bytes[2] && bytes[2] <= 0xBF) &&
+ (0x80 <= bytes[3] && bytes[3] <= 0xBF)
+ )
+ ) {
+ bytes += 4;
+ continue;
+ }
+
+ return false;
+ }
+
+ return true;
+}
diff --git a/app/wlib/test/testapp.c b/app/wlib/test/testapp.c
index 6342801..3754a85 100644
--- a/app/wlib/test/testapp.c
+++ b/app/wlib/test/testapp.c
@@ -19,7 +19,7 @@
*
* 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.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/