diff options
Diffstat (limited to 'app/wlib')
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 = ¬iceW; - - 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 = ¬iceW; + + 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 ×Font[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 */ |