summaryrefslogtreecommitdiff
path: root/app/wlib/gtklib
diff options
context:
space:
mode:
Diffstat (limited to 'app/wlib/gtklib')
-rw-r--r--app/wlib/gtklib/CMakeLists.txt103
-rw-r--r--app/wlib/gtklib/bitmap.c38
-rw-r--r--app/wlib/gtklib/boxes.c194
-rw-r--r--app/wlib/gtklib/browserhelp.c69
-rw-r--r--app/wlib/gtklib/button.c904
-rw-r--r--app/wlib/gtklib/color.c512
-rw-r--r--app/wlib/gtklib/control.c259
-rw-r--r--app/wlib/gtklib/droplist.c441
-rw-r--r--app/wlib/gtklib/dynarr.h10
-rw-r--r--app/wlib/gtklib/filesel.c203
-rw-r--r--app/wlib/gtklib/font.c369
-rw-r--r--app/wlib/gtklib/gtkdraw-cairo.c1357
-rw-r--r--app/wlib/gtklib/gtkint.h307
-rw-r--r--app/wlib/gtklib/help.c43
-rw-r--r--app/wlib/gtklib/ixhelp.c424
-rw-r--r--app/wlib/gtklib/lines.c132
-rw-r--r--app/wlib/gtklib/list.c519
-rw-r--r--app/wlib/gtklib/liststore.c219
-rw-r--r--app/wlib/gtklib/main.c30
-rw-r--r--app/wlib/gtklib/menu.c493
-rw-r--r--app/wlib/gtklib/message.c224
-rw-r--r--app/wlib/gtklib/notice.c344
-rw-r--r--app/wlib/gtklib/opendocument.c88
-rw-r--r--app/wlib/gtklib/osxhelp.c169
-rw-r--r--app/wlib/gtklib/pixbuf.c96
-rw-r--r--app/wlib/gtklib/png.c65
-rw-r--r--app/wlib/gtklib/print.c1074
-rw-r--r--app/wlib/gtklib/single.c356
-rw-r--r--app/wlib/gtklib/splash.c115
-rw-r--r--app/wlib/gtklib/statusbar.c205
-rw-r--r--app/wlib/gtklib/sysinfo.c137
-rw-r--r--app/wlib/gtklib/text.c604
-rw-r--r--app/wlib/gtklib/timer.c95
-rw-r--r--app/wlib/gtklib/tooltip.c236
-rw-r--r--app/wlib/gtklib/treeview.c424
-rw-r--r--app/wlib/gtklib/uthash.h102
-rw-r--r--app/wlib/gtklib/util.c831
-rw-r--r--app/wlib/gtklib/window.c1339
-rw-r--r--app/wlib/gtklib/wpref.c360
-rw-r--r--app/wlib/gtklib/writebitmap.c102
40 files changed, 7096 insertions, 6496 deletions
diff --git a/app/wlib/gtklib/CMakeLists.txt b/app/wlib/gtklib/CMakeLists.txt
index 97ab56f..6c673d9 100644
--- a/app/wlib/gtklib/CMakeLists.txt
+++ b/app/wlib/gtklib/CMakeLists.txt
@@ -1,7 +1,12 @@
# Setup GTK UI library...
-file(GLOB headers *.h)
-set(sources
+target_include_directories(xtrkcad-wlib
+ PRIVATE
+ ${xtrkcad-lib_SOURCE_DIR}
+)
+
+target_sources(xtrkcad-wlib
+ PRIVATE
bitmap.c
boxes.c
button.c
@@ -20,11 +25,11 @@ set(sources
notice.c
opendocument.c
pixbuf.c
- png.c
print.c
single.c
splash.c
statusbar.c
+ sysinfo.c
text.c
timer.c
tooltip.c
@@ -32,66 +37,80 @@ set(sources
util.c
window.c
wpref.c
-# end of refactored sources
+ writebitmap.c
gtkdraw-cairo.c
- )
+)
# help system is OS and build specific, add appropriate source files
if(APPLE)
if (XTRKCAD_USE_APPLEHELP)
- set(sources
- ${sources}
+ target_sources(xtrkcad-wlib
+ PRIVATE
osxhelp.c)
- else(XTRKCAD_USE_APPLEHELP)
+ else()
if(XTRKCAD_USE_BROWSER)
- set(sources
- ${sources}
- browserhelp.c)
- else(XTRKCAD_USE_BROWSER)
- PKG_CHECK_MODULES(GTK_WEBKIT "webkit-1.0" REQUIRED)
- set(sources
- ${sources}
- ixhelp.c)
- endif(XTRKCAD_USE_BROWSER)
- endif(XTRKCAD_USE_APPLEHELP)
-else(APPLE)
+ target_sources(xtrkcad-wlib
+ PRIVATE
+ browserhelp.c)
+ else()
+ PKG_CHECK_MODULES(GTK_WEBKIT "webkit-1.0" REQUIRED)
+ target_sources(xtrkcad-wlib
+ PRIVATE
+ ixhelp.c)
+ endif()
+ endif()
+else()
if(XTRKCAD_USE_BROWSER)
- set(sources
- ${sources}
- browserhelp.c)
- else(XTRKCAD_USE_BROWSER)
+ target_sources(xtrkcad-wlib
+ PRIVATE
+ browserhelp.c)
+ else()
PKG_CHECK_MODULES(GTK_WEBKIT "webkit-1.0" REQUIRED)
- set(sources
- ${sources}
- ixhelp.c)
- endif(XTRKCAD_USE_BROWSER)
-endif(APPLE)
-
-include_directories(${XTrkCAD_BINARY_DIR})
-
-add_library(xtrkcad-wlib ${headers} ${sources})
+ target_sources(xtrkcad-wlib
+ PRIVATE
+ ixhelp.c)
+ endif()
+endif()
# GTK
find_package (GTK2)
-include_directories(${GTK_INCLUDE_DIRS})
-target_link_libraries(xtrkcad-wlib ${GTK_LIBRARIES})
# configure for GTK's native Unix print
find_package (GTKUnixPrint)
-include_directories(${GTK_UNIX_PRINT_INCLUDE_DIRS})
-target_link_libraries(xtrkcad-wlib ${GTK_UNIX_PRINT_LIBRARIES})
+
+target_include_directories(xtrkcad-wlib
+ PRIVATE
+ ${GTK_INCLUDE_DIRS}
+ ${GTK_UNIX_PRINT_INCLUDE_DIRS}
+)
+target_link_libraries(xtrkcad-wlib
+ PRIVATE
+ dynstring
+ ${GTK_UNIX_PRINT_LIBRARIES}
+ ${GTK_LIBRARIES}
+)
# add dependency to webkit if configured
if (APPLE)
if(NOT XTRKCAD_USE_APPLEHELP)
if(NOT XTRKCAD_USE_BROWSER)
- include_directories(${GTK_WEBKIT_INCLUDE_DIRS})
- target_link_libraries(xtrkcad-wlib ${GTK_WEBKIT_LIBRARIES})
+ target_include_directories(xtrkcad-wlib
+ ${GTK_WEBKIT_INCLUDE_DIRS}
+ )
+ target_link_libraries(xtrkcad-wlib
+ PRIVATE
+ ${GTK_WEBKIT_LIBRARIES}
+ )
endif()
endif()
-else (APPLE)
+else ()
if(NOT XTRKCAD_USE_BROWSER)
- include_directories(${GTK_WEBKIT_INCLUDE_DIRS})
- target_link_libraries(xtrkcad-wlib ${GTK_WEBKIT_LIBRARIES})
+ target_include_directories(xtrkcad-wlib
+ ${GTK_WEBKIT_INCLUDE_DIRS}
+ )
+ target_link_libraries(xtrkcad-wlib
+ PRIVATE
+ ${GTK_WEBKIT_LIBRARIES}
+ )
endif()
-endif(APPLE)
+endif()
diff --git a/app/wlib/gtklib/bitmap.c b/app/wlib/gtklib/bitmap.c
index eb5ef94..b1ff2ed 100644
--- a/app/wlib/gtklib/bitmap.c
+++ b/app/wlib/gtklib/bitmap.c
@@ -16,7 +16,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
@@ -46,54 +46,57 @@ struct wBitmap_t {
*/
wControl_p
-wBitmapCreate( wWin_p parent, wPos_t x, wPos_t y, long options, wIcon_p iconP )
+wBitmapCreate( wWin_p parent, wWinPix_t x, wWinPix_t y, long options,
+ const struct wIcon_t * iconP )
{
wBitmap_p bt;
GdkPixbuf *pixbuf;
GtkWidget *image;
-
+
bt = wlibAlloc( parent, B_BITMAP, x, y, NULL, sizeof *bt, NULL );
bt->w = iconP->w;
bt->h = iconP->h;
bt->option = options;
-
+
/*
- * Depending on the platform, parent->widget->window might still be null
+ * Depending on the platform, parent->widget->window might still be null
* at this point. The window allocation should be forced before creating
* the pixmap.
*/
- if ( gtk_widget_get_window( parent->widget ) == NULL )
- gtk_widget_realize( parent->widget ); /* force allocation, if pending */
-
+ if ( gtk_widget_get_window( parent->widget ) == NULL ) {
+ gtk_widget_realize( parent->widget ); /* force allocation, if pending */
+ }
+
/* create the bitmap from supplied xpm data */
pixbuf = gdk_pixbuf_new_from_xpm_data( (const char **)iconP->bits );
g_object_ref_sink(pixbuf);
image = gtk_image_new_from_pixbuf( pixbuf );
gtk_widget_show( image );
g_object_unref( (gpointer)pixbuf );
-
+
bt->widget = gtk_fixed_new();
gtk_widget_show( bt->widget );
gtk_container_add( GTK_CONTAINER(bt->widget), image );
-
+
wlibComputePos( (wControl_p)bt );
wlibControlGetSize( (wControl_p)bt );
gtk_fixed_put( GTK_FIXED( parent->widget ), bt->widget, bt->realX, bt->realY );
-
+
return( (wControl_p)bt );
}
/**
* Create a two-tone icon
- *
+ *
* \param w IN width of icon
* \param h IN height of icon
* \param bits IN bitmap
- * \param color IN color
+ * \param color IN color
* \returns icon handle
*/
-wIcon_p wIconCreateBitMap( wPos_t w, wPos_t h, const char * bits, wDrawColor color )
+wIcon_p wIconCreateBitMap( wWinPix_t w, wWinPix_t h, const char * bits,
+ wDrawColor color )
{
wIcon_p ip;
ip = (wIcon_p)malloc( sizeof *ip );
@@ -101,7 +104,10 @@ wIcon_p wIconCreateBitMap( wPos_t w, wPos_t h, const char * bits, wDrawColor col
ip->w = w;
ip->h = h;
ip->color = color;
- ip->bits = bits;
+ // Copy bits
+ int nBytes = ( ( w + 7 ) / 8 ) * h;
+ ip->bits = (char*)malloc( nBytes );
+ memcpy( (void*)ip->bits, bits, nBytes );
return ip;
}
@@ -125,7 +131,7 @@ wIcon_p wIconCreatePixMap( char *pm[] )
/**
* Set the color a two-tone icon
- *
+ *
* \param ip IN icon handle
* \param color IN color to use
*/
diff --git a/app/wlib/gtklib/boxes.c b/app/wlib/gtklib/boxes.c
index cf419e6..3c0173b 100644
--- a/app/wlib/gtklib/boxes.c
+++ b/app/wlib/gtklib/boxes.c
@@ -36,8 +36,8 @@
#include "gtkint.h"
struct wBox_t {
- WOBJ_COMMON
- wBoxType_e boxTyp;
+ WOBJ_COMMON
+ wBoxType_e boxTyp;
};
#define B (1)
@@ -60,12 +60,12 @@ struct wBox_t {
*/
void wBoxSetSize(
- wBox_p b,
- wPos_t w,
- wPos_t h)
+ wBox_p b,
+ wWinPix_t w,
+ wWinPix_t h)
{
- b->w = w;
- b->h = h;
+ b->w = w;
+ b->h = h;
}
/**
@@ -82,78 +82,78 @@ void wBoxSetSize(
*/
void wlibDrawBox(
- wWin_p win,
- wBoxType_e style,
- wPos_t x,
- wPos_t y,
- wPos_t w,
- wPos_t h)
+ wWin_p win,
+ wBoxType_e style,
+ wWinPix_t x,
+ wWinPix_t y,
+ wWinPix_t w,
+ wWinPix_t h)
{
- wPos_t x0, y0, x1, y1;
- GdkDrawable * window;
- cairo_t *cr;
- static char colors[8][4][2] = {
- { /* ThinB */ {B,0}, {B,0}, {B,0}, {B,0} },
- { /* ThinW */ {W,0}, {W,0}, {W,0}, {W,0} },
- { /* AboveW */ {W,0}, {W,0}, {B,0}, {B,0} },
- { /* BelowW */ {B,0}, {B,0}, {W,0}, {W,0} },
- { /* ThickB */ {B,B}, {B,B}, {B,B}, {B,B} },
- { /* ThickW */ {W,W}, {W,W}, {W,W}, {W,W} },
- { /* RidgeW */ {W,B}, {W,B}, {B,W}, {B,W} },
- { /* TroughW*/ {B,W}, {B,W}, {W,B}, {W,B} }
- };
- window = gtk_widget_get_window(win->widget);
- cr = gdk_cairo_create(window);
- cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
- cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
- cairo_set_line_width(cr, 1.0);
- x0 = x;
- x1 = x+w;
- y0 = y;
- y1 = y+h;
- SETCOLOR(style, 0, 0);
- cairo_move_to(cr, x0, y0);
- cairo_line_to(cr, x0, y1);
- cairo_stroke_preserve(cr);
- SETCOLOR(style, 1, 0);
- cairo_move_to(cr, x0, y0);
- cairo_line_to(cr, x1, y0);
- cairo_stroke_preserve(cr);
- SETCOLOR(style, 2, 0);
- cairo_move_to(cr, x1, y1);
- cairo_line_to(cr, x0+1, y1);
- cairo_stroke_preserve(cr);
- SETCOLOR(style, 3, 0);
- cairo_move_to(cr, x1, y1-1);
- cairo_line_to(cr, x1, y0+1);
- cairo_stroke_preserve(cr);
-
- if (style < wBoxThickB) {
- cairo_destroy(cr);
- return;
- }
-
- x0++;
- y0++;
- x1--;
- y1--;
- SETCOLOR(style, 0, 1);
- cairo_move_to(cr, x0, y0);
- cairo_line_to(cr, x0, y1);
- cairo_stroke_preserve(cr);
- SETCOLOR(style, 1, 1);
- cairo_move_to(cr, x0+1, y0);
- cairo_line_to(cr, x1, y0);
- cairo_stroke_preserve(cr);
- SETCOLOR(style, 2, 1);
- cairo_move_to(cr, x1, y1);
- cairo_line_to(cr, x0+1, y1);
- cairo_stroke_preserve(cr);
- SETCOLOR(style, 3, 1);
- cairo_move_to(cr, x1, y1-1);
- cairo_line_to(cr, x1, y0+1);
- cairo_stroke_preserve(cr);
- cairo_destroy(cr);
+ wWinPix_t x0, y0, x1, y1;
+ GdkDrawable * window;
+ cairo_t *cr;
+ static char colors[8][4][2] = {
+ { /* ThinB */ {B,0}, {B,0}, {B,0}, {B,0} },
+ { /* ThinW */ {W,0}, {W,0}, {W,0}, {W,0} },
+ { /* AboveW */ {W,0}, {W,0}, {B,0}, {B,0} },
+ { /* BelowW */ {B,0}, {B,0}, {W,0}, {W,0} },
+ { /* ThickB */ {B,B}, {B,B}, {B,B}, {B,B} },
+ { /* ThickW */ {W,W}, {W,W}, {W,W}, {W,W} },
+ { /* RidgeW */ {W,B}, {W,B}, {B,W}, {B,W} },
+ { /* TroughW*/ {B,W}, {B,W}, {W,B}, {W,B} }
+ };
+ window = gtk_widget_get_window(win->widget);
+ cr = gdk_cairo_create(window);
+ cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
+ cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
+ cairo_set_line_width(cr, 1.0);
+ x0 = x;
+ x1 = x+w;
+ y0 = y;
+ y1 = y+h;
+ SETCOLOR(style, 0, 0);
+ cairo_move_to(cr, x0, y0);
+ cairo_line_to(cr, x0, y1);
+ cairo_stroke_preserve(cr);
+ SETCOLOR(style, 1, 0);
+ cairo_move_to(cr, x0, y0);
+ cairo_line_to(cr, x1, y0);
+ cairo_stroke_preserve(cr);
+ SETCOLOR(style, 2, 0);
+ cairo_move_to(cr, x1, y1);
+ cairo_line_to(cr, x0+1, y1);
+ cairo_stroke_preserve(cr);
+ SETCOLOR(style, 3, 0);
+ cairo_move_to(cr, x1, y1-1);
+ cairo_line_to(cr, x1, y0+1);
+ cairo_stroke_preserve(cr);
+
+ if (style < wBoxThickB) {
+ cairo_destroy(cr);
+ return;
+ }
+
+ x0++;
+ y0++;
+ x1--;
+ y1--;
+ SETCOLOR(style, 0, 1);
+ cairo_move_to(cr, x0, y0);
+ cairo_line_to(cr, x0, y1);
+ cairo_stroke_preserve(cr);
+ SETCOLOR(style, 1, 1);
+ cairo_move_to(cr, x0+1, y0);
+ cairo_line_to(cr, x1, y0);
+ cairo_stroke_preserve(cr);
+ SETCOLOR(style, 2, 1);
+ cairo_move_to(cr, x1, y1);
+ cairo_line_to(cr, x0+1, y1);
+ cairo_stroke_preserve(cr);
+ SETCOLOR(style, 3, 1);
+ cairo_move_to(cr, x1, y1-1);
+ cairo_line_to(cr, x1, y0+1);
+ cairo_stroke_preserve(cr);
+ cairo_destroy(cr);
}
/**
@@ -165,9 +165,9 @@ void wlibDrawBox(
static void boxRepaint(wControl_p b)
{
- wBox_p bb = (wBox_p)(b);
- wWin_p win = bb->parent;
- wlibDrawBox(win, bb->boxTyp, bb->realX, bb->realY, bb->w, bb->h);
+ wBox_p bb = (wBox_p)(b);
+ wWin_p win = bb->parent;
+ wlibDrawBox(win, bb->boxTyp, bb->realX, bb->realY, bb->w, bb->h);
}
/**
@@ -184,21 +184,21 @@ static void boxRepaint(wControl_p b)
*/
wBox_p wBoxCreate(
- wWin_p parent,
- wPos_t bx,
- wPos_t by,
- const char * labelStr,
- wBoxType_e boxTyp,
- wPos_t bw,
- wPos_t bh)
+ wWin_p parent,
+ wWinPix_t bx,
+ wWinPix_t by,
+ const char * labelStr,
+ wBoxType_e boxTyp,
+ wWinPix_t bw,
+ wWinPix_t bh)
{
- wBox_p b;
- b = (wBox_p)wlibAlloc(parent, B_BOX, bx, by, labelStr, sizeof *b, NULL);
- wlibComputePos((wControl_p)b);
- b->boxTyp = boxTyp;
- b->w = bw;
- b->h = bh;
- b->repaintProc = boxRepaint;
- wlibAddButton((wControl_p)b);
- return b;
+ wBox_p b;
+ b = (wBox_p)wlibAlloc(parent, B_BOX, bx, by, labelStr, sizeof *b, NULL);
+ wlibComputePos((wControl_p)b);
+ b->boxTyp = boxTyp;
+ b->w = bw;
+ b->h = bh;
+ b->repaintProc = boxRepaint;
+ wlibAddButton((wControl_p)b);
+ return b;
}
diff --git a/app/wlib/gtklib/browserhelp.c b/app/wlib/gtklib/browserhelp.c
index aa8f5c7..6d2ac5d 100644
--- a/app/wlib/gtklib/browserhelp.c
+++ b/app/wlib/gtklib/browserhelp.c
@@ -17,18 +17,21 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
#include <assert.h>
#include <string.h>
+#include <limits.h>
-#include "misc.h"
+//#include "misc.h"
#include "gtkint.h"
#include "i18n.h"
+extern wBool_t CheckHelpTopicExists(const char * topic);
+
#include "dynstring.h"
#define debug 0
@@ -43,7 +46,8 @@
"variable.\n Also make sure that the user has sufficient access rights to read these" \
"files."
/**
- * Create a fully qualified url from a topic
+ * Create a fully qualified url from a topic. The library path is converted to
+ * an absolute path first. The url is then created from that path.
*
* \param helpUrl OUT pointer to url, free by caller
* \param topic IN the help topic
@@ -52,20 +56,29 @@
static void
TopicToUrl(char **helpUrl, const char *topic)
{
- DynString url;
- DynStringMalloc(&url, 16);
-
- // build up the url line
- DynStringCatCStrs(&url,
- "file://",
- wGetAppLibDir(),
- "/html/",
- topic,
- ".html",
- NULL);
-
- *helpUrl = strdup(DynStringToCStr(&url));
- DynStringFree(&url);
+ DynString url;
+ DynStringMalloc(&url, 16);
+ char *realPath;
+
+ realPath = realpath(wGetAppLibDir(), NULL);
+
+ if(realPath) {
+ // build up the url line
+ DynStringCatCStrs(&url,
+ "file://",
+ realPath,
+ "/html/",
+ topic,
+ ".html",
+ NULL);
+
+ *helpUrl = strdup(DynStringToCStr(&url));
+ DynStringFree(&url);
+ free(realPath);
+ } else {
+ wNoticeEx( NT_ERROR, _("Not enough memory for realpath()"), _("Exit"), NULL);
+ wExit(0);
+ }
}
/**
* Invoke the system's default browser to display help for <topic>. First the
@@ -77,22 +90,22 @@ TopicToUrl(char **helpUrl, const char *topic)
void wHelp(const char * topic)
{
- int rc;
- char *url;
- char *currentPath;
-
- assert(topic != NULL);
- assert(strlen(topic));
+ int rc;
+ char *url;
+// char *currentPath;
- if (!CheckHelpTopicExists(topic)) return;
+ assert(topic != NULL);
+ assert(strlen(topic));
- TopicToUrl(&url, topic);
+ if (!CheckHelpTopicExists(topic)) { return; }
+ TopicToUrl(&url, topic);
+ printf(">%s<\n", url);
rc = wOpenFileExternal(url);
if (!rc) {
- wNotice(HELPERRORTEXT, _("Cancel"), NULL);
- }
+ wNotice(HELPERRORTEXT, _("Cancel"), NULL);
+ }
- free(url);
+ free(url);
}
diff --git a/app/wlib/gtklib/button.c b/app/wlib/gtklib/button.c
index 51106c8..7193b11 100644
--- a/app/wlib/gtklib/button.c
+++ b/app/wlib/gtklib/button.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -53,10 +53,17 @@
void wButtonSetBusy(wButton_p bb, int value)
{
- bb->recursion++;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bb->widget), value);
- bb->recursion--;
- bb->busy = value;
+ bb->recursion++;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bb->widget), value);
+ bb->recursion--;
+ bb->busy = value;
+ if (!value) {
+ if (bb->timer_id) {
+ g_source_remove(bb->timer_id);
+ bb->timer_id = 0;
+ }
+ bb->timer_state = -1;
+ }
}
/**
@@ -70,57 +77,58 @@ void wButtonSetBusy(wButton_p bb, int value)
*/
void wlibSetLabel(
- GtkWidget *widget,
- long option,
- const char * labelStr,
- GtkLabel * * labelG,
- GtkWidget * * imageG)
+ GtkWidget *widget,
+ long option,
+ const char * labelStr,
+ GtkLabel * * labelG,
+ GtkWidget * * imageG)
{
- wIcon_p bm;
- GdkBitmap * mask;
-
- if (widget == 0) {
- abort();
- }
-
- if (labelStr) {
- if (option&BO_ICON) {
- GdkPixbuf *pixbuf;
-
- bm = (wIcon_p)labelStr;
-
- if (bm->gtkIconType == gtkIcon_pixmap) {
- pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)bm->bits);
- } else {
- pixbuf = wlibPixbufFromXBM( bm );
- }
- double scaleicon;
- wPrefGetFloat(PREFSECTION, LARGEICON, &scaleicon, 1.0);
- if (scaleicon<1.0) scaleicon=1.0;
- if (scaleicon>2.0) scaleicon=2.0;
- GdkPixbuf *pixbuf2 =
- gdk_pixbuf_scale_simple(pixbuf, gdk_pixbuf_get_width(pixbuf)*scaleicon, gdk_pixbuf_get_height(pixbuf)*scaleicon, GDK_INTERP_BILINEAR);
- g_object_ref_sink(pixbuf);
- g_object_unref((gpointer)pixbuf);
- if (*imageG==NULL) {
- *imageG = gtk_image_new_from_pixbuf(pixbuf2);
- gtk_container_add(GTK_CONTAINER(widget), *imageG);
- gtk_widget_show(*imageG);
- } else {
- gtk_image_set_from_pixbuf(GTK_IMAGE(*imageG), pixbuf2);
- }
- g_object_ref_sink(pixbuf2);
- g_object_unref((gpointer)pixbuf2);
- } else {
- if (*labelG==NULL) {
- *labelG = (GtkLabel*)gtk_label_new(wlibConvertInput(labelStr));
- gtk_container_add(GTK_CONTAINER(widget), (GtkWidget*)*labelG);
- gtk_widget_show((GtkWidget*)*labelG);
- } else {
- gtk_label_set_text(*labelG, wlibConvertInput(labelStr));
- }
- }
- }
+ wIcon_p bm;
+// GdkBitmap * mask;
+
+ if (widget == 0) {
+ abort();
+ }
+
+ if (labelStr) {
+ if (option&BO_ICON) {
+ GdkPixbuf *pixbuf;
+
+ bm = (wIcon_p)labelStr;
+
+ if (bm->gtkIconType == gtkIcon_pixmap) {
+ pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)bm->bits);
+ } else {
+ pixbuf = wlibPixbufFromXBM( bm );
+ }
+ double scaleicon;
+ wPrefGetFloat(PREFSECTION, LARGEICON, &scaleicon, 1.0);
+ if (scaleicon<1.0) { scaleicon=1.0; }
+ if (scaleicon>2.0) { scaleicon=2.0; }
+ GdkPixbuf *pixbuf2 =
+ gdk_pixbuf_scale_simple(pixbuf, gdk_pixbuf_get_width(pixbuf)*scaleicon,
+ gdk_pixbuf_get_height(pixbuf)*scaleicon, GDK_INTERP_BILINEAR);
+ g_object_ref_sink(pixbuf);
+ g_object_unref((gpointer)pixbuf);
+ if (*imageG==NULL) {
+ *imageG = gtk_image_new_from_pixbuf(pixbuf2);
+ gtk_container_add(GTK_CONTAINER(widget), *imageG);
+ gtk_widget_show(*imageG);
+ } else {
+ gtk_image_set_from_pixbuf(GTK_IMAGE(*imageG), pixbuf2);
+ }
+ g_object_ref_sink(pixbuf2);
+ g_object_unref((gpointer)pixbuf2);
+ } else {
+ if (*labelG==NULL) {
+ *labelG = (GtkLabel*)gtk_label_new(wlibConvertInput(labelStr));
+ gtk_container_add(GTK_CONTAINER(widget), (GtkWidget*)*labelG);
+ gtk_widget_show((GtkWidget*)*labelG);
+ } else {
+ gtk_label_set_text(*labelG, wlibConvertInput(labelStr));
+ }
+ }
+ }
}
/**
@@ -131,7 +139,7 @@ void wlibSetLabel(
void wButtonSetLabel(wButton_p bb, const char * labelStr)
{
- wlibSetLabel(bb->widget, bb->option, labelStr, &bb->labelG, &bb->imageG);
+ wlibSetLabel(bb->widget, bb->option, labelStr, &bb->labelG, &bb->imageG);
}
/**
@@ -141,51 +149,166 @@ void wButtonSetLabel(wButton_p bb, const char * labelStr)
*/
void wlibButtonDoAction(
- wButton_p bb)
+ wButton_p bb)
{
- if (bb->action) {
- bb->action(bb->data);
- }
+ if (bb->action) {
+ bb->action(bb->data);
+ }
}
+
/**
* Signal handler for button push
- * \param widget IN the widget
+ * \param widget IN the widget or NULL for autorepeat
* \param value IN the button handle (same as widget???)
*/
static void pushButt(
- GtkWidget *widget,
- gpointer value)
+ GtkWidget *widget,
+ gpointer value)
{
- wButton_p b = (wButton_p)value;
+ wButton_p b = (wButton_p)value;
+
+ if (debugWindow >= 2) {
+ printf("%s button pushed\n", b->labelStr?b->labelStr:"No label");
+ }
- if (debugWindow >= 2) {
- printf("%s button pushed\n", b->labelStr?b->labelStr:"No label");
- }
+ if (b->recursion) {
+ return;
+ }
- if (b->recursion) {
- return;
- }
+ wlibStringUpdate();
+ if (b->action) {
+ b->action(b->data);
+ }
- if (b->action) {
- b->action(b->data);
- }
- if (!b->busy) {
- b->recursion++;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->widget), FALSE);
- b->recursion--;
- }
}
+#define REPEAT_STAGE0_DELAY 500
+#define REPEAT_STAGE1_DELAY 150
+#define REPEAT_STAGE2_DELAY 100
+
+/* Timer callback function! */
+static int timer_func ( void * data)
+{
+ wButton_p bb = (wButton_p)data;
+ if (bb->timer_id == 0) {
+ bb->timer_state = -1;
+ return FALSE;
+ }
+ /* Autorepeat state machine */
+ switch (bb->timer_state) {
+ case 0: /* Enable slow auto-repeat */
+ g_source_remove(bb->timer_id);
+ bb->timer_id = 0;
+ bb->timer_state = 1;
+ bb->timer_id = g_timeout_add( REPEAT_STAGE1_DELAY, timer_func, bb);
+ bb->timer_count = 0;
+ break;
+ case 1: /* Check if it's time for fast repeat yet */
+ if (bb->timer_count++ > 10) {
+ bb->timer_state = 2;
+ }
+ break;
+ case 2: /* Start fast auto-repeat */
+ g_source_remove(bb->timer_id);
+ bb->timer_id = 0;
+ bb->timer_state = 3;
+ bb->timer_id = g_timeout_add( REPEAT_STAGE2_DELAY, timer_func, bb);
+ break;
+ case 3:
+ break;
+ default:
+ g_source_remove(bb->timer_id);
+ bb->timer_id = 0;
+ bb->timer_state = -1;
+ return FALSE;
+ break;
+ }
+
+ pushButt(NULL,bb);
+
+ return TRUE;
+
+}
+
+static gint pressButt(
+ GtkWidget *widget,
+ GdkEventButton *event,
+ wButton_p bb)
+{
+
+ if ( debugWindow >= 1 ) {
+ printf( "buttonPress: %s\n", bb->labelStr );
+ }
+ if (bb->recursion) {
+ return TRUE;
+
+ }
+
+
+ if (bb->option & BO_REPEAT) {
+ /* Remove an existing timer */
+ if (bb->timer_id) {
+ g_source_remove(bb->timer_id);
+ }
+
+ /* Setup a timer */
+ bb->timer_id = g_timeout_add( REPEAT_STAGE0_DELAY, timer_func, bb);
+ bb->timer_state = 0;
+
+ }
+
+ if (!bb->busy) {
+ bb->recursion++;
+ int sensitive = gtk_widget_get_sensitive (GTK_WIDGET(bb->widget));
+ if (sensitive) {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bb->widget), TRUE);
+ }
+ bb->recursion--;
+ }
+
+
+ return TRUE;
+
+}
+
+static gint releaseButt(
+ GtkWidget *widget,
+ GdkEventButton *event,
+ wButton_p bb)
+{
+
+ if ( debugWindow >= 1 ) {
+ printf( "buttonRelease: %s\n", bb->labelStr );
+ }
+ /* Remove any existing timer */
+ if (bb->timer_id) {
+ g_source_remove(bb->timer_id);
+ bb->timer_id = 0;
+ }
+
+ bb->timer_state = -1;
+
+ pushButt(widget,bb); //Do here to simulate "clicked"
+
+ if (!bb->busy) {
+ bb->recursion++;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bb->widget), FALSE);
+ bb->recursion--;
+ }
+ return TRUE;
+}
+
+
/**
* Called after expose event default hander - allows the button to be outlined
*/
static wBool_t exposeButt(
- GtkWidget *widget,
- GdkEventExpose *event,
- gpointer g)
+ GtkWidget *widget,
+ GdkEventExpose *event,
+ gpointer g)
{
wControl_p b = (wControl_p)g;
return wControlExpose(widget,event,b);
@@ -207,57 +330,62 @@ static wBool_t exposeButt(
*/
wButton_p wButtonCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- const char * labelStr,
- long option,
- wPos_t width,
- wButtonCallBack_p action,
- void * data)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ wWinPix_t width,
+ wButtonCallBack_p action,
+ void * data)
{
- wButton_p b;
- if (option&BO_ICON) //The labelStr here is a wIcon_p
- b = wlibAlloc(parent, B_BUTTON, x, y, " ", sizeof *b, data);
- else
- b = wlibAlloc(parent, B_BUTTON, x, y, labelStr, sizeof *b, data);
- b->option = option;
- b->action = action;
- wlibComputePos((wControl_p)b);
-
- b->widget = gtk_toggle_button_new();
- g_signal_connect(GTK_OBJECT(b->widget), "clicked",
- G_CALLBACK(pushButt), b);
- g_signal_connect_after(GTK_OBJECT(b->widget), "expose-event",
- G_CALLBACK(exposeButt), b);
- if (width > 0) {
- gtk_widget_set_size_request(b->widget, width, -1);
- }
-
- if( labelStr ){
- wButtonSetLabel(b, labelStr);
- }
-
- gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
-
- if (option & BB_DEFAULT) {
- gtk_widget_set_can_default(b->widget, GTK_CAN_DEFAULT);
- gtk_widget_grab_default(b->widget);
- gtk_window_set_default(GTK_WINDOW(parent->gtkwin), b->widget);
- }
-
- wlibControlGetSize((wControl_p)b);
-
- if (width == 0 && b->w < MIN_BUTTON_WIDTH && (b->option&BO_ICON)==0) {
- b->w = MIN_BUTTON_WIDTH;
- gtk_widget_set_size_request(b->widget, b->w, b->h);
- }
-
- gtk_widget_show(b->widget);
- wlibAddButton((wControl_p)b);
- wlibAddHelpString(b->widget, helpStr);
- return b;
+ wButton_p b;
+ if (option&BO_ICON) { //The labelStr here is a wIcon_p
+ b = wlibAlloc(parent, B_BUTTON, x, y, " ", sizeof *b, data);
+ } else {
+ b = wlibAlloc(parent, B_BUTTON, x, y, labelStr, sizeof *b, data);
+ }
+ b->option = option;
+ b->action = action;
+ wlibComputePos((wControl_p)b);
+
+ b->widget = gtk_toggle_button_new();
+ g_signal_connect(GTK_OBJECT(b->widget), "button_press_event",
+ G_CALLBACK(pressButt), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "button_release_event",
+ G_CALLBACK(releaseButt), b);
+ //g_signal_connect(GTK_OBJECT(b->widget), "clicked",
+ // G_CALLBACK(pushButt), b);
+ g_signal_connect_after(GTK_OBJECT(b->widget), "expose-event",
+ G_CALLBACK(exposeButt), b);
+ if (width > 0) {
+ gtk_widget_set_size_request(b->widget, width, -1);
+ }
+
+ if( labelStr ) {
+ wButtonSetLabel(b, labelStr);
+ }
+
+ gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
+
+ if (option & BB_DEFAULT) {
+ gtk_widget_set_can_default(b->widget, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default(b->widget);
+ gtk_window_set_default(GTK_WINDOW(parent->gtkwin), b->widget);
+ }
+
+ wlibControlGetSize((wControl_p)b);
+
+ if (width == 0 && b->w < MIN_BUTTON_WIDTH && (b->option&BO_ICON)==0) {
+ b->w = MIN_BUTTON_WIDTH;
+ gtk_widget_set_size_request(b->widget, b->w, b->h);
+ }
+
+ gtk_widget_show(b->widget);
+ wlibAddButton((wControl_p)b);
+ wlibAddHelpString(b->widget, helpStr);
+ return b;
}
@@ -270,10 +398,10 @@ wButton_p wButtonCreate(
*/
struct wChoice_t {
- WOBJ_COMMON
- long *valueP;
- wChoiceCallBack_p action;
- int recursion;
+ WOBJ_COMMON
+ long *valueP;
+ wChoiceCallBack_p action;
+ int recursion;
};
@@ -288,33 +416,33 @@ struct wChoice_t {
*/
static long choiceGetValue(
- wChoice_p bc)
+ wChoice_p bc)
{
- GList * child, * children;
- long value, inx;
-
- if (bc->type == B_TOGGLE) {
- value = 0;
- } else {
- value = -1;
- }
-
- for (children=child=gtk_container_get_children(GTK_CONTAINER(bc->widget)),inx=0;
- child; child=child->next,inx++) {
- if (gtk_toggle_button_get_active(child->data)) {
- if (bc->type == B_TOGGLE) {
- value |= (1<<inx);
- } else {
- value = inx;
- }
- }
- }
-
- if (children) {
- g_list_free(children);
- }
-
- return value;
+ GList * child, * children;
+ long value, inx;
+
+ if (bc->type == B_TOGGLE) {
+ value = 0;
+ } else {
+ value = -1;
+ }
+
+ for (children=child=gtk_container_get_children(GTK_CONTAINER(bc->widget)),inx=0;
+ child; child=child->next,inx++) {
+ if (gtk_toggle_button_get_active(child->data)) {
+ if (bc->type == B_TOGGLE) {
+ value |= (1<<inx);
+ } else {
+ value = inx;
+ }
+ }
+ }
+
+ if (children) {
+ g_list_free(children);
+ }
+
+ return value;
}
/**
@@ -325,24 +453,24 @@ static long choiceGetValue(
*/
void wRadioSetValue(
- wChoice_p bc, /* Radio box */
- long value) /* Value */
+ wChoice_p bc, /* Radio box */
+ long value) /* Value */
{
- GList * child, * children;
- long inx;
-
- for (children=child=gtk_container_get_children(GTK_CONTAINER(bc->widget)),inx=0;
- child; child=child->next,inx++) {
- if (inx == value) {
- bc->recursion++;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(child->data), TRUE);
- bc->recursion--;
- }
- }
-
- if (children) {
- g_list_free(children);
- }
+ GList * child, * children;
+ long inx;
+
+ for (children=child=gtk_container_get_children(GTK_CONTAINER(bc->widget)),inx=0;
+ child; child=child->next,inx++) {
+ if (inx == value) {
+ bc->recursion++;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(child->data), TRUE);
+ bc->recursion--;
+ }
+ }
+
+ if (children) {
+ g_list_free(children);
+ }
}
/**
@@ -353,9 +481,9 @@ void wRadioSetValue(
*/
long wRadioGetValue(
- wChoice_p bc) /* Radio box */
+ wChoice_p bc) /* Radio box */
{
- return choiceGetValue(bc);
+ return choiceGetValue(bc);
}
/**
@@ -366,24 +494,24 @@ long wRadioGetValue(
*/
void wToggleSetValue(
- wChoice_p bc, /* Toggle box */
- long value) /* Values */
+ wChoice_p bc, /* Toggle box */
+ long value) /* Values */
{
- GList * child, * children;
- long inx;
- bc->recursion++;
+ GList * child, * children;
+ long inx;
+ bc->recursion++;
- for (children=child=gtk_container_get_children(GTK_CONTAINER(bc->widget)),inx=0;
- child; child=child->next,inx++) {
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(child->data),
- (value&(1<<inx))!=0);
- }
+ for (children=child=gtk_container_get_children(GTK_CONTAINER(bc->widget)),inx=0;
+ child; child=child->next,inx++) {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(child->data),
+ (value&(1<<inx))!=0);
+ }
- if (children) {
- g_list_free(children);
- }
+ if (children) {
+ g_list_free(children);
+ }
- bc->recursion--;
+ bc->recursion--;
}
@@ -395,9 +523,9 @@ void wToggleSetValue(
*/
long wToggleGetValue(
- wChoice_p b) /* Toggle box */
+ wChoice_p b) /* Toggle box */
{
- return choiceGetValue(b);
+ return choiceGetValue(b);
}
/**
@@ -410,35 +538,35 @@ long wToggleGetValue(
*/
static int pushChoice(
- GtkWidget *widget,
- gpointer b)
+ GtkWidget *widget,
+ gpointer b)
{
- wChoice_p bc = (wChoice_p)b;
- long value = choiceGetValue(bc);
+ wChoice_p bc = (wChoice_p)b;
+ long value = choiceGetValue(bc);
- if (debugWindow >= 2) {
- printf("%s choice pushed = %ld\n", bc->labelStr?bc->labelStr:"No label",
- value);
- }
+ if (debugWindow >= 2) {
+ printf("%s choice pushed = %ld\n", bc->labelStr?bc->labelStr:"No label",
+ value);
+ }
- if (bc->type == B_RADIO &&
- !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))) {
- return 1;
- }
+ if (bc->type == B_RADIO &&
+ !(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))) {
+ return 1;
+ }
- if (bc->recursion) {
- return 1;
- }
+ if (bc->recursion) {
+ return 1;
+ }
- if (bc->valueP) {
- *bc->valueP = value;
- }
+ if (bc->valueP) {
+ *bc->valueP = value;
+ }
- if (bc->action) {
- bc->action(value, bc->data);
- }
+ if (bc->action) {
+ bc->action(value, bc->data);
+ }
- return 1;
+ return 1;
}
/**
@@ -449,13 +577,13 @@ static int pushChoice(
*/
static void choiceRepaint(
- wControl_p b)
+ wControl_p b)
{
- wChoice_p bc = (wChoice_p)b;
+ wChoice_p bc = (wChoice_p)b;
- if (gtk_widget_get_visible(b->widget)) {
- wlibDrawBox(bc->parent, wBoxBelow, bc->realX-1, bc->realY-1, bc->w+1, bc->h+1);
- }
+ if (gtk_widget_get_visible(b->widget)) {
+ wlibDrawBox(bc->parent, wBoxBelow, bc->realX-1, bc->realY-1, bc->w+1, bc->h+1);
+ }
}
/**
@@ -475,95 +603,95 @@ static void choiceRepaint(
*/
wChoice_p wRadioCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- const char * labelStr,
- long option,
- const char **labels,
- long *valueP,
- wChoiceCallBack_p action,
- void *data)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ const char * const *labels,
+ long *valueP,
+ wChoiceCallBack_p action,
+ void *data)
{
- wChoice_p b;
- const char ** label;
- GtkWidget *butt0=NULL, *butt;
-
- if ((option & BC_NOBORDER)==0) {
- if (x>=0) {
- x++;
- } else {
- x--;
- }
-
- if (y>=0) {
- y++;
- } else {
- y--;
- }
- }
-
- b = wlibAlloc(parent, B_RADIO, x, y, labelStr, sizeof *b, data);
- b->option = option;
- b->action = action;
- b->valueP = valueP;
- wlibComputePos((wControl_p)b);
-
- ((wControl_p)b)->outline = FALSE;
-
- if (option&BC_HORZ) {
- b->widget = gtk_hbox_new(FALSE, 0);
- } else {
- b->widget = gtk_vbox_new(FALSE, 0);
- }
-
- if (b->widget == 0) {
- abort();
- }
-
- for (label=labels; *label; label++) {
- butt = gtk_radio_button_new_with_label(
- butt0?gtk_radio_button_get_group(GTK_RADIO_BUTTON(butt0)):NULL, _(*label));
-
- if (butt0==NULL) {
- butt0 = butt;
- }
-
- gtk_box_pack_start(GTK_BOX(b->widget), butt, TRUE, TRUE, 0);
- gtk_widget_show(butt);
- g_signal_connect(GTK_OBJECT(butt), "toggled",
- G_CALLBACK(pushChoice), b);
- g_signal_connect_after(GTK_OBJECT(b->widget), "expose-event",
- G_CALLBACK(exposeButt), b);
- wlibAddHelpString(butt, helpStr);
- }
-
- if (option & BB_DEFAULT) {
- gtk_widget_set_can_default(b->widget, TRUE);
- gtk_widget_grab_default(b->widget);
- }
-
- if (valueP) {
- wRadioSetValue(b, *valueP);
- }
-
- if ((option & BC_NOBORDER)==0) {
- b->repaintProc = choiceRepaint;
- b->w += 2;
- b->h += 2;
- }
-
- gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
- wlibControlGetSize((wControl_p)b);
-
- if (labelStr) {
- b->labelW = wlibAddLabel((wControl_p)b, labelStr);
- }
-
- gtk_widget_show(b->widget);
- wlibAddButton((wControl_p)b);
- return b;
+ wChoice_p b;
+ const char * const * label;
+ GtkWidget *butt0=NULL, *butt;
+
+ if ((option & BC_NOBORDER)==0) {
+ if (x>=0) {
+ x++;
+ } else {
+ x--;
+ }
+
+ if (y>=0) {
+ y++;
+ } else {
+ y--;
+ }
+ }
+
+ b = wlibAlloc(parent, B_RADIO, x, y, labelStr, sizeof *b, data);
+ b->option = option;
+ b->action = action;
+ b->valueP = valueP;
+ wlibComputePos((wControl_p)b);
+
+ ((wControl_p)b)->outline = FALSE;
+
+ if (option&BC_HORZ) {
+ b->widget = gtk_hbox_new(FALSE, 0);
+ } else {
+ b->widget = gtk_vbox_new(FALSE, 0);
+ }
+
+ if (b->widget == 0) {
+ abort();
+ }
+
+ for (label=labels; *label; label++) {
+ butt = gtk_radio_button_new_with_label(
+ butt0?gtk_radio_button_get_group(GTK_RADIO_BUTTON(butt0)):NULL, _(*label));
+
+ if (butt0==NULL) {
+ butt0 = butt;
+ }
+
+ gtk_box_pack_start(GTK_BOX(b->widget), butt, TRUE, TRUE, 0);
+ gtk_widget_show(butt);
+ g_signal_connect(GTK_OBJECT(butt), "toggled",
+ G_CALLBACK(pushChoice), b);
+ g_signal_connect_after(GTK_OBJECT(b->widget), "expose-event",
+ G_CALLBACK(exposeButt), b);
+ wlibAddHelpString(butt, helpStr);
+ }
+
+ if (option & BB_DEFAULT) {
+ gtk_widget_set_can_default(b->widget, TRUE);
+ gtk_widget_grab_default(b->widget);
+ }
+
+ if (valueP) {
+ wRadioSetValue(b, *valueP);
+ }
+
+ if ((option & BC_NOBORDER)==0) {
+ b->repaintProc = choiceRepaint;
+ b->w += 2;
+ b->h += 2;
+ }
+
+ gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
+ wlibControlGetSize((wControl_p)b);
+
+ if (labelStr) {
+ b->labelW = wlibAddLabel((wControl_p)b, labelStr);
+ }
+
+ gtk_widget_show(b->widget);
+ wlibAddButton((wControl_p)b);
+ return b;
}
/**
@@ -583,82 +711,82 @@ wChoice_p wRadioCreate(
*/
wChoice_p wToggleCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- const char * labelStr,
- long option,
- const char **labels,
- long *valueP,
- wChoiceCallBack_p action,
- void *data)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ const char * const * labels,
+ long *valueP,
+ wChoiceCallBack_p action,
+ void *data)
{
- wChoice_p b;
- const char ** label;
-
- if ((option & BC_NOBORDER)==0) {
- if (x>=0) {
- x++;
- } else {
- x--;
- }
-
- if (y>=0) {
- y++;
- } else {
- y--;
- }
- }
-
- b = wlibAlloc(parent, B_TOGGLE, x, y, labelStr, sizeof *b, data);
- b->option = option;
- b->action = action;
- wlibComputePos((wControl_p)b);
-
- ((wControl_p)b)->outline = FALSE;
-
- if (option&BC_HORZ) {
- b->widget = gtk_hbox_new(FALSE, 0);
- } else {
- b->widget = gtk_vbox_new(FALSE, 0);
- }
-
- if (b->widget == 0) {
- abort();
- }
-
- for (label=labels; *label; label++) {
- GtkWidget *butt;
-
- butt = gtk_check_button_new_with_label(_(*label));
- gtk_box_pack_start(GTK_BOX(b->widget), butt, TRUE, TRUE, 0);
- gtk_widget_show(butt);
- g_signal_connect(GTK_OBJECT(butt), "toggled",
- G_CALLBACK(pushChoice), b);
- g_signal_connect_after(GTK_OBJECT(b->widget), "expose-event",
- G_CALLBACK(exposeButt), b);
- wlibAddHelpString(butt, helpStr);
- }
-
- if (valueP) {
- wToggleSetValue(b, *valueP);
- }
-
- if ((option & BC_NOBORDER)==0) {
- b->repaintProc = choiceRepaint;
- b->w += 2;
- b->h += 2;
- }
-
- gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
- wlibControlGetSize((wControl_p)b);
-
- if (labelStr) {
- b->labelW = wlibAddLabel((wControl_p)b, labelStr);
- }
-
- gtk_widget_show(b->widget);
- wlibAddButton((wControl_p)b);
- return b;
+ wChoice_p b;
+ const char * const * label;
+
+ if ((option & BC_NOBORDER)==0) {
+ if (x>=0) {
+ x++;
+ } else {
+ x--;
+ }
+
+ if (y>=0) {
+ y++;
+ } else {
+ y--;
+ }
+ }
+
+ b = wlibAlloc(parent, B_TOGGLE, x, y, labelStr, sizeof *b, data);
+ b->option = option;
+ b->action = action;
+ wlibComputePos((wControl_p)b);
+
+ ((wControl_p)b)->outline = FALSE;
+
+ if (option&BC_HORZ) {
+ b->widget = gtk_hbox_new(FALSE, 0);
+ } else {
+ b->widget = gtk_vbox_new(FALSE, 0);
+ }
+
+ if (b->widget == 0) {
+ abort();
+ }
+
+ for (label=labels; *label; label++) {
+ GtkWidget *butt;
+
+ butt = gtk_check_button_new_with_label(_(*label));
+ gtk_box_pack_start(GTK_BOX(b->widget), butt, TRUE, TRUE, 0);
+ gtk_widget_show(butt);
+ g_signal_connect(GTK_OBJECT(butt), "toggled",
+ G_CALLBACK(pushChoice), b);
+ g_signal_connect_after(GTK_OBJECT(b->widget), "expose-event",
+ G_CALLBACK(exposeButt), b);
+ wlibAddHelpString(butt, helpStr);
+ }
+
+ if (valueP) {
+ wToggleSetValue(b, *valueP);
+ }
+
+ if ((option & BC_NOBORDER)==0) {
+ b->repaintProc = choiceRepaint;
+ b->w += 2;
+ b->h += 2;
+ }
+
+ gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
+ wlibControlGetSize((wControl_p)b);
+
+ if (labelStr) {
+ b->labelW = wlibAddLabel((wControl_p)b, labelStr);
+ }
+
+ gtk_widget_show(b->widget);
+ wlibAddButton((wControl_p)b);
+ return b;
}
diff --git a/app/wlib/gtklib/color.c b/app/wlib/gtklib/color.c
index e1689d2..d193872 100644
--- a/app/wlib/gtklib/color.c
+++ b/app/wlib/gtklib/color.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <assert.h>
#include <stdlib.h>
@@ -45,62 +45,62 @@ wDrawColor wDrawColorBlack;
static GArray *colorMap_garray = NULL; // Change to use glib array
static colorMap_t colorMap[] = {
- { 255, 255, 255 }, /* White */
- { 0, 0, 0 }, /* Black */
- { 255, 0, 0 }, /* Red */
- { 0, 255, 0 }, /* Green */
- { 0, 0, 255 }, /* Blue */
- { 255, 255, 0 }, /* Yellow */
- { 255, 0, 255 }, /* Purple */
- { 0, 255, 255 }, /* Aqua */
- { 128, 0, 0 }, /* Dk. Red */
- { 0, 128, 0 }, /* Dk. Green */
- { 0, 0, 128 }, /* Dk. Blue */
- { 128, 128, 0 }, /* Dk. Yellow */
- { 128, 0, 128 }, /* Dk. Purple */
- { 0, 128, 128 }, /* Dk. Aqua */
- { 65, 105, 225 }, /* Royal Blue */
- { 0, 191, 255 }, /* DeepSkyBlue */
- { 125, 206, 250 }, /* LightSkyBlue */
- { 70, 130, 180 }, /* Steel Blue */
- { 176, 224, 230 }, /* Powder Blue */
- { 127, 255, 212 }, /* Aquamarine */
- { 46, 139, 87 }, /* SeaGreen */
- { 152, 251, 152 }, /* PaleGreen */
- { 124, 252, 0 }, /* LawnGreen */
- { 50, 205, 50 }, /* LimeGreen */
- { 34, 139, 34 }, /* ForestGreen */
- { 255, 215, 0 }, /* Gold */
- { 188, 143, 143 }, /* RosyBrown */
- { 139, 69, 19 }, /* SaddleBrown */
- { 245, 245, 220 }, /* Beige */
- { 210, 180, 140 }, /* Tan */
- { 210, 105, 30 }, /* Chocolate */
- { 165, 42, 42 }, /* Brown */
- { 255, 165, 0 }, /* Orange */
- { 255, 127, 80 }, /* Coral */
- { 255, 99, 71 }, /* Tomato */
- { 255, 105, 180 }, /* HotPink */
- { 255, 192, 203 }, /* Pink */
- { 176, 48, 96 }, /* Maroon */
- { 238, 130, 238 }, /* Violet */
- { 160, 32, 240 }, /* Purple */
- { 16, 16, 16 }, /* Gray */
- { 32, 32, 32 }, /* Gray */
- { 48, 48, 48 }, /* Gray */
- { 64, 64, 64 }, /* Gray */
- { 80, 80, 80 }, /* Gray */
- { 96, 96, 96 }, /* Gray */
- { 112, 112, 122 }, /* Gray */
- { 128, 128, 128 }, /* Gray */
- { 144, 144, 144 }, /* Gray */
- { 160, 160, 160 }, /* Gray */
- { 176, 176, 176 }, /* Gray */
- { 192, 192, 192 }, /* Gray */
- { 208, 208, 208 }, /* Gray */
- { 224, 224, 224 }, /* Gray */
- { 240, 240, 240 }, /* Gray */
- { 255, 255, 255 } /* WhitePixel */
+ { 255, 255, 255 }, /* White */
+ { 0, 0, 0 }, /* Black */
+ { 255, 0, 0 }, /* Red */
+ { 0, 255, 0 }, /* Green */
+ { 0, 0, 255 }, /* Blue */
+ { 255, 255, 0 }, /* Yellow */
+ { 255, 0, 255 }, /* Purple */
+ { 0, 255, 255 }, /* Aqua */
+ { 128, 0, 0 }, /* Dk. Red */
+ { 0, 128, 0 }, /* Dk. Green */
+ { 0, 0, 128 }, /* Dk. Blue */
+ { 128, 128, 0 }, /* Dk. Yellow */
+ { 128, 0, 128 }, /* Dk. Purple */
+ { 0, 128, 128 }, /* Dk. Aqua */
+ { 65, 105, 225 }, /* Royal Blue */
+ { 0, 191, 255 }, /* DeepSkyBlue */
+ { 125, 206, 250 }, /* LightSkyBlue */
+ { 70, 130, 180 }, /* Steel Blue */
+ { 176, 224, 230 }, /* Powder Blue */
+ { 127, 255, 212 }, /* Aquamarine */
+ { 46, 139, 87 }, /* SeaGreen */
+ { 152, 251, 152 }, /* PaleGreen */
+ { 124, 252, 0 }, /* LawnGreen */
+ { 50, 205, 50 }, /* LimeGreen */
+ { 34, 139, 34 }, /* ForestGreen */
+ { 255, 215, 0 }, /* Gold */
+ { 188, 143, 143 }, /* RosyBrown */
+ { 139, 69, 19 }, /* SaddleBrown */
+ { 245, 245, 220 }, /* Beige */
+ { 210, 180, 140 }, /* Tan */
+ { 210, 105, 30 }, /* Chocolate */
+ { 165, 42, 42 }, /* Brown */
+ { 255, 165, 0 }, /* Orange */
+ { 255, 127, 80 }, /* Coral */
+ { 255, 99, 71 }, /* Tomato */
+ { 255, 105, 180 }, /* HotPink */
+ { 255, 192, 203 }, /* Pink */
+ { 176, 48, 96 }, /* Maroon */
+ { 238, 130, 238 }, /* Violet */
+ { 160, 32, 240 }, /* Purple */
+ { 16, 16, 16 }, /* Gray */
+ { 32, 32, 32 }, /* Gray */
+ { 48, 48, 48 }, /* Gray */
+ { 64, 64, 64 }, /* Gray */
+ { 80, 80, 80 }, /* Gray */
+ { 96, 96, 96 }, /* Gray */
+ { 112, 112, 122 }, /* Gray */
+ { 128, 128, 128 }, /* Gray */
+ { 144, 144, 144 }, /* Gray */
+ { 160, 160, 160 }, /* Gray */
+ { 176, 176, 176 }, /* Gray */
+ { 192, 192, 192 }, /* Gray */
+ { 208, 208, 208 }, /* Gray */
+ { 224, 224, 224 }, /* Gray */
+ { 240, 240, 240 }, /* Gray */
+ { 255, 255, 255 } /* WhitePixel */
};
#define NUM_GRAYS (16)
@@ -117,21 +117,21 @@ static char lastColorChar = '!';
*/
wDrawColor wDrawColorGray(
- int percent)
+ int percent)
{
- int n;
- long rgb;
- n = (percent * (NUM_GRAYS+1)) / 100;
-
- if (n <= 0) {
- return wDrawColorBlack;
- } else if (n >= NUM_GRAYS) {
- return wDrawColorWhite;
- } else {
- n = (n*256)/NUM_GRAYS;
- rgb = RGB(n, n, n);
- return wDrawFindColor(rgb);
- }
+ int n;
+ long rgb;
+ n = (percent * (NUM_GRAYS+1)) / 100;
+
+ if (n <= 0) {
+ return wDrawColorBlack;
+ } else if (n >= NUM_GRAYS) {
+ return wDrawColorWhite;
+ } else {
+ n = (n*256)/NUM_GRAYS;
+ rgb = RGB(n, n, n);
+ return wDrawFindColor(rgb);
+ }
}
/**
@@ -142,12 +142,12 @@ wDrawColor wDrawColorGray(
void wlibGetColorMap(void)
{
- if (gtkColorMap) {
- return;
- }
+ if (gtkColorMap) {
+ return;
+ }
- gtkColorMap = gtk_widget_get_colormap(gtkMainW->widget);
- return;
+ gtkColorMap = gtk_widget_get_colormap(gtkMainW->widget);
+ return;
}
/**
@@ -160,21 +160,21 @@ void wlibGetColorMap(void)
static void init_colorMapValue(colorMap_t * t)
{
- t->rgb = RGB(t->red, t->green, t->blue);
- t->normalColor.red = t->red*65535/255;
- t->normalColor.green = t->green*65535/255;
- t->normalColor.blue = t->blue*65535/255;
- gdk_colormap_alloc_color(gtkColorMap, &t->normalColor, FALSE, TRUE);
- t->invertColor = t->normalColor;
- t->invertColor.pixel ^= g_array_index(colorMap_garray, colorMap_t,
- wDrawColorWhite).normalColor.pixel;
- t->colorChar = lastColorChar++;
-
- if (lastColorChar >= 0x7F) {
- lastColorChar = '!'+1;
- } else if (lastColorChar == '"') {
- lastColorChar++;
- }
+ t->rgb = RGB(t->red, t->green, t->blue);
+ t->normalColor.red = t->red*65535/255;
+ t->normalColor.green = t->green*65535/255;
+ t->normalColor.blue = t->blue*65535/255;
+ gdk_colormap_alloc_color(gtkColorMap, &t->normalColor, FALSE, TRUE);
+ t->invertColor = t->normalColor;
+ t->invertColor.pixel ^= g_array_index(colorMap_garray, colorMap_t,
+ wDrawColorWhite).normalColor.pixel;
+ t->colorChar = lastColorChar++;
+
+ if (lastColorChar >= 0x7F) {
+ lastColorChar = '!'+1;
+ } else if (lastColorChar == '"') {
+ lastColorChar++;
+ }
}
/**
@@ -185,15 +185,15 @@ static void init_colorMapValue(colorMap_t * t)
static void init_colorMap(void)
{
- int gint;
- colorMap_garray = g_array_sized_new(TRUE, TRUE, sizeof(colorMap_t),
- sizeof(colorMap)/sizeof(colorMap_t));
- g_array_append_vals(colorMap_garray, &colorMap,
- sizeof(colorMap)/sizeof(colorMap_t));
-
- for (gint=0; gint<colorMap_garray->len; gint++) {
- init_colorMapValue(&g_array_index(colorMap_garray, colorMap_t, gint));
- }
+ int gint;
+ colorMap_garray = g_array_sized_new(TRUE, TRUE, sizeof(colorMap_t),
+ sizeof(colorMap)/sizeof(colorMap_t));
+ g_array_append_vals(colorMap_garray, &colorMap,
+ sizeof(colorMap)/sizeof(colorMap_t));
+
+ for (gint=0; gint<colorMap_garray->len; gint++) {
+ init_colorMapValue(&g_array_index(colorMap_garray, colorMap_t, gint));
+ }
}
/**
@@ -206,57 +206,57 @@ static void init_colorMap(void)
*/
wDrawColor wDrawFindColor(
- long rgb0)
+ long rgb0)
{
- wDrawColor cc;
- int r0, g0, b0, r1, g1, b1;
- int d0;
- int i;
- colorMap_t tempMapValue;
- wlibGetColorMap();
- cc = wDrawColorBlack;
- r0 = (int)(rgb0>>16)&0xFF;
- g0 = (int)(rgb0>>8)&0xFF;
- b0 = (int)(rgb0)&0xFF;
- d0 = 256*3;
-
- // Initialize garray if needed
- if (colorMap_garray == NULL) {
- init_colorMap();
- }
-
- // Iterate over entire garray
- for (i=0; i<colorMap_garray->len; i++) {
- int d1;
- colorMap_t * cm_p;
-
- cm_p = &g_array_index(colorMap_garray, colorMap_t, i);
- r1 = (int)cm_p->red;
- g1 = (int)cm_p->green;
- b1 = (int)cm_p->blue;
- d1 = abs(r0-r1) + abs(g0-g1) + abs(b0-b1);
-
- if (d1 == 0) {
- return i;
- }
-
- if (d1 < d0) {
- d0 = d1;
- cc = i;
- }
- }
-
- if (d0 <= MAX_COLOR_DISTANCE) {
- return cc;
- }
-
- // No good value - so add one
- tempMapValue.red = r0;
- tempMapValue.green = g0;
- tempMapValue.blue = b0;
- init_colorMapValue(&tempMapValue);
- g_array_append_val(colorMap_garray,tempMapValue);
- return i;
+ wDrawColor cc;
+ int r0, g0, b0, r1, g1, b1;
+ int d0;
+ int i;
+ colorMap_t tempMapValue;
+ wlibGetColorMap();
+ cc = wDrawColorBlack;
+ r0 = (int)(rgb0>>16)&0xFF;
+ g0 = (int)(rgb0>>8)&0xFF;
+ b0 = (int)(rgb0)&0xFF;
+ d0 = 256*3;
+
+ // Initialize garray if needed
+ if (colorMap_garray == NULL) {
+ init_colorMap();
+ }
+
+ // Iterate over entire garray
+ for (i=0; i<colorMap_garray->len; i++) {
+ int d1;
+ colorMap_t * cm_p;
+
+ cm_p = &g_array_index(colorMap_garray, colorMap_t, i);
+ r1 = (int)cm_p->red;
+ g1 = (int)cm_p->green;
+ b1 = (int)cm_p->blue;
+ d1 = abs(r0-r1) + abs(g0-g1) + abs(b0-b1);
+
+ if (d1 == 0) {
+ return i;
+ }
+
+ if (d1 < d0) {
+ d0 = d1;
+ cc = i;
+ }
+ }
+
+ if (d0 <= MAX_COLOR_DISTANCE) {
+ return cc;
+ }
+
+ // No good value - so add one
+ tempMapValue.red = r0;
+ tempMapValue.green = g0;
+ tempMapValue.blue = b0;
+ init_colorMapValue(&tempMapValue);
+ g_array_append_val(colorMap_garray,tempMapValue);
+ return i;
}
/**
@@ -267,21 +267,21 @@ wDrawColor wDrawFindColor(
*/
long wDrawGetRGB(
- wDrawColor color)
+ wDrawColor color)
{
- colorMap_t * colorMap_e;
- wlibGetColorMap();
+ colorMap_t * colorMap_e;
+ wlibGetColorMap();
- if (colorMap_garray == NULL) {
- init_colorMap();
- }
+ if (colorMap_garray == NULL) {
+ init_colorMap();
+ }
- if (color < 0 || color > colorMap_garray->len) {
- abort();
- }
+ if (color < 0 || color > colorMap_garray->len) {
+ abort();
+ }
- colorMap_e = &g_array_index(colorMap_garray, colorMap_t, color);
- return colorMap_e->rgb;
+ colorMap_e = &g_array_index(colorMap_garray, colorMap_t, color);
+ return colorMap_e->rgb;
}
/**
@@ -293,27 +293,27 @@ long wDrawGetRGB(
*/
GdkColor* wlibGetColor(
- wDrawColor color,
- wBool_t normal)
+ wDrawColor color,
+ wBool_t normal)
{
- colorMap_t * colorMap_e;
- wlibGetColorMap();
+ colorMap_t * colorMap_e;
+ wlibGetColorMap();
- if (colorMap_garray == NULL) {
- init_colorMap();
- }
+ if (colorMap_garray == NULL) {
+ init_colorMap();
+ }
- if (color < 0 || color > colorMap_garray->len) {
- abort();
- }
+ if (color < 0 || color > colorMap_garray->len) {
+ abort();
+ }
- colorMap_e = &g_array_index(colorMap_garray, colorMap_t, color);
+ colorMap_e = &g_array_index(colorMap_garray, colorMap_t, color);
- if (normal) {
- return &colorMap_e->normalColor;
- } else {
- return &colorMap_e->invertColor;
- }
+ if (normal) {
+ return &colorMap_e->normalColor;
+ } else {
+ return &colorMap_e->invertColor;
+ }
}
@@ -326,12 +326,12 @@ GdkColor* wlibGetColor(
*/
typedef struct {
- wDrawColor * valueP;
- const char * labelStr;
- wColorSelectButtonCallBack_p action;
- void * data;
- wDrawColor color;
- wButton_p button;
+ wDrawColor * valueP;
+ const char * labelStr;
+ wColorSelectButtonCallBack_p action;
+ void * data;
+ wDrawColor color;
+ wButton_p button;
} colorData_t;
/**
@@ -344,23 +344,23 @@ typedef struct {
static void
colorChange(GtkColorButton *widget, gpointer user_data)
{
- colorData_t *cd = user_data;
- GdkColor newcolor;
- long rgb;
+ colorData_t *cd = user_data;
+ GdkColor newcolor;
+ long rgb;
- gtk_color_button_get_color(widget, &newcolor);
+ gtk_color_button_get_color(widget, &newcolor);
- rgb = RGB((int)(newcolor.red/256), (int)(newcolor.green/256),
- (int)(newcolor.blue/256));
- cd->color = wDrawFindColor(rgb);
+ rgb = RGB((int)(newcolor.red/256), (int)(newcolor.green/256),
+ (int)(newcolor.blue/256));
+ cd->color = wDrawFindColor(rgb);
- if (cd->valueP) {
- *(cd->valueP) = cd->color;
- }
+ if (cd->valueP) {
+ *(cd->valueP) = cd->color;
+ }
- if (cd->action) {
- cd->action(cd->data, cd->color);
- }
+ if (cd->action) {
+ cd->action(cd->data, cd->color);
+ }
}
/**
@@ -372,14 +372,14 @@ colorChange(GtkColorButton *widget, gpointer user_data)
*/
void wColorSelectButtonSetColor(
- wButton_p bb,
- wDrawColor color)
+ wButton_p bb,
+ wDrawColor color)
{
- GdkColor *colorOfButton = wlibGetColor(color, TRUE);
+ GdkColor *colorOfButton = wlibGetColor(color, TRUE);
- gtk_color_button_set_color(GTK_COLOR_BUTTON(bb->widget),
- colorOfButton);
- ((colorData_t*)((wControl_p)bb)->data)->color = color;
+ gtk_color_button_set_color(GTK_COLOR_BUTTON(bb->widget),
+ colorOfButton);
+ ((colorData_t*)((wControl_p)bb)->data)->color = color;
}
@@ -391,9 +391,9 @@ void wColorSelectButtonSetColor(
*/
wDrawColor wColorSelectButtonGetColor(
- wButton_p bb)
+ wButton_p bb)
{
- return ((colorData_t*)((wControl_p)bb)->data)->color;
+ return ((colorData_t*)((wControl_p)bb)->data)->color;
}
/**
@@ -413,57 +413,57 @@ wDrawColor wColorSelectButtonGetColor(
*/
wButton_p wColorSelectButtonCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- const char * labelStr,
- long option,
- wPos_t width,
- wDrawColor *valueP,
- wColorSelectButtonCallBack_p action,
- void * data)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ wWinPix_t width,
+ wDrawColor *valueP,
+ wColorSelectButtonCallBack_p action,
+ void * data)
{
- wButton_p b;
- colorData_t * cd;
- cd = malloc(sizeof(colorData_t));
- cd->valueP = valueP;
- cd->action = action;
- cd->data = data;
- cd->labelStr = labelStr;
- cd->color = (valueP?*valueP:0);
-
- b = wlibAlloc(parent, B_BUTTON, x, y, labelStr, sizeof *b, cd);
- b->option = option;
- wlibComputePos((wControl_p)b);
-
- b->widget = gtk_color_button_new();
- GtkStyle *style;
- style = gtk_widget_get_style(b->widget);
- style->xthickness = 1;
- style->ythickness = 1;
- gtk_widget_set_style(b->widget, style);
- gtk_widget_set_size_request(GTK_WIDGET(b->widget), 22, 22);
- g_signal_connect(GTK_OBJECT(b->widget), "color-set",
- G_CALLBACK(colorChange), cd);
-
- gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
-
- if (option & BB_DEFAULT) {
- gtk_widget_set_can_default(b->widget, GTK_CAN_DEFAULT);
- gtk_widget_grab_default(b->widget);
- gtk_window_set_default(GTK_WINDOW(parent->gtkwin), b->widget);
- }
-
- wlibControlGetSize((wControl_p)b);
-
- gtk_widget_show(b->widget);
- wlibAddButton((wControl_p)b);
- wlibAddHelpString(b->widget, helpStr);
- wColorSelectButtonSetColor(b, (valueP?*valueP:0));
-
- if (labelStr) {
- ((wControl_p)b)->labelW = wlibAddLabel((wControl_p)b, labelStr);
- }
- return b;
+ wButton_p b;
+ colorData_t * cd;
+ cd = malloc(sizeof(colorData_t));
+ cd->valueP = valueP;
+ cd->action = action;
+ cd->data = data;
+ cd->labelStr = labelStr;
+ cd->color = (valueP?*valueP:0);
+
+ b = wlibAlloc(parent, B_BUTTON, x, y, labelStr, sizeof *b, cd);
+ b->option = option;
+ wlibComputePos((wControl_p)b);
+
+ b->widget = gtk_color_button_new();
+ GtkStyle *style;
+ style = gtk_widget_get_style(b->widget);
+ style->xthickness = 1;
+ style->ythickness = 1;
+ gtk_widget_set_style(b->widget, style);
+ gtk_widget_set_size_request(GTK_WIDGET(b->widget), 22, 22);
+ g_signal_connect(GTK_OBJECT(b->widget), "color-set",
+ G_CALLBACK(colorChange), cd);
+
+ gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
+
+ if (option & BB_DEFAULT) {
+ gtk_widget_set_can_default(b->widget, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default(b->widget);
+ gtk_window_set_default(GTK_WINDOW(parent->gtkwin), b->widget);
+ }
+
+ wlibControlGetSize((wControl_p)b);
+
+ gtk_widget_show(b->widget);
+ wlibAddButton((wControl_p)b);
+ wlibAddHelpString(b->widget, helpStr);
+ wColorSelectButtonSetColor(b, (valueP?*valueP:0));
+
+ if (labelStr) {
+ ((wControl_p)b)->labelW = wlibAddLabel((wControl_p)b, labelStr);
+ }
+ return b;
}
diff --git a/app/wlib/gtklib/control.c b/app/wlib/gtklib/control.c
index 07d9210..d43d2b6 100644
--- a/app/wlib/gtklib/control.c
+++ b/app/wlib/gtklib/control.c
@@ -1,7 +1,7 @@
/** \file control.c
* Control Utilities
*/
-/*
+/*
* Copyright 2016 Martin Fischer <m_fischer@sf.net>
*
* This program is free software; you can redistribute it and/or modify
@@ -46,31 +46,31 @@
*/
void wControlShow(
- wControl_p b,
- wBool_t show)
+ wControl_p b,
+ wBool_t show)
{
- if (b->type == B_LINES) {
- wlibLineShow((wLine_p)b, show);
- return;
- }
-
- if (b->widget == NULL) {
- abort();
- }
-
- if (show) {
- gtk_widget_show(b->widget);
-
- if (b->label) {
- gtk_widget_show(b->label);
- }
- } else {
- gtk_widget_hide(b->widget);
-
- if (b->label) {
- gtk_widget_hide(b->label);
- }
- }
+ if (b->type == B_LINES) {
+ wlibLineShow((wLine_p)b, show);
+ return;
+ }
+
+ if (b->widget == NULL) {
+ abort();
+ }
+
+ if (show) {
+ gtk_widget_show(b->widget);
+
+ if (b->label) {
+ gtk_widget_show(b->label);
+ }
+ } else {
+ gtk_widget_hide(b->widget);
+
+ if (b->label) {
+ gtk_widget_hide(b->label);
+ }
+ }
}
/**
@@ -82,14 +82,24 @@ void wControlShow(
*/
void wControlActive(
- wControl_p b,
- int active)
+ wControl_p b,
+ int active)
{
- if (b->widget == NULL) {
- abort();
- }
+ if (b->widget == NULL) {
+ abort();
+ }
+
+ if (b->type == B_LIST || b->type == B_DROPLIST ) {
+
+ gtk_widget_set_sensitive(gtk_bin_get_child(GTK_BIN(b->widget)), active);
+ gtk_combo_box_set_button_sensitivity(GTK_COMBO_BOX(b->widget),
+ active?GTK_SENSITIVITY_ON:GTK_SENSITIVITY_OFF);
- gtk_widget_set_sensitive(GTK_WIDGET(b->widget), active);
+ } else {
+
+ gtk_widget_set_sensitive(GTK_WIDGET(b->widget), active);
+
+ }
}
/**
@@ -102,17 +112,17 @@ void wControlActive(
* \returns width of label including some space
*/
-wPos_t wLabelWidth(
- const char * label)
+wWinPix_t wLabelWidth(
+ const char * label)
{
- GtkWidget * widget;
- GtkRequisition requisition;
- widget = gtk_label_new(wlibConvertInput(label));
- gtk_widget_size_request(widget, &requisition);
- g_object_ref_sink (widget);
- gtk_widget_destroy(widget);
- g_object_unref(widget);
- return requisition.width+8;
+ GtkWidget * widget;
+ GtkRequisition requisition;
+ widget = gtk_label_new(wlibConvertInput(label));
+ gtk_widget_size_request(widget, &requisition);
+ g_object_ref_sink (widget);
+ gtk_widget_destroy(widget);
+ g_object_unref(widget);
+ return requisition.width+8;
}
/**
@@ -122,10 +132,10 @@ wPos_t wLabelWidth(
* \returns width
*/
-wPos_t wControlGetWidth(
- wControl_p b)
+wWinPix_t wControlGetWidth(
+ wControl_p b)
{
- return b->w;
+ return b->w;
}
/**
@@ -135,10 +145,10 @@ wPos_t wControlGetWidth(
* \returns height
*/
-wPos_t wControlGetHeight(
- wControl_p b)
+wWinPix_t wControlGetHeight(
+ wControl_p b)
{
- return b->h;
+ return b->h;
}
/**
@@ -148,10 +158,10 @@ wPos_t wControlGetHeight(
* \returns position
*/
-wPos_t wControlGetPosX(
- wControl_p b) /* Control */
+wWinPix_t wControlGetPosX(
+ wControl_p b) /* Control */
{
- return b->realX;
+ return b->realX;
}
/**
@@ -161,10 +171,11 @@ wPos_t wControlGetPosX(
* \returns position
*/
-wPos_t wControlGetPosY(
- wControl_p b) /* Control */
+wWinPix_t wControlGetPosY(
+ wControl_p b) /* Control */
{
- return b->realY - BORDERSIZE - ((b->parent->option&F_MENUBAR)?b->parent->menu_height:0);
+ return b->realY - BORDERSIZE - ((b->parent->option&F_MENUBAR)
+ ?b->parent->menu_height:0);
}
/**
@@ -176,27 +187,29 @@ wPos_t wControlGetPosY(
*/
void wControlSetPos(
- wControl_p b,
- wPos_t x,
- wPos_t y)
+ wControl_p b,
+ wWinPix_t x,
+ wWinPix_t y)
{
- b->realX = x;
- b->realY = y + BORDERSIZE + ((b->parent->option&F_MENUBAR)?b->parent->menu_height:0);
-
- if (b->widget) {
- gtk_fixed_move(GTK_FIXED(b->parent->widget), b->widget, b->realX, b->realY);
- }
-
- if (b->label) {
- GtkRequisition requisition, reqwidget;
- gtk_widget_size_request(b->label, &requisition);
- if (b->widget)
- gtk_widget_size_request(b->widget, &reqwidget);
- else
- reqwidget.height = requisition.height;
- gtk_fixed_move(GTK_FIXED(b->parent->widget), b->label, b->realX-b->labelW,
- b->realY+(reqwidget.height/2 - requisition.height/2));
- }
+ b->realX = x;
+ b->realY = y + BORDERSIZE + ((b->parent->option&F_MENUBAR)
+ ?b->parent->menu_height:0);
+
+ if (b->widget) {
+ gtk_fixed_move(GTK_FIXED(b->parent->widget), b->widget, b->realX, b->realY);
+ }
+
+ if (b->label) {
+ GtkRequisition requisition, reqwidget;
+ gtk_widget_size_request(b->label, &requisition);
+ if (b->widget) {
+ gtk_widget_size_request(b->widget, &reqwidget);
+ } else {
+ reqwidget.height = requisition.height;
+ }
+ gtk_fixed_move(GTK_FIXED(b->parent->widget), b->label, b->realX-b->labelW,
+ b->realY+(reqwidget.height/2 - requisition.height/2));
+ }
}
/**
@@ -207,24 +220,25 @@ void wControlSetPos(
*/
void wControlSetLabel(
- wControl_p b,
- const char * labelStr)
+ wControl_p b,
+ const char * labelStr)
{
- GtkRequisition requisition,reqwidget;
-
- if (b->label) {
- gtk_label_set_text(GTK_LABEL(b->label), wlibConvertInput(labelStr));
- gtk_widget_size_request(b->label, &requisition);
- if (b->widget)
- gtk_widget_size_request(b->widget, &reqwidget);
- else
- reqwidget.height = requisition.height;
- b->labelW = requisition.width+8;
- gtk_fixed_move(GTK_FIXED(b->parent->widget), b->label, b->realX-b->labelW,
- b->realY+(reqwidget.height/2 - requisition.height/2));
- } else {
- b->labelW = wlibAddLabel(b, labelStr);
- }
+ GtkRequisition requisition,reqwidget;
+
+ if (b->label) {
+ gtk_label_set_text(GTK_LABEL(b->label), wlibConvertInput(labelStr));
+ gtk_widget_size_request(b->label, &requisition);
+ if (b->widget) {
+ gtk_widget_size_request(b->widget, &reqwidget);
+ } else {
+ reqwidget.height = requisition.height;
+ }
+ b->labelW = requisition.width+8;
+ gtk_fixed_move(GTK_FIXED(b->parent->widget), b->label, b->realX-b->labelW,
+ b->realY+(reqwidget.height/2 - requisition.height/2));
+ } else {
+ b->labelW = wlibAddLabel(b, labelStr);
+ }
}
/**
@@ -235,10 +249,10 @@ void wControlSetLabel(
*/
void wControlSetContext(
- wControl_p b,
- void * context)
+ wControl_p b,
+ void * context)
{
- b->data = context;
+ b->data = context;
}
/**
@@ -248,31 +262,21 @@ void wControlSetContext(
*/
void wControlSetFocus(
- wControl_p b)
+ wControl_p b)
{
}
wBool_t wControlExpose (
- GtkWidget * widget,
- GdkEventExpose * event,
- wControl_p b
- )
+ GtkWidget * widget,
+ GdkEventExpose * event,
+ wControl_p b
+)
{
GdkWindow * win = gtk_widget_get_window(b->widget);
cairo_t * cr = NULL;
if (win) {
cr = gdk_cairo_create(win);
- } else return TRUE;
-
-#ifdef CURSOR_SURFACE
- if (b && b->cursor_surface.surface && b->cursor_surface.show) {
- cairo_set_source_surface(cr,b->cursor_surface.surface,event->area.x, event->area.y);
- cairo_set_operator(cr,CAIRO_OPERATOR_OVER);
- cairo_rectangle(cr,event->area.x, event->area.y,
- event->area.width, event->area.height);
- cairo_fill(cr);
- }
-#endif
+ } else { return TRUE; }
if (b->outline) {
cairo_set_source_rgb(cr, 0.23, 0.37, 0.80);
@@ -281,7 +285,7 @@ wBool_t wControlExpose (
cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
cairo_rectangle(cr,event->area.x+2, event->area.y+2,
- event->area.width-4, event->area.height-4);
+ event->area.width-4, event->area.height-4);
cairo_stroke(cr);
}
@@ -289,7 +293,7 @@ wBool_t wControlExpose (
cairo_destroy(cr);
- return FALSE;
+ return FALSE;
}
/**
@@ -301,26 +305,21 @@ wBool_t wControlExpose (
*
*/
void wControlHilite(
- wControl_p b,
- wBool_t hilite)
+ wControl_p b,
+ wBool_t hilite)
{
- cairo_t *cr;
- int off = GTKCONTROLHILITEWIDTH/2+1;
-
- if (b->widget == NULL) {
- return;
- }
-
- if (! gtk_widget_get_visible(b->widget)) {
- return;
- }
-
- if (! gtk_widget_get_visible(b->parent->widget)) {
- return;
- }
+// cairo_t *cr;
+// int off = GTKCONTROLHILITEWIDTH/2+1;
+ if ( debugWindow >= 1 ) {
+ printf( "wControlHIlite( %s, %d )\n", b->labelStr, hilite );
+ }
- b->outline = hilite;
+ if (b->widget == NULL) {
+ return;
+ }
+ b->outline = hilite;
- if (b->widget)
- gtk_widget_queue_draw(b->widget);
+ if (b->widget) {
+ gtk_widget_queue_draw(b->widget);
+ }
}
diff --git a/app/wlib/gtklib/droplist.c b/app/wlib/gtklib/droplist.c
index 69a2efd..a4abced 100644
--- a/app/wlib/gtklib/droplist.c
+++ b/app/wlib/gtklib/droplist.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -51,30 +51,30 @@
int
wlibDropListAddColumns(GtkWidget *dropList, int columns)
{
- int i;
- int start = 0;
- GtkCellRenderer *cell;
-
- if (gtk_combo_box_get_has_entry(GTK_COMBO_BOX(dropList))) {
- start = 1;
- }
-
- /* Create cell renderer. */
- cell = gtk_cell_renderer_text_new();
-
- for (i = start; i < columns; i++) {
- /* Pack it into the droplist */
- gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(dropList), cell, TRUE);
-
- /* Connect renderer to data source */
- gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(dropList),
- cell,
- "text",
- LISTCOL_TEXT + i,
- NULL);
- }
-
- return (i);
+ int i;
+ int start = 0;
+ GtkCellRenderer *cell;
+
+ if (gtk_combo_box_get_has_entry(GTK_COMBO_BOX(dropList))) {
+ start = 1;
+ }
+
+ /* Create cell renderer. */
+ cell = gtk_cell_renderer_text_new();
+
+ for (i = start; i < columns; i++) {
+ /* Pack it into the droplist */
+ gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(dropList), cell, TRUE);
+
+ /* Connect renderer to data source */
+ gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(dropList),
+ cell,
+ "text",
+ LISTCOL_TEXT + i,
+ NULL);
+ }
+
+ return (i);
}
/**
@@ -86,7 +86,7 @@ wlibDropListAddColumns(GtkWidget *dropList, int columns)
wIndex_t wDropListGetCount(wList_p b)
{
- return (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(b->listStore), NULL));
+ return (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(b->listStore), NULL));
}
/**
@@ -99,7 +99,7 @@ wIndex_t wDropListGetCount(wList_p b)
void
wDropListClear(wList_p b)
{
- wlibListStoreClear(b->listStore);
+ wlibListStoreClear(b->listStore);
}
/**
@@ -111,22 +111,22 @@ wDropListClear(wList_p b)
void *wDropListGetItemContext(wList_p b, wIndex_t inx)
{
- GtkTreeIter iter;
- wListItem_p data = NULL;
-
- if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(b->listStore), &iter, NULL,
- inx)) {
- gtk_tree_model_get(GTK_TREE_MODEL(b->listStore),
- &iter,
- LISTCOL_DATA, (void *)&data,
- -1);
- }
-
- if (data) {
- return (data->itemData);
- } else {
- return (NULL);
- }
+ GtkTreeIter iter;
+ wListItem_p data = NULL;
+
+ if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(b->listStore), &iter, NULL,
+ inx)) {
+ gtk_tree_model_get(GTK_TREE_MODEL(b->listStore),
+ &iter,
+ LISTCOL_DATA, (void *)&data,
+ -1);
+ }
+
+ if (data) {
+ return (data->itemData);
+ } else {
+ return (NULL);
+ }
}
/**
@@ -138,21 +138,21 @@ void *wDropListGetItemContext(wList_p b, wIndex_t inx)
*/
void wDropListAddValue(
- wList_p b,
- char *text,
- wListItem_p data)
+ wList_p b,
+ char *text,
+ wListItem_p data)
{
- GtkTreeIter iter;
+ GtkTreeIter iter;
- assert(b != NULL);
- assert(text != NULL);
+ assert(b != NULL);
+ assert(text != NULL);
- gtk_list_store_append(b->listStore, &iter); // append new row to tree store
+ gtk_list_store_append(b->listStore, &iter); // append new row to tree store
- gtk_list_store_set(b->listStore, &iter,
- LISTCOL_TEXT, text,
- LISTCOL_DATA, (void *)data,
- -1);
+ gtk_list_store_set(b->listStore, &iter,
+ LISTCOL_TEXT, text,
+ LISTCOL_DATA, (void *)data,
+ -1);
}
/**
@@ -162,25 +162,25 @@ void wDropListAddValue(
*/
void wListSetValue(
- wList_p bl,
- const char * val)
+ wList_p bl,
+ const char * val)
{
- assert(bl->listStore!=NULL);
+ assert(bl->listStore!=NULL);
- bl->recursion++;
+ bl->recursion++;
- if (bl->type == B_DROPLIST) {
- bl->editted = TRUE;
- gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(bl->widget))), val);
+ if (bl->type == B_DROPLIST) {
+ bl->editted = TRUE;
+ gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(bl->widget))), val);
- if (bl->action) {
- bl->action(-1, val, 0, bl->data, NULL);
- }
- } else {
- assert(FALSE);
- }
+ if (bl->action) {
+ bl->action(-1, val, 0, bl->data, NULL);
+ }
+ } else {
+ assert(FALSE);
+ }
- bl->recursion--;
+ bl->recursion--;
}
/**
@@ -195,11 +195,11 @@ void wListSetValue(
void wDropListSetIndex(wList_p b, int val)
{
- if ((b->option&BL_NONE)!=0 && val < 0) {
- gtk_combo_box_set_active(GTK_COMBO_BOX(b->widget), -1);
- } else {
- gtk_combo_box_set_active(GTK_COMBO_BOX(b->widget), val);
- }
+ if ((b->option&BL_NONE)!=0 && val < 0) {
+ gtk_combo_box_set_active(GTK_COMBO_BOX(b->widget), -1);
+ } else {
+ gtk_combo_box_set_active(GTK_COMBO_BOX(b->widget), val);
+ }
}
/**
@@ -214,24 +214,24 @@ void wDropListSetIndex(wList_p b, int val)
*/
wBool_t wDropListSetValues(
- wList_p b,
- wIndex_t row,
- const char * labelStr,
- wIcon_p bm,
- void *itemData)
+ wList_p b,
+ wIndex_t row,
+ const char * labelStr,
+ wIcon_p bm,
+ void *itemData)
{
- GtkTreeIter iter;
-
- if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(b->listStore), &iter, NULL,
- row)) {
- gtk_list_store_set(b->listStore,
- &iter,
- LISTCOL_TEXT, labelStr,
- -1);
- return (TRUE);
- } else {
- return (FALSE);
- }
+ GtkTreeIter iter;
+
+ if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(b->listStore), &iter, NULL,
+ row)) {
+ gtk_list_store_set(b->listStore,
+ &iter,
+ LISTCOL_TEXT, labelStr,
+ -1);
+ return (TRUE);
+ } else {
+ return (FALSE);
+ }
}
/**
@@ -245,72 +245,75 @@ wBool_t wDropListSetValues(
*/
static int DropListChanged(
- GtkComboBox * comboBox,
- gpointer data)
+ GtkComboBox * comboBox,
+ gpointer data)
{
- wList_p bl = (wList_p)data;
- GtkTreeIter iter;
-
- wIndex_t inx = 0;
- gchar *string = NULL;
- wListItem_p listItemP = NULL;
-
- if (bl->recursion) {
- return 0;
- }
-
- /* Obtain currently selected item from combo box. */
- if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(comboBox), &iter)) {
- GtkTreeModel *model;
-
- /* Obtain data model from combo box. */
- model = gtk_combo_box_get_model(comboBox);
-
- /* get the selected row */
- string = gtk_tree_model_get_string_from_iter(model,
- &iter);
- inx = atoi(string);
- g_free(string);
- string = NULL;
-
- /* Obtain string from model. */
- gtk_tree_model_get(model, &iter,
- LISTCOL_TEXT, &string,
- LISTCOL_DATA, (void *)&listItemP,
- -1);
- bl->editted = FALSE;
-
- } else {
- /* Nothing selected, user is entering text directly */
- inx = -1;
- GtkEntry * entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(bl->widget)));
- if ( entry == NULL )
- return 0;
- const char * string1 = gtk_entry_get_text(entry);
- if ( string1 == NULL )
- return 0;
- string = g_strdup(string1);
- bl->editted = TRUE;
- }
-
- /* selection changed, store new selections and call back */
- if (bl->last != inx || bl->editted == TRUE) {
-
- bl->last = inx;
-
- if (bl->valueP) {
- *bl->valueP = inx;
- }
-
- /* selection changed -> callback */
- if (string && bl->action) {
- bl->action(inx, string, 1, bl->data, listItemP?listItemP->itemData:NULL);
- }
- }
-
- if ( string )
- g_free(string);
- return 1;
+ wList_p bl = (wList_p)data;
+ GtkTreeIter iter;
+
+ wIndex_t inx = 0;
+ gchar *string = NULL;
+ wListItem_p listItemP = NULL;
+
+ if (bl->recursion) {
+ return 0;
+ }
+
+ /* Obtain currently selected item from combo box. */
+ if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(comboBox), &iter)) {
+ GtkTreeModel *model;
+
+ /* Obtain data model from combo box. */
+ model = gtk_combo_box_get_model(comboBox);
+
+ /* get the selected row */
+ string = gtk_tree_model_get_string_from_iter(model,
+ &iter);
+ inx = atoi(string);
+ g_free(string);
+ string = NULL;
+
+ /* Obtain string from model. */
+ gtk_tree_model_get(model, &iter,
+ LISTCOL_TEXT, &string,
+ LISTCOL_DATA, (void *)&listItemP,
+ -1);
+ bl->editted = FALSE;
+
+ } else {
+ /* Nothing selected, user is entering text directly */
+ inx = -1;
+ GtkEntry * entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(bl->widget)));
+ if ( entry == NULL ) {
+ return 0;
+ }
+ const char * string1 = gtk_entry_get_text(entry);
+ if ( string1 == NULL ) {
+ return 0;
+ }
+ string = g_strdup(string1);
+ bl->editted = TRUE;
+ }
+
+ /* selection changed, store new selections and call back */
+ if (bl->last != inx || bl->editted == TRUE) {
+
+ bl->last = inx;
+
+ if (bl->valueP) {
+ *bl->valueP = inx;
+ }
+
+ /* selection changed -> callback */
+ if (string && bl->action) {
+ bl->action(inx, string, 1, bl->data, listItemP?listItemP->itemData:NULL);
+ }
+ }
+
+ if ( string ) {
+ g_free(string);
+ }
+ return 1;
}
/**
@@ -324,15 +327,15 @@ static int DropListChanged(
GtkWidget *
wlibNewDropList(GtkListStore *ls, int editable)
{
- GtkWidget *widget;
+ GtkWidget *widget;
- if (editable) {
- widget = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(ls));
- } else {
- widget = gtk_combo_box_new_with_model(GTK_TREE_MODEL(ls));
- }
+ if (editable) {
+ widget = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(ls));
+ } else {
+ widget = gtk_combo_box_new_with_model(GTK_TREE_MODEL(ls));
+ }
- return (widget);
+ return (widget);
}
/**
@@ -352,80 +355,80 @@ wlibNewDropList(GtkListStore *ls, int editable)
*/
wList_p wDropListCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- const char * labelStr,
- long option,
- long number,
- wPos_t width,
- long *valueP,
- wListCallBack_p action,
- void *data)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ long number,
+ wWinPix_t width,
+ long *valueP,
+ wListCallBack_p action,
+ void *data)
{
- wList_p b;
+ wList_p b;
- b = (wList_p)wlibAlloc(parent, B_DROPLIST, x, y, labelStr, sizeof *b, data);
- b->option = option;
- b->number = number;
- b->count = 0;
- b->last = -1;
- b->valueP = valueP;
- b->action = action;
- b->listX = b->realX;
- b->colCnt = 0;
- b->colWidths = NULL;
- b->colRightJust = NULL;
- b->editable = ((option & BL_EDITABLE) != 0);
+ b = (wList_p)wlibAlloc(parent, B_DROPLIST, x, y, labelStr, sizeof *b, data);
+ b->option = option;
+ b->number = number;
+ b->count = 0;
+ b->last = -1;
+ b->valueP = valueP;
+ b->action = action;
+ b->listX = b->realX;
+ b->colCnt = 0;
+ b->colWidths = NULL;
+ b->colRightJust = NULL;
+ b->editable = ((option & BL_EDITABLE) != 0);
- assert(width != 0);
+ assert(width != 0);
- wlibComputePos((wControl_p)b);
+ wlibComputePos((wControl_p)b);
- // create tree store for storing the contents
- b->listStore = wlibNewListStore(DROPLIST_TEXTCOLUMNS);
+ // create tree store for storing the contents
+ b->listStore = wlibNewListStore(DROPLIST_TEXTCOLUMNS);
- if (!b->listStore) {
- abort();
- }
+ if (!b->listStore) {
+ abort();
+ }
- // create the droplist
- b->widget = wlibNewDropList(b->listStore,
- option & BL_EDITABLE);
+ // create the droplist
+ b->widget = wlibNewDropList(b->listStore,
+ option & BL_EDITABLE);
- if (b->widget == 0) {
- abort();
- }
- g_object_ref_sink(b->listStore);
- g_object_unref(G_OBJECT(b->listStore));
+ if (b->widget == 0) {
+ abort();
+ }
+ g_object_ref_sink(b->listStore);
+ g_object_unref(G_OBJECT(b->listStore));
- wlibDropListAddColumns(b->widget, DROPLIST_TEXTCOLUMNS);
+ wlibDropListAddColumns(b->widget, DROPLIST_TEXTCOLUMNS);
- gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(b->widget),
- LISTCOL_TEXT);
+ gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(b->widget),
+ LISTCOL_TEXT);
- // combo's style
- gtk_rc_parse_string("style \"my-style\" { GtkComboBox::appears-as-list = 1 } widget \"*.mycombo\" style \"my-style\" ");
- gtk_widget_set_name(b->widget,"mycombo");
+ // combo's style
+ gtk_rc_parse_string("style \"my-style\" { GtkComboBox::appears-as-list = 1 } widget \"*.mycombo\" style \"my-style\" ");
+ gtk_widget_set_name(b->widget,"mycombo");
- g_signal_connect(GTK_OBJECT(b->widget), "changed",
- G_CALLBACK(DropListChanged), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "changed",
+ G_CALLBACK(DropListChanged), b);
- gtk_widget_set_size_request(b->widget, width, -1);
+ gtk_widget_set_size_request(b->widget, width, -1);
- gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
- wlibControlGetSize((wControl_p)b);
+ gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
+ wlibControlGetSize((wControl_p)b);
- if (labelStr) {
- b->labelW = wlibAddLabel((wControl_p)b, labelStr);
- }
+ if (labelStr) {
+ b->labelW = wlibAddLabel((wControl_p)b, labelStr);
+ }
- gtk_widget_show(b->widget);
- wlibAddButton((wControl_p)b);
- wlibAddHelpString(b->widget, helpStr);
+ gtk_widget_show(b->widget);
+ wlibAddButton((wControl_p)b);
+ wlibAddHelpString(b->widget, helpStr);
- return b;
+ return b;
}
diff --git a/app/wlib/gtklib/dynarr.h b/app/wlib/gtklib/dynarr.h
index 2adf115..1eefd62 100644
--- a/app/wlib/gtklib/dynarr.h
+++ b/app/wlib/gtklib/dynarr.h
@@ -14,7 +14,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@@ -22,10 +22,10 @@
#define DYNARR_H_SEEN
typedef struct {
- int cnt;
- int max;
- void * ptr;
- } dynArr_t;
+ int cnt;
+ int max;
+ void * ptr;
+} dynArr_t;
#define DYNARR_APPEND(T,DA,INCR) \
{ if ((DA).cnt >= (DA).max) { \
diff --git a/app/wlib/gtklib/filesel.c b/app/wlib/gtklib/filesel.c
index a1fb7cc..3d4fb85 100644
--- a/app/wlib/gtklib/filesel.c
+++ b/app/wlib/gtklib/filesel.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -41,114 +41,115 @@
#define MAX_ALLOWEDFILTERS 10
struct wFilSel_t {
- GtkWidget * window; /**< file selector handle*/
- wFilSelCallBack_p action; /**< */
- void * data; /**< */
- int pattCount; /**< number of file patterns*/
- wBool_t loadPatternsAdded; /** Already loaded */
- GtkFileFilter *filter[ MAX_ALLOWEDFILTERS ]; /**< array of file patterns */
- wFilSelMode_e mode; /**< used for load or save */
- int opt; /**< see FS_ options */
- const char * title; /**< dialog box title */
- wWin_p parent; /**< parent window */
- char *defaultExtension; /**< to use if no extension specified */
- };
+ GtkWidget * window; /**< file selector handle*/
+ wFilSelCallBack_p action; /**< */
+ void * data; /**< */
+ int pattCount; /**< number of file patterns*/
+ wBool_t loadPatternsAdded; /** Already loaded */
+ GtkFileFilter *filter[ MAX_ALLOWEDFILTERS ]; /**< array of file patterns */
+ wFilSelMode_e mode; /**< used for load or save */
+ int opt; /**< see FS_ options */
+ const char * title; /**< dialog box title */
+ wWin_p parent; /**< parent window */
+ char *defaultExtension; /**< to use if no extension specified */
+};
/**
* Signal handler for 'changed' signal of custom combo box. The filter
* is set accordinng to the file format active in the combo box
- *
- * \param comboBox the combo box
+ *
+ * \param comboBox the combo box
* \param fileSelector data of the file selector
- *
+ *
*/
-static void FileFormatChanged( GtkWidget *comboBox,
- struct wFilSel_t *fileSelector )
+static void FileFormatChanged( GtkWidget *comboBox,
+ struct wFilSel_t *fileSelector )
{
// get active entry
int entry = (int)gtk_combo_box_get_active (GTK_COMBO_BOX(comboBox));
-
+
if( entry>=0 ) {
- g_object_ref(G_OBJECT( (fileSelector->filter)[ entry ]));
- gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(fileSelector->window ),
- (fileSelector->filter)[ entry ]);
+ g_object_ref(G_OBJECT( (fileSelector->filter)[ entry ]));
+ gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(fileSelector->window ),
+ (fileSelector->filter)[ entry ]);
}
}
/**
- * Create a widget containing a combo box for selecting a file format.
+ * Create a widget containing a combo box for selecting a file format.
* From an array of filters, the names are retrieved and used to populate
- * the combo box.
+ * the combo box.
* \param IN dialogBox
* \param patterns IN number of entries for combo
* \param filters IN
* \returns the newly created widget
*/
-
-static GtkWidget *CreateFileformatSelector(struct wFilSel_t *dialogBox,
- int patterns,
- GtkFileFilter **filters)
+
+static GtkWidget *CreateFileformatSelector(struct wFilSel_t *dialogBox,
+ int patterns,
+ GtkFileFilter **filters)
{
GtkWidget *hbox = gtk_hbox_new(FALSE, 12);
GtkWidget *text = gtk_label_new(_("Save format:"));
GtkWidget *combo = gtk_combo_box_text_new ();
- g_signal_connect(G_OBJECT(combo),
- "changed",
- (GCallback)FileFormatChanged,
- dialogBox );
+ g_signal_connect(G_OBJECT(combo),
+ "changed",
+ (GCallback)FileFormatChanged,
+ dialogBox );
gtk_box_pack_start (GTK_BOX(hbox),
- text,
- FALSE,
- FALSE,
- 0);
+ text,
+ FALSE,
+ FALSE,
+ 0);
gtk_box_pack_end (GTK_BOX(hbox),
- combo,
- TRUE,
- TRUE,
- 0);
+ combo,
+ TRUE,
+ TRUE,
+ 0);
for(int i=0; i < patterns; i++ ) {
const char *nameOfFilter = gtk_file_filter_get_name( filters[ i ] );
gtk_combo_box_text_append_text( GTK_COMBO_BOX_TEXT(combo), nameOfFilter );
}
gtk_combo_box_set_active (GTK_COMBO_BOX(combo), 0);
-
+
gtk_widget_show_all(hbox);
-
- return(hbox);
+
+ return(hbox);
}
/**
* Create a new file selector. Only the internal data structures are
- * set up, no dialog is created.
+ * set up, no dialog is created.
*
* \param w IN parent window
* \param mode IN ?
* \param opt IN ?
* \param title IN dialog title
* \param pattList IN list of selection patterns
- * \param action IN callback
+ * \param action IN callback
* \param data IN ?
* \return the newly created file selector structure
*/
-
+
struct wFilSel_t * wFilSelCreate(
- wWin_p w,
- wFilSelMode_e mode,
- int opt,
- const char * title,
- const char * pattList,
- wFilSelCallBack_p action,
- void * data )
+ wWin_p w,
+ wFilSelMode_e mode,
+ int opt,
+ const char * title,
+ const char * pattList,
+ wFilSelCallBack_p action,
+ void * data )
{
struct wFilSel_t *fs;
fs = (struct wFilSel_t*)malloc(sizeof *fs);
- if (!fs)
+ if (!fs) {
return NULL;
+ }
fs->parent = w;
fs->window = 0;
@@ -208,22 +209,24 @@ struct wFilSel_t * wFilSelCreate(
gtk_file_filter_add_pattern (fs->filter[ count ], cp1 );
cp1 = strtok_r(NULL, ";", &filterState );
}
- if (cp1s)
+ if (cp1s) {
free(cp1s);
+ }
}
// the first pattern is considered to match the default extension
if( count == 0 && !(opt&FS_PICTURES)) {
fs->defaultExtension = strdup( cp2 );
int i = 0;
- for (i=0; i<strlen(cp2) && cp2[i] != ' ' && cp2[i] != ';';i++) ;
- if (i<strlen(cp2)) fs->defaultExtension[i] = '\0';
+ for (i=0; i<strlen(cp2) && cp2[i] != ' ' && cp2[i] != ';'; i++) ;
+ if (i<strlen(cp2)) { fs->defaultExtension[i] = '\0'; }
}
fs->pattCount = ++count;
}
cp = strtok_r( NULL, ":", &patternState );
}
- if (cps)
+ if (cps) {
free(cps);
+ }
} else {
@@ -234,13 +237,13 @@ struct wFilSel_t * wFilSelCreate(
}
/**
- * Show and handle the file selection dialog.
+ * Show and handle the file selection dialog.
*
- * \param fs IN file selection
+ * \param fs IN file selection
* \param dirName IN starting directory
* \return always TRUE
*/
-
+
int wFilSelect( struct wFilSel_t * fs, const char * dirName )
{
char name[1024];
@@ -250,67 +253,71 @@ int wFilSelect( struct wFilSel_t * fs, const char * dirName )
GError *err = NULL;
if (fs->window == NULL) {
- fs->window = gtk_file_chooser_dialog_new( fs->title,
- GTK_WINDOW( fs->parent->gtkwin ),
- (fs->mode == FS_LOAD ? GTK_FILE_CHOOSER_ACTION_OPEN : GTK_FILE_CHOOSER_ACTION_SAVE ),
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- (fs->mode == FS_LOAD ? GTK_STOCK_OPEN : GTK_STOCK_SAVE ), GTK_RESPONSE_ACCEPT,
- NULL );
- if (fs->window==0) abort();
+ fs->window = gtk_file_chooser_dialog_new( fs->title,
+ GTK_WINDOW( fs->parent->gtkwin ),
+ (fs->mode == FS_LOAD ? GTK_FILE_CHOOSER_ACTION_OPEN :
+ GTK_FILE_CHOOSER_ACTION_SAVE ),
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ (fs->mode == FS_LOAD ? GTK_STOCK_OPEN : GTK_STOCK_SAVE ), GTK_RESPONSE_ACCEPT,
+ NULL );
+ if (fs->window==0) { abort(); }
if ( fs->mode == FS_SAVE ) {
- // get confirmation before overwritting an existing file
- gtk_file_chooser_set_do_overwrite_confirmation( GTK_FILE_CHOOSER(fs->window), TRUE );
+ // get confirmation before overwritting an existing file
+ gtk_file_chooser_set_do_overwrite_confirmation( GTK_FILE_CHOOSER(fs->window),
+ TRUE );
}
-
+
/** \todo for loading a shortcut folder could be added linking to the example directory */
}
strcpy( name, dirName );
- gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(fs->window), name );
+ gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(fs->window), name );
if( fs->mode == FS_SAVE || fs->mode == FS_UPDATE ) {
- gtk_file_chooser_set_extra_widget( GTK_FILE_CHOOSER(fs->window),
- CreateFileformatSelector(fs, fs->pattCount, fs->filter ));
- }
- // Add a current folder and a shortcut to it for Load/import dialogs
- if( fs->mode == FS_LOAD ) {
- gtk_file_chooser_add_shortcut_folder( GTK_FILE_CHOOSER(fs->window), name, NULL );
+ gtk_file_chooser_set_extra_widget( GTK_FILE_CHOOSER(fs->window),
+ CreateFileformatSelector(fs, fs->pattCount, fs->filter ));
+ }
+ // Add a current folder and a shortcut to it for Load/import dialogs
+ if( fs->mode == FS_LOAD ) {
+ gtk_file_chooser_add_shortcut_folder( GTK_FILE_CHOOSER(fs->window), name,
+ NULL );
// allow selecting multiple files
if( fs->opt & FS_MULTIPLEFILES ) {
gtk_file_chooser_set_select_multiple ( GTK_FILE_CHOOSER(fs->window), TRUE);
- }
+ }
// add the file filters to the dialog box
if( fs->pattCount && !fs->loadPatternsAdded) {
for( i = 0; i < fs->pattCount; i++ ) {
- gtk_file_chooser_add_filter( GTK_FILE_CHOOSER( fs->window ), fs->filter[ i ] );
+ gtk_file_chooser_add_filter( GTK_FILE_CHOOSER( fs->window ), fs->filter[ i ] );
}
fs->loadPatternsAdded = TRUE;
- }
- }
-
- int resp = gtk_dialog_run( GTK_DIALOG( fs->window ));
+ }
+ }
+
+ int resp = gtk_dialog_run( GTK_DIALOG( fs->window ));
if( resp == GTK_RESPONSE_ACCEPT || resp == GTK_RESPONSE_APPLY) {
- char **fileNames;
+ char **fileNames;
GSList *fileNameList;
-
+
fileNameList = gtk_file_chooser_get_uris( GTK_FILE_CHOOSER(fs->window) );
- fileNames = calloc( sizeof(char *), g_slist_length (fileNameList) );
-
+ fileNames = calloc( sizeof(char *), g_slist_length (fileNameList) );
+
for (i=0; i < g_slist_length (fileNameList); i++ ) {
char *namePart;
file = g_filename_from_uri( g_slist_nth_data( fileNameList, i ), &host, &err );
-
+
// check for presence of file extension
// jump behind the last directory delimiter
namePart = strrchr( file, '/' ) + 1;
// is there a dot in the last part, yes->extension present
- if( !strchr( namePart, '.' ) ){
-
+ if( !strchr( namePart, '.' ) ) {
+
// else try to find the current filter and parse its name
- GtkFileFilter *currentFilter = gtk_file_chooser_get_filter (GTK_FILE_CHOOSER(fs->window) );
+ GtkFileFilter *currentFilter = gtk_file_chooser_get_filter (GTK_FILE_CHOOSER(
+ fs->window) );
if (currentFilter) {
const char *nameOfFilter = gtk_file_filter_get_name( currentFilter );
char *pattern = strdup( nameOfFilter );
@@ -324,28 +331,28 @@ int wFilSelect( struct wFilSel_t * fs, const char * dirName )
extension = startDelimiter + 2;
}
}
- file = g_realloc( file, strlen(file)+strlen(extension));
+ file = g_realloc( file, strlen(file)+strlen(extension)+1);
strcat( file, extension );
free( pattern );
}
- }
+ }
fileNames[ i ] = file;
g_free( g_slist_nth_data ( fileNameList, i));
}
-
+
gtk_widget_hide( GTK_WIDGET( fs->window ));
if (fs->action) {
fs->action( g_slist_length(fileNameList), fileNames, fs->data );
}
-
+
for(i=0; i < g_slist_length(fileNameList); i++) {
g_free( fileNames[ i ]);
}
free( fileNames );
- g_slist_free (fileNameList);
+ g_slist_free (fileNameList);
} else {
gtk_widget_hide( GTK_WIDGET( fs->window ));
}
-
+
return 1;
}
diff --git a/app/wlib/gtklib/font.c b/app/wlib/gtklib/font.c
index e2f741b..e89307c 100644
--- a/app/wlib/gtklib/font.c
+++ b/app/wlib/gtklib/font.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
@@ -67,7 +67,7 @@ static GtkWidget *fontSelectionDialog;
int absoluteFontSize = 18;
struct wFont_t {
- PangoFontDescription *fontDescription;
+ PangoFontDescription *fontDescription;
};
static wFont_p standardFonts[F_HELV-F_TIMES+1][2][2];
@@ -85,76 +85,76 @@ static wFont_p curFont = NULL;
static void fontSelectionDialogCallback(GtkFontSelectionDialog
*fontSelectionDialog, gint response, gpointer data)
{
- if (response == GTK_RESPONSE_APPLY || response == GTK_RESPONSE_OK) {
- gchar *fontName;
-
- fontName = gtk_font_selection_dialog_get_font_name(fontSelectionDialog);
- wPrefSetString("font", "name", fontName);
- pango_font_description_free(curFont->fontDescription);
- curFont->fontDescription = pango_font_description_from_string(fontName);
- absoluteFontSize = (pango_font_description_get_size(
- curFont->fontDescription))/PANGO_SCALE;
+ if (response == GTK_RESPONSE_APPLY || response == GTK_RESPONSE_OK) {
+ gchar *fontName;
+
+ fontName = gtk_font_selection_dialog_get_font_name(fontSelectionDialog);
+ wPrefSetString("font", "name", fontName);
+ pango_font_description_free(curFont->fontDescription);
+ curFont->fontDescription = pango_font_description_from_string(fontName);
+ absoluteFontSize = (pango_font_description_get_size(
+ curFont->fontDescription))/PANGO_SCALE;
#if WLIB_FONT_DEBUG >= 2
- fprintf(stderr, "new font selection:\n");
- fprintf(stderr, " font name \"%s\"\n", fontName);
- fprintf(stderr, " font size is %d\n",
- pango_font_description_get_size(curFont->fontDescription)/PANGO_SCALE);
- fprintf(stderr, " font size is absolute %d\n",
- pango_font_description_get_size_is_absolute(curFont->fontDescription));
+ fprintf(stderr, "new font selection:\n");
+ fprintf(stderr, " font name \"%s\"\n", fontName);
+ fprintf(stderr, " font size is %d\n",
+ pango_font_description_get_size(curFont->fontDescription)/PANGO_SCALE);
+ fprintf(stderr, " font size is absolute %d\n",
+ pango_font_description_get_size_is_absolute(curFont->fontDescription));
#endif
- g_free(fontName);
- }
+ g_free(fontName);
+ }
- if (response == GTK_RESPONSE_OK || response == GTK_RESPONSE_CANCEL) {
- gtk_widget_hide(GTK_WIDGET(fontSelectionDialog));
- }
+ if (response == GTK_RESPONSE_OK || response == GTK_RESPONSE_CANCEL) {
+ gtk_widget_hide(GTK_WIDGET(fontSelectionDialog));
+ }
}
static wBool_t fontInitted = FALSE;
static wBool_t fontInit()
{
- const char *fontNames[] = {
- "times 18",
- "times italic 18",
- "times bold 18",
- "times bold italic 18",
- "helvetica 18",
- "helvetica oblique 18",
- "helvetica bold 18",
- "helvetica bold oblique 18",
- };
- int s = 0;
- int i, j, k;
-
- for (i = F_TIMES; i <= F_HELV; ++i) {
- for (j = FW_MEDIUM; j <= FW_BOLD; ++j) {
- for (k = FS_REGULAR; k <= FS_ITALIC; ++k) {
- PangoFontDescription *fontDescription = pango_font_description_from_string(
- fontNames[s++]);
- wFont_p standardFont = (wFont_p) malloc(sizeof(struct wFont_t));
- standardFont->fontDescription = fontDescription;
- standardFonts[i-F_TIMES][j][k] = standardFont;
- }
- }
- }
-
- if (curFont == NULL) {
- curFont = (wFont_p) malloc(sizeof(struct wFont_t));
-
- if (curFont == NULL) {
- return FALSE;
- }
-
- const char *fontName = wPrefGetString("font", "name");
- curFont->fontDescription = pango_font_description_from_string(
- fontName ? fontName : "helvetica 18");
- absoluteFontSize = (int) PANGO_PIXELS(pango_font_description_get_size(
- curFont->fontDescription));
- }
-
- fontInitted = TRUE;
- return TRUE;
+ const char *fontNames[] = {
+ "times 18",
+ "times italic 18",
+ "times bold 18",
+ "times bold italic 18",
+ "helvetica 18",
+ "helvetica oblique 18",
+ "helvetica bold 18",
+ "helvetica bold oblique 18",
+ };
+ int s = 0;
+ int i, j, k;
+
+ for (i = F_TIMES; i <= F_HELV; ++i) {
+ for (j = FW_MEDIUM; j <= FW_BOLD; ++j) {
+ for (k = FS_REGULAR; k <= FS_ITALIC; ++k) {
+ PangoFontDescription *fontDescription = pango_font_description_from_string(
+ fontNames[s++]);
+ wFont_p standardFont = (wFont_p) malloc(sizeof(struct wFont_t));
+ standardFont->fontDescription = fontDescription;
+ standardFonts[i-F_TIMES][j][k] = standardFont;
+ }
+ }
+ }
+
+ if (curFont == NULL) {
+ curFont = (wFont_p) malloc(sizeof(struct wFont_t));
+
+ if (curFont == NULL) {
+ return FALSE;
+ }
+
+ const char *fontName = wPrefGetString("font", "name");
+ curFont->fontDescription = pango_font_description_from_string(
+ fontName ? fontName : "helvetica 18");
+ absoluteFontSize = (int) PANGO_PIXELS(pango_font_description_get_size(
+ curFont->fontDescription));
+ }
+
+ fontInitted = TRUE;
+ return TRUE;
}
@@ -182,62 +182,63 @@ PangoLayout *wlibFontCreatePangoLayout(GtkWidget *widget,
wFont_p fp,
wFontSize_t fs,
const char *s,
- int *width_p,
- int *height_p,
- int *ascent_p,
- int *descent_p,
- int *baseline_p)
+ wDrawPix_t *width_p,
+ wDrawPix_t *height_p,
+ wDrawPix_t *ascent_p,
+ wDrawPix_t *descent_p,
+ wDrawPix_t *baseline_p)
{
- if (!fontInitted) {
- fontInit();
- }
-
- PangoLayout *layout = NULL;
- gchar *utf8 = wlibConvertInput(s);
- /* RPH -- pango_cairo_create_layout() is missing in CentOS 4.8.
- CentOS 4.8 only has GTK 2.4.13 and Pango 1.6.0 and does not have
- libpangocairo at all.
- pango_cairo_create_layout() was introduced with Pango 1.10. */
+ if (!fontInitted) {
+ fontInit();
+ }
+
+ PangoLayout *layout = NULL;
+ gchar *utf8 = wlibConvertInput(s);
+ /* RPH -- pango_cairo_create_layout() is missing in CentOS 4.8.
+ CentOS 4.8 only has GTK 2.4.13 and Pango 1.6.0 and does not have
+ libpangocairo at all.
+ pango_cairo_create_layout() was introduced with Pango 1.10. */
#if PANGO_VERSION_MAJOR >= 1 && PANGO_VERSION_MINOR >= 10
- if (cairo != NULL) {
- layout = pango_cairo_create_layout((cairo_t *) cairo);
- pango_layout_set_text(layout, utf8, -1);
- } else
+ if (cairo != NULL) {
+ layout = pango_cairo_create_layout((cairo_t *) cairo);
+ pango_layout_set_text(layout, utf8, -1);
+ } else
#endif
- layout = gtk_widget_create_pango_layout(widget, utf8);
-
- PangoFontDescription *fontDescription = (fp ? fp : curFont)->fontDescription;
- PangoContext *context;
- PangoFontMetrics *metrics;
- /* set attributes */
- pango_font_description_set_size(fontDescription,
- FONTSIZE_TO_PANGOSIZE(fs) * PANGO_SCALE);
- pango_layout_set_font_description(layout, fontDescription);
- /* get layout measures */
- pango_layout_get_size(layout, width_p, height_p);
- *width_p = *width_p / PANGO_SCALE;
- *height_p = *height_p / PANGO_SCALE;
- context = gtk_widget_create_pango_context(widget);
- metrics = pango_context_get_metrics(context, fontDescription,
- pango_context_get_language(context));
- *baseline_p = pango_layout_get_baseline(layout) / PANGO_SCALE;
- *ascent_p = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE;
- *descent_p = pango_font_metrics_get_descent(metrics) / PANGO_SCALE;
- pango_font_metrics_unref(metrics);
- g_object_unref(context);
+ layout = gtk_widget_create_pango_layout(widget, utf8);
+
+ PangoFontDescription *fontDescription = (fp ? fp : curFont)->fontDescription;
+ PangoContext *context;
+ PangoFontMetrics *metrics;
+ /* set attributes */
+ pango_font_description_set_size(fontDescription,
+ FONTSIZE_TO_PANGOSIZE(fs) * PANGO_SCALE);
+ pango_layout_set_font_description(layout, fontDescription);
+ /* get layout measures */
+ gint width_i, height_i;
+ pango_layout_get_size(layout, &width_i, &height_i);
+ *width_p = width_i / PANGO_SCALE;
+ *height_p = height_i / PANGO_SCALE;
+ context = gtk_widget_create_pango_context(widget);
+ metrics = pango_context_get_metrics(context, fontDescription,
+ pango_context_get_language(context));
+ *baseline_p = pango_layout_get_baseline(layout) / PANGO_SCALE;
+ *ascent_p = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE;
+ *descent_p = pango_font_metrics_get_descent(metrics) / PANGO_SCALE;
+ pango_font_metrics_unref(metrics);
+ g_object_unref(context);
#if WLIB_FONT_DEBUG >= 3
- fprintf(stderr, "font layout created:\n");
- fprintf(stderr, " widget: %p\n", widget);
- //fprintf(stderr, " font description:%p\n", fp);
- fprintf(stderr, " font size: %f\n", fs);
- fprintf(stderr, " layout text: \"%s\" (utf8)\n", utf8);
- fprintf(stderr, " layout width: %d\n", *width_p);
- fprintf(stderr, " layout height: %d\n", *height_p);
- fprintf(stderr, " layout ascent: %d (pixels)\n", *ascent_p);
- fprintf(stderr, " layout descent: %d (pixels)\n", *descent_p);
+ fprintf(stderr, "font layout created:\n");
+ fprintf(stderr, " widget: %p\n", widget);
+ //fprintf(stderr, " font description:%p\n", fp);
+ fprintf(stderr, " font size: %f\n", fs);
+ fprintf(stderr, " layout text: \"%s\" (utf8)\n", utf8);
+ fprintf(stderr, " layout width: %d\n", *width_p);
+ fprintf(stderr, " layout height: %d\n", *height_p);
+ fprintf(stderr, " layout ascent: %d (pixels)\n", *ascent_p);
+ fprintf(stderr, " layout descent: %d (pixels)\n", *descent_p);
#endif
- return layout;
+ return layout;
}
/**
@@ -247,7 +248,7 @@ PangoLayout *wlibFontCreatePangoLayout(GtkWidget *widget,
void wlibFontDestroyPangoLayout(PangoLayout *layout)
{
- g_object_ref_sink(layout);
+ g_object_ref_sink(layout);
g_object_unref(layout);
}
@@ -258,9 +259,9 @@ void wlibFontDestroyPangoLayout(PangoLayout *layout)
void wInitializeFonts()
{
- if (!fontInitted) {
- fontInit();
- }
+ if (!fontInitted) {
+ fontInit();
+ }
}
/**
@@ -271,41 +272,41 @@ void wInitializeFonts()
*/
void wSelectFont(
- const char * title)
+ const char * title)
{
- if (!fontInitted) {
- fontInit();
- }
-
- if (fontSelectionDialog == NULL) {
- fontSelectionDialog = gtk_font_selection_dialog_new(_("Font Select"));
- gtk_window_set_position(GTK_WINDOW(fontSelectionDialog), GTK_WIN_POS_MOUSE);
- gtk_window_set_modal(GTK_WINDOW(fontSelectionDialog), TRUE);
- gtk_font_selection_dialog_set_preview_text(GTK_FONT_SELECTION_DIALOG(
- fontSelectionDialog), sampleText);
- g_signal_connect(G_OBJECT(fontSelectionDialog), "response",
- G_CALLBACK(fontSelectionDialogCallback), NULL);
- g_signal_connect(G_OBJECT(fontSelectionDialog), "destroy",
- G_CALLBACK(gtk_widget_destroyed), &fontSelectionDialog);
- }
-
- gtk_window_set_title(GTK_WINDOW(fontSelectionDialog), title);
-
- if (curFont != NULL) {
- gchar *fontName;
-
- /* the curFont description contains the latest font info
- * which is depended on the current scale
- * overwrite it with the absoluteFontSize */
- pango_font_description_set_size(curFont->fontDescription,
- FONTSIZE_TO_PANGOSIZE(absoluteFontSize) * PANGO_SCALE);
- fontName = pango_font_description_to_string(curFont->fontDescription);
- gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(
- fontSelectionDialog), fontName);
- g_free(fontName);
- }
-
- gtk_widget_show(fontSelectionDialog);
+ if (!fontInitted) {
+ fontInit();
+ }
+
+ if (fontSelectionDialog == NULL) {
+ fontSelectionDialog = gtk_font_selection_dialog_new(_("Font Select"));
+ gtk_window_set_position(GTK_WINDOW(fontSelectionDialog), GTK_WIN_POS_MOUSE);
+ gtk_window_set_modal(GTK_WINDOW(fontSelectionDialog), TRUE);
+ gtk_font_selection_dialog_set_preview_text(GTK_FONT_SELECTION_DIALOG(
+ fontSelectionDialog), sampleText);
+ g_signal_connect(G_OBJECT(fontSelectionDialog), "response",
+ G_CALLBACK(fontSelectionDialogCallback), NULL);
+ g_signal_connect(G_OBJECT(fontSelectionDialog), "destroy",
+ G_CALLBACK(gtk_widget_destroyed), &fontSelectionDialog);
+ }
+
+ gtk_window_set_title(GTK_WINDOW(fontSelectionDialog), title);
+
+ if (curFont != NULL) {
+ gchar *fontName;
+
+ /* the curFont description contains the latest font info
+ * which is depended on the current scale
+ * overwrite it with the absoluteFontSize */
+ pango_font_description_set_size(curFont->fontDescription,
+ FONTSIZE_TO_PANGOSIZE(absoluteFontSize) * PANGO_SCALE);
+ fontName = pango_font_description_to_string(curFont->fontDescription);
+ gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(
+ fontSelectionDialog), fontName);
+ g_free(fontName);
+ }
+
+ gtk_widget_show(fontSelectionDialog);
}
/**
@@ -316,11 +317,11 @@ void wSelectFont(
static wFont_p wlibSelectedFont(void)
{
- if (!fontInitted) {
- fontInit();
- }
+ if (!fontInitted) {
+ fontInit();
+ }
- return curFont;
+ return curFont;
}
/**
@@ -331,16 +332,16 @@ static wFont_p wlibSelectedFont(void)
wFontSize_t wSelectedFontSize(void)
{
- if (!fontInitted) {
- fontInit();
- }
+ if (!fontInitted) {
+ fontInit();
+ }
#if WLIB_FONT_DEBUG >= 3
- fprintf(stderr, "the font size of current font description is: %d\n",
- pango_font_description_get_size(curFont->fontDescription)/PANGO_SCALE);
- fprintf(stderr, "the font size of absoluteFontSize is: %d\n",absoluteFontSize);
+ fprintf(stderr, "the font size of current font description is: %d\n",
+ pango_font_description_get_size(curFont->fontDescription)/PANGO_SCALE);
+ fprintf(stderr, "the font size of absoluteFontSize is: %d\n",absoluteFontSize);
#endif
- return absoluteFontSize;
+ return absoluteFontSize;
}
/**
@@ -352,7 +353,7 @@ wFontSize_t wSelectedFontSize(void)
void wSetSelectedFontSize(wFontSize_t size)
{
- absoluteFontSize = size;
+ absoluteFontSize = size;
}
/**
@@ -367,30 +368,30 @@ void wSetSelectedFontSize(wFontSize_t size)
const char *wlibFontTranslate(wFont_p fp)
{
- static gchar *fontName = NULL;
+ static gchar *fontName = NULL;
- if (fontName != NULL) {
- g_free(fontName);
- }
+ if (fontName != NULL) {
+ g_free(fontName);
+ }
- if (!fontInitted) {
- fontInit();
- }
+ if (!fontInitted) {
+ fontInit();
+ }
- if (fp == NULL) {
- fp = wlibSelectedFont();
- }
+ if (fp == NULL) {
+ fp = wlibSelectedFont();
+ }
- if (fp == NULL) {
- fp = standardFonts[0][FW_MEDIUM][FS_REGULAR];
- }
+ if (fp == NULL) {
+ fp = standardFonts[0][FW_MEDIUM][FS_REGULAR];
+ }
- fontName = pango_font_description_to_string(fp->fontDescription);
+ fontName = pango_font_description_to_string(fp->fontDescription);
#if WLIB_FONT_DEBUG >= 2
- fprintf(stderr, "font translation: ");
- fprintf(stderr, " \"%s\"\n", fontName);
+ fprintf(stderr, "font translation: ");
+ fprintf(stderr, " \"%s\"\n", fontName);
#endif
- return (const char *) fontName;
+ return (const char *) fontName;
}
/**
@@ -401,9 +402,9 @@ const char *wlibFontTranslate(wFont_p fp)
wFont_p wStandardFont(int face, wBool_t bold, wBool_t italic)
{
- if (!fontInitted) {
- fontInit();
- }
+ if (!fontInitted) {
+ fontInit();
+ }
- return standardFonts[face-F_TIMES][bold][italic];
+ return standardFonts[face-F_TIMES][bold][italic];
}
diff --git a/app/wlib/gtklib/gtkdraw-cairo.c b/app/wlib/gtklib/gtkdraw-cairo.c
index 4498a2c..f24bde6 100644
--- a/app/wlib/gtklib/gtkdraw-cairo.c
+++ b/app/wlib/gtklib/gtkdraw-cairo.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -49,40 +49,40 @@ static long drawVerbose = 0;
wBool_t wDrawDoTempDraw = TRUE;
struct wDrawBitMap_t {
- int w;
- int h;
- int x;
- int y;
- const unsigned char * bits;
- GdkPixmap * pixmap;
- GdkBitmap * mask;
- };
+ int w;
+ int h;
+ int x;
+ int y;
+ const unsigned char * bits;
+ GdkPixmap * pixmap;
+ GdkBitmap * mask;
+};
//struct wDraw_t {
- //WOBJ_COMMON
- //void * context;
- //wDrawActionCallBack_p action;
- //wDrawRedrawCallBack_p redraw;
+//WOBJ_COMMON
+//void * context;
+//wDrawActionCallBack_p action;
+//wDrawRedrawCallBack_p redraw;
- //GdkPixmap * pixmap;
- //GdkPixmap * pixmapBackup;
+//GdkPixmap * pixmap;
+//GdkPixmap * pixmapBackup;
- //double dpi;
+//double dpi;
- //GdkGC * gc;
- //wDrawWidth lineWidth;
- //wDrawOpts opts;
- //wPos_t maxW;
- //wPos_t maxH;
- //unsigned long lastColor;
- //wBool_t lastColorInverted;
- //const char * helpStr;
+//GdkGC * gc;
+//wDrawWidth lineWidth;
+//wDrawOpts opts;
+//wWinPix_t maxW;
+//wWinPix_t maxH;
+//unsigned long lastColor;
+//wBool_t lastColorInverted;
+//const char * helpStr;
- //wPos_t lastX;
- //wPos_t lastY;
+//wWinPix_t lastX;
+//wWinPix_t lastY;
- //wBool_t delayUpdate;
- //};
+//wBool_t delayUpdate;
+//};
struct wDraw_t psPrint_d;
@@ -109,95 +109,10 @@ struct wDraw_t psPrint_d;
*
*******************************************************************************/
-static cairo_t* gtkDrawCreateCairoCursorContext(
- wControl_p ct,
- cairo_surface_t * surf,
- wDrawWidth width,
- wDrawLineType_e lineType,
- wDrawColor color,
- wDrawOpts opts )
-{
- cairo_t* cairo;
-
- cairo = cairo_create(surf);
-
- width = width ? abs(width) : 1;
- cairo_set_line_width(cairo, width);
-
- cairo_set_line_cap(cairo, CAIRO_LINE_CAP_BUTT);
- cairo_set_line_join(cairo, CAIRO_LINE_JOIN_MITER);
-
- switch(lineType)
- {
- case wDrawLineSolid:
- {
- cairo_set_dash(cairo, 0, 0, 0);
- break;
- }
- case wDrawLineDash:
- {
- double dashes[] = { 5, 3 };
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0);
- break;
- }
- case wDrawLineDot:
- {
- double dashes[] = { 1, 2 };
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0);
- break;
- }
- case wDrawLineDashDot:
- {
- double dashes[] = { 5, 2, 1, 2 };
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0);
- break;
- }
- case wDrawLineDashDotDot:
- {
- double dashes[] = { 5, 2, 1, 2, 1, 2 };
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0);
- break;
- }
- case wDrawLineCenter:
- {
- double dashes[] = { 8, 3, 5, 3};
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0.0);
- break;
- }
- case wDrawLinePhantom:
- {
- double dashes[] = { 8, 3, 5, 3, 5, 3};
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0.0);
- break;
- }
-
- }
- GdkColor * gcolor;
-
-
- cairo_set_operator(cairo, CAIRO_OPERATOR_SOURCE);
- gcolor = wlibGetColor(color, TRUE);
-
- if (ct->type == B_DRAW) {
- wDraw_p bd = (wDraw_p)ct;
- bd->lastColor = color;
- }
-
- cairo_set_source_rgba(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0, gcolor->blue / 65535.0, 1.0);
-
- return cairo;
-}
-
wBool_t wDrawSetTempMode(
- wDraw_p bd,
- wBool_t bTemp )
+ wDraw_p bd,
+ wBool_t bTemp )
{
wBool_t ret = bd->bTempMode;
bd->bTempMode = bTemp;
@@ -209,102 +124,99 @@ wBool_t wDrawSetTempMode(
}
static cairo_t* gtkDrawCreateCairoContext(
- wDraw_p bd,
- GdkDrawable * win,
- wDrawWidth width,
- wDrawLineType_e lineType,
- wDrawColor color,
- wDrawOpts opts )
+ wDraw_p bd,
+ GdkDrawable * win,
+ wDrawWidth width,
+ wDrawLineType_e lineType,
+ wDrawColor color,
+ wDrawOpts opts )
{
cairo_t* cairo;
- if (win)
+ if (win) {
cairo = gdk_cairo_create(win);
- else {
+ } else {
if (opts & wDrawOptTemp) {
- if ( ! bd->bTempMode )
- printf( "Temp draw in Main Mode. Contact Developers. See %s:%d\n", "gtkdraw-cario.c", __LINE__+1 );
-/* Temp Draw In Main Mode:
- You are seeing this message because there is a wDraw*() call on tempD but you are not in the context of TempRedraw()
- Typically this happens when Cmd<Object>() is processing a C_DOWN or C_MOVE action and it writes directly to tempD
- Instead it sould set some state which allows c_redraw to do the actual drawing
- If you set a break point on the printf you'll see the offending wDraw*() call in the traceback
- It should be sufficient to remove that draw code or move it to C_REDRAW
- This is not fatal but the draw will be ineffective because the next TempRedraw() will erase the temp surface
- before the expose event can copy (or bitblt) it
-*/
+ if ( ! bd->bTempMode ) {
+ printf( "Temp draw in Main Mode. Contact Developers. See %s:%d\n",
+ "gtkdraw-cario.c", __LINE__+1 );
+ }
+ /* Temp Draw In Main Mode:
+ You are seeing this message because there is a wDraw*() call on tempD but you are not in the context of TempRedraw()
+ Typically this happens when Cmd<Object>() is processing a C_DOWN or C_MOVE action and it writes directly to tempD
+ Instead it sould set some state which allows c_redraw to do the actual drawing
+ If you set a break point on the printf you'll see the offending wDraw*() call in the traceback
+ It should be sufficient to remove that draw code or move it to C_REDRAW
+ This is not fatal but the draw will be ineffective because the next TempRedraw() will erase the temp surface
+ before the expose event can copy (or bitblt) it
+ */
cairo = cairo_create(bd->temp_surface);
} else {
- if ( bd->bTempMode )
- printf( "Main draw in Temp Mode. Contact Developers. See %s:%d\n", "gtkdraw-cario.c", __LINE__+1 );
-/* Main Draw In Temp Mode:
- You are seeing this message because there is a wDraw*() call on mainD but you are in the context of TempRedraw()
- Typically this happens when C_REDRAW action calls wDraw*() on mainD, in which case it should be writing to tempD.
- Or the wDraw*() call should be removed if it is redundant.
- If you set a break point on the printf you'll see the offending wDraw*() call in the traceback
- This is not fatal but could result in garbage being left on the screen if the command is cancelled.
-*/
+ if ( bd->bTempMode ) {
+ printf( "Main draw in Temp Mode. Contact Developers. See %s:%d\n",
+ "gtkdraw-cario.c", __LINE__+1 );
+ }
+ /* Main Draw In Temp Mode:
+ You are seeing this message because there is a wDraw*() call on mainD but you are in the context of TempRedraw()
+ Typically this happens when C_REDRAW action calls wDraw*() on mainD, in which case it should be writing to tempD.
+ Or the wDraw*() call should be removed if it is redundant.
+ If you set a break point on the printf you'll see the offending wDraw*() call in the traceback
+ This is not fatal but could result in garbage being left on the screen if the command is cancelled.
+ */
cairo = gdk_cairo_create(bd->pixmap);
}
}
width = width ? abs(width) : 1;
- if ( color == wDrawColorWhite )
- width += 1; // Remove ghosts
+ if ( color == wDrawColorWhite ) {
+ width += 1; // Remove ghosts
+ }
cairo_set_line_width(cairo, width);
cairo_set_line_cap(cairo, CAIRO_LINE_CAP_BUTT);
cairo_set_line_join(cairo, CAIRO_LINE_JOIN_MITER);
- switch(lineType)
- {
- case wDrawLineSolid:
- {
- cairo_set_dash(cairo, 0, 0, 0);
- break;
- }
- case wDrawLineDash:
- {
- double dashes[] = { 5, 3 };
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0);
- break;
- }
- case wDrawLineDot:
- {
- double dashes[] = { 1, 2 };
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0);
- break;
- }
- case wDrawLineDashDot:
- {
- double dashes[] = { 5, 2, 1, 2 };
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0);
- break;
- }
- case wDrawLineDashDotDot:
- {
- double dashes[] = { 5, 2, 1, 2, 1, 2 };
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0);
- break;
- }
- case wDrawLineCenter:
- {
- double dashes[] = { 8, 3, 5, 3};
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0.0);
- break;
- }
- case wDrawLinePhantom:
- {
- double dashes[] = { 8, 3, 5, 3, 5, 3};
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cairo, dashes, len_dashes, 0.0);
- break;
- }
+ switch(lineType) {
+ case wDrawLineSolid: {
+ cairo_set_dash(cairo, 0, 0, 0);
+ break;
+ }
+ case wDrawLineDash: {
+ double dashes[] = { 5, 3 };
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cairo, dashes, len_dashes, 0);
+ break;
+ }
+ case wDrawLineDot: {
+ double dashes[] = { 1, 2 };
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cairo, dashes, len_dashes, 0);
+ break;
+ }
+ case wDrawLineDashDot: {
+ double dashes[] = { 5, 2, 1, 2 };
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cairo, dashes, len_dashes, 0);
+ break;
+ }
+ case wDrawLineDashDotDot: {
+ double dashes[] = { 5, 2, 1, 2, 1, 2 };
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cairo, dashes, len_dashes, 0);
+ break;
+ }
+ case wDrawLineCenter: {
+ double dashes[] = { 8, 3, 5, 3};
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cairo, dashes, len_dashes, 0.0);
+ break;
+ }
+ case wDrawLinePhantom: {
+ double dashes[] = { 8, 3, 5, 3, 5, 3};
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cairo, dashes, len_dashes, 0.0);
+ break;
+ }
}
GdkColor * gcolor;
@@ -315,49 +227,22 @@ static cairo_t* gtkDrawCreateCairoContext(
bd->lastColor = color;
- cairo_set_source_rgb(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0, gcolor->blue / 65535.0);
+ cairo_set_source_rgb(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0,
+ gcolor->blue / 65535.0);
return cairo;
}
-static cairo_t* gtkDrawDestroyCairoContext(cairo_t *cairo) {
+static cairo_t* gtkDrawDestroyCairoContext(cairo_t *cairo)
+{
cairo_destroy(cairo);
return NULL;
}
-#ifdef CURSOR_SURFACE
-cairo_t* CreateCursorSurface(wControl_p ct, wSurface_p surface, wPos_t width, wPos_t height, wDrawColor color, wDrawOpts opts) {
-
- cairo_t * cairo = NULL;
-
- if ((opts&wDrawOptCursor) || (opts&wDrawOptCursorRmv)) {
-
- if (surface!=NULL || surface->width != width || surface->height != height) {
- if (surface->surface) cairo_surface_destroy(surface->surface);
- surface->surface = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, width,height );
- surface->width = width;
- surface->height = height;
-
- }
-
- cairo = gtkDrawCreateCairoCursorContext(ct,surface->surface,0,wDrawLineSolid, color, opts);
- cairo_save(cairo);
- cairo_set_source_rgba(cairo, 0.0, 0.0, 0.0, 0.0);
- cairo_paint(cairo);
- cairo_restore(cairo);
- surface->show = TRUE;
- cairo_set_operator(cairo,CAIRO_OPERATOR_SOURCE);
- }
-
- return cairo;
-
-}
-#endif
-
- void wDrawDelayUpdate(
- wDraw_p bd,
- wBool_t delay )
+void wDrawDelayUpdate(
+ wDraw_p bd,
+ wBool_t delay )
{
GdkRectangle update_rect;
@@ -372,17 +257,17 @@ cairo_t* CreateCursorSurface(wControl_p ct, wSurface_p surface, wPos_t width, wP
}
- void wDrawLine(
- wDraw_p bd,
- wPos_t x0, wPos_t y0,
- wPos_t x1, wPos_t y1,
- wDrawWidth width,
- wDrawLineType_e lineType,
- wDrawColor color,
- wDrawOpts opts )
+void wDrawLine(
+ wDraw_p bd,
+ wDrawPix_t x0, wDrawPix_t y0,
+ wDrawPix_t x1, wDrawPix_t y1,
+ wDrawWidth width,
+ wDrawLineType_e lineType,
+ wDrawColor color,
+ wDrawOpts opts )
{
- GdkGC * gc;
- GdkRectangle update_rect;
+// GdkGC * gc;
+// GdkRectangle update_rect;
if ( bd == &psPrint_d ) {
psPrintLine( x0, y0, x1, y1, width, lineType, color, opts );
@@ -393,13 +278,15 @@ cairo_t* CreateCursorSurface(wControl_p ct, wSurface_p surface, wPos_t width, wP
x1 = INMAPX(bd,x1);
y1 = INMAPY(bd,y1);
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, width, lineType, color, opts);
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, width, lineType, color,
+ opts);
cairo_move_to(cairo, x0 + 0.5, y0 + 0.5);
cairo_line_to(cairo, x1 + 0.5, y1 + 0.5);
cairo_stroke(cairo);
gtkDrawDestroyCairoContext(cairo);
- if (bd->widget)
- gtk_widget_queue_draw(GTK_WIDGET(bd->widget)); //,x0,y0+1,x1,y1+1);
+ if (bd->widget) {
+ gtk_widget_queue_draw(GTK_WIDGET(bd->widget)); //,x0,y0+1,x1,y1+1);
+ }
}
@@ -418,79 +305,86 @@ cairo_t* CreateCursorSurface(wControl_p ct, wSurface_p surface, wPos_t width, wP
*/
- void wDrawArc(
- wDraw_p bd,
- wPos_t x0, wPos_t y0,
- wPos_t r,
- wAngle_t angle0,
- wAngle_t angle1,
- int drawCenter,
- wDrawWidth width,
- wDrawLineType_e lineType,
- wDrawColor color,
- wDrawOpts opts )
+void wDrawArc(
+ wDraw_p bd,
+ wDrawPix_t x0, wDrawPix_t y0,
+ wDrawPix_t r,
+ wAngle_t angle0,
+ wAngle_t angle1,
+ int drawCenter,
+ wDrawWidth width,
+ wDrawLineType_e lineType,
+ wDrawColor color,
+ wDrawOpts opts )
{
int x, y, w, h;
if ( bd == &psPrint_d ) {
- psPrintArc( x0, y0, r, angle0, angle1, drawCenter, width, lineType, color, opts );
+ psPrintArc( x0, y0, r, angle0, angle1, drawCenter, width, lineType, color,
+ opts );
return;
}
- if (r < 6.0/75.0) return;
+ if (r < 6.0/75.0) { return; }
x = INMAPX(bd,x0-r);
y = INMAPY(bd,y0+r);
w = 2*r;
h = 2*r;
// now create the new arc
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, width, lineType, color, opts);
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, width, lineType, color,
+ opts);
cairo_new_path(cairo);
// its center point marker
- if(drawCenter)
- {
+ if(drawCenter) {
// draw a small crosshair to mark the center of the curve
- cairo_move_to(cairo, INMAPX(bd, x0 - (CENTERMARK_LENGTH / 2)), INMAPY(bd, y0 ));
+ cairo_move_to(cairo, INMAPX(bd, x0 - (CENTERMARK_LENGTH / 2)), INMAPY(bd,
+ y0 ));
cairo_line_to(cairo, INMAPX(bd, x0 + (CENTERMARK_LENGTH / 2)), INMAPY(bd, y0 ));
cairo_move_to(cairo, INMAPX(bd, x0), INMAPY(bd, y0 - (CENTERMARK_LENGTH / 2 )));
- cairo_line_to(cairo, INMAPX(bd, x0) , INMAPY(bd, y0 + (CENTERMARK_LENGTH / 2)));
+ cairo_line_to(cairo, INMAPX(bd, x0), INMAPY(bd, y0 + (CENTERMARK_LENGTH / 2)));
cairo_new_sub_path( cairo );
}
// draw the curve itself
- cairo_arc_negative(cairo, INMAPX(bd, x0), INMAPY(bd, y0), r, (angle0 - 90 + angle1) * (M_PI / 180.0), (angle0 - 90) * (M_PI / 180.0));
+ cairo_arc_negative(cairo, INMAPX(bd, x0), INMAPY(bd, y0), r,
+ (angle0 - 90 + angle1) * (M_PI / 180.0), (angle0 - 90) * (M_PI / 180.0));
cairo_stroke(cairo);
gtkDrawDestroyCairoContext(cairo);
- if (bd->widget && !bd->delayUpdate)
- gtk_widget_queue_draw_area(bd->widget,x,y,w,h);
+ if (bd->widget && !bd->delayUpdate) {
+ gtk_widget_queue_draw_area(bd->widget,x,y,w,h);
+ }
}
- void wDrawPoint(
- wDraw_p bd,
- wPos_t x0, wPos_t y0,
- wDrawColor color,
- wDrawOpts opts )
+void wDrawPoint(
+ wDraw_p bd,
+ wDrawPix_t x0, wDrawPix_t y0,
+ wDrawColor color,
+ wDrawOpts opts )
{
- GdkRectangle update_rect;
+// GdkRectangle update_rect;
if ( bd == &psPrint_d ) {
/*psPrintArc( x0, y0, r, angle0, angle1, drawCenter, width, lineType, color, opts );*/
return;
}
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color, opts);
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color,
+ opts);
cairo_new_path(cairo);
cairo_arc(cairo, INMAPX(bd, x0), INMAPY(bd, y0), 0.75, 0, 2 * M_PI);
cairo_stroke(cairo);
gtkDrawDestroyCairoContext(cairo);
- if (bd->widget && !bd->delayUpdate)
- gtk_widget_queue_draw_area(bd->widget,INMAPX(bd,x0-0.75),INMAPY(bd,y0+0.75),2,2);
+ if (bd->widget && !bd->delayUpdate) {
+ gtk_widget_queue_draw_area(bd->widget,INMAPX(bd,x0-0.75),INMAPY(bd,y0+0.75),2,
+ 2);
+ }
}
@@ -500,23 +394,23 @@ cairo_t* CreateCursorSurface(wControl_p ct, wSurface_p surface, wPos_t width, wP
*
******************************************************************************/
- void wDrawString(
- wDraw_p bd,
- wPos_t x, wPos_t y,
- wAngle_t a,
- const char * s,
- wFont_p fp,
- wFontSize_t fs,
- wDrawColor color,
- wDrawOpts opts )
+void wDrawString(
+ wDraw_p bd,
+ wDrawPix_t x, wDrawPix_t y,
+ wAngle_t a,
+ const char * s,
+ wFont_p fp,
+ wFontSize_t fs,
+ wDrawColor color,
+ wDrawOpts opts )
{
PangoLayout *layout;
GdkRectangle update_rect;
- int w;
- int h;
- gint ascent;
- gint descent;
- gint baseline;
+ wDrawPix_t w;
+ wDrawPix_t h;
+ wDrawPix_t ascent;
+ wDrawPix_t descent;
+ wDrawPix_t baseline;
double angle = -M_PI * a / 180.0;
if ( bd == &psPrint_d ) {
@@ -528,19 +422,21 @@ cairo_t* CreateCursorSurface(wControl_p ct, wSurface_p surface, wPos_t width, wP
y = INMAPY(bd,y);
/* draw text */
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color, opts);
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color,
+ opts);
cairo_save( cairo );
cairo_identity_matrix(cairo);
layout = wlibFontCreatePangoLayout(bd->widget, cairo, fp, fs, s,
- (int *) &w, (int *) &h,
- (int *) &ascent, (int *) &descent, (int *) &baseline);
+ &w, &h,
+ &ascent, &descent, &baseline);
/* cairo does not support the old method of text removal by overwrite;
* if color is White, then overwrite old text with a White rectangle */
GdkColor* const gcolor = wlibGetColor(color, TRUE);
- cairo_set_source_rgb(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0, gcolor->blue / 65535.0);
+ cairo_set_source_rgb(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0,
+ gcolor->blue / 65535.0);
cairo_translate( cairo, x, y );
cairo_rotate( cairo, angle );
@@ -554,7 +450,7 @@ cairo_t* CreateCursorSurface(wControl_p ct, wSurface_p surface, wPos_t width, wP
cairo_restore( cairo );
gtkDrawDestroyCairoContext(cairo);
- if (bd->delayUpdate || bd->widget == NULL) return;
+ if (bd->delayUpdate || bd->widget == NULL) { return; }
/* recalculate the area to be updated
* for simplicity sake I added plain text height ascent and descent,
@@ -565,48 +461,52 @@ cairo_t* CreateCursorSurface(wControl_p ct, wSurface_p surface, wPos_t width, wP
update_rect.width = (gint) (w * cos( angle ) + h * sin(angle))+2;
update_rect.height = (gint) (h * sin( angle ) + w * cos(angle))+2;
gtk_widget_draw(bd->widget, &update_rect);
- if (bd->widget && !bd->delayUpdate)
- gtk_widget_queue_draw_area(bd->widget, update_rect.x, update_rect.y, update_rect.width, update_rect.height);
-
+ if (bd->widget && !bd->delayUpdate) {
+ gtk_widget_queue_draw_area(bd->widget, update_rect.x, update_rect.y,
+ update_rect.width, update_rect.height);
+ }
+
}
- void wDrawGetTextSize(
- wPos_t *w,
- wPos_t *h,
- wPos_t *d,
- wPos_t *a,
- wDraw_p bd,
- const char * s,
- wFont_p fp,
- wFontSize_t fs )
+void wDrawGetTextSize(
+ wDrawPix_t *w,
+ wDrawPix_t *h,
+ wDrawPix_t *d,
+ wDrawPix_t *a,
+ wDraw_p bd,
+ const char * s,
+ wFont_p fp,
+ wFontSize_t fs )
{
- int textWidth;
- int textHeight;
- int ascent;
- int descent;
- int baseline;
+ wDrawPix_t textWidth;
+ wDrawPix_t textHeight;
+ wDrawPix_t ascent;
+ wDrawPix_t descent;
+ wDrawPix_t baseline;
*w = 0;
*h = 0;
/* draw text */
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, wDrawColorBlack, bd->bTempMode?wDrawOptTemp:0 );
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid,
+ wDrawColorBlack, bd->bTempMode?wDrawOptTemp:0 );
cairo_identity_matrix(cairo);
wlibFontDestroyPangoLayout(
- wlibFontCreatePangoLayout(bd->widget, cairo, fp, fs, s,
- &textWidth, (int *) &textHeight,
- (int *) &ascent, (int *) &descent, (int *) &baseline) );
-
- *w = (wPos_t) textWidth;
- *h = (wPos_t) textHeight;
- *a = (wPos_t) ascent;
- //*d = (wPos_t) textHeight-ascent;
- *d = (wPos_t) descent;
-
- if (debugWindow >= 3)
- fprintf(stderr, "text metrics: w=%d, h=%d, d=%d\n", *w, *h, *d);
+ wlibFontCreatePangoLayout(bd->widget, cairo, fp, fs, s,
+ &textWidth, &textHeight,
+ &ascent, &descent, &baseline) );
+
+ *w = textWidth;
+ *h = textHeight;
+ *a = ascent;
+ //*d = textHeight-ascent;
+ *d = descent;
+
+ if (debugWindow >= 3) {
+ fprintf(stderr, "text metrics: w=%0.1f, h=%0.1f, d=%0.1f\n", *w, *h, *d);
+ }
gtkDrawDestroyCairoContext(cairo);
}
@@ -619,9 +519,9 @@ cairo_t* CreateCursorSurface(wControl_p ct, wSurface_p surface, wPos_t width, wP
*******************************************************************************/
static void wlibDrawFilled(
- cairo_t * cairo,
- wDrawColor color,
- wDrawOpts opt )
+ cairo_t * cairo,
+ wDrawColor color,
+ wDrawOpts opt )
{
if ( (opt & wDrawOptTransparent) != 0 ) {
if ( (opt & wDrawOptTemp) == 0 ) {
@@ -630,26 +530,28 @@ static void wlibDrawFilled(
cairo_fill_preserve(cairo);
}
GdkColor * gcolor = wlibGetColor(color, TRUE);
- cairo_set_source_rgba(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0, gcolor->blue / 65535.0, 1.0);
+ cairo_set_source_rgba(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0,
+ gcolor->blue / 65535.0, 1.0);
cairo_set_operator(cairo, CAIRO_OPERATOR_OVER);
cairo_stroke_preserve(cairo);
cairo_set_operator(cairo, CAIRO_OPERATOR_OVER);
- cairo_set_source_rgba(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0, gcolor->blue / 65535.0, 0.3);
+ cairo_set_source_rgba(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0,
+ gcolor->blue / 65535.0, 0.3);
}
cairo_fill(cairo);
}
- void wDrawFilledRectangle(
- wDraw_p bd,
- wPos_t x,
- wPos_t y,
- wPos_t w,
- wPos_t h,
- wDrawColor color,
- wDrawOpts opt )
+void wDrawFilledRectangle(
+ wDraw_p bd,
+ wDrawPix_t x,
+ wDrawPix_t y,
+ wDrawPix_t w,
+ wDrawPix_t h,
+ wDrawColor color,
+ wDrawOpts opt )
{
- GdkRectangle update_rect;
+// GdkRectangle update_rect;
if ( bd == &psPrint_d ) {
psPrintFillRectangle( x, y, w, h, color, opt );
@@ -659,7 +561,8 @@ static void wlibDrawFilled(
x = INMAPX(bd,x);
y = INMAPY(bd,y)-h;
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color, opt);
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color,
+ opt);
cairo_move_to(cairo, x, y);
cairo_rel_line_to(cairo, w, 0);
@@ -669,22 +572,23 @@ static void wlibDrawFilled(
wlibDrawFilled( cairo, color, opt );
gtkDrawDestroyCairoContext(cairo);
- if (bd->widget && !bd->delayUpdate)
+ if (bd->widget && !bd->delayUpdate) {
gtk_widget_queue_draw_area(GTK_WIDGET(bd->widget),x,y,w,h);
+ }
}
- void wDrawPolygon(
- wDraw_p bd,
- wPos_t p[][2],
- wPolyLine_e type[],
- int cnt,
- wDrawColor color,
- wDrawWidth dw,
- wDrawLineType_e lt,
- wDrawOpts opt,
- int fill,
- int open )
+void wDrawPolygon(
+ wDraw_p bd,
+ wDrawPix_t p[][2],
+ wPolyLine_e type[],
+ int cnt,
+ wDrawColor color,
+ wDrawWidth dw,
+ wDrawLineType_e lt,
+ wDrawOpts opt,
+ int fill,
+ int open )
{
static int maxCnt = 0;
static GdkPoint *points;
@@ -695,34 +599,37 @@ static void wlibDrawFilled(
return;
}
- if (cnt > maxCnt) {
- if (points == NULL)
+ if (cnt > maxCnt) {
+ if (points == NULL) {
points = (GdkPoint*)malloc( cnt*sizeof *points );
- else
+ } else {
points = (GdkPoint*)realloc( points, cnt*sizeof *points );
- if (points == NULL)
+ }
+ if (points == NULL) {
abort();
+ }
maxCnt = cnt;
}
- wPos_t min_x,max_x,min_y,max_y;
+ wDrawPix_t min_x,max_x,min_y,max_y;
min_x = max_x = INMAPX(bd,p[0][0]);
min_y = max_y = INMAPY(bd,p[0][1]);
- for (i=0; i<cnt; i++) {
- points[i].x = INMAPX(bd,p[i][0]);
- if (points[i].x < min_x) min_x = points[i].x;
- if (points[i].x > max_x) max_x = points[i].x;
- if (points[i].y > max_y) max_y = points[i].y;
- points[i].y = INMAPY(bd,p[i][1]);
+ for (i=0; i<cnt; i++) {
+ points[i].x = INMAPX(bd,p[i][0]);
+ if (points[i].x < min_x) { min_x = points[i].x; }
+ if (points[i].y < min_y) { min_y = points[i].y; }
+ if (points[i].x > max_x) { max_x = points[i].x; }
+ if (points[i].y > max_y) { max_y = points[i].y; }
+ points[i].y = INMAPY(bd,p[i][1]);
}
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, fill?0:dw, fill?wDrawLineSolid:lt, color, opt);
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, fill?0:dw,
+ fill?wDrawLineSolid:lt, color, opt);
- for(i = 0; i < cnt; ++i)
- {
+ for(i = 0; i < cnt; ++i) {
int j = i-1;
int k = i+1;
- if (j < 0) j = cnt-1;
- if (k > cnt-1) k = 0;
+ if (j < 0) { j = cnt-1; }
+ if (k > cnt-1) { k = 0; }
GdkPoint mid0, mid1, mid3, mid4;
// save is static because of an apparent compiler bug on Linux
// This happens with RelWithDebInfo target
@@ -770,20 +677,24 @@ static void wlibDrawFilled(
save = points[0];
} else {
cairo_move_to(cairo, mid0.x, mid0.y);
- if (type[i] == 1)
- cairo_curve_to(cairo, points[i].x, points[i].y, points[i].x, points[i].y, mid1.x, mid1.y);
- else
+ if (type[i] == 1) {
+ cairo_curve_to(cairo, points[i].x, points[i].y, points[i].x, points[i].y,
+ mid1.x, mid1.y);
+ } else {
cairo_curve_to(cairo, mid3.x, mid3.y, mid4.x, mid4.y, mid1.x, mid1.y);
+ }
save = mid0;
}
} else if (!type || type[i] == wPolyLineStraight || (open && (i==cnt-1))) {
cairo_line_to(cairo, points[i].x, points[i].y);
} else {
cairo_line_to(cairo, mid0.x, mid0.y);
- if (type[i] == wPolyLineSmooth)
- cairo_curve_to(cairo, points[i].x, points[i].y, points[i].x, points[i].y, mid1.x, mid1.y);
- else
+ if (type[i] == wPolyLineSmooth) {
+ cairo_curve_to(cairo, points[i].x, points[i].y, points[i].x, points[i].y,
+ mid1.x, mid1.y);
+ } else {
cairo_curve_to(cairo, mid3.x, mid3.y, mid4.x, mid4.y, mid1.x, mid1.y);
+ }
}
if ((i==cnt-1) && !open) {
cairo_line_to(cairo, save.x, save.y);
@@ -795,18 +706,20 @@ static void wlibDrawFilled(
cairo_stroke(cairo);
}
gtkDrawDestroyCairoContext(cairo);
- if (bd->widget && !bd->delayUpdate)
- gtk_widget_queue_draw_area(GTK_WIDGET(bd->widget),min_x,min_y,max_x-min_y,max_y-min_y);
+ if (bd->widget && !bd->delayUpdate) {
+ gtk_widget_queue_draw_area(GTK_WIDGET(bd->widget),min_x,min_y,max_x-min_y,
+ max_y-min_y);
+ }
}
- void wDrawFilledCircle(
- wDraw_p bd,
- wPos_t x0,
- wPos_t y0,
- wPos_t r,
- wDrawColor color,
- wDrawOpts opt )
+void wDrawFilledCircle(
+ wDraw_p bd,
+ wDrawPix_t x0,
+ wDrawPix_t y0,
+ wDrawPix_t r,
+ wDrawColor color,
+ wDrawOpts opt )
{
int x, y, w, h;
@@ -820,22 +733,26 @@ static void wlibDrawFilled(
w = 2*r;
h = 2*r;
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color, opt);
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color,
+ opt);
cairo_arc(cairo, INMAPX(bd, x0), INMAPY(bd, y0), r, 0, 2 * M_PI);
wlibDrawFilled( cairo, color, opt );
gtkDrawDestroyCairoContext(cairo);
- if (bd->widget)
- gtk_widget_queue_draw_area(GTK_WIDGET(bd->widget),x,y,w,h);
+ if (bd->widget && !bd->delayUpdate) {
+ gtk_widget_queue_draw_area(GTK_WIDGET(bd->widget),x,y,w,h);
+ }
}
- void wDrawClearTemp(wDraw_p bd) {
+void wDrawClearTemp(wDraw_p bd)
+{
//Wipe out temp space with 0 alpha (transparent)
static long cDCT = 0;
- if ( iDrawLog )
+ if ( iDrawLog ) {
printf( "wDrawClearTemp %ld\n", cDCT++ );
+ }
cairo_t* cairo = cairo_create(bd->temp_surface);
cairo_set_source_rgba(cairo, 0.0, 0.0, 0.0, 0.0);
@@ -847,29 +764,32 @@ static void wlibDrawFilled(
cairo_fill(cairo);
cairo_destroy(cairo);
- if (bd->widget && !bd->delayUpdate)
+ if (bd->widget && !bd->delayUpdate) {
gtk_widget_queue_draw(bd->widget);
- }
+ }
+}
- void wDrawClear(
- wDraw_p bd )
+void wDrawClear(
+ wDraw_p bd )
{
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, wDrawColorWhite, 0);
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid,
+ wDrawColorWhite, 0);
cairo_move_to(cairo, 0, 0);
cairo_rel_line_to(cairo, bd->w, 0);
cairo_rel_line_to(cairo, 0, bd->h);
cairo_rel_line_to(cairo, -bd->w, 0);
cairo_fill(cairo);
- if (bd->widget)
+ if (bd->widget) {
gtk_widget_queue_draw(bd->widget);
+ }
gtkDrawDestroyCairoContext(cairo);
wDrawClearTemp(bd);
}
- void * wDrawGetContext(
- wDraw_p bd )
+void * wDrawGetContext(
+ wDraw_p bd )
{
return bd->context;
}
@@ -881,13 +801,13 @@ static void wlibDrawFilled(
*******************************************************************************/
- wDrawBitMap_p wDrawBitMapCreate(
- wDraw_p bd,
- int w,
- int h,
- int x,
- int y,
- const unsigned char * fbits )
+wDrawBitMap_p wDrawBitMapCreate(
+ wDraw_p bd,
+ int w,
+ int h,
+ int x,
+ int y,
+ const unsigned char * fbits )
{
wDrawBitMap_p bm;
@@ -902,23 +822,21 @@ static void wlibDrawFilled(
}
- void wDrawBitMap(
- wDraw_p bd,
- wDrawBitMap_p bm,
- wPos_t x, wPos_t y,
- wDrawColor color,
- wDrawOpts opts )
+void wDrawBitMap(
+ wDraw_p bd,
+ wDrawBitMap_p bm,
+ wDrawPix_t x, wDrawPix_t y,
+ wDrawColor color,
+ wDrawOpts opts )
{
int i, j, wb;
- wPos_t xx, yy;
- wControl_p b;
- wWin_p win;
- GdkDrawable * gdk_drawable, * cairo_surface;
+ wDrawPix_t xx, yy;
GtkWidget * widget = bd->widget;
-
+
static long cDBM = 0;
- if ( iDrawLog )
+ if ( iDrawLog ) {
printf( "wDrawBitMap %ld\n", cDBM++ );
+ }
x = INMAPX( bd, x-bm->x );
y = INMAPY( bd, y-bm->y )-bm->h;
@@ -926,32 +844,6 @@ static void wlibDrawFilled(
cairo_t* cairo;
-#ifdef CURSOR_SURFACE
- if (opts&wDrawOptCursorRmv) color = wDrawColorWhite; //Wipeout existing cursor draw (simplistic first)
-
-
- if ((opts&wDrawOptCursor) || (opts&wDrawOptCursorRmv) || (opts&wDrawOptCursorQuit)) {
-
- cairo = CreateCursorSurface((wControl_p)bd,&bd->cursor_surface, bd->w, bd->h, color, opts);
-
- if ((opts&wDrawOptCursorRmv) || (opts&wDrawOptCursorQuit)) {
- bd->cursor_surface.show = FALSE;
- } else bd->cursor_surface.show = TRUE;
-
- widget = bd->widget;
-
-
- } else {
- cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color, opts);
- widget = bd->widget;
- }
-
- GtkWidget * new_widget = widget;
- GdkGC * gc = NULL;
- GdkWindow * gdk_window = NULL;
-
- win = bd->parent;
-#endif
cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, color, opts);
@@ -960,55 +852,15 @@ static void wlibDrawFilled(
if ( bm->bits[ j*wb+(i>>3) ] & (1<<(i&07)) ) {
xx = x+i;
yy = y+j;
-#ifdef CURSOR_SURFACE
- if ( 0 <= xx && xx < bd->w &&
- 0 <= yy && yy < bd->h ) {
- b = (wControl_p)bd;
- } else if ( (opts&wDrawOptNoClip) != 0 ) {
- xx += bd->realX;
- yy += bd->realY;
- b = wlibGetControlFromPos( bd->parent, xx, yy );
- if ( b) {
- xx -= b->realX;
- yy -= b->realY;
- new_widget = b->widget;
- } else {
- new_widget = bd->parent->widget;
- }
- } else {
- continue;
- }
-
- if (new_widget != widget) {
- if (cairo)
- cairo_destroy(cairo);
- cairo = NULL;
- if (widget && (widget != bd->parent->widget))
- gtk_widget_queue_draw(GTK_WIDGET(widget));
- if ( (opts&wDrawOptCursor) || (opts&wDrawOptCursorRmv) || (opts&wDrawOptCursorQuit)) {
- if (!b) b = (wControl_p)(bd->parent->widget);
- cairo = CreateCursorSurface(b,&b->cursor_surface, b->w, b->h, color, opts);
- widget = b->widget;
- gc = NULL;
- if ((opts&wDrawOptCursorRmv) || (opts&wDrawOptCursorQuit))
- b->cursor_surface.show = FALSE;
- else
- b->cursor_surface.show = TRUE;
- } else {
- continue;
- }
- widget = new_widget;
- }
- if ((opts&wDrawOptCursorQuit) || (opts&wDrawOptCursorQuit) ) continue;
-#endif
cairo_rectangle(cairo, xx, yy, 1, 1);
cairo_fill(cairo);
}
cairo_destroy(cairo);
- if (widget && !bd->delayUpdate)
+ if (widget && !bd->delayUpdate) {
gtk_widget_queue_draw_area(GTK_WIDGET(widget), x, y, bm->w, bm->h);
+ }
}
@@ -1021,8 +873,8 @@ static void wlibDrawFilled(
- void wDrawSaveImage(
- wDraw_p bd )
+void wDrawSaveImage(
+ wDraw_p bd )
{
cairo_t * cr;
if ( bd->pixmapBackup ) {
@@ -1032,7 +884,7 @@ static void wlibDrawFilled(
cr = gdk_cairo_create(bd->pixmapBackup);
gdk_cairo_set_source_pixmap(cr, bd->pixmap, 0, 0);
- cairo_paint(cr);
+ cairo_paint(cr);
cairo_destroy(cr);
cr = NULL;
@@ -1040,8 +892,8 @@ static void wlibDrawFilled(
}
- void wDrawRestoreImage(
- wDraw_p bd )
+void wDrawRestoreImage(
+ wDraw_p bd )
{
GdkRectangle update_rect;
if ( bd->pixmapBackup ) {
@@ -1054,7 +906,7 @@ static void wlibDrawFilled(
cr = NULL;
- if ( bd->delayUpdate || bd->widget == NULL ) return;
+ if ( bd->delayUpdate || bd->widget == NULL ) { return; }
update_rect.x = 0;
update_rect.y = 0;
update_rect.width = bd->w;
@@ -1064,10 +916,10 @@ static void wlibDrawFilled(
}
- void wDrawSetSize(
- wDraw_p bd,
- wPos_t w,
- wPos_t h , void * redraw)
+void wDrawSetSize(
+ wDraw_p bd,
+ wWinPix_t w,
+ wWinPix_t h, void * redraw)
{
wBool_t repaint;
if (bd == NULL) {
@@ -1076,37 +928,47 @@ static void wlibDrawFilled(
}
/* Negative values crashes the program */
- if (w < 0 || h < 0)
- return;
+ if ( w <= 0 || h <= 0 ) {
+ fprintf( stderr, "wDrawSetSize bad size %ldx%ld\n", w, h );
+ if ( w <= 0 ) {
+ w = 100;
+ }
+ if ( h <= 0 ) {
+ h = 100;
+ }
+ }
repaint = (w != bd->w || h != bd->h);
bd->w = w;
bd->h = h;
gtk_widget_set_size_request( bd->widget, w, h );
- if (repaint)
- {
- if (bd->pixmap)
+ if (repaint) {
+ if (bd->pixmap) {
gdk_pixmap_unref( bd->pixmap );
+ }
bd->pixmap = gdk_pixmap_new( bd->widget->window, w, h, -1 );
- if (bd->temp_surface)
+ if (bd->temp_surface) {
cairo_surface_destroy( bd->temp_surface);
+ }
bd->temp_surface = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, w,h );
wDrawClear( bd );
- if (!redraw)
+ if (!redraw) {
bd->redraw( bd, bd->context, w, h );
+ }
}
/*wRedraw( bd )*/;
}
- void wDrawGetSize(
- wDraw_p bd,
- wPos_t *w,
- wPos_t *h )
+void wDrawGetSize(
+ wDraw_p bd,
+ wWinPix_t *w,
+ wWinPix_t *h )
{
- if (bd->widget)
+ if (bd->widget) {
wlibControlGetSize( (wControl_p)bd );
+ }
*w = bd->w-2;
*h = bd->h-2;
}
@@ -1118,76 +980,68 @@ static void wlibDrawFilled(
* \return the resolution in dpi
*/
- double wDrawGetDPI(
- wDraw_p d )
+double wDrawGetDPI(
+ wDraw_p d )
{
//if (d == &psPrint_d)
- //return 1440.0;
+ //return 1440.0;
//else
- return d->dpi;
+ return d->dpi;
}
- double wDrawGetMaxRadius(
- wDraw_p d )
+double wDrawGetMaxRadius(
+ wDraw_p d )
{
- if (d == &psPrint_d)
+ if (d == &psPrint_d) {
return 10e9;
- else
+ } else {
return 32767.0;
+ }
}
- void wDrawClip(
- wDraw_p d,
- wPos_t x,
- wPos_t y,
- wPos_t w,
- wPos_t h )
+void wDrawClip(
+ wDraw_p d,
+ wDrawPix_t x,
+ wDrawPix_t y,
+ wDrawPix_t w,
+ wDrawPix_t h )
{
GdkRectangle rect;
- rect.width = w;
- rect.height = h;
- rect.x = INMAPX( d, x );
- rect.y = INMAPY( d, y ) - rect.height;
+ rect.width = (wWinPix_t)w;
+ rect.height = (wWinPix_t)h;
+ rect.x = (wWinPix_t)INMAPX( d, x );
+ rect.y = (wWinPix_t)INMAPY( d, y ) - rect.height;
gdk_gc_set_clip_rectangle( d->gc, &rect );
}
static gint draw_expose_event(
- GtkWidget *widget,
- GdkEventExpose *event,
- wDraw_p bd)
+ GtkWidget *widget,
+ GdkEventExpose *event,
+ wDraw_p bd)
{
static long cDEE = 0;
if ( iDrawLog )
- printf( "draw_expose_event %ld %dx%d+%dx%d %dx%d+%dx%d\n", cDEE++,
- event->area.x, event->area.y, event->area.width, event->area.height,
- 0, bd->w, 0, bd->h );
+ printf( "draw_expose_event %ld %dx%d+%dx%d %ldx%ld+%ldx%ld\n", cDEE++,
+ event->area.x, event->area.y, event->area.width, event->area.height,
+ 0L, bd->w, 0L, bd->h );
cairo_t* cairo = gdk_cairo_create (widget->window);
gdk_cairo_set_source_pixmap(cairo,bd->pixmap,0,0);
cairo_rectangle(cairo,event->area.x, event->area.y,
- event->area.width, event->area.height);
+ event->area.width, event->area.height);
cairo_set_operator(cairo,CAIRO_OPERATOR_SOURCE);
cairo_fill(cairo);
cairo_set_source_surface(cairo,bd->temp_surface,0,0);
cairo_rectangle(cairo,event->area.x, event->area.y,
- event->area.width, event->area.height);
+ event->area.width, event->area.height);
cairo_set_operator(cairo,CAIRO_OPERATOR_OVER);
cairo_fill(cairo);
-#ifdef CURSOR_SURFACE
- if (bd->cursor_surface.surface && bd->cursor_surface.show) {
- cairo_set_source_surface(cairo,bd->cursor_surface.surface,0,0);
- cairo_set_operator(cairo,CAIRO_OPERATOR_OVER);
- cairo_rectangle(cairo,event->area.x, event->area.y,
- event->area.width, event->area.height);
- cairo_fill(cairo);
- }
-#endif
cairo_destroy(cairo);
return TRUE;
@@ -1195,14 +1049,14 @@ static gint draw_expose_event(
static gint draw_configure_event(
- GtkWidget *widget,
- GdkEventConfigure *event,
- wDraw_p bd)
+ GtkWidget *widget,
+ GdkEventConfigure *event,
+ wDraw_p bd)
{
return TRUE;
}
-static const char * actionNames[] = { "None", "Move", "LDown", "LDrag", "LUp", "RDown", "RDrag", "RUp", "Text", "ExtKey", "WUp", "WDown", "DblL", "ModK", "ScrU", "ScrD", "ScrL", "ScrR" };
+static const char * actionNames[] = { "None", "Move", "LDown", "LDrag", "LUp", "RDown", "RDrag", "RUp", "Text", "ExtKey", "WUp", "WDown", "DblL", "ModK", "ScrU", "ScrD", "ScrL", "ScrR", "MDown", "MDrag", "MUp" };
/**
* Handler for scroll events, ie mouse wheel activity
@@ -1211,30 +1065,35 @@ static const char * actionNames[] = { "None", "Move", "LDown", "LDrag", "LUp", "
static int scrollTimer;
static int timer_busy_count;
static wAction_t lastAction;
+static int timer_interval = 500; // Start at 0.5 secs
-static int ScrollTimerPop(wDraw_p bd) {
+static int ScrollTimerPop(wDraw_p bd)
+{
- if (timer_busy_count>1) {
- timer_busy_count = 0;
- scrollTimer = 0;
- } else {
- timer_busy_count++;
- return TRUE;
- }
- if (drawVerbose >= 2)
- printf( "%s-Pop\n", actionNames[lastAction] );
- bd->action( bd, bd->context, lastAction, 0, 0 );
+ if (timer_busy_count>4)
+ timer_interval = 250; //If lots of events 0.25 secs next time
+ if (timer_busy_count<1)
+ timer_interval = 500; //If few events 0.5 secs next time
- return FALSE;
+
+ if (drawVerbose >= 2) {
+ printf( "%s-Pop\n", actionNames[lastAction] );
+ }
+ scrollTimer = 0;
+ timer_busy_count = 0;
+ // Don't do the action as may no longer be scrolling
+ // bd->action( bd, bd->context, lastAction, (wDrawPix_t)0, (wDrawPix_t)0 );
+
+ return FALSE; //Stops timer re-popping
}
static gint draw_scroll_event(
- GtkWidget *widget,
- GdkEventScroll *event,
- wDraw_p bd)
+ GtkWidget *widget,
+ GdkEventScroll *event,
+ wDraw_p bd)
{
- wAction_t action;
+ wAction_t action = 0;
static int oldEventX = 0;
static int oldEventY = 0;
static int newEventX = 0;
@@ -1248,44 +1107,34 @@ static gint draw_scroll_event(
oldEventY = OUTMAPX(bd, event->y_root);
switch( event->direction ) {
- case GDK_SCROLL_UP:
- if (event->state & GDK_CONTROL_MASK)
- action = wActionScrollRight;
- else
- action = wActionScrollUp;
- break;
- case GDK_SCROLL_DOWN:
- if (event->state & GDK_CONTROL_MASK)
- action = wActionScrollLeft;
- else
- action = wActionScrollDown;
- break;
- case GDK_SCROLL_LEFT:
- action = wActionScrollLeft;
- break;
- case GDK_SCROLL_RIGHT:
+ case GDK_SCROLL_UP:
+ if (event->state & GDK_CONTROL_MASK) {
action = wActionScrollRight;
- break;
- default:
- return TRUE;
- break;
+ } else {
+ action = wActionScrollUp;
+ }
+ break;
+ case GDK_SCROLL_DOWN:
+ if (event->state & GDK_CONTROL_MASK) {
+ action = wActionScrollLeft;
+ } else {
+ action = wActionScrollDown;
+ }
+ break;
+ case GDK_SCROLL_LEFT:
+ action = wActionScrollLeft;
+ break;
+ case GDK_SCROLL_RIGHT:
+ action = wActionScrollRight;
+ break;
+ default:
+ return TRUE;
+ break;
}
if (drawVerbose >= 2)
printf( "%sNew[%dx%d]Delta[%dx%d]\n", actionNames[action],
- newEventX, newEventY, oldEventX, oldEventY );
-
-
-
- if (scrollTimer) { // Already have a timer
- lastAction = action;
- return TRUE;
- } else {
- lastAction = action;
- timer_busy_count = 0;
- scrollTimer = g_timeout_add(25,(GSourceFunc)ScrollTimerPop,bd); // 25ms delay
- return TRUE;
- }
+ newEventX, newEventY, oldEventX, oldEventY );
} else {
@@ -1306,12 +1155,27 @@ static gint draw_scroll_event(
default:
break;
}
+
}
+ if (event->time < GDK_CURRENT_TIME) return TRUE; //Ignore past events
+
+ if (scrollTimer) { // Already have a timer
+ timer_busy_count++;
+ lastAction = action;
+ return TRUE;
+ } else {
+ lastAction = action;
+ timer_busy_count = 0;
+ scrollTimer = g_timeout_add(timer_interval,(GSourceFunc)ScrollTimerPop,bd); // 250ms delay
+ }
+
if (action != 0) {
- if (drawVerbose >= 2)
- printf( "%s[%dx%d]\n", actionNames[action], bd->lastX, bd->lastY );
- bd->action( bd, bd->context, action, bd->lastX, bd->lastY );
+ if (drawVerbose >= 2) {
+ printf( "%s[%ldx%ld]\n", actionNames[action], bd->lastX, bd->lastY );
+ }
+ bd->action( bd, bd->context, action, (wDrawPix_t)bd->lastX,
+ (wDrawPix_t)bd->lastY);
}
return TRUE;
@@ -1320,8 +1184,8 @@ static gint draw_scroll_event(
static gint draw_leave_event(
- GtkWidget *widget,
- GdkEvent * event )
+ GtkWidget *widget,
+ GdkEvent * event )
{
wlibHelpHideBalloon();
return TRUE;
@@ -1332,14 +1196,19 @@ static gint draw_leave_event(
* Handler for mouse button clicks.
*/
+
+
static gint draw_button_event(
- GtkWidget *widget,
- GdkEventButton *event,
- wDraw_p bd )
+ GtkWidget *widget,
+ GdkEventButton *event,
+ wDraw_p bd )
{
+
wAction_t action = 0;
- if (bd->action == NULL)
+
+ if (bd->action == NULL) {
return TRUE;
+ }
bd->lastX = OUTMAPX(bd, event->x);
bd->lastY = OUTMAPY(bd, event->y);
@@ -1347,35 +1216,43 @@ static gint draw_button_event(
switch ( event->button ) {
case 1: /* left mouse button */
action = event->type==GDK_BUTTON_PRESS?wActionLDown:wActionLUp;
- if (event->type==GDK_2BUTTON_PRESS) action = wActionLDownDouble;
- /*bd->action( bd, bd->context, event->type==GDK_BUTTON_PRESS?wActionLDown:wActionLUp, bd->lastX, bd->lastY );*/
+ if (event->type==GDK_2BUTTON_PRESS) { action = wActionLDownDouble; }
+ break;
+ case 2: /* middle mouse button */
+ action = event->type==GDK_BUTTON_PRESS?wActionMDown:wActionMUp;
+ /*bd->action( bd, bd->context, event->type==GDK_BUTTON_PRESS?wActionLDown:wActionLUp, (wDrawPix_t)bd->lastX, (wDrawPix_t)bd->lastY );*/
break;
case 3: /* right mouse button */
action = event->type==GDK_BUTTON_PRESS?wActionRDown:wActionRUp;
- /*bd->action( bd, bd->context, event->type==GDK_BUTTON_PRESS?wActionRDown:wActionRUp, bd->lastX, bd->lastY );*/
+ /*bd->action( bd, bd->context, event->type==GDK_BUTTON_PRESS?wActionRDown:wActionRUp, (wDrawPix_t)bd->lastX, (wDrawPix_t)bd->lastY );*/
break;
}
if (action != 0) {
- if (drawVerbose >= 2)
- printf( "%s[%dx%d]\n", actionNames[action], bd->lastX, bd->lastY );
- bd->action( bd, bd->context, action, bd->lastX, bd->lastY );
+ if (drawVerbose >= 2) {
+ printf( "%s[%ldx%ld]\n", actionNames[action], bd->lastX, bd->lastY );
+ }
+ bd->action( bd, bd->context, action, (wDrawPix_t)bd->lastX,
+ (wDrawPix_t)bd->lastY );
}
- if (!(bd->option & BD_NOFOCUS))
+
+ if (!(bd->option & BD_NOFOCUS)) {
gtk_widget_grab_focus( bd->widget );
+ }
return TRUE;
}
static gint draw_motion_event(
- GtkWidget *widget,
- GdkEventMotion *event,
- wDraw_p bd )
+ GtkWidget *widget,
+ GdkEventMotion *event,
+ wDraw_p bd )
{
int x, y;
GdkModifierType state;
wAction_t action;
- if (bd->action == NULL)
+ if (bd->action == NULL) {
return TRUE;
+ }
if (event->is_hint) {
gdk_window_get_pointer (event->window, &x, &y, &state);
@@ -1387,6 +1264,8 @@ static gint draw_motion_event(
if (state & GDK_BUTTON1_MASK) {
action = wActionLDrag;
+ } else if (state & GDK_BUTTON2_MASK) {
+ action = wActionMDrag;
} else if (state & GDK_BUTTON3_MASK) {
action = wActionRDrag;
} else {
@@ -1394,48 +1273,54 @@ static gint draw_motion_event(
}
bd->lastX = OUTMAPX(bd, x);
bd->lastY = OUTMAPY(bd, y);
- if (drawVerbose >= 2)
- printf( "%lx: %s[%dx%d] %s\n", (long)bd, actionNames[action], bd->lastX, bd->lastY, event->is_hint?"<Hint>":"<>" );
- bd->action( bd, bd->context, action, bd->lastX, bd->lastY );
- if (!(bd->option & BD_NOFOCUS))
+ if (drawVerbose >= 2) {
+ printf( "%lx: %s[%ldx%ld] %s\n", (long)bd, actionNames[action], bd->lastX,
+ bd->lastY, event->is_hint?"<Hint>":"<>" );
+ }
+ bd->action( bd, bd->context, action, (wDrawPix_t)bd->lastX,
+ (wDrawPix_t)bd->lastY );
+ if (!(bd->option & BD_NOFOCUS)) {
gtk_widget_grab_focus( bd->widget );
+ }
return TRUE;
}
static gint draw_char_release_event(
- GtkWidget * widget,
- GdkEventKey *event,
- wDraw_p bd )
+ GtkWidget * widget,
+ GdkEventKey *event,
+ wDraw_p bd )
{
- GdkModifierType modifiers;
- guint key = event->keyval;
- wModKey_e modKey = wModKey_None;
- switch (key) {
- case GDK_KEY_Alt_L: modKey = wModKey_Alt; break;
- case GDK_KEY_Alt_R: modKey = wModKey_Alt; break;
- case GDK_KEY_Shift_L: modKey = wModKey_Shift; break;
- case GDK_KEY_Shift_R: modKey = wModKey_Shift; break;
- case GDK_KEY_Control_L: modKey = wModKey_Ctrl; break;
- case GDK_KEY_Control_R: modKey = wModKey_Ctrl; break;
- default: ;
- }
+// GdkModifierType modifiers;
+ guint key = event->keyval;
+ wModKey_e modKey = wModKey_None;
+ switch (key) {
+ case GDK_KEY_Alt_L: modKey = wModKey_Alt; break;
+ case GDK_KEY_Alt_R: modKey = wModKey_Alt; break;
+ case GDK_KEY_Shift_L: modKey = wModKey_Shift; break;
+ case GDK_KEY_Shift_R: modKey = wModKey_Shift; break;
+ case GDK_KEY_Control_L: modKey = wModKey_Ctrl; break;
+ case GDK_KEY_Control_R: modKey = wModKey_Ctrl; break;
+ default: ;
+ }
- if (modKey!= wModKey_None && (bd->option & BD_MODKEYS)) {
- bd->action(bd, bd->context, wActionModKey+((int)modKey<<8), bd->lastX, bd->lastY );
- if (!(bd->option & BD_NOFOCUS))
- gtk_widget_grab_focus( bd->widget );
- return TRUE;
- } else {
- return FALSE;
+ if (modKey!= wModKey_None && (bd->option & BD_MODKEYS)) {
+ bd->action(bd, bd->context, wActionModKey+((int)modKey<<8),
+ (wDrawPix_t)bd->lastX, (wDrawPix_t)bd->lastY );
+ if (!(bd->option & BD_NOFOCUS)) {
+ gtk_widget_grab_focus( bd->widget );
}
+ return TRUE;
+ } else {
return FALSE;
+ }
+ return FALSE;
}
static gint draw_char_event(
- GtkWidget * widget,
- GdkEventKey *event,
- wDraw_p bd )
+ GtkWidget * widget,
+ GdkEventKey *event,
+ wDraw_p bd )
{
GdkModifierType modifiers;
guint key = event->keyval;
@@ -1444,9 +1329,12 @@ static gint draw_char_event(
switch (key) {
case GDK_KEY_Escape: key = 0x1B; break;
case GDK_KEY_Return:
+ case GDK_KP_Enter:
modifiers = gtk_accelerator_get_default_mod_mask();
- if (((event->state & modifiers)==GDK_CONTROL_MASK) || ((event->state & modifiers)==GDK_MOD1_MASK))
- extKey = wAccelKey_LineFeed; //If Return plus Control or Alt send in LineFeed
+ if (((event->state & modifiers)==GDK_CONTROL_MASK)
+ || ((event->state & modifiers)==GDK_MOD1_MASK)) {
+ extKey = wAccelKey_LineFeed; //If Return plus Control or Alt send in LineFeed
+ }
key = 0x0D;
break;
case GDK_KEY_Linefeed: key = 0x0A; break;
@@ -1480,31 +1368,40 @@ static gint draw_char_event(
case GDK_KEY_Shift_R: modKey = wModKey_Shift; break;
case GDK_KEY_Control_L: modKey = wModKey_Ctrl; break;
case GDK_KEY_Control_R: modKey = wModKey_Ctrl; break;
- default: ;
+ default: ;
}
if (extKey != wAccelKey_None) {
if ( wlibFindAccelKey( event ) == NULL ) {
- bd->action( bd, bd->context, wActionExtKey + ((int)extKey<<8), bd->lastX, bd->lastY );
+ bd->action( bd, bd->context, wActionExtKey + ((int)extKey<<8),
+ (wDrawPix_t)bd->lastX, (wDrawPix_t)bd->lastY );
+ }
+ if (!(bd->option & BD_NOFOCUS)) {
+ gtk_widget_grab_focus( bd->widget );
}
- if (!(bd->option & BD_NOFOCUS))
- gtk_widget_grab_focus( bd->widget );
return TRUE;
} else if ((key >=wAccelKey_Up) && (key<=wAccelKey_Left) && bd->action) {
- bd->action( bd, bd->context, wActionText+(key<<8), bd->lastX, bd->lastY );
- if (!(bd->option & BD_NOFOCUS))
+ bd->action( bd, bd->context, wActionText+(key<<8), (wDrawPix_t)bd->lastX,
+ (wDrawPix_t)bd->lastY );
+ if (!(bd->option & BD_NOFOCUS)) {
gtk_widget_grab_focus( bd->widget );
+ }
return TRUE;
- } else if (key <= 0xFF && (event->state&(GDK_CONTROL_MASK|GDK_MOD1_MASK)) == 0 && bd->action) {
- bd->action( bd, bd->context, wActionText+(key<<8), bd->lastX, bd->lastY );
- if (!(bd->option & BD_NOFOCUS))
- gtk_widget_grab_focus( bd->widget );
+ } else if (key <= 0xFF && (event->state&(GDK_CONTROL_MASK|GDK_MOD1_MASK)) == 0
+ && bd->action) {
+ bd->action( bd, bd->context, wActionText+(key<<8), (wDrawPix_t)bd->lastX,
+ (wDrawPix_t)bd->lastY );
+ if (!(bd->option & BD_NOFOCUS)) {
+ gtk_widget_grab_focus( bd->widget );
+ }
return TRUE;
} else if (modKey!= wModKey_None && (bd->option & BD_MODKEYS)) {
- bd->action(bd, bd->context, wActionModKey+((int)modKey<<8), bd->lastX, bd->lastY );
- if (!(bd->option & BD_NOFOCUS))
- gtk_widget_grab_focus( bd->widget );
- return TRUE;
+ bd->action(bd, bd->context, wActionModKey+((int)modKey<<8),
+ (wDrawPix_t)bd->lastX, (wDrawPix_t)bd->lastY );
+ if (!(bd->option & BD_NOFOCUS)) {
+ gtk_widget_grab_focus( bd->widget );
+ }
+ return TRUE;
} else {
return FALSE;
}
@@ -1523,17 +1420,17 @@ int XW = 0;
int XH = 0;
int xw, xh, cw, ch;
- wDraw_p wDrawCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- long option,
- wPos_t width,
- wPos_t height,
- void * context,
- wDrawRedrawCallBack_p redraw,
- wDrawActionCallBack_p action )
+wDraw_p wDrawCreate(
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ long option,
+ wWinPix_t width,
+ wWinPix_t height,
+ void * context,
+ wDrawRedrawCallBack_p redraw,
+ wDrawActionCallBack_p action )
{
wDraw_p bd;
@@ -1549,37 +1446,51 @@ int xw, xh, cw, ch;
gtk_drawing_area_size( GTK_DRAWING_AREA(bd->widget), width, height );
gtk_widget_set_size_request( GTK_WIDGET(bd->widget), width, height );
gtk_signal_connect (GTK_OBJECT (bd->widget), "expose_event",
- (GtkSignalFunc) draw_expose_event, bd);
+ (GtkSignalFunc) draw_expose_event, bd);
gtk_signal_connect (GTK_OBJECT(bd->widget),"configure_event",
- (GtkSignalFunc) draw_configure_event, bd);
+ (GtkSignalFunc) draw_configure_event, bd);
gtk_signal_connect (GTK_OBJECT (bd->widget), "motion_notify_event",
- (GtkSignalFunc) draw_motion_event, bd);
+ (GtkSignalFunc) draw_motion_event, bd);
gtk_signal_connect (GTK_OBJECT (bd->widget), "button_press_event",
- (GtkSignalFunc) draw_button_event, bd);
+ (GtkSignalFunc) draw_button_event, bd);
gtk_signal_connect (GTK_OBJECT (bd->widget), "button_release_event",
- (GtkSignalFunc) draw_button_event, bd);
+ (GtkSignalFunc) draw_button_event, bd);
gtk_signal_connect (GTK_OBJECT (bd->widget), "scroll_event",
- (GtkSignalFunc) draw_scroll_event, bd);
+ (GtkSignalFunc) draw_scroll_event, bd);
gtk_signal_connect_after (GTK_OBJECT (bd->widget), "key_press_event",
- (GtkSignalFunc) draw_char_event, bd);
+ (GtkSignalFunc) draw_char_event, bd);
gtk_signal_connect_after (GTK_OBJECT (bd->widget), "key_release_event",
- (GtkSignalFunc) draw_char_release_event, bd);
+ (GtkSignalFunc) draw_char_release_event, bd);
gtk_signal_connect (GTK_OBJECT (bd->widget), "leave_notify_event",
- (GtkSignalFunc) draw_leave_event, bd);
+ (GtkSignalFunc) draw_leave_event, bd);
gtk_widget_set_can_focus(bd->widget,!(option & BD_NOFOCUS));
//if (!(option & BD_NOFOCUS))
// GTK_WIDGET_SET_FLAGS(GTK_WIDGET(bd->widget), GTK_CAN_FOCUS);
gtk_widget_set_events (bd->widget, GDK_EXPOSURE_MASK
- | GDK_LEAVE_NOTIFY_MASK
- | GDK_BUTTON_PRESS_MASK
- | GDK_BUTTON_RELEASE_MASK
- | GDK_SCROLL_MASK
- | GDK_POINTER_MOTION_MASK
- | GDK_POINTER_MOTION_HINT_MASK
- | GDK_KEY_PRESS_MASK
- | GDK_KEY_RELEASE_MASK );
+ | GDK_LEAVE_NOTIFY_MASK
+ | GDK_BUTTON_PRESS_MASK
+ | GDK_BUTTON_RELEASE_MASK
+ | GDK_SCROLL_MASK
+ | GDK_POINTER_MOTION_MASK
+ | GDK_POINTER_MOTION_HINT_MASK
+ | GDK_KEY_PRESS_MASK
+ | GDK_KEY_RELEASE_MASK );
bd->lastColor = -1;
- bd->dpi = 75;
+
+ double dpi;
+
+ wPrefGetFloat(PREFSECTION, DPISET, &dpi, 96.0);
+
+ if ( width <= 0 || height <= 0 ) {
+ fprintf( stderr, "wDrawCreate bad size %ldx%ld\n", width, height );
+ if ( width <= 0 ) {
+ width = 100;
+ }
+ if ( height <= 0 ) {
+ height = 100;
+ }
+ }
+ bd->dpi = dpi;
bd->maxW = bd->w = width;
bd->maxH = bd->h = height;
@@ -1587,19 +1498,21 @@ int xw, xh, cw, ch;
wlibControlGetSize( (wControl_p)bd );
gtk_widget_realize( bd->widget );
bd->pixmap = gdk_pixmap_new( bd->widget->window, width, height, -1 );
- bd->temp_surface = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, width,height );
+ bd->temp_surface = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, width,
+ height );
wDrawClear(bd);
bd->gc = gdk_gc_new( parent->gtkwin->window );
gdk_gc_copy( bd->gc, parent->gtkwin->style->base_gc[GTK_STATE_NORMAL] );
-{
- GdkCursor * cursor;
- cursor = gdk_cursor_new ( GDK_TCROSS );
- gdk_window_set_cursor ( bd->widget->window, cursor);
- gdk_cursor_destroy (cursor);
-}
+ {
+ GdkCursor * cursor;
+ cursor = gdk_cursor_new ( GDK_TCROSS );
+ gdk_window_set_cursor ( bd->widget->window, cursor);
+ gdk_cursor_destroy (cursor);
+ }
#ifdef LATER
- if (labelStr)
+ if (labelStr) {
bd->labelW = gtkAddLabel( (wControl_p)bd, labelStr );
+ }
#endif
gtk_widget_show( bd->widget );
wlibAddButton( (wControl_p)bd );
@@ -1614,14 +1527,19 @@ int xw, xh, cw, ch;
*
*******************************************************************************/
-wDraw_p wBitMapCreate( wPos_t w, wPos_t h, int arg )
+wDraw_p wBitMapCreate( wWinPix_t w, wWinPix_t h, int arg )
{
wDraw_p bd;
bd = (wDraw_p)wlibAlloc( gtkMainW, B_DRAW, 0, 0, NULL, sizeof *bd, NULL );
bd->lastColor = -1;
- bd->dpi = 75;
+
+ double dpi;
+
+ wPrefGetFloat(PREFSECTION, DPISET, &dpi, 96.0);
+
+ bd->dpi = dpi;
bd->maxW = bd->w = w;
bd->maxH = bd->h = h;
@@ -1655,7 +1573,8 @@ wBool_t wBitMapDelete( wDraw_p d )
* Background
*
******************************************************************************/
-int wDrawSetBackground( wDraw_p bd, char * path, char ** error) {
+int wDrawSetBackground( wDraw_p bd, char * path, char ** error)
+{
GError *err = NULL;
@@ -1677,10 +1596,41 @@ int wDrawSetBackground( wDraw_p bd, char * path, char ** error) {
}
-void wDrawShowBackground( wDraw_p bd, wPos_t pos_x, wPos_t pos_y, wPos_t size, wAngle_t angle, int screen) {
+/**
+ * Use a loaded background in another context.
+ *
+ * \param from context with background
+ * \param to context to get a reference to the existing background
+ */
+
+void
+wDrawCloneBackground(wDraw_p from, wDraw_p to)
+{
+ if (from->background) {
+ to->background = from->background;
+ } else {
+ to->background = NULL;
+ }
+}
+
+/**
+* Draw background to screen. The background will be sized and rotated before being shown. The bitmap
+* is scaled so that the width is equal to size. The height is changed proportionally.
+*
+* \param bd drawing context
+* \param pos_x, pos_y bitmap position
+* \param size desired width after scaling
+* \param angle
+* \param screen visibility of bitmap in percent
+*/
+
+void wDrawShowBackground( wDraw_p bd, wWinPix_t pos_x, wWinPix_t pos_y,
+ wWinPix_t size, wAngle_t angle, int screen)
+{
if (bd->background) {
- cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid, wDrawColorWhite, bd->bTempMode?wDrawOptTemp:0 );
+ cairo_t* cairo = gtkDrawCreateCairoContext(bd, NULL, 0, wDrawLineSolid,
+ wDrawColorWhite, bd->bTempMode?wDrawOptTemp:0 );
cairo_save(cairo);
int pixels_width = gdk_pixbuf_get_width(bd->background);
int pixels_height = gdk_pixbuf_get_height(bd->background);
@@ -1697,19 +1647,24 @@ void wDrawShowBackground( wDraw_p bd, wPos_t pos_x, wPos_t pos_y, wPos_t size, w
}
cairo_set_operator(cairo, CAIRO_OPERATOR_OVER);
double rad = M_PI*(angle/180);
- posy = (double)bd->h-((pixels_height*fabs(cos(rad))+pixels_width*fabs(sin(rad)))*scale)-posy;
+ posy = (double)bd->h-((pixels_height*fabs(cos(rad))+pixels_width*fabs(sin(
+ rad)))*scale)-posy;
//width = (double)(pixels_width*scale);
//height = (double)(pixels_height*scale);
cairo_translate(cairo,posx,posy);
cairo_scale(cairo, scale, scale);
- cairo_translate(cairo, fabs(pixels_width/2.0*cos(rad))+fabs(pixels_height/2.0*sin(rad)),
- fabs(pixels_width/2.0*sin(rad))+fabs(pixels_height/2.0*cos(rad)));
+ cairo_translate(cairo, fabs(pixels_width/2.0*cos(rad))+fabs(
+ pixels_height/2.0*sin(rad)),
+ fabs(pixels_width/2.0*sin(rad))+fabs(pixels_height/2.0*cos(rad)));
cairo_rotate(cairo, M_PI*(angle/180.0));
// We need to clip around the image, or cairo will paint garbage data
- cairo_rectangle(cairo, -pixels_width/2.0, -pixels_height/2.0, pixels_width, pixels_height);
+ cairo_rectangle(cairo, -pixels_width/2.0, -pixels_height/2.0, pixels_width,
+ pixels_height);
cairo_clip(cairo);
- gdk_cairo_set_source_pixbuf(cairo, bd->background, -pixels_width/2.0, -pixels_height/2.0);
- cairo_pattern_t *mask = cairo_pattern_create_rgba (1.0,1.0,1.0,(100.0-screen)/100.0);
+ gdk_cairo_set_source_pixbuf(cairo, bd->background, -pixels_width/2.0,
+ -pixels_height/2.0);
+ cairo_pattern_t *mask = cairo_pattern_create_rgba (1.0,1.0,1.0,
+ (100.0-screen)/100.0);
cairo_mask(cairo,mask);
cairo_pattern_destroy(mask);
cairo_restore(cairo);
diff --git a/app/wlib/gtklib/gtkint.h b/app/wlib/gtklib/gtkint.h
index 410fd7f..e3757a4 100644
--- a/app/wlib/gtklib/gtkint.h
+++ b/app/wlib/gtklib/gtkint.h
@@ -1,4 +1,4 @@
-/** \file gtkint.h
+/** \file gtkint.h
* Internal definitions for the gtk-library
*/
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef GTKINT_H
@@ -42,24 +42,16 @@
extern wWin_p gtkMainW;
-#ifdef CURSOR_SURFACE
-typedef struct {
- cairo_surface_t* surface;
- wPos_t width;
- wPos_t height;
- wBool_t show;
-} wCursorSurface_t, * wSurface_p;
-#endif
-
typedef enum {
- W_MAIN, W_POPUP,
- B_BUTTON, B_CANCEL, B_POPUP, B_TEXT, B_INTEGER, B_FLOAT,
- B_LIST, B_DROPLIST, B_COMBOLIST,
- B_RADIO, B_TOGGLE,
- B_DRAW, B_MENU, B_MULTITEXT, B_MESSAGE, B_LINES,
- B_MENUITEM, B_BOX,
- B_BITMAP, B_STATUS } wType_e;
+ W_MAIN, W_POPUP,
+ B_BUTTON, B_CANCEL, B_POPUP, B_TEXT, B_INTEGER, B_FLOAT,
+ B_LIST, B_DROPLIST, B_COMBOLIST,
+ B_RADIO, B_TOGGLE,
+ B_DRAW, B_MENU, B_MULTITEXT, B_MESSAGE, B_LINES,
+ B_MENUITEM, B_BOX,
+ B_BITMAP, B_STATUS
+} wType_e;
typedef void (*repaintProcCallback_p)( wControl_p );
typedef void (*doneProcCallback_p)( wControl_p b );
@@ -69,11 +61,10 @@ typedef void (*setTriggerCallback_p)( wControl_p b );
wControl_p next; \
wControl_p synonym; \
wWin_p parent; \
- wPos_t origX, origY; \
- wPos_t realX, realY; \
- wPos_t default_size_x, default_size_y; \
- wPos_t labelW; \
- wPos_t w, h; \
+ wWinPix_t origX, origY; \
+ wWinPix_t realX, realY; \
+ wWinPix_t labelW; \
+ wWinPix_t w, h; \
int maximize_initially; \
long option; \
const char * labelStr; \
@@ -81,74 +72,73 @@ typedef void (*setTriggerCallback_p)( wControl_p b );
GtkWidget * widget; \
GtkWidget * label; \
doneProcCallback_p doneProc; \
- /* CURSOR_SURFACE wCursorSurface_t cursor_surface;*/ \
wBool_t outline; \
void * data;
struct wWin_t {
- WOBJ_COMMON
- GtkWidget *gtkwin; /**< GTK window */
- wPos_t lastX, lastY;
- wControl_p first, last;
- wWinCallBack_p winProc; /**< window procedure */
- wBool_t shown; /**< visibility state */
- const char * nameStr; /**< window name (not title) */
- GtkWidget * menubar; /**< menubar handle (if exists) */
- int menu_height;
- GdkGC * gc; /**< graphics context */
- int gc_linewidth; /**< ??? */
- wBool_t busy;
- int resizeTimer; /** resizing **/
- int resizeW,resizeH;
- int timer_idle_count;
- int timer_busy_count;
- int modalLevel;
- };
+ WOBJ_COMMON
+ GtkWidget *gtkwin; /**< GTK window */
+ wWinPix_t lastX, lastY;
+ wControl_p first, last;
+ wWinCallBack_p winProc; /**< window procedure */
+ wBool_t shown; /**< visibility state */
+ const char * nameStr; /**< window name (not title) */
+ GtkWidget * menubar; /**< menubar handle (if exists) */
+ int menu_height;
+ GdkGC * gc; /**< graphics context */
+ int gc_linewidth; /**< ??? */
+ wBool_t busy;
+ int resizeTimer; /** resizing **/
+ int resizeW,resizeH;
+ int timer_idle_count;
+ int timer_busy_count;
+ int modalLevel;
+};
struct wControl_t {
- WOBJ_COMMON
- };
-
+ WOBJ_COMMON
+};
+
typedef struct wListItem_t * wListItem_p;
struct wList_t {
- WOBJ_COMMON
+ WOBJ_COMMON
// GtkWidget *list;
- int count;
- int number;
- int colCnt;
- wPos_t *colWidths;
- wBool_t *colRightJust;
- GtkListStore *listStore;
- GtkWidget *treeView;
- int last;
- wPos_t listX;
- long * valueP;
- wListCallBack_p action;
- int recursion;
- int editted;
- int editable;
- };
+ int count;
+ int number;
+ int colCnt;
+ wWinPix_t *colWidths;
+ wBool_t *colRightJust;
+ GtkListStore *listStore;
+ GtkWidget *treeView;
+ int last;
+ wWinPix_t listX;
+ long * valueP;
+ wListCallBack_p action;
+ int recursion;
+ int editted;
+ int editable;
+};
struct wListItem_t {
- wBool_t active;
- void * itemData;
- char * label;
- GtkLabel * labelG;
- wBool_t selected;
- wList_p listP;
- };
+ wBool_t active;
+ void * itemData;
+ char * label;
+ GtkLabel * labelG;
+ wBool_t selected;
+ wList_p listP;
+};
#define gtkIcon_bitmap (1)
#define gtkIcon_pixmap (2)
struct wIcon_t {
- int gtkIconType;
- wPos_t w;
- wPos_t h;
- wDrawColor color;
- const void * bits;
- };
+ int gtkIconType;
+ wWinPix_t w;
+ wWinPix_t h;
+ wDrawColor color;
+ const void * bits;
+};
extern char wConfigName[];
extern wDrawColor wDrawColorWhite;
@@ -157,36 +147,42 @@ extern wDrawColor wDrawColorBlack;
/* boxes.c */
-void wlibDrawBox(wWin_p win, wBoxType_e style, wPos_t x, wPos_t y, wPos_t w, wPos_t h);
+void wlibDrawBox(wWin_p win, wBoxType_e style, wWinPix_t x, wWinPix_t y,
+ wWinPix_t w, wWinPix_t h);
/* button.c */
-void wlibSetLabel(GtkWidget *widget, long option, const char *labelStr, GtkLabel **labelG, GtkWidget **imageG);
+void wlibSetLabel(GtkWidget *widget, long option, const char *labelStr,
+ GtkLabel **labelG, GtkWidget **imageG);
void wlibButtonDoAction(wButton_p bb);
struct wButton_t {
- WOBJ_COMMON
- GtkLabel * labelG;
- GtkWidget * imageG;
- wButtonCallBack_p action;
- int busy;
- int recursion;
+ WOBJ_COMMON
+ GtkLabel * labelG;
+ GtkWidget * imageG;
+ wButtonCallBack_p action;
+ int busy;
+ int recursion;
+ long timer_id;
+ int timer_count;
+ int timer_state;
};
/* color.c */
typedef struct {
- unsigned char red;
- unsigned char green;
- unsigned char blue;
- GdkColor normalColor;
- GdkColor invertColor;
- long rgb;
- int colorChar;
+ unsigned char red;
+ unsigned char green;
+ unsigned char blue;
+ GdkColor normalColor;
+ GdkColor invertColor;
+ long rgb;
+ int colorChar;
} colorMap_t;
GdkColor *wlibGetColor(wDrawColor color, wBool_t normal);
/* control.c */
-wBool_t wControlExpose (GtkWidget * widget, GdkEventExpose * event, wControl_p b);
+wBool_t wControlExpose (GtkWidget * widget, GdkEventExpose * event,
+ wControl_p b);
/* droplist.c */
enum columns {
@@ -201,13 +197,19 @@ void wDropListClear(wList_p b);
void *wDropListGetItemContext(wList_p b, wIndex_t inx);
void wDropListAddValue(wList_p b, char *text, wListItem_p data);
void wDropListSetIndex(wList_p b, int val);
-wBool_t wDropListSetValues(wList_p b, wIndex_t row, const char *labelStr, wIcon_p bm, void *itemData);
-wList_p wDropListCreate(wWin_p parent, wPos_t x, wPos_t y, const char *helpStr, const char *labelStr, long option, long number, wPos_t width, long *valueP, wListCallBack_p action, void *data);
+wBool_t wDropListSetValues(wList_p b, wIndex_t row, const char *labelStr,
+ wIcon_p bm, void *itemData);
+wList_p wDropListCreate(wWin_p parent, wWinPix_t x, wWinPix_t y,
+ const char *helpStr, const char *labelStr, long option, long number,
+ wWinPix_t width, long *valueP, wListCallBack_p action, void *data);
/* filesel.c */
/* font.c */
-PangoLayout *wlibFontCreatePangoLayout(GtkWidget *widget, void *cairo, wFont_p fp, wFontSize_t fs, const char *s, int *width_p, int *height_p, int *ascent_p, int *descent_p, int *baseline_p);
+PangoLayout *wlibFontCreatePangoLayout(GtkWidget *widget, void *cairo,
+ wFont_p fp, wFontSize_t fs, const char *s, wDrawPix_t *width_p,
+ wDrawPix_t *height_p, wDrawPix_t *ascent_p, wDrawPix_t *descent_p,
+ wDrawPix_t *baseline_p);
void wlibFontDestroyPangoLayout(PangoLayout *layout);
const char *wlibFontTranslate(wFont_p fp);
@@ -217,16 +219,20 @@ const char *wlibFontTranslate(wFont_p fp);
void wlibLineShow(wLine_p bl, wBool_t visible);
/* list.c */
-int CompareListData(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data);
+int CompareListData(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter,
+ gpointer data);
/* liststore.c */
wListItem_p wlibListItemGet(GtkListStore *ls, wIndex_t inx, GList **childR);
void *wlibListStoreGetContext(GtkListStore *ls, int inx);
void wlibListStoreClear(GtkListStore *listStore);
GtkListStore *wlibNewListStore(int colCnt);
-void wlibListStoreSetPixbuf(GtkListStore *ls, GtkTreeIter *iter, GdkPixbuf *pixbuf);
-int wlibListStoreAddData(GtkListStore *ls, GdkPixbuf *pixbuf, int cols, wListItem_p id);
-int wlibListStoreUpdateValues(GtkListStore *ls, int row, int cols, char *labels, wIcon_p bm);
+void wlibListStoreSetPixbuf(GtkListStore *ls, GtkTreeIter *iter,
+ GdkPixbuf *pixbuf);
+int wlibListStoreAddData(GtkListStore *ls, GdkPixbuf *pixbuf, int cols,
+ wListItem_p id);
+int wlibListStoreUpdateValues(GtkListStore *ls, int row, int cols, char *labels,
+ wIcon_p bm);
/* main.c */
char *wlibGetAppName(void);
@@ -236,20 +242,21 @@ int getMlistOrigin(wMenuList_p ml, GList **pChildren);
/* misc.c */
typedef struct accelData_t {
- wAccelKey_e key;
- int modifier;
- wAccelKeyCallBack_p action;
- void * data;
+ wAccelKey_e key;
+ int modifier;
+ wAccelKeyCallBack_p action;
+ void * data;
} accelData_t;
GdkPixbuf* wlibPixbufFromXBM(wIcon_p ip);
int wlibAddLabel(wControl_p b, const char *labelStr);
-void *wlibAlloc(wWin_p parent, wType_e type, wPos_t origX, wPos_t origY, const char *labelStr, int size, void *data);
+void *wlibAlloc(wWin_p parent, wType_e type, wWinPix_t origX, wWinPix_t origY,
+ const char *labelStr, int size, void *data);
void wlibComputePos(wControl_p b);
void wlibControlGetSize(wControl_p b);
void wlibAddButton(wControl_p b);
-wControl_p wlibGetControlFromPos(wWin_p win, wPos_t x, wPos_t y);
+wControl_p wlibGetControlFromPos(wWin_p win, wWinPix_t x, wWinPix_t y);
char *wlibConvertInput(const char *inString);
char *wlibConvertOutput(const char *inString);
struct accelData_t *wlibFindAccelKey(GdkEventKey *event);
@@ -264,48 +271,56 @@ GdkPixbuf *wlibMakePixbuf(wIcon_p ip);
/* print.c */
struct wDraw_t {
- WOBJ_COMMON
- void * context;
- wDrawActionCallBack_p action;
- wDrawRedrawCallBack_p redraw;
-
- GdkPixmap * pixmap;
- GdkPixmap * pixmapBackup;
- cairo_surface_t * temp_surface;
-
- double dpi;
-
- GdkGC * gc;
- wDrawWidth lineWidth;
- wDrawOpts opts;
- wPos_t maxW;
- wPos_t maxH;
- unsigned long lastColor;
- wBool_t lastColorInverted;
- const char * helpStr;
-
- wPos_t lastX;
- wPos_t lastY;
-
- wBool_t delayUpdate;
- cairo_t *printContext;
- cairo_surface_t *curPrintSurface;
- GdkPixbuf * background;
-
- wBool_t bTempMode;
- };
+ WOBJ_COMMON
+ void * context;
+ wDrawActionCallBack_p action;
+ wDrawRedrawCallBack_p redraw;
+
+ GdkPixmap * pixmap;
+ GdkPixmap * pixmapBackup;
+ cairo_surface_t * temp_surface;
+
+ double dpi;
+
+ GdkGC * gc;
+ wDrawWidth lineWidth;
+ wDrawOpts opts;
+ wWinPix_t maxW;
+ wWinPix_t maxH;
+ unsigned long lastColor;
+ wBool_t lastColorInverted;
+ const char * helpStr;
+
+ wWinPix_t lastX;
+ wWinPix_t lastY;
+
+ wBool_t delayUpdate;
+ cairo_t *printContext;
+ cairo_surface_t *curPrintSurface;
+ GdkPixbuf * background;
+
+ wBool_t bTempMode;
+};
void WlibApplySettings(GtkPrintOperation *op);
void WlibSaveSettings(GtkPrintOperation *op);
-void psPrintLine(wPos_t x0, wPos_t y0, wPos_t x1, wPos_t y1, wDrawWidth width, wDrawLineType_e lineType, wDrawColor color, wDrawOpts opts);
-void psPrintArc(wPos_t x0, wPos_t y0, wPos_t r, double angle0, double angle1, wBool_t drawCenter, wDrawWidth width, wDrawLineType_e lineType, wDrawColor color, wDrawOpts opts);
-void psPrintFillRectangle(wPos_t x0, wPos_t y0, wPos_t x1, wPos_t y1, wDrawColor color, wDrawOpts opts);
-void psPrintFillPolygon(wPos_t p[][2], wPolyLine_e type[], int cnt, wDrawColor color, wDrawOpts opts, int fill, int open);
-void psPrintFillCircle(wPos_t x0, wPos_t y0, wPos_t r, wDrawColor color, wDrawOpts opts);
-void psPrintString(wPos_t x, wPos_t y, double a, char *s, wFont_p fp, double fs, wDrawColor color, wDrawOpts opts);
-static void WlibGetPaperSize(void);
+void psPrintLine(wDrawPix_t x0, wDrawPix_t y0, wDrawPix_t x1, wDrawPix_t y1,
+ wDrawWidth width, wDrawLineType_e lineType, wDrawColor color, wDrawOpts opts);
+void psPrintArc(wDrawPix_t x0, wDrawPix_t y0, wDrawPix_t r, double angle0,
+ double angle1, wBool_t drawCenter, wDrawWidth width, wDrawLineType_e lineType,
+ wDrawColor color, wDrawOpts opts);
+void psPrintFillRectangle(wDrawPix_t x0, wDrawPix_t y0, wDrawPix_t x1,
+ wDrawPix_t y1, wDrawColor color, wDrawOpts opts);
+void psPrintFillPolygon(wDrawPix_t p[][2], wPolyLine_e type[], int cnt,
+ wDrawColor color, wDrawOpts opts, int fill, int open);
+void psPrintFillCircle(wDrawPix_t x0, wDrawPix_t y0, wDrawPix_t r,
+ wDrawColor color, wDrawOpts opts);
+void psPrintString(wDrawPix_t x, wDrawPix_t y, double a, char *s, wFont_p fp,
+ double fs, wDrawColor color, wDrawOpts opts);
+//static void WlibGetPaperSize(void);
/* single.c */
+void wlibStringUpdate();
/* splash.c */
@@ -321,12 +336,15 @@ void wlibHelpHideBalloon();
/* treeview.c */
void wlibTreeViewSetSelected(wList_p b, int index);
-GtkWidget *wlibNewTreeView(GtkListStore *ls, int showTitles, int multiSelection);
+GtkWidget *wlibNewTreeView(GtkListStore *ls, int showTitles,
+ int multiSelection);
int wlibTreeViewAddColumns(GtkWidget *tv, int count);
int wlibAddColumnTitles(GtkWidget *tv, const char **titles);
-int wlibTreeViewAddData(GtkWidget *tv, int cols, char *label, GdkPixbuf *pixbuf, wListItem_p userData);
+int wlibTreeViewAddData(GtkWidget *tv, int cols, char *label, GdkPixbuf *pixbuf,
+ wListItem_p userData);
void wlibTreeViewAddRow(wList_p b, char *label, wIcon_p bm, wListItem_p id_p);
-gboolean changeSelection(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer data);
+gboolean changeSelection(GtkTreeSelection *selection, GtkTreeModel *model,
+ GtkTreePath *path, gboolean path_currently_selected, gpointer data);
int wTreeViewGetCount(wList_p b);
void wTreeViewClear(wList_p b);
@@ -334,7 +352,8 @@ void *wTreeViewGetItemContext(wList_p b, int row);
/* window.c */
void wlibDoModal(wWin_p win0, wBool_t modal);
-wBool_t catch_shift_ctrl_alt_keys(GtkWidget *widget, GdkEventKey *event, void *data);
+wBool_t catch_shift_ctrl_alt_keys(GtkWidget *widget, GdkEventKey *event,
+ void *data);
/* wpref.c */
diff --git a/app/wlib/gtklib/help.c b/app/wlib/gtklib/help.c
index 8f2766d..f062b83 100644
--- a/app/wlib/gtklib/help.c
+++ b/app/wlib/gtklib/help.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#define GTK_DISABLE_SINGLE_INCLUDES
@@ -28,7 +28,8 @@
#include <gtk/gtk.h>
#include <gdk/gdk.h>
-#include "misc.h"
+//#include "misc.h"
+extern const char * GetCurCommandName();
#include "gtkint.h"
#include "i18n.h"
@@ -45,29 +46,31 @@
static void
DoHelpMenu(void *data)
{
- int func = (intptr_t)data;
+ int func = (intptr_t)data;
- const char * topic;
+ const char * topic;
- switch (func) {
- case 1:
- wHelp("index");
- break;
+ switch (func) {
+ case 1:
+ wHelp("contents");
+ break;
- case 3:
- topic = GetCurCommandName();
- if (topic && topic[0])
- wHelp(topic);
- break;
+ case 3:
+ topic = GetCurCommandName();
+ if (topic && topic[0]) {
+ wHelp(topic);
+ }
+ break;
- default:
- break;
- }
+ default:
+ break;
+ }
- return;
+ return;
}
-void wDoAccelHelp(wAccelKey_e key, void * context) {
+void wDoAccelHelp(wAccelKey_e key, void * context)
+{
DoHelpMenu(context);
}
@@ -80,6 +83,6 @@ void wDoAccelHelp(wAccelKey_e key, void * context) {
void wMenuAddHelp(wMenu_p m)
{
- wMenuPushCreate(m, NULL, _("&Contents"), 0, DoHelpMenu, (void*)1);
- wMenuPushCreate(m, NULL, _("Co&mmand Context help"), 0, DoHelpMenu, (void*)3);
+ wMenuPushCreate(m, NULL, _("&Contents"), 0, DoHelpMenu, (void*)1);
+ wMenuPushCreate(m, NULL, _("Co&mmand Context help"), 0, DoHelpMenu, (void*)3);
}
diff --git a/app/wlib/gtklib/ixhelp.c b/app/wlib/gtklib/ixhelp.c
index 5079f61..80b579c 100644
--- a/app/wlib/gtklib/ixhelp.c
+++ b/app/wlib/gtklib/ixhelp.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
@@ -77,34 +77,34 @@ static GtkWidget *contents_view; /** handle for the help contents pane */
static GtkWidget*
lookup_widget(GtkWidget *widget, const gchar *widget_name)
{
- GtkWidget *parent, *found_widget;
+ GtkWidget *parent, *found_widget;
- for (;;) {
- if (GTK_IS_MENU(widget)) {
- parent = gtk_menu_get_attach_widget(GTK_MENU(widget));
- } else {
- parent = widget->parent;
- }
+ for (;;) {
+ if (GTK_IS_MENU(widget)) {
+ parent = gtk_menu_get_attach_widget(GTK_MENU(widget));
+ } else {
+ parent = widget->parent;
+ }
- if (!parent) {
- parent = (GtkWidget*) g_object_get_data(G_OBJECT(widget), "GladeParentKey");
- }
+ if (!parent) {
+ parent = (GtkWidget*) g_object_get_data(G_OBJECT(widget), "GladeParentKey");
+ }
- if (parent == NULL) {
- break;
- }
+ if (parent == NULL) {
+ break;
+ }
- widget = parent;
- }
+ widget = parent;
+ }
- found_widget = (GtkWidget*) g_object_get_data(G_OBJECT(widget),
- widget_name);
+ found_widget = (GtkWidget*) g_object_get_data(G_OBJECT(widget),
+ widget_name);
- if (!found_widget) {
- g_warning("Widget not found: %s", widget_name);
- }
+ if (!found_widget) {
+ g_warning("Widget not found: %s", widget_name);
+ }
- return found_widget;
+ return found_widget;
}
@@ -124,21 +124,21 @@ lookup_widget(GtkWidget *widget, const gchar *widget_name)
GtkWidget *
CreateHPaned(GtkBox *container, char *property)
{
- GtkWidget *hpaned;
- long posSlider;
+ GtkWidget *hpaned;
+ long posSlider;
- /* the horizontal slider */
- hpaned = gtk_hpaned_new();
- gtk_container_set_border_width(GTK_CONTAINER(hpaned), 6);
+ /* the horizontal slider */
+ hpaned = gtk_hpaned_new();
+ gtk_container_set_border_width(GTK_CONTAINER(hpaned), 6);
- wPrefGetInteger(HTMLHELPSECTION, SLIDERPREFNAME, &posSlider, SLIDERPOSDEFAULT);
- gtk_paned_set_position(GTK_PANED(hpaned), (int)posSlider);
+ wPrefGetInteger(HTMLHELPSECTION, SLIDERPREFNAME, &posSlider, SLIDERPOSDEFAULT);
+ gtk_paned_set_position(GTK_PANED(hpaned), (int)posSlider);
- /* pack the horizontal slider into the main window */
- gtk_box_pack_start(container, hpaned, TRUE, TRUE, 0);
- gtk_widget_show(hpaned);
+ /* pack the horizontal slider into the main window */
+ gtk_box_pack_start(container, hpaned, TRUE, TRUE, 0);
+ gtk_widget_show(hpaned);
- return (hpaned);
+ return (hpaned);
}
/**
@@ -155,69 +155,69 @@ CreateHPaned(GtkBox *container, char *property)
static gboolean
DestroyHelpWindow(GtkWidget *win, GdkEvent *event, void *ptr)
{
- int i;
- GtkWidget *widget;
- char tmp[ 20 ];
+ int i;
+ GtkWidget *widget;
+ char tmp[ 20 ];
- gint x, y;
+ gint x, y;
- /* get the slider position and save it */
- widget = lookup_widget(win, PANED);
- i = gtk_paned_get_position(GTK_PANED(widget));
- wPrefSetInteger(HTMLHELPSECTION, SLIDERPREFNAME, i);
+ /* get the slider position and save it */
+ widget = lookup_widget(win, PANED);
+ i = gtk_paned_get_position(GTK_PANED(widget));
+ wPrefSetInteger(HTMLHELPSECTION, SLIDERPREFNAME, i);
- /* get the window position */
- gtk_window_get_position((GtkWindow *)win, &x, &y);
- sprintf(tmp, "%d %d", x, y);
- wPrefSetString(HTMLHELPSECTION, WINDOWPOSPREFNAME, tmp);
+ /* get the window position */
+ gtk_window_get_position((GtkWindow *)win, &x, &y);
+ sprintf(tmp, "%d %d", x, y);
+ wPrefSetString(HTMLHELPSECTION, WINDOWPOSPREFNAME, tmp);
- /* get the window size */
- gtk_window_get_size((GtkWindow *)win , &x, &y);
- sprintf(tmp, "%d %d", x, y);
- wPrefSetString(HTMLHELPSECTION, WINDOWSIZEPREFNAME, tmp);
+ /* get the window size */
+ gtk_window_get_size((GtkWindow *)win, &x, &y);
+ sprintf(tmp, "%d %d", x, y);
+ wPrefSetString(HTMLHELPSECTION, WINDOWSIZEPREFNAME, tmp);
- gtk_widget_hide(win);
- return TRUE;
+ gtk_widget_hide(win);
+ return TRUE;
}
void back_button_clicked(GtkWidget *widget, gpointer data)
{
- webkit_web_view_go_back(WEBKIT_WEB_VIEW(data));
+ webkit_web_view_go_back(WEBKIT_WEB_VIEW(data));
}
void forward_button_clicked(GtkWidget *widget, gpointer data)
{
- webkit_web_view_go_forward(WEBKIT_WEB_VIEW(data));
+ webkit_web_view_go_forward(WEBKIT_WEB_VIEW(data));
}
void home_button_clicked(GtkWidget *widget, gpointer data)
{
- load_into_view("index.html", MAIN_VIEW);
+ load_into_view("index.html", MAIN_VIEW);
}
/* Toggles the contents pane */
void contents_button_clicked(GtkWidget *widget, gpointer data)
{
- if (gtk_paned_get_position(GTK_PANED(data)) < 50) {
- gtk_paned_set_position(GTK_PANED(data), 370);
- } else {
- gtk_paned_set_position(GTK_PANED(data), 0);
- }
+ if (gtk_paned_get_position(GTK_PANED(data)) < 50) {
+ gtk_paned_set_position(GTK_PANED(data), 370);
+ } else {
+ gtk_paned_set_position(GTK_PANED(data), 0);
+ }
}
gboolean contents_click_handler(
- WebKitWebView *web_view,
- WebKitWebFrame *frame,
- WebKitNetworkRequest *request,
- WebKitWebNavigationAction *navigation_action,
- WebKitWebPolicyDecision *policy_decision,
- gpointer data)
+ WebKitWebView *web_view,
+ WebKitWebFrame *frame,
+ WebKitNetworkRequest *request,
+ WebKitWebNavigationAction *navigation_action,
+ WebKitWebPolicyDecision *policy_decision,
+ gpointer data)
{
- webkit_web_view_load_uri(WEBKIT_WEB_VIEW(data),
- webkit_network_request_get_uri(request));
+ webkit_web_view_load_uri(WEBKIT_WEB_VIEW(data),
+ webkit_network_request_get_uri(request));
- return TRUE;
+ return TRUE;
}
/**
@@ -225,45 +225,45 @@ gboolean contents_click_handler(
*/
void initialize_buttons(GtkWidget *main_vbox, GtkWidget *content_hpane)
{
- GtkWidget *buttons_hbuttonbox;
- GtkWidget *back_button;
- GtkWidget *forward_button;
- GtkWidget *home_button;
- GtkWidget *contents_button;
-
- // define and attach signals to buttons
- back_button = gtk_button_new_with_label(_("Back"));
- g_signal_connect(back_button, "clicked", G_CALLBACK(back_button_clicked),
- G_OBJECT(main_view));
-
- forward_button = gtk_button_new_with_label(_("Forward"));
- g_signal_connect(forward_button, "clicked", G_CALLBACK(forward_button_clicked),
- G_OBJECT(main_view));
-
- home_button = gtk_button_new_with_label(_("Home"));
- g_signal_connect(home_button, "clicked", G_CALLBACK(home_button_clicked),
- G_OBJECT(main_view));
-
- contents_button = gtk_button_new_with_label(_("Contents"));
- g_signal_connect(contents_button, "clicked",
- G_CALLBACK(contents_button_clicked), G_OBJECT(content_hpane));
-
- // button layout
- buttons_hbuttonbox = gtk_hbutton_box_new();
- gtk_container_add(GTK_CONTAINER(buttons_hbuttonbox), back_button);
- gtk_container_add(GTK_CONTAINER(buttons_hbuttonbox), forward_button);
- gtk_container_add(GTK_CONTAINER(buttons_hbuttonbox), home_button);
- gtk_container_add(GTK_CONTAINER(buttons_hbuttonbox), contents_button);
- gtk_box_pack_start(GTK_BOX(main_vbox), buttons_hbuttonbox, FALSE, TRUE, 0);
- gtk_box_set_spacing(GTK_BOX(buttons_hbuttonbox), 6);
- gtk_button_box_set_layout(GTK_BUTTON_BOX(buttons_hbuttonbox),
- GTK_BUTTONBOX_START);
-
- /* Store pointers to all widgets, for use by lookup_widget(). */
- GLADE_HOOKUP_OBJECT(main_view, back_button, BACKBUTTON);
- GLADE_HOOKUP_OBJECT(main_view, forward_button, FORWARDBUTTON);
- GLADE_HOOKUP_OBJECT(main_view, home_button, HOMEBUTTON);
- GLADE_HOOKUP_OBJECT(main_view, contents_button, CONTENTBUTTON);
+ GtkWidget *buttons_hbuttonbox;
+ GtkWidget *back_button;
+ GtkWidget *forward_button;
+ GtkWidget *home_button;
+ GtkWidget *contents_button;
+
+ // define and attach signals to buttons
+ back_button = gtk_button_new_with_label(_("Back"));
+ g_signal_connect(back_button, "clicked", G_CALLBACK(back_button_clicked),
+ G_OBJECT(main_view));
+
+ forward_button = gtk_button_new_with_label(_("Forward"));
+ g_signal_connect(forward_button, "clicked", G_CALLBACK(forward_button_clicked),
+ G_OBJECT(main_view));
+
+ home_button = gtk_button_new_with_label(_("Home"));
+ g_signal_connect(home_button, "clicked", G_CALLBACK(home_button_clicked),
+ G_OBJECT(main_view));
+
+ contents_button = gtk_button_new_with_label(_("Contents"));
+ g_signal_connect(contents_button, "clicked",
+ G_CALLBACK(contents_button_clicked), G_OBJECT(content_hpane));
+
+ // button layout
+ buttons_hbuttonbox = gtk_hbutton_box_new();
+ gtk_container_add(GTK_CONTAINER(buttons_hbuttonbox), back_button);
+ gtk_container_add(GTK_CONTAINER(buttons_hbuttonbox), forward_button);
+ gtk_container_add(GTK_CONTAINER(buttons_hbuttonbox), home_button);
+ gtk_container_add(GTK_CONTAINER(buttons_hbuttonbox), contents_button);
+ gtk_box_pack_start(GTK_BOX(main_vbox), buttons_hbuttonbox, FALSE, TRUE, 0);
+ gtk_box_set_spacing(GTK_BOX(buttons_hbuttonbox), 6);
+ gtk_button_box_set_layout(GTK_BUTTON_BOX(buttons_hbuttonbox),
+ GTK_BUTTONBOX_START);
+
+ /* Store pointers to all widgets, for use by lookup_widget(). */
+ GLADE_HOOKUP_OBJECT(main_view, back_button, BACKBUTTON);
+ GLADE_HOOKUP_OBJECT(main_view, forward_button, FORWARDBUTTON);
+ GLADE_HOOKUP_OBJECT(main_view, home_button, HOMEBUTTON);
+ GLADE_HOOKUP_OBJECT(main_view, contents_button, CONTENTBUTTON);
}
/**
@@ -275,123 +275,123 @@ void initialize_buttons(GtkWidget *main_vbox, GtkWidget *content_hpane)
GtkWidget*
CreateHelpWindow(void)
{
- GtkWidget *main_vbox;
- GtkWidget *main_view_scroller;
- GtkWidget *contents_view_scroller;
- GtkWidget *content_hpane;
+ GtkWidget *main_vbox;
+ GtkWidget *main_view_scroller;
+ GtkWidget *contents_view_scroller;
+ GtkWidget *content_hpane;
- int width;
- int height;
- int x, y;
- int w = 0, h = 0;
- const char *pref;
+ int width;
+ int height;
+ int x, y;
+ int w = 0, h = 0;
+ const char *pref;
- wHelpWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ wHelpWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- width = gdk_screen_get_width(gtk_window_get_screen((GtkWindow *)wHelpWindow));
- height = gdk_screen_get_height(gtk_window_get_screen((GtkWindow *)wHelpWindow));
+ width = gdk_screen_get_width(gtk_window_get_screen((GtkWindow *)wHelpWindow));
+ height = gdk_screen_get_height(gtk_window_get_screen((GtkWindow *)wHelpWindow));
- pref = wPrefGetString(HTMLHELPSECTION, WINDOWSIZEPREFNAME);
+ pref = wPrefGetString(HTMLHELPSECTION, WINDOWSIZEPREFNAME);
- if (pref) {
- sscanf(pref, "%d %d", &w, &h);
+ if (pref) {
+ sscanf(pref, "%d %d", &w, &h);
- if (w > width) {
- w = width;
- }
+ if (w > width) {
+ w = width;
+ }
- if (h > height) {
- h = height;
- }
- } else {
- w = (width * 2)/ 5;
- h = height - 100;
- }
+ if (h > height) {
+ h = height;
+ }
+ } else {
+ w = (width * 2)/ 5;
+ h = height - 100;
+ }
- pref = wPrefGetString(HTMLHELPSECTION, WINDOWPOSPREFNAME);
+ pref = wPrefGetString(HTMLHELPSECTION, WINDOWPOSPREFNAME);
- if (pref) {
- sscanf(pref, "%d %d", &x, &y);
+ if (pref) {
+ sscanf(pref, "%d %d", &x, &y);
- if (y > height - h) {
- y = height - h;
- }
+ if (y > height - h) {
+ y = height - h;
+ }
- if (x > width - w) {
- x = width - w;
- }
- } else {
- x = (width * 3) / 5 - 10;
- y = 70;
- }
+ if (x > width - w) {
+ x = width - w;
+ }
+ } else {
+ x = (width * 3) / 5 - 10;
+ y = 70;
+ }
- gtk_window_resize((GtkWindow *)wHelpWindow, w, h);
- gtk_window_move((GtkWindow *)wHelpWindow, x, y);
+ gtk_window_resize((GtkWindow *)wHelpWindow, w, h);
+ gtk_window_move((GtkWindow *)wHelpWindow, x, y);
- gtk_window_set_title(GTK_WINDOW(wHelpWindow), "XTrkCad Help");
+ gtk_window_set_title(GTK_WINDOW(wHelpWindow), "XTrkCad Help");
- g_signal_connect(G_OBJECT(wHelpWindow), "delete-event",
- G_CALLBACK(DestroyHelpWindow), NULL);
+ g_signal_connect(G_OBJECT(wHelpWindow), "delete-event",
+ G_CALLBACK(DestroyHelpWindow), NULL);
- main_view_scroller = gtk_scrolled_window_new(NULL, NULL);
- contents_view_scroller = gtk_scrolled_window_new(NULL, NULL);
- main_view = webkit_web_view_new();
- contents_view = webkit_web_view_new();
- // must be done here as it gets locked down later
- load_into_view("contents.html", CONTENTS_VIEW);
- gtk_widget_set_size_request(GTK_WIDGET(wHelpWindow), x, y);
+ main_view_scroller = gtk_scrolled_window_new(NULL, NULL);
+ contents_view_scroller = gtk_scrolled_window_new(NULL, NULL);
+ main_view = webkit_web_view_new();
+ contents_view = webkit_web_view_new();
+ // must be done here as it gets locked down later
+ load_into_view("contents.html", CONTENTS_VIEW);
+ gtk_widget_set_size_request(GTK_WIDGET(wHelpWindow), x, y);
- main_vbox = gtk_vbox_new(FALSE, 5);
- gtk_container_add(GTK_CONTAINER(wHelpWindow), main_vbox);
+ main_vbox = gtk_vbox_new(FALSE, 5);
+ gtk_container_add(GTK_CONTAINER(wHelpWindow), main_vbox);
- gtk_container_add(GTK_CONTAINER(main_view_scroller), main_view);
+ gtk_container_add(GTK_CONTAINER(main_view_scroller), main_view);
- gtk_container_add(GTK_CONTAINER(contents_view_scroller), contents_view);
+ gtk_container_add(GTK_CONTAINER(contents_view_scroller), contents_view);
- content_hpane = gtk_hpaned_new();
- initialize_buttons(main_vbox, content_hpane);
- gtk_container_add(GTK_CONTAINER(content_hpane), contents_view_scroller);
- gtk_container_add(GTK_CONTAINER(content_hpane), main_view_scroller);
- gtk_box_pack_start(GTK_BOX(main_vbox), content_hpane, TRUE, TRUE, 0);
+ content_hpane = gtk_hpaned_new();
+ initialize_buttons(main_vbox, content_hpane);
+ gtk_container_add(GTK_CONTAINER(content_hpane), contents_view_scroller);
+ gtk_container_add(GTK_CONTAINER(content_hpane), main_view_scroller);
+ gtk_box_pack_start(GTK_BOX(main_vbox), content_hpane, TRUE, TRUE, 0);
- gtk_paned_set_position(GTK_PANED(content_hpane), 370);
+ gtk_paned_set_position(GTK_PANED(content_hpane), 370);
- g_signal_connect(contents_view, "navigation-policy-decision-requested",
- G_CALLBACK(contents_click_handler), G_OBJECT(main_view));
+ g_signal_connect(contents_view, "navigation-policy-decision-requested",
+ G_CALLBACK(contents_click_handler), G_OBJECT(main_view));
- /* Store pointers to all widgets, for use by lookup_widget(). */
- GLADE_HOOKUP_OBJECT_NO_REF(wHelpWindow, wHelpWindow, "wHelpWindow");
- GLADE_HOOKUP_OBJECT(wHelpWindow, content_hpane, PANED);
- GLADE_HOOKUP_OBJECT(wHelpWindow, contents_view, TOCVIEW);
- GLADE_HOOKUP_OBJECT(wHelpWindow, main_view, CONTENTSVIEW);
+ /* Store pointers to all widgets, for use by lookup_widget(). */
+ GLADE_HOOKUP_OBJECT_NO_REF(wHelpWindow, wHelpWindow, "wHelpWindow");
+ GLADE_HOOKUP_OBJECT(wHelpWindow, content_hpane, PANED);
+ GLADE_HOOKUP_OBJECT(wHelpWindow, contents_view, TOCVIEW);
+ GLADE_HOOKUP_OBJECT(wHelpWindow, main_view, CONTENTSVIEW);
- return wHelpWindow;
+ return wHelpWindow;
}
void load_into_view(char *file, int requested_view)
{
- GtkWidget *view;
+ GtkWidget *view;
- switch (requested_view) {
- case MAIN_VIEW:
- view = main_view;
- break;
+ switch (requested_view) {
+ case MAIN_VIEW:
+ view = main_view;
+ break;
- case CONTENTS_VIEW:
- view = contents_view;
- break;
+ case CONTENTS_VIEW:
+ view = contents_view;
+ break;
- default:
- printf("*** error, could not find view");
- break;
- }
+ default:
+ printf("*** error, could not find view");
+ break;
+ }
- char fileToLoad[250] = "file://";
- strcat(fileToLoad,directory);
- strcat(fileToLoad,file);
+ char fileToLoad[250] = "file://";
+ strcat(fileToLoad,directory);
+ strcat(fileToLoad,file);
- //debug printf("*** loading %s into pane %d.\n", fileToLoad, requested_view);
- webkit_web_view_load_uri(WEBKIT_WEB_VIEW(view), fileToLoad);
+ //debug printf("*** loading %s into pane %d.\n", fileToLoad, requested_view);
+ webkit_web_view_load_uri(WEBKIT_WEB_VIEW(view), fileToLoad);
}
/**
@@ -402,36 +402,36 @@ void load_into_view(char *file, int requested_view)
void wHelp(const char * topic)
{
- char *htmlFile;
+ char *htmlFile;
- //Take off any topic characters after a '-'
+ //Take off any topic characters after a '-'
- if (!topic || !topic[0]) return;
+ if (!topic || !topic[0]) { return; }
- if (!CheckHelpTopicExists(topic)) return;
+ if (!CheckHelpTopicExists(topic)) { return; }
- if (!wHelpWindow) {
- directory = malloc(BUFSIZ);
- assert(directory != NULL);
+ if (!wHelpWindow) {
+ directory = malloc(BUFSIZ);
+ assert(directory != NULL);
- sprintf(directory, "%s/html/", wGetAppLibDir());
+ sprintf(directory, "%s/html/", wGetAppLibDir());
- wHelpWindow = CreateHelpWindow();
- /* load the default content */
- load_into_view("index.html", MAIN_VIEW);
- }
+ wHelpWindow = CreateHelpWindow();
+ /* load the default content */
+ load_into_view("index.html", MAIN_VIEW);
+ }
- /* need space for the 'html' extension plus dot plus \0 */
- htmlFile = malloc(strlen(topic) + 6);
+ /* need space for the 'html' extension plus dot plus \0 */
+ htmlFile = malloc(strlen(topic) + 6);
- assert(htmlFile != NULL);
+ assert(htmlFile != NULL);
- sprintf(htmlFile, "%s.html", topic);
+ sprintf(htmlFile, "%s.html", topic);
- load_into_view(htmlFile, MAIN_VIEW);
- gtk_widget_show_all(wHelpWindow);
- gtk_window_present(GTK_WINDOW(wHelpWindow));
+ load_into_view(htmlFile, MAIN_VIEW);
+ gtk_widget_show_all(wHelpWindow);
+ gtk_window_present(GTK_WINDOW(wHelpWindow));
- free(htmlFile);
+ free(htmlFile);
}
diff --git a/app/wlib/gtklib/lines.c b/app/wlib/gtklib/lines.c
index bd787a6..6ce7ac1 100644
--- a/app/wlib/gtklib/lines.c
+++ b/app/wlib/gtklib/lines.c
@@ -44,10 +44,10 @@
*/
struct wLine_t {
- WOBJ_COMMON
- wBool_t visible;
- int count;
- wLines_t * lines;
+ WOBJ_COMMON
+ wBool_t visible;
+ int count;
+ wLines_t * lines;
};
/**
@@ -59,30 +59,30 @@ struct wLine_t {
static void linesRepaint(wControl_p b)
{
- wLine_p bl = (wLine_p)(b);
- int i;
- wWin_p win = (wWin_p)(bl->parent);
- GdkDrawable * window;
- cairo_t *cr;
-
- if (!bl->visible) {
- return;
- }
-
- window = gtk_widget_get_window(win->widget);
- cr = gdk_cairo_create(window);
- cairo_set_source_rgb(cr, 0, 0, 0);
- cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
- cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
-
- for (i=0; i<bl->count; i++) {
- cairo_set_line_width(cr, bl->lines[i].width);
- cairo_move_to(cr, bl->lines[i].x0, bl->lines[i].y0);
- cairo_line_to(cr, bl->lines[i].x1, bl->lines[i].y1);
- cairo_stroke(cr);
- }
-
- cairo_destroy(cr);
+ wLine_p bl = (wLine_p)(b);
+ int i;
+ wWin_p win = (wWin_p)(bl->parent);
+ GdkDrawable * window;
+ cairo_t *cr;
+
+ if (!bl->visible) {
+ return;
+ }
+
+ window = gtk_widget_get_window(win->widget);
+ cr = gdk_cairo_create(window);
+ cairo_set_source_rgb(cr, 0, 0, 0);
+ cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
+ cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
+
+ for (i=0; i<bl->count; i++) {
+ cairo_set_line_width(cr, bl->lines[i].width);
+ cairo_move_to(cr, bl->lines[i].x0, bl->lines[i].y0);
+ cairo_line_to(cr, bl->lines[i].x1, bl->lines[i].y1);
+ cairo_stroke(cr);
+ }
+
+ cairo_destroy(cr);
}
/**
@@ -94,10 +94,10 @@ static void linesRepaint(wControl_p b)
*/
void wlibLineShow(
- wLine_p bl,
- wBool_t visible)
+ wLine_p bl,
+ wBool_t visible)
{
- bl->visible = visible;
+ bl->visible = visible;
}
/**
@@ -111,40 +111,40 @@ void wlibLineShow(
*/
wLine_p wLineCreate(
- wWin_p parent,
- const char * labelStr,
- int count,
- wLines_t * lines)
+ wWin_p parent,
+ const char * labelStr,
+ int count,
+ wLines_t * lines)
{
- wLine_p linesWindow;
- int i;
- linesWindow = (wLine_p)wlibAlloc(parent, B_LINES, 0, 0, labelStr,
- sizeof *linesWindow, NULL);
- linesWindow->visible = TRUE;
- linesWindow->count = count;
- linesWindow->lines = lines;
- linesWindow->w = linesWindow->h = 0;
-
- for (i=0; i<count; i++) {
- if (lines[i].x0 > linesWindow->w) {
- linesWindow->w = lines[i].x0;
- }
-
- if (lines[i].y0 > linesWindow->h) {
- linesWindow->h = lines[i].y0;
- }
-
- if (lines[i].x1 > linesWindow->w) {
- linesWindow->w = lines[i].x1;
- }
-
- if (lines[i].y1 > linesWindow->h) {
- linesWindow->h = lines[i].y1;
- }
- }
-
- linesWindow->repaintProc = linesRepaint;
- wlibAddButton((wControl_p)linesWindow);
- linesWindow->widget = NULL;
- return linesWindow;
+ wLine_p linesWindow;
+ int i;
+ linesWindow = (wLine_p)wlibAlloc(parent, B_LINES, 0, 0, labelStr,
+ sizeof *linesWindow, NULL);
+ linesWindow->visible = TRUE;
+ linesWindow->count = count;
+ linesWindow->lines = lines;
+ linesWindow->w = linesWindow->h = 0;
+
+ for (i=0; i<count; i++) {
+ if (lines[i].x0 > linesWindow->w) {
+ linesWindow->w = lines[i].x0;
+ }
+
+ if (lines[i].y0 > linesWindow->h) {
+ linesWindow->h = lines[i].y0;
+ }
+
+ if (lines[i].x1 > linesWindow->w) {
+ linesWindow->w = lines[i].x1;
+ }
+
+ if (lines[i].y1 > linesWindow->h) {
+ linesWindow->h = lines[i].y1;
+ }
+ }
+
+ linesWindow->repaintProc = linesRepaint;
+ wlibAddButton((wControl_p)linesWindow);
+ linesWindow->widget = NULL;
+ return linesWindow;
}
diff --git a/app/wlib/gtklib/list.c b/app/wlib/gtklib/list.c
index ac66aba..92977dc 100644
--- a/app/wlib/gtklib/list.c
+++ b/app/wlib/gtklib/list.c
@@ -16,7 +16,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -37,9 +37,9 @@
#include "i18n.h"
struct listSearch {
- const char *search;
- char *result;
- int row;
+ const char *search;
+ char *result;
+ int row;
};
@@ -59,21 +59,21 @@ struct listSearch {
*/
void wListClear(
- wList_p b)
+ wList_p b)
{
- assert(b!= NULL);
+ assert(b!= NULL);
- b->recursion++;
+ b->recursion++;
- if (b->type == B_DROPLIST) {
- wDropListClear(b);
- } else {
- wTreeViewClear(b);
- }
+ if (b->type == B_DROPLIST) {
+ wDropListClear(b);
+ } else {
+ wTreeViewClear(b);
+ }
- b->recursion--;
- b->last = -1;
- b->count = 0;
+ b->recursion--;
+ b->last = -1;
+ b->count = 0;
}
/**
@@ -84,23 +84,23 @@ void wListClear(
*/
void wListSetIndex(
- wList_p b,
- int element)
+ wList_p b,
+ int element)
{
- if (b->widget == 0) {
- abort();
- }
+ if (b->widget == 0) {
+ abort();
+ }
- b->recursion++;
+ b->recursion++;
- if (b->type == B_DROPLIST) {
- wDropListSetIndex(b, element);
- } else {
- wlibTreeViewSetSelected(b, element);
- }
+ if (b->type == B_DROPLIST) {
+ wDropListSetIndex(b, element);
+ } else {
+ wlibTreeViewSetSelected(b, element);
+ }
- b->last = element;
- b->recursion--;
+ b->last = element;
+ b->recursion--;
}
/**
@@ -121,23 +121,23 @@ int
CompareListData(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter,
gpointer data)
{
- wListItem_p id_p;
- struct listSearch *search = (struct listSearch *)data;
-
- gtk_tree_model_get(model,
- iter,
- LISTCOL_DATA,
- &id_p,
- -1);
-
- if (id_p && id_p->label && !strcmp(id_p->label, search->search)) {
- search->result = (char *)id_p->label;
- return TRUE;
- } else {
- search->result = NULL;
- search->row++;
- return FALSE;
- }
+ wListItem_p id_p;
+ struct listSearch *search = (struct listSearch *)data;
+
+ gtk_tree_model_get(model,
+ iter,
+ LISTCOL_DATA,
+ &id_p,
+ -1);
+
+ if (id_p && id_p->label && !strcmp(id_p->label, search->search)) {
+ search->result = (char *)id_p->label;
+ return TRUE;
+ } else {
+ search->result = NULL;
+ search->row++;
+ return FALSE;
+ }
}
/**
@@ -149,25 +149,25 @@ CompareListData(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter,
*/
wIndex_t wListFindValue(
- wList_p b,
- const char * val)
+ wList_p b,
+ const char * val)
{
- struct listSearch thisSearch;
+ struct listSearch thisSearch;
- assert(b!=NULL);
- assert(b->listStore!=NULL);
+ assert(b!=NULL);
+ assert(b->listStore!=NULL);
- thisSearch.search = val;
- thisSearch.row = 0;
+ thisSearch.search = val;
+ thisSearch.row = 0;
- gtk_tree_model_foreach(GTK_TREE_MODEL(b->listStore), CompareListData,
- (void *)&thisSearch);
+ gtk_tree_model_foreach(GTK_TREE_MODEL(b->listStore), CompareListData,
+ (void *)&thisSearch);
- if (!thisSearch.result) {
- return -1;
- } else {
- return thisSearch.row;
- }
+ if (!thisSearch.result) {
+ return -1;
+ } else {
+ return thisSearch.row;
+ }
}
/**
@@ -178,13 +178,13 @@ wIndex_t wListFindValue(
*/
wIndex_t wListGetCount(
- wList_p b)
+ wList_p b)
{
- if (b->type == B_DROPLIST) {
- return wDropListGetCount(b);
- } else {
- return wTreeViewGetCount(b);
- }
+ if (b->type == B_DROPLIST) {
+ return wDropListGetCount(b);
+ } else {
+ return wTreeViewGetCount(b);
+ }
}
/**
@@ -196,18 +196,18 @@ wIndex_t wListGetCount(
*/
void * wListGetItemContext(
- wList_p b,
- wIndex_t inx)
+ wList_p b,
+ wIndex_t inx)
{
- if (inx < 0) {
- return NULL;
- }
-
- if (b->type == B_DROPLIST) {
- return wDropListGetItemContext(b, inx);
- } else {
- return wTreeViewGetItemContext(b, inx);
- }
+ if (inx < 0) {
+ return NULL;
+ }
+
+ if (b->type == B_DROPLIST) {
+ return wDropListGetItemContext(b, inx);
+ } else {
+ return wTreeViewGetItemContext(b, inx);
+ }
}
/**
@@ -221,53 +221,57 @@ void * wListGetItemContext(
*/
wIndex_t wListGetValues(
- wList_p bl,
- char * labelStr,
- int labelSize,
- void * * listDataRet,
- void * * itemDataRet)
+ wList_p bl,
+ char * labelStr,
+ int labelSize,
+ void * * listDataRet,
+ void * * itemDataRet)
{
- wListItem_p id_p;
- wIndex_t inx = bl->last;
- const char * entry_value = "";
- void * item_data = NULL;
-
- assert(bl != NULL);
- assert(bl->listStore != NULL);
-
- if (bl->type == B_DROPLIST && bl->editted) {
- entry_value = gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(
- bl->widget))));
- item_data = NULL;
- inx = bl->last = -1;
- } else {
- inx = bl->last;
-
- if (inx >= 0) {
- id_p = wlibListStoreGetContext(bl->listStore, inx);
-
- if (id_p==NULL) {
- fprintf(stderr, "wListGetValues - id_p == NULL\n");
- } else {
- entry_value = id_p->label;
- item_data = id_p->itemData;
- }
- }
- }
-
- if (labelStr) {
- strncpy(labelStr, entry_value, labelSize);
- }
-
- if (listDataRet) {
- *listDataRet = bl->data;
- }
-
- if (itemDataRet) {
- *itemDataRet = item_data;
- }
-
- return bl->last;
+ wListItem_p id_p;
+ wIndex_t inx = bl->last;
+ const char * entry_value = "";
+ void * item_data = NULL;
+
+ assert(bl != NULL);
+ assert(bl->listStore != NULL);
+
+ if (bl->type == B_DROPLIST && bl->editted) {
+ entry_value = gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(
+ bl->widget))));
+ item_data = NULL;
+ inx = bl->last = -1;
+ } else {
+ //Make sure in range
+ if (bl->last > bl->count-1) { bl->last = bl->count-1; }
+ inx = bl->last;
+
+
+ if (inx >= 0) {
+ id_p = wlibListStoreGetContext(bl->listStore, inx);
+
+ if (id_p==NULL) {
+ fprintf(stderr, "wListGetValues - id_p == NULL\n");
+ bl->last = -1;
+ } else {
+ entry_value = id_p->label;
+ item_data = id_p->itemData;
+ }
+ }
+ }
+
+ if (labelStr) {
+ strncpy(labelStr, entry_value, labelSize);
+ }
+
+ if (listDataRet) {
+ *listDataRet = bl->data;
+ }
+
+ if (itemDataRet) {
+ *itemDataRet = item_data;
+ }
+
+ return bl->last;
}
/**
@@ -278,22 +282,22 @@ wIndex_t wListGetValues(
*/
wBool_t wListGetItemSelected(
- wList_p b,
- wIndex_t inx)
+ wList_p b,
+ wIndex_t inx)
{
- wListItem_p id_p;
+ wListItem_p id_p;
- if (inx < 0) {
- return FALSE;
- }
+ if (inx < 0) {
+ return FALSE;
+ }
- id_p = wlibListStoreGetContext(b->listStore, inx);
+ id_p = wlibListStoreGetContext(b->listStore, inx);
- if (id_p) {
- return id_p->selected;
- } else {
- return FALSE;
- }
+ if (id_p) {
+ return id_p->selected;
+ } else {
+ return FALSE;
+ }
}
/**
@@ -304,16 +308,16 @@ wBool_t wListGetItemSelected(
*/
wIndex_t wListGetSelectedCount(
- wList_p b)
+ wList_p b)
{
- wIndex_t selcnt, inx;
+ wIndex_t selcnt, inx;
- for (selcnt=inx=0; inx<b->count; inx++)
- if (wListGetItemSelected(b, inx)) {
- selcnt++;
- }
+ for (selcnt=inx=0; inx<b->count; inx++)
+ if (wListGetItemSelected(b, inx)) {
+ selcnt++;
+ }
- return selcnt;
+ return selcnt;
}
/**
@@ -325,26 +329,26 @@ wIndex_t wListGetSelectedCount(
void wListSelectAll(wList_p bl)
{
- wIndex_t inx;
- GtkTreeSelection *selection;
+ wIndex_t inx;
+ GtkTreeSelection *selection;
- assert(bl != NULL);
- // mark all items selected
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(bl->treeView));
- gtk_tree_selection_select_all(selection);
+ assert(bl != NULL);
+ // mark all items selected
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(bl->treeView));
+ gtk_tree_selection_select_all(selection);
- // and synchronize the internal data structures
- wListGetCount(bl);
+ // and synchronize the internal data structures
+ wListGetCount(bl);
- for (inx=0; inx<bl->count; inx++) {
- wListItem_p ldp;
+ for (inx=0; inx<bl->count; inx++) {
+ wListItem_p ldp;
- ldp = wlibListStoreGetContext(bl->listStore, inx);
+ ldp = wlibListStoreGetContext(bl->listStore, inx);
- if (ldp) {
- ldp->selected = TRUE;
- }
- }
+ if (ldp) {
+ ldp->selected = TRUE;
+ }
+ }
}
/**
@@ -359,25 +363,25 @@ void wListSelectAll(wList_p bl)
*/
wBool_t wListSetValues(
- wList_p b,
- wIndex_t row,
- const char * labelStr,
- wIcon_p bm,
- void *itemData)
+ wList_p b,
+ wIndex_t row,
+ const char * labelStr,
+ wIcon_p bm,
+ void *itemData)
{
- assert(b->listStore != NULL);
+ assert(b->listStore != NULL);
- b->recursion++;
+ b->recursion++;
- if (b->type == B_DROPLIST) {
- wDropListSetValues(b, row, labelStr, bm, itemData);
- } else {
- wlibListStoreUpdateValues(b->listStore, row, b->colCnt, (char *)labelStr, bm);
- }
+ if (b->type == B_DROPLIST) {
+ wDropListSetValues(b, row, labelStr, bm, itemData);
+ } else {
+ wlibListStoreUpdateValues(b->listStore, row, b->colCnt, (char *)labelStr, bm);
+ }
- b->recursion--;
- return TRUE;
+ b->recursion--;
+ return TRUE;
}
/**
@@ -387,31 +391,34 @@ wBool_t wListSetValues(
*/
void wListDelete(
- wList_p b,
- wIndex_t inx)
+ wList_p b,
+ wIndex_t inx)
{
- GtkTreeIter iter;
+ GtkTreeIter iter;
- assert(b->listStore != 0);
- assert(b->type != B_DROPLIST);
- b->recursion++;
+ assert(b->listStore != 0);
+ assert(b->type != B_DROPLIST);
+ b->recursion++;
- if (b->type == B_DROPLIST) {
- wNotice("Deleting from dropboxes is not implemented!", "Continue", NULL);
- } else {
- gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(b->listStore),
- &iter,
- NULL,
- inx);
- gtk_list_store_remove(b->listStore, &iter);
+ if (b->type == B_DROPLIST) {
+ wNotice("Deleting from dropboxes is not implemented!", "Continue", NULL);
+ } else {
+ gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(b->listStore),
+ &iter,
+ NULL,
+ inx);
+ gtk_list_store_remove(b->listStore, &iter);
- b->count--;
- }
+ b->count--;
+ }
- b->recursion--;
- return;
+ if (b->last == inx-1) { b->last = -1; }
+ else if (b->last >= inx) { b->last = -1; }
+
+ b->recursion--;
+ return;
}
/**
@@ -424,29 +431,29 @@ void wListDelete(
*/
int wListGetColumnWidths(
- wList_p bl,
- int colCnt,
- wPos_t * colWidths)
+ wList_p bl,
+ int colCnt,
+ wWinPix_t * colWidths)
{
- int inx;
+ int inx;
- if (bl->type != B_LIST) {
- return 0;
- }
+ if (bl->type != B_LIST) {
+ return 0;
+ }
- if (bl->colWidths == NULL) {
- return 0;
- }
+ if (bl->colWidths == NULL) {
+ return 0;
+ }
- for (inx=0; inx<colCnt; inx++) {
- if (inx < bl->colCnt) {
- colWidths[inx] = bl->colWidths[inx];
- } else {
- colWidths[inx] = 0;
- }
- }
+ for (inx=0; inx<colCnt; inx++) {
+ if (inx < bl->colCnt) {
+ colWidths[inx] = bl->colWidths[inx];
+ } else {
+ colWidths[inx] = 0;
+ }
+ }
- return bl->colCnt;
+ return bl->colCnt;
}
/**
@@ -460,45 +467,45 @@ int wListGetColumnWidths(
*/
wIndex_t wListAddValue(
- wList_p b,
- const char * labelStr,
- wIcon_p bm,
- void * itemData)
+ wList_p b,
+ const char * labelStr,
+ wIcon_p bm,
+ void * itemData)
{
- wListItem_p id_p;
+ wListItem_p id_p;
- assert(b != NULL);
+ assert(b != NULL);
- b->recursion++;
+ b->recursion++;
- id_p = (wListItem_p)g_malloc(sizeof *id_p);
- memset(id_p, 0, sizeof *id_p);
- id_p->itemData = itemData;
- id_p->active = TRUE;
+ id_p = (wListItem_p)g_malloc(sizeof *id_p);
+ memset(id_p, 0, sizeof *id_p);
+ id_p->itemData = itemData;
+ id_p->active = TRUE;
- if (labelStr == NULL) {
- labelStr = "";
- }
+ if (labelStr == NULL) {
+ labelStr = "";
+ }
- id_p->label = strdup(labelStr);
- id_p->listP = b;
+ id_p->label = strdup(labelStr);
+ id_p->listP = b;
- if (b->type == B_DROPLIST) {
- wDropListAddValue(b, (char *)labelStr, id_p);
- } else {
- wlibTreeViewAddRow(b, (char *)labelStr, bm, id_p);
- }
+ if (b->type == B_DROPLIST) {
+ wDropListAddValue(b, (char *)labelStr, id_p);
+ } else {
+ wlibTreeViewAddRow(b, (char *)labelStr, bm, id_p);
+ }
- //free(id_p->label);
+ //free(id_p->label);
- b->count++;
- b->recursion--;
+ b->count++;
+ b->recursion--;
- if (b->count == 1) {
- b->last = 0;
- }
+ if (b->count == 1) {
+ b->last = 0;
+ }
- return b->count-1;
+ return b->count-1;
}
@@ -510,16 +517,16 @@ wIndex_t wListAddValue(
* \param h IN height (ignored for droplist)
*/
-void wListSetSize(wList_p bl, wPos_t w, wPos_t h)
+void wListSetSize(wList_p bl, wWinPix_t w, wWinPix_t h)
{
- if (bl->type == B_DROPLIST) {
- gtk_widget_set_size_request(bl->widget, w, -1);
- } else {
- gtk_widget_set_size_request(bl->widget, w, h);
- }
-
- bl->w = w;
- bl->h = h;
+ if (bl->type == B_DROPLIST) {
+ gtk_widget_set_size_request(bl->widget, w, -1);
+ } else {
+ gtk_widget_set_size_request(bl->widget, w, h);
+ }
+
+ bl->w = w;
+ bl->h = h;
}
/**
@@ -533,20 +540,20 @@ void wListSetSize(wList_p bl, wPos_t w, wPos_t h)
*/
wList_p wComboListCreate(
- wWin_p parent, /* Parent window */
- wPos_t x, /* X-position */
- wPos_t y, /* Y-position */
- const char * helpStr, /* Help string */
- const char * labelStr, /* Label */
- long option, /* Options */
- long number, /* Number of displayed list entries */
- wPos_t width, /* Width */
- long *valueP, /* Selected index */
- wListCallBack_p action, /* Callback */
- void *data) /* Context */
+ wWin_p parent, /* Parent window */
+ wWinPix_t x, /* X-position */
+ wWinPix_t y, /* Y-position */
+ const char * helpStr, /* Help string */
+ const char * labelStr, /* Label */
+ long option, /* Options */
+ long number, /* Number of displayed list entries */
+ wWinPix_t width, /* Width */
+ long *valueP, /* Selected index */
+ wListCallBack_p action, /* Callback */
+ void *data) /* Context */
{
- wNotice("ComboLists are not implemented!", "Abort", NULL);
- abort();
+ wNotice("ComboLists are not implemented!", "Abort", NULL);
+ abort();
}
diff --git a/app/wlib/gtklib/liststore.c b/app/wlib/gtklib/liststore.c
index 088bf33..b1b0f8a 100644
--- a/app/wlib/gtklib/liststore.c
+++ b/app/wlib/gtklib/liststore.c
@@ -47,25 +47,25 @@
*/
wListItem_p wlibListItemGet(
- GtkListStore *ls,
- wIndex_t inx,
- GList ** childR)
+ GtkListStore *ls,
+ wIndex_t inx,
+ GList ** childR)
{
- wListItem_p id_p;
+ wListItem_p id_p;
- assert(ls != NULL);
+ assert(ls != NULL);
- if (childR) {
- *childR = NULL;
- }
+ if (childR) {
+ *childR = NULL;
+ }
- if (inx < 0) {
- return NULL;
- }
+ if (inx < 0) {
+ return NULL;
+ }
- id_p = wlibListStoreGetContext(ls, inx);
+ id_p = wlibListStoreGetContext(ls, inx);
- return id_p;
+ return id_p;
}
/**
@@ -79,33 +79,33 @@ wListItem_p wlibListItemGet(
void *
wlibListStoreGetContext(GtkListStore *ls, int inx)
{
- GtkTreeIter iter;
- gchar *string = NULL;
- gboolean result;
- gint childs;
-
- childs = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(ls),
- NULL);
-
- if (inx < childs) {
- result = gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(ls),
- &iter,
- NULL,
- inx);
-
- if (result) {
- gtk_tree_model_get(GTK_TREE_MODEL(ls),
- &iter,
- LISTCOL_DATA,
- &string,
- -1);
- } else {
- printf("Invalid index %d for list!\n", inx);
-
- }
- }
-
- return (string);
+ GtkTreeIter iter;
+ gchar *string = NULL;
+ gboolean result;
+ gint childs;
+
+ childs = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(ls),
+ NULL);
+
+ if (inx < childs) {
+ result = gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(ls),
+ &iter,
+ NULL,
+ inx);
+
+ if (result) {
+ gtk_tree_model_get(GTK_TREE_MODEL(ls),
+ &iter,
+ LISTCOL_DATA,
+ &string,
+ -1);
+ } else {
+ printf("Invalid index %d for list!\n", inx);
+
+ }
+ }
+
+ return (string);
}
@@ -119,21 +119,22 @@ wlibListStoreGetContext(GtkListStore *ls, int inx)
void
wlibListStoreClear(GtkListStore *listStore)
{
- wListItem_p id_p;
- int i = 0;
+ wListItem_p id_p;
+ int i = 0;
- assert(listStore != NULL);
+ assert(listStore != NULL);
- id_p = wlibListStoreGetContext(listStore, i++);
+ id_p = wlibListStoreGetContext(listStore, i++);
- while (id_p) {
- if (id_p->label)
- g_free(id_p->label);
- g_free(id_p);
- id_p = wlibListStoreGetContext(listStore, i++);
- }
+ while (id_p) {
+ if (id_p->label) {
+ g_free(id_p->label);
+ }
+ g_free(id_p);
+ id_p = wlibListStoreGetContext(listStore, i++);
+ }
- gtk_list_store_clear(listStore);
+ gtk_list_store_clear(listStore);
}
/**
@@ -148,23 +149,23 @@ wlibListStoreClear(GtkListStore *listStore)
GtkListStore *
wlibNewListStore(int colCnt)
{
- GtkListStore *ls;
- GType *colTypes;
- int i;
+ GtkListStore *ls;
+ GType *colTypes;
+ int i;
- /* create the list store, using strings for all columns */
- colTypes = g_malloc(sizeof(GType) * (colCnt + LISTCOL_TEXT));
- colTypes[ LISTCOL_BITMAP ] = GDK_TYPE_PIXBUF;
- colTypes[ LISTCOL_DATA ] = G_TYPE_POINTER;
+ /* create the list store, using strings for all columns */
+ colTypes = g_malloc(sizeof(GType) * (colCnt + LISTCOL_TEXT));
+ colTypes[ LISTCOL_BITMAP ] = GDK_TYPE_PIXBUF;
+ colTypes[ LISTCOL_DATA ] = G_TYPE_POINTER;
- for (i = 0; i < colCnt; i++) {
- colTypes[ LISTCOL_TEXT + i ] = G_TYPE_STRING;
- }
+ for (i = 0; i < colCnt; i++) {
+ colTypes[ LISTCOL_TEXT + i ] = G_TYPE_STRING;
+ }
- ls = gtk_list_store_newv(colCnt + LISTCOL_TEXT, colTypes);
- g_free(colTypes);
+ ls = gtk_list_store_newv(colCnt + LISTCOL_TEXT, colTypes);
+ g_free(colTypes);
- return (ls);
+ return (ls);
}
/**
@@ -179,26 +180,26 @@ wlibNewListStore(int colCnt)
static int
wlibListStoreUpdateIter(GtkListStore *ls, GtkTreeIter *iter, char *labels)
{
- char *convertedLabels;
- char *text;
- char *start;
- int current = 0;
-
- convertedLabels = strdup(wlibConvertInput(labels));
- start = convertedLabels;
-
- while ((text = strchr(start, '\t')) != NULL) {
- *text = '\0';
- gtk_list_store_set(ls, iter, LISTCOL_TEXT + current, start, -1);
- start = text + 1;
- current++;
- }
-
- /* add the last piece of the string */
- gtk_list_store_set(ls, iter, LISTCOL_TEXT + current, start, -1);
-
- free(convertedLabels);
- return (current+1);
+ char *convertedLabels;
+ char *text;
+ char *start;
+ int current = 0;
+
+ convertedLabels = strdup(wlibConvertInput(labels));
+ start = convertedLabels;
+
+ while ((text = strchr(start, '\t')) != NULL) {
+ *text = '\0';
+ gtk_list_store_set(ls, iter, LISTCOL_TEXT + current, start, -1);
+ start = text + 1;
+ current++;
+ }
+
+ /* add the last piece of the string */
+ gtk_list_store_set(ls, iter, LISTCOL_TEXT + current, start, -1);
+
+ free(convertedLabels);
+ return (current+1);
}
/**
@@ -213,9 +214,9 @@ wlibListStoreUpdateIter(GtkListStore *ls, GtkTreeIter *iter, char *labels)
void
wlibListStoreSetPixbuf(GtkListStore *ls, GtkTreeIter *iter, GdkPixbuf *pixbuf)
{
- gtk_list_store_set(ls, iter, LISTCOL_BITMAP, pixbuf, -1);
- g_object_ref_sink(pixbuf);
- g_object_unref(pixbuf);
+ gtk_list_store_set(ls, iter, LISTCOL_BITMAP, pixbuf, -1);
+ g_object_ref_sink(pixbuf);
+ g_object_unref(pixbuf);
}
/**
* Add a row to the list store
@@ -230,19 +231,19 @@ int
wlibListStoreAddData(GtkListStore *ls, GdkPixbuf *pixbuf, int cols,
wListItem_p id)
{
- GtkTreeIter iter;
- int count;
+ GtkTreeIter iter;
+ int count;
- gtk_list_store_append(ls, &iter);
- gtk_list_store_set(ls, &iter, LISTCOL_DATA, id, -1);
+ gtk_list_store_append(ls, &iter);
+ gtk_list_store_set(ls, &iter, LISTCOL_DATA, id, -1);
- if (pixbuf) {
- wlibListStoreSetPixbuf(ls, &iter, pixbuf);
- }
+ if (pixbuf) {
+ wlibListStoreSetPixbuf(ls, &iter, pixbuf);
+ }
- count = wlibListStoreUpdateIter(ls, &iter, (char *)id->label);
+ count = wlibListStoreUpdateIter(ls, &iter, (char *)id->label);
- return (count);
+ return (count);
}
/**
@@ -261,23 +262,23 @@ int
wlibListStoreUpdateValues(GtkListStore *ls, int row, int cols, char *labels,
wIcon_p bm)
{
- GtkTreeIter iter;
- int count;
+ GtkTreeIter iter;
+ int count;
- gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(ls),
- &iter,
- NULL,
- row);
+ gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(ls),
+ &iter,
+ NULL,
+ row);
- count = wlibListStoreUpdateIter(ls, &iter, labels);
+ count = wlibListStoreUpdateIter(ls, &iter, labels);
- if (bm) {
- GdkPixbuf *pixbuf;
+ if (bm) {
+ GdkPixbuf *pixbuf;
- pixbuf = wlibMakePixbuf(bm);
- wlibListStoreSetPixbuf(ls, &iter, pixbuf);
- }
+ pixbuf = wlibMakePixbuf(bm);
+ wlibListStoreSetPixbuf(ls, &iter, pixbuf);
+ }
- return (count);
+ return (count);
}
diff --git a/app/wlib/gtklib/main.c b/app/wlib/gtklib/main.c
index 470f17b..7022a0a 100644
--- a/app/wlib/gtklib/main.c
+++ b/app/wlib/gtklib/main.c
@@ -18,7 +18,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -46,10 +46,10 @@ char *wExecutableName;
* Initialize the application name for later use
*
* \param _appName IN Name of application
- * \return
+ * \return
*/
-
-void
+
+void
wInitAppName(char *_appName)
{
appName = g_strdup( _appName );
@@ -59,7 +59,7 @@ char *
wlibGetAppName()
{
return( appName );
-}
+}
/*
*******************************************************************************
@@ -76,17 +76,19 @@ int main( int argc, char *argv[] )
wWin_p win;
const char *ld;
- if ( getenv( "GTKLIB_NOLOCALE" ) == 0 )
+ if ( getenv( "GTKLIB_NOLOCALE" ) == 0 ) {
setlocale( LC_ALL, "en_US" );
+ }
gtk_init( &argc, &argv );
- if ((win=wMain( argc, argv )) == NULL)
+ if ((win=wMain( argc, argv )) == NULL) {
exit(1);
- wExecutableName = argv[ 0 ];
+ }
+ wExecutableName = argv[ 0 ];
ld = wGetAppLibDir();
-
+
#ifdef WINDOWS
-
+
#else
// set up help search path on unix boxes
if (ld != NULL) {
@@ -94,14 +96,16 @@ int main( int argc, char *argv[] )
const char *hp;
sprintf( buff, "HELPPATH=/usr/lib/help:%s:", ld );
- if ( (hp = getenv("HELPPATH")) != NULL )
+ if ( (hp = getenv("HELPPATH")) != NULL ) {
strcat( buff, hp );
+ }
putenv( buff );
}
#endif
-
- if (!win->shown)
+
+ if (!win->shown) {
wWinShow( win, TRUE );
+ }
gtk_main();
exit(0);
diff --git a/app/wlib/gtklib/menu.c b/app/wlib/gtklib/menu.c
index 79695d4..8646f15 100644
--- a/app/wlib/gtklib/menu.c
+++ b/app/wlib/gtklib/menu.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -50,28 +50,29 @@
typedef enum { M_MENU, M_SEPARATOR, M_PUSH, M_LIST, M_LISTITEM, M_TOGGLE, M_RADIO } mtype_e;
typedef enum { MM_BUTT, MM_MENU, MM_BAR, MM_POPUP } mmtype_e;
-typedef struct{ mtype_e mtype; /**< menu entry type */
- GtkWidget *menu_item;
- wMenu_p parentMenu;
- int recursion; /**< recursion counter */
- } MOBJ_COMMON; /**< menu item specific data */
-
-
+typedef struct {
+ mtype_e mtype; /**< menu entry type */
+ GtkWidget *menu_item;
+ wMenu_p parentMenu;
+ int recursion; /**< recursion counter */
+} MOBJ_COMMON; /**< menu item specific data */
+
+
struct wMenuItem_t {
WOBJ_COMMON
MOBJ_COMMON m;
- };
+};
typedef struct wMenuItem_t * wMenuItem_p;
-// a few macros to make access to members easier
-//#define PTR2M( ptr ) ((ptr)->m)
-#define MMENUITEM( ptr ) (((ptr)->m).menu_item)
+// a few macros to make access to members easier
+//#define PTR2M( ptr ) ((ptr)->m)
+#define MMENUITEM( ptr ) (((ptr)->m).menu_item)
#define MPARENT( ptr ) (((ptr)->m).parentMenu)
#define MITEMTYPE( ptr ) (((ptr)->m).mtype)
-#define MRECURSION( ptr ) (((ptr)->m).recursion)
-
-
+#define MRECURSION( ptr ) (((ptr)->m).recursion)
+
+
struct wMenu_t {
WOBJ_COMMON
MOBJ_COMMON m;
@@ -83,21 +84,21 @@ struct wMenu_t {
void * traceData;
GtkLabel * labelG;
GtkWidget * imageG;
- };
+};
struct wMenuPush_t {
WOBJ_COMMON
MOBJ_COMMON m;
wMenuCallBack_p action;
wBool_t enabled;
- };
+};
struct wMenuRadio_t {
WOBJ_COMMON
MOBJ_COMMON m;
wMenuCallBack_p action;
wBool_t enabled;
- };
+};
struct wMenuList_t {
WOBJ_COMMON
@@ -105,44 +106,45 @@ struct wMenuList_t {
int max;
int count;
wMenuListCallBack_p action;
- };
+};
struct wMenuListItem_t {
WOBJ_COMMON
MOBJ_COMMON m;
wMenuList_p mlist;
- };
+};
typedef struct wMenuListItem_t * wMenuListItem_p;
-
+
struct wMenuToggle_t {
WOBJ_COMMON
MOBJ_COMMON m;
- wMenuToggleCallBack_p action;
+ wMenuCallBack_p action;
wBool_t enabled;
wBool_t set;
- };
+};
/*-----------------------------------------------------------------*/
-
+
/**
* Handle activate event for menu items.
*
* \param widget IN widget that emitted the signal
* \param value IN application data
- * \return
+ * \return
*/
-
+
static void pushMenuItem(
- GtkWidget * widget,
- gpointer value )
+ GtkWidget * widget,
+ gpointer value )
{
wMenuItem_p m = (wMenuItem_p)value;
wMenuToggle_p mt;
- if (MRECURSION( m ))
+ if (MRECURSION( m )) {
return;
+ }
switch MITEMTYPE( m ) {
case M_PUSH:
@@ -151,13 +153,14 @@ static void pushMenuItem(
case M_TOGGLE:
mt = (wMenuToggle_p)m;
wMenuToggleSet( mt, !mt->set );
- mt->action( mt->set, mt->data );
+ mt->action( mt->data );
break;
case M_RADIO:
/* NOTE: action is only called when radio button is activated, not when deactivated */
- if( gtk_check_menu_item_get_active((GtkCheckMenuItem *)widget ) == TRUE )
+ if( gtk_check_menu_item_get_active((GtkCheckMenuItem *)widget ) == TRUE ) {
((wMenuRadio_p)m)->action( ((wMenuRadio_p)m)->data );
- break;
+ }
+ break;
case M_MENU:
return;
default:
@@ -167,57 +170,63 @@ static void pushMenuItem(
if( MPARENT(m)->traceFunc ) {
MPARENT(m)->traceFunc( MPARENT( m ), m->labelStr, MPARENT(m)->traceData );
}
-}
+}
/**
* Create a new menu element, add to the parent menu and to help
*
* \param m IN parent menu
* \param mtype IN type of new entry
- * \param helpStr IN help topic
+ * \param helpStr IN help topic
* \param labelStr IN display label
* \param size IN size of additional data?
* \return the newly created menu element
*/
static wMenuItem_p createMenuItem(
- wMenu_p m,
- mtype_e mtype,
- const char * helpStr,
- const char * labelStr,
- int size )
+ wMenu_p m,
+ mtype_e mtype,
+ const char * helpStr,
+ const char * labelStr,
+ int size )
{
wMenuItem_p mi;
mi = (wMenuItem_p)wlibAlloc( NULL, B_MENUITEM, 0, 0, labelStr, size, NULL );
MITEMTYPE( mi )= mtype;
-
+
switch ( mtype ) {
case M_LIST:
- MMENUITEM( mi ) = gtk_menu_item_new_with_mnemonic(wlibConvertInput(mi->labelStr)); // NULL; //PTR2M(m).menu_item
+ MMENUITEM( mi ) = gtk_menu_item_new_with_mnemonic(wlibConvertInput(
+ mi->labelStr)); // NULL; //PTR2M(m).menu_item
break;
case M_SEPARATOR:
MMENUITEM( mi ) = gtk_separator_menu_item_new();
break;
case M_TOGGLE:
- MMENUITEM( mi ) = gtk_check_menu_item_new_with_mnemonic(wlibConvertInput(mi->labelStr));
+ MMENUITEM( mi ) = gtk_check_menu_item_new_with_mnemonic(wlibConvertInput(
+ mi->labelStr));
break;
case M_RADIO:
- MMENUITEM( mi ) = gtk_radio_menu_item_new_with_mnemonic(m->radioGroup, wlibConvertInput(mi->labelStr));
- m->radioGroup = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (MMENUITEM( mi )));
- break;
+ MMENUITEM( mi ) = gtk_radio_menu_item_new_with_mnemonic(m->radioGroup,
+ wlibConvertInput(mi->labelStr));
+ m->radioGroup = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (MMENUITEM(
+ mi )));
+ break;
default:
- MMENUITEM( mi ) = gtk_menu_item_new_with_mnemonic(wlibConvertInput(mi->labelStr));
+ MMENUITEM( mi ) = gtk_menu_item_new_with_mnemonic(wlibConvertInput(
+ mi->labelStr));
break;
}
if (MMENUITEM( mi )) {
- if (m)
+ if (m) {
gtk_menu_shell_append( (GtkMenuShell *)(m->menu), MMENUITEM( mi ) );
+ }
g_signal_connect( GTK_OBJECT(MMENUITEM( mi )), "activate",
- G_CALLBACK(pushMenuItem), mi );
- gtk_widget_show(MMENUITEM( mi ));
+ G_CALLBACK(pushMenuItem), mi );
+ gtk_widget_show(MMENUITEM( mi ));
}
-
+
// this is a link list of all menu items belonging to a specific menu
// is used in automatic processing (macro)??
if (m) {
@@ -229,8 +238,8 @@ static wMenuItem_p createMenuItem(
m->last = mi;
}
mi->next = NULL;
-
-
+
+
if (helpStr != NULL) {
wlibAddHelpString( MMENUITEM( mi ), helpStr );
}
@@ -240,13 +249,14 @@ static wMenuItem_p createMenuItem(
/**
* Add a accelerator key to a widget
- *
+ *
* @param w IN unused(?)
* @param menu IN unused(?)
* @param menu_item IN owning widget
* @param acclKey IN the accelerator key
*/
-static void setAcclKey( wWin_p w, GtkWidget * menu, GtkWidget * menu_item, int acclKey )
+static void setAcclKey( wWin_p w, GtkWidget * menu, GtkWidget * menu_item,
+ int acclKey )
{
int mask;
static GtkAccelGroup * accel_alpha_group = NULL;
@@ -267,10 +277,10 @@ static void setAcclKey( wWin_p w, GtkWidget * menu, GtkWidget * menu_item, int a
gtk_window_add_accel_group(GTK_WINDOW(gtkMainW->gtkwin), accel_nonalpha_group );
gtk_accelerator_set_default_mod_mask( oldmods );
}
-
+
mask = 0;
if (acclKey) {
-
+
if (acclKey&WALT) {
mask |= GDK_MOD1_MASK;
}
@@ -305,38 +315,38 @@ static void setAcclKey( wWin_p w, GtkWidget * menu, GtkWidget * menu_item, int a
mask |= GDK_CONTROL_MASK;
}
gtk_widget_add_accelerator( menu_item, "activate",
- (isalpha(acclKey&0xFF)?accel_alpha_group:accel_nonalpha_group),
- toupper(acclKey&0xFF), mask, GTK_ACCEL_VISIBLE|GTK_ACCEL_LOCKED );
+ (isalpha(acclKey&0xFF)?accel_alpha_group:accel_nonalpha_group),
+ toupper(acclKey&0xFF), mask, GTK_ACCEL_VISIBLE|GTK_ACCEL_LOCKED );
}
}
/*-----------------------------------------------------------------*/
/**
- * Create a radio button as a menu entry
+ * Create a radio button as a menu entry
*
* \param m IN menu to be extended
* \param helpStr IN reference into help
* \param labelStr IN text for entry
* \param acclKey IN accelerator key to add
- * \param action IN callback function
+ * \param action IN callback function
* \param data IN application data
* \param helpStr IN
* \return menu entry
*/
wMenuRadio_p wMenuRadioCreate(
- wMenu_p m,
- const char * helpStr,
- const char * labelStr,
- long acclKey,
- wMenuCallBack_p action,
- void *data )
+ wMenu_p m,
+ const char * helpStr,
+ const char * labelStr,
+ long acclKey,
+ wMenuCallBack_p action,
+ void *data )
{
wMenuRadio_p mi;
mi = (wMenuRadio_p)createMenuItem( m, M_RADIO, helpStr, labelStr, sizeof *mi );
//~ if (m->mmtype == MM_POPUP && !testMenuPopup)
- //~ return mi;
+ //~ return mi;
setAcclKey( m->parent, m->menu, MMENUITEM( mi ), acclKey );
mi->action = action;
mi->data = data;
@@ -351,37 +361,38 @@ wMenuRadio_p wMenuRadioCreate(
* \return
*/
-void wMenuRadioSetActive(
- wMenuRadio_p mi )
+void wMenuRadioSetActive(
+ wMenuRadio_p mi )
{
- gtk_check_menu_item_set_active( (GtkCheckMenuItem *)MMENUITEM(mi), TRUE );
-}
+ gtk_check_menu_item_set_active( (GtkCheckMenuItem *)MMENUITEM(mi), TRUE );
+}
/*-----------------------------------------------------------------*/
/**
- * Create a menu entry
+ * Create a menu entry
*
* \param m IN menu to be extended
* \param helpStr IN reference into help
* \param labelStr IN text for entry
* \param acclKey IN acceleratoor key to add
- * \param action IN callback function
+ * \param action IN callback function
* \param data IN application data
* \return menu entry
*/
wMenuPush_p wMenuPushCreate(
- wMenu_p m,
- const char * helpStr,
- const char * labelStr,
- long acclKey,
- wMenuCallBack_p action,
- void *data )
+ wMenu_p m,
+ const char * helpStr,
+ const char * labelStr,
+ long acclKey,
+ wMenuCallBack_p action,
+ void *data )
{
wMenuPush_p mi;
- mi = (wMenuPush_p)createMenuItem( m, M_PUSH, helpStr, labelStr, sizeof( struct wMenuPush_t ));
+ mi = (wMenuPush_p)createMenuItem( m, M_PUSH, helpStr, labelStr,
+ sizeof( struct wMenuPush_t ));
setAcclKey( m->parent, m->menu, MMENUITEM( mi ), acclKey );
@@ -395,13 +406,13 @@ wMenuPush_p wMenuPushCreate(
* Enable menu entry
*
* \param mi IN menu entry
- * \param enable IN new state
+ * \param enable IN new state
* \return
*/
void wMenuPushEnable(
- wMenuPush_p mi,
- wBool_t enable )
+ wMenuPush_p mi,
+ wBool_t enable )
{
mi->enabled = enable;
gtk_widget_set_sensitive( GTK_WIDGET(MMENUITEM( mi )), enable );
@@ -419,12 +430,13 @@ void wMenuPushEnable(
*/
wMenu_p wMenuMenuCreate(
- wMenu_p m,
- const char * helpStr,
- const char * labelStr )
+ wMenu_p m,
+ const char * helpStr,
+ const char * labelStr )
{
wMenu_p mi;
- mi = (wMenu_p)createMenuItem( m, M_MENU, helpStr, labelStr, sizeof( struct wMenu_t ));
+ mi = (wMenu_p)createMenuItem( m, M_MENU, helpStr, labelStr,
+ sizeof( struct wMenu_t ));
mi->mmtype = MM_MENU;
mi->menu = gtk_menu_new();
@@ -442,7 +454,7 @@ wMenu_p wMenuMenuCreate(
*/
void wMenuSeparatorCreate(
- wMenu_p m )
+ wMenu_p m )
{
createMenuItem( m, M_SEPARATOR, NULL, "", sizeof( struct wMenuItem_t ));
}
@@ -464,46 +476,48 @@ int getMlistOrigin( wMenuList_p ml, GList **pChildren )
int count = 0;
int found = -1;
GtkWidget *mitem = MMENUITEM( ml );
-
+
*pChildren = gtk_container_get_children( GTK_CONTAINER( MPARENT( ml )->menu ));
- if( !*pChildren )
+ if( !*pChildren ) {
return( -1 );
-
+ }
+
while( (mi = g_list_nth_data( *pChildren, count ))) {
if( mi == mitem ) {
found = TRUE;
break;
- }
- else {
+ } else {
count++;
- }
+ }
}
-
- if( found )
+
+ if( found ) {
return( count );
- else
+ } else {
return( -1 );
+ }
}
/**
- * Signal handler for clicking onto a menu list item.
+ * Signal handler for clicking onto a menu list item.
* Parameters are the GtkWidget as expected and the pointer to the MenuListItem
*
* \param widget IN the GtkWidget
- * \param value IN the menu list item
+ * \param value IN the menu list item
* \return
*/
static void pushMenuList(
- GtkWidget * widget,
- gpointer value )
+ GtkWidget * widget,
+ gpointer value )
{
// pointer to the list item
wMenuListItem_p ml = (wMenuListItem_p)value;
- if (MRECURSION( ml ))
+ if (MRECURSION( ml )) {
return;
-
+ }
+
if (ml->mlist->count <= 0) {
// this should never happen
fprintf( stderr, "pushMenuItem: empty list\n" );
@@ -514,31 +528,32 @@ static void pushMenuList(
const char * itemLabel;
itemLabel = gtk_menu_item_get_label( GTK_MENU_ITEM( widget ));
-
- ml->mlist->action( 0, itemLabel, ml->data );
+
+ ml->mlist->action( 0, itemLabel, ml->data );
return;
}
fprintf( stderr, "pushMenuItem: item (%lx) not found\n", (long)widget );
}
/**
- * Create a list menu entry
+ * Create a list menu entry
*
* \param m IN menu to be extended
* \param helpStr IN reference into help
* \param max IN maximum number of elements
- * \param action IN callback function
+ * \param action IN callback function
* \return menu entry
*/
wMenuList_p wMenuListCreate(
- wMenu_p m,
- const char * helpStr,
- int max,
- wMenuListCallBack_p action )
+ wMenu_p m,
+ const char * helpStr,
+ int max,
+ wMenuListCallBack_p action )
{
wMenuList_p mi;
- mi = (wMenuList_p)createMenuItem( m, M_LIST, NULL, _("<Empty List>"), sizeof( struct wMenuList_t ));
+ mi = (wMenuList_p)createMenuItem( m, M_LIST, NULL, _("<Empty List>"),
+ sizeof( struct wMenuList_t ));
gtk_widget_set_sensitive( GTK_WIDGET(MMENUITEM( mi )), FALSE );
mi->next = NULL;
mi->count = 0;
@@ -551,90 +566,96 @@ wMenuList_p wMenuListCreate(
/**
* Add a new item to a list of menu entries
- * The placeholder for the list is looked up. Then the new item is added immediately
+ * The placeholder for the list is looked up. Then the new item is added immediately
* behind it. In case the maximum number of items is reached the last item is removed.
*
* \param ml IN handle for the menu list - the placeholder item
* \param index IN position of new menu item
- * \param labelStr IN the menu label for the new item
+ * \param labelStr IN the menu label for the new item
* \param data IN application data for the new item
- * \return
+ * \return
*/
void wMenuListAdd(
- wMenuList_p ml,
- int index,
- const char * labelStr,
- const void * data )
+ wMenuList_p ml,
+ int index,
+ const char * labelStr,
+ const void * data )
{
int i = 0;
GList * children;
i = getMlistOrigin( ml, &children );
-
+
if( i > -1 ) {
wMenuListItem_p mi;
// we're adding an item, so hide the default placeholder
gtk_widget_hide( MMENUITEM( ml ));
-
+
// delete an earlier entry with the same label
- wMenuListDelete( ml, labelStr );
+ wMenuListDelete( ml, labelStr );
// a new item
ml->count ++;
-
+
// is there a maximum number of items set and reached with the new item?
if(( ml->max != -1 ) && ( ml->count > ml-> max )) {
wMenuListItem_p mold;
GtkWidget * item;
-
+
// get the last item in the list
item = g_list_nth_data( children, i + ml->max );
// get the pointer to the data structure
mold = g_object_get_data( G_OBJECT( item ), WLISTITEM );
// kill the menu entry
gtk_widget_destroy( item );
- // free the data
+ // free the data
free( (void *)mold->labelStr );
free( (void *)mold );
ml->count--;
- }
-
+ }
+
// create the new menu item and initialize the data fields
- mi = (wMenuListItem_p)wlibAlloc( NULL, B_MENUITEM, 0, 0, labelStr, sizeof( struct wMenuListItem_t ), NULL );
+ mi = (wMenuListItem_p)wlibAlloc( NULL, B_MENUITEM, 0, 0, labelStr,
+ sizeof( struct wMenuListItem_t ), NULL );
MITEMTYPE( mi ) = M_LISTITEM;
MMENUITEM( mi ) = gtk_menu_item_new_with_label(wlibConvertInput(mi->labelStr));
mi->data = (void *)data;
mi->mlist = ml;
g_object_set_data( G_OBJECT(MMENUITEM( mi )), WLISTITEM, mi );
-
+
// add the item to the menu
- if ( index < 0 )
+ if ( index < 0 ) {
index = 0;
- if ( index >= ml->count )
+ }
+ if ( index >= ml->count ) {
index = ml->count - 1;
- gtk_menu_shell_insert((GtkMenuShell *)(MPARENT( ml )->menu), MMENUITEM( mi ), i + index + 1 );
- g_signal_connect( GTK_OBJECT(MMENUITEM( mi )), "activate", G_CALLBACK(pushMenuList), mi );
-
+ }
+ gtk_menu_shell_insert((GtkMenuShell *)(MPARENT( ml )->menu), MMENUITEM( mi ),
+ i + index + 1 );
+ g_signal_connect( GTK_OBJECT(MMENUITEM( mi )), "activate",
+ G_CALLBACK(pushMenuList), mi );
+
gtk_widget_show(MMENUITEM( mi ));
}
-
- if( children )
+
+ if( children ) {
g_list_free( children );
+ }
}
/**
* Remove the menu entry identified by a given label.
*
* \param ml IN menu list
- * \param labelStr IN label string of item
+ * \param labelStr IN label string of item
*/
void wMenuListDelete(
- wMenuList_p ml,
- const char * labelStr )
+ wMenuList_p ml,
+ const char * labelStr )
{
int i;
int found = FALSE;
@@ -642,30 +663,31 @@ void wMenuListDelete(
// find the placeholder for the list in the menu
i = getMlistOrigin( ml, &children );
-
+
if( i > -1 ) {
int origin;
- GtkWidget * item;
+ GtkWidget * item;
char * labelStrConverted;
-
+
// starting from the placeholder, find the menu item with the correct text
found = FALSE;
labelStrConverted = wlibConvertInput( labelStr );
origin = i;
-
+
// get menu item
// get label of item
// compare items
// if identical, leave loop
while( i <= origin + ml->count && !found ) {
const char * itemLabel;
-
+
item = g_list_nth_data( children, i );
itemLabel = gtk_menu_item_get_label( GTK_MENU_ITEM( item ));
- if( !g_utf8_collate (itemLabel, labelStrConverted ))
+ if( !g_utf8_collate (itemLabel, labelStrConverted )) {
found = TRUE;
- else
+ } else {
i++;
+ }
}
if( found ) {
wMenuListItem_p mold;
@@ -673,45 +695,47 @@ void wMenuListDelete(
mold = g_object_get_data( G_OBJECT( item ), WLISTITEM );
// kill the menu entry
gtk_widget_destroy( item );
- // free the data
+ // free the data
free( (void *)mold->labelStr );
free( (void *)mold );
- ml->count--;
+ ml->count--;
}
- }
-
- if( children )
+ }
+
+ if( children ) {
g_list_free( children );
+ }
}
/**
* Get the label and the application data of a specific menu list item
*
- * \param ml IN menu list
+ * \param ml IN menu list
* \param index IN item within list
* \param data OUT application data
* \return item label
*/
-const char *
+const char *
wMenuListGet( wMenuList_p ml, int index, void ** data )
{
int i;
GList * children;
const char * itemLabel = NULL;
-
+
// check whether index is in range, if not return immediately
if ( index >= ml->count || ml->count <= 0 ) {
- if (data)
+ if (data) {
*data = NULL;
+ }
return NULL;
}
-
+
// find the placeholder for the list in the menu
i = getMlistOrigin( ml, &children );
-
+
if( i > -1 ) {
GtkWidget * item;
wMenuListItem_p mold;
@@ -721,10 +745,11 @@ wMenuListGet( wMenuList_p ml, int index, void ** data )
mold = g_object_get_data( G_OBJECT( GTK_MENU_ITEM( item ) ), WLISTITEM );
*data = mold->data;
}
-
- if( children )
+
+ if( children ) {
g_list_free( children );
-
+ }
+
return itemLabel;
}
@@ -735,16 +760,17 @@ wMenuListGet( wMenuList_p ml, int index, void ** data )
*/
void wMenuListClear(
- wMenuList_p ml )
+ wMenuList_p ml )
{
int origin;
GList * children;
- if (ml->count == 0)
+ if (ml->count == 0) {
return;
+ }
origin = getMlistOrigin( ml, &children );
-
+
if( origin > -1 ) {
int i;
@@ -752,23 +778,24 @@ void wMenuListClear(
while( i < origin + ml->count ) {
wMenuListItem_p mold;
GtkWidget * item;
-
+
item = g_list_nth_data( children, i + 1 );
mold = g_object_get_data( G_OBJECT( item ), WLISTITEM );
// kill the menu entry
gtk_widget_destroy( item );
- // free the data
+ // free the data
free( (void *)mold->labelStr );
free( (void *)mold );
i++;
- }
- }
+ }
+ }
ml->count = 0;
gtk_widget_show( MMENUITEM( ml ));
-
- if( children )
+
+ if( children ) {
g_list_free( children );
+ }
}
/*-----------------------------------------------------------------*/
/**
@@ -779,30 +806,31 @@ void wMenuListClear(
* \param labelStr IN text for entry
* \param acclKey IN acceleratoor key to add
* \param set IN initial state
- * \param action IN callback function
+ * \param action IN callback function
* \param data IN application data
* \return menu entry
*/
wMenuToggle_p wMenuToggleCreate(
- wMenu_p m,
- const char * helpStr,
- const char * labelStr,
- long acclKey,
- wBool_t set,
- wMenuToggleCallBack_p action,
- void * data )
+ wMenu_p m,
+ const char * helpStr,
+ const char * labelStr,
+ long acclKey,
+ wBool_t set,
+ wMenuCallBack_p action,
+ void * data )
{
wMenuToggle_p mt;
- mt = (wMenuToggle_p)createMenuItem( m, M_TOGGLE, helpStr, labelStr, sizeof( struct wMenuToggle_t ));
+ mt = (wMenuToggle_p)createMenuItem( m, M_TOGGLE, helpStr, labelStr,
+ sizeof( struct wMenuToggle_t ));
setAcclKey( m->parent, m->menu, MMENUITEM( mt ), acclKey );
mt->action = action;
mt->data = data;
mt->enabled = TRUE;
MPARENT( mt ) = m;
wMenuToggleSet( mt, set );
-
+
return mt;
}
@@ -814,7 +842,7 @@ wMenuToggle_p wMenuToggleCreate(
*/
wBool_t wMenuToggleGet(
- wMenuToggle_p mt )
+ wMenuToggle_p mt )
{
return mt->set;
}
@@ -828,11 +856,11 @@ wBool_t wMenuToggleGet(
*/
wBool_t wMenuToggleSet(
- wMenuToggle_p mt,
- wBool_t set )
+ wMenuToggle_p mt,
+ wBool_t set )
{
wBool_t rc;
- if (mt==NULL) return 0;
+ if (mt==NULL) { return 0; }
MRECURSION( mt )++;
gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(MMENUITEM( mt )), set );
MRECURSION( mt )--;
@@ -845,13 +873,13 @@ wBool_t wMenuToggleSet(
* Enable menu entry containing a check box
*
* \param mi IN menu entry
- * \param enable IN new state
+ * \param enable IN new state
* \return
*/
void wMenuToggleEnable(
- wMenuToggle_p mt,
- wBool_t enable )
+ wMenuToggle_p mt,
+ wBool_t enable )
{
mt->enabled = enable;
}
@@ -860,29 +888,30 @@ void wMenuToggleEnable(
/*-----------------------------------------------------------------*/
/**
- * Set the text for a menu
+ * Set the text for a menu
*
* \param m IN menu entry
* \param labelStr IN new text
* \return
*/
-void wMenuSetLabel( wMenu_p m, const char * labelStr) {
+void wMenuSetLabel( wMenu_p m, const char * labelStr)
+{
wlibSetLabel( m->widget, m->option, labelStr, &m->labelG, &m->imageG );
}
/**
- * Signal handler for menu items. Parameters are the GtkWidget as
+ * Signal handler for menu items. Parameters are the GtkWidget as
* expected and the pointer to the MenuListItem
*
* \param widget IN the GtkWidget
- * \param value IN the menu list item
+ * \param value IN the menu list item
* \return
*/
static gint pushMenu(
- GtkWidget * widget,
- wMenu_p m )
+ GtkWidget * widget,
+ wMenu_p m )
{
gtk_menu_popup( GTK_MENU(m->menu), NULL, NULL, NULL, NULL, 0, 0 );
/* Tell calling code that we have handled this event; the buck
@@ -903,12 +932,12 @@ static gint pushMenu(
*/
wMenu_p wMenuCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- const char * labelStr,
- long option )
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option )
{
wMenu_p m;
m = wlibAlloc( parent, B_MENU, x, y, labelStr, sizeof( struct wMenu_t ), NULL );
@@ -920,12 +949,12 @@ wMenu_p wMenuCreate(
m->widget = gtk_button_new();
g_signal_connect (GTK_OBJECT(m->widget), "clicked",
- G_CALLBACK(pushMenu), m );
+ G_CALLBACK(pushMenu), m );
m->menu = gtk_menu_new();
wMenuSetLabel( m, labelStr );
-
+
gtk_fixed_put( GTK_FIXED(parent->widget), m->widget, m->realX, m->realY );
wlibControlGetSize( (wControl_p)m );
if ( m->w < 80 && (m->option&BO_ICON)==0) {
@@ -939,27 +968,27 @@ wMenu_p wMenuCreate(
}
/**
- * Add a drop-down menu to the menu bar.
+ * Add a drop-down menu to the menu bar.
*
- * \param w IN main window handle
+ * \param w IN main window handle
* \param helpStr IN unused (should be help topic )
- * \param labelStr IN label for the drop-down menu
+ * \param labelStr IN label for the drop-down menu
* \return pointer to the created drop-down menu
*/
wMenu_p wMenuBarAdd(
- wWin_p w,
- const char * helpStr,
- const char * labelStr )
+ wWin_p w,
+ const char * helpStr,
+ const char * labelStr )
{
wMenu_p m;
GtkWidget * menuItem;
-
+
m = wlibAlloc( w, B_MENU, 0, 0, labelStr, sizeof( struct wMenu_t ), NULL );
m->mmtype = MM_BAR;
m->realX = 0;
m->realY = 0;
-
+
menuItem = gtk_menu_item_new_with_mnemonic( wlibConvertInput(m->labelStr) );
m->menu = gtk_menu_new();
gtk_menu_item_set_submenu( GTK_MENU_ITEM(menuItem), m->menu );
@@ -968,10 +997,10 @@ wMenu_p wMenuBarAdd(
m->w = 0;
m->h = 0;
-
+
/* TODO: why is help not supported here? */
/*gtkAddHelpString( m->panel_item, helpStr );*/
-
+
return m;
}
@@ -982,13 +1011,13 @@ wMenu_p wMenuBarAdd(
* Create a popup menu (context menu)
*
* \param w IN parent window
- * \param labelStr IN label
+ * \param labelStr IN label
* \return the created menu
*/
wMenu_p wMenuPopupCreate(
- wWin_p w,
- const char * labelStr )
+ wWin_p w,
+ const char * labelStr )
{
wMenu_p b;
b = wlibAlloc( w, B_MENU, 0, 0, labelStr, sizeof *b, NULL );
@@ -999,10 +1028,11 @@ wMenu_p wMenuPopupCreate(
b->w = 0;
b->h = 0;
g_signal_connect( GTK_OBJECT (b->menu), "key_press_event",
- G_CALLBACK(catch_shift_ctrl_alt_keys), b);
+ G_CALLBACK(catch_shift_ctrl_alt_keys), b);
g_signal_connect( GTK_OBJECT (b->menu), "key_release_event",
- G_CALLBACK (catch_shift_ctrl_alt_keys), b);
- gtk_widget_set_events ( GTK_WIDGET(b->menu), GDK_EXPOSURE_MASK|GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK );
+ G_CALLBACK (catch_shift_ctrl_alt_keys), b);
+ gtk_widget_set_events ( GTK_WIDGET(b->menu),
+ GDK_EXPOSURE_MASK|GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK );
return b;
}
@@ -1023,30 +1053,30 @@ void wMenuPopupShow( wMenu_p mp )
/**
* ?? Seems to be related to macro / automatic playback functionality
*
- * \param m IN
- * \param func IN
- * \param data IN
+ * \param m IN
+ * \param func IN
+ * \param data IN
*/
void wMenuSetTraceCallBack(
- wMenu_p m,
- wMenuTraceCallBack_p func,
- void * data )
+ wMenu_p m,
+ wMenuTraceCallBack_p func,
+ void * data )
{
m->traceFunc = func;
m->traceData = data;
}
/**
- * ??? same as above
- * \param m IN
- * \param label IN
+ * ??? same as above
+ * \param m IN
+ * \param label IN
* \return describe the return value
*/
wBool_t wMenuAction(
- wMenu_p m,
- const char * label )
+ wMenu_p m,
+ const char * label )
{
wMenuItem_p mi;
wMenuToggle_p mt;
@@ -1056,10 +1086,11 @@ wBool_t wMenuAction(
case M_SEPARATOR:
break;
case M_PUSH:
- if ( ((wMenuPush_p)mi)->enabled == FALSE )
+ if ( ((wMenuPush_p)mi)->enabled == FALSE ) {
wBeep();
- else
+ } else {
((wMenuPush_p)mi)->action( ((wMenuPush_p)mi)->data );
+ }
break;
case M_TOGGLE:
mt = (wMenuToggle_p)mi;
@@ -1067,7 +1098,7 @@ wBool_t wMenuAction(
wBeep();
} else {
wMenuToggleSet( mt, !mt->set );
- mt->action( mt->set, mt->data );
+ mt->action( mt->data );
}
break;
case M_MENU:
@@ -1076,7 +1107,7 @@ wBool_t wMenuAction(
break;
default:
/*fprintf(stderr, "Oops: wMenuAction\n");*/
- break;
+ break;
}
return TRUE;
}
diff --git a/app/wlib/gtklib/message.c b/app/wlib/gtklib/message.c
index af37d22..6a63434 100644
--- a/app/wlib/gtklib/message.c
+++ b/app/wlib/gtklib/message.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
@@ -42,10 +42,10 @@
*/
struct wMessage_t {
- WOBJ_COMMON
- GtkWidget * labelWidget;
- const char * message;
- wPos_t labelWidth;
+ WOBJ_COMMON
+ GtkWidget * labelWidget;
+ const char * message;
+ wWinPix_t labelWidth;
};
/**
@@ -57,14 +57,14 @@ struct wMessage_t {
*/
void wMessageSetValue(
- wMessage_p b,
- const char * arg)
+ wMessage_p b,
+ const char * arg)
{
- if (b->widget == 0) {
- abort();
- }
+ if (b->widget == 0) {
+ abort();
+ }
- gtk_label_set_text(GTK_LABEL(b->labelWidget), wlibConvertInput(arg));
+ gtk_label_set_text(GTK_LABEL(b->labelWidget), wlibConvertInput(arg));
}
/**
@@ -76,11 +76,11 @@ void wMessageSetValue(
*/
void wMessageSetWidth(
- wMessage_p b,
- wPos_t width)
+ wMessage_p b,
+ wWinPix_t width)
{
- b->labelWidth = width;
- gtk_widget_set_size_request(b->widget, width, -1);
+ b->labelWidth = width;
+ gtk_widget_set_size_request(b->widget, width, -1);
}
/**
@@ -90,48 +90,48 @@ void wMessageSetWidth(
* \return text height
*/
-wPos_t wMessageGetHeight(
- long flags)
+wWinPix_t wMessageGetHeight(
+ long flags)
{
- GtkWidget * temp;
+ GtkWidget * temp;
- if (!(flags&COMBOBOX)) {
+ if (!(flags&COMBOBOX)) {
temp = gtk_label_new("Test"); //To get size of text itself
- } else {
- temp = gtk_combo_box_text_new(); //to get max size of an object in infoBar
- }
-
- if (wMessageSetFont(flags)) {
- GtkStyle *style;
- PangoFontDescription *fontDesc;
- int fontSize;
- /* get the current font descriptor */
- style = gtk_widget_get_style(temp);
- fontDesc = style->font_desc;
- /* get the current font size */
- fontSize = PANGO_PIXELS(pango_font_description_get_size(fontDesc));
-
- /* calculate the new font size */
- if (flags & BM_LARGE) {
- pango_font_description_set_size(fontDesc, fontSize * 1.4 * PANGO_SCALE);
- } else {
- pango_font_description_set_size(fontDesc, fontSize * 0.7 * PANGO_SCALE);
- }
-
- /* set the new font size */
- gtk_widget_modify_font(temp, fontDesc);
- }
-
- if (flags&1L) {
- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(temp),"Test");
- }
-
- GtkRequisition temp_requisition;
- gtk_widget_size_request(temp,&temp_requisition);
- g_object_ref_sink(temp);
- gtk_widget_destroy(temp);
- g_object_unref(temp);
- return temp_requisition.height;
+ } else {
+ temp = gtk_combo_box_text_new(); //to get max size of an object in infoBar
+ }
+
+ if (wMessageSetFont(flags)) {
+ GtkStyle *style;
+ PangoFontDescription *fontDesc;
+ int fontSize;
+ /* get the current font descriptor */
+ style = gtk_widget_get_style(temp);
+ fontDesc = style->font_desc;
+ /* get the current font size */
+ fontSize = PANGO_PIXELS(pango_font_description_get_size(fontDesc));
+
+ /* calculate the new font size */
+ if (flags & BM_LARGE) {
+ pango_font_description_set_size(fontDesc, fontSize * 1.4 * PANGO_SCALE);
+ } else {
+ pango_font_description_set_size(fontDesc, fontSize * 0.7 * PANGO_SCALE);
+ }
+
+ /* set the new font size */
+ gtk_widget_modify_font(temp, fontDesc);
+ }
+
+ if (flags&1L) {
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(temp),"Test");
+ }
+
+ GtkRequisition temp_requisition;
+ gtk_widget_size_request(temp,&temp_requisition);
+ g_object_ref_sink(temp);
+ gtk_widget_destroy(temp);
+ g_object_unref(temp);
+ return temp_requisition.height;
}
/**
@@ -148,61 +148,61 @@ wPos_t wMessageGetHeight(
*/
wMessage_p wMessageCreateEx(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * labelStr,
- wPos_t width,
- const char *message,
- long flags)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * labelStr,
+ wWinPix_t width,
+ const char *message,
+ long flags)
{
- wMessage_p b;
- GtkRequisition requisition;
- GtkStyle *style;
- PangoFontDescription *fontDesc;
- int fontSize;
- b = (wMessage_p)wlibAlloc(parent, B_MESSAGE, x, y, NULL, sizeof *b, NULL);
- wlibComputePos((wControl_p)b);
- b->message = message;
- b->labelWidth = width;
- b->labelWidget = gtk_label_new(message?wlibConvertInput(message):"");
-
- /* do we need to set a special font? */
- if (wMessageSetFont(flags)) {
- /* get the current font descriptor */
- style = gtk_widget_get_style(GTK_WIDGET(b->labelWidget));
- fontDesc = style->font_desc;
- /* get the current font size */
- fontSize = PANGO_PIXELS(pango_font_description_get_size(fontDesc));
-
- /* calculate the new font size */
- if (flags & BM_LARGE) {
- pango_font_description_set_size(fontDesc, fontSize * 1.4 * PANGO_SCALE);
- } else {
- pango_font_description_set_size(fontDesc, fontSize * 0.7 * PANGO_SCALE);
- }
-
- /* set the new font size */
- gtk_widget_modify_font((GtkWidget *)b->labelWidget, fontDesc);
- }
-
- b->widget = gtk_fixed_new();
- gtk_widget_size_request(GTK_WIDGET(b->labelWidget), &requisition);
- gtk_container_add(GTK_CONTAINER(b->widget), b->labelWidget);
- gtk_widget_set_size_request(b->widget, width?width:requisition.width,
- requisition.height);
- wlibControlGetSize((wControl_p)b);
- gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
- gtk_widget_show(b->widget);
- gtk_widget_show(b->labelWidget);
- wlibAddButton((wControl_p)b);
-
- /* Reset font size to normal */
- if (wMessageSetFont(flags)) {
- pango_font_description_set_size(fontDesc, fontSize * PANGO_SCALE);
- }
-
- return b;
+ wMessage_p b;
+ GtkRequisition requisition;
+ GtkStyle *style;
+ PangoFontDescription *fontDesc;
+ int fontSize;
+ b = (wMessage_p)wlibAlloc(parent, B_MESSAGE, x, y, NULL, sizeof *b, NULL);
+ wlibComputePos((wControl_p)b);
+ b->message = message;
+ b->labelWidth = width;
+ b->labelWidget = gtk_label_new(message?wlibConvertInput(message):"");
+
+ /* do we need to set a special font? */
+ if (wMessageSetFont(flags)) {
+ /* get the current font descriptor */
+ style = gtk_widget_get_style(GTK_WIDGET(b->labelWidget));
+ fontDesc = style->font_desc;
+ /* get the current font size */
+ fontSize = PANGO_PIXELS(pango_font_description_get_size(fontDesc));
+
+ /* calculate the new font size */
+ if (flags & BM_LARGE) {
+ pango_font_description_set_size(fontDesc, fontSize * 1.4 * PANGO_SCALE);
+ } else {
+ pango_font_description_set_size(fontDesc, fontSize * 0.7 * PANGO_SCALE);
+ }
+
+ /* set the new font size */
+ gtk_widget_modify_font((GtkWidget *)b->labelWidget, fontDesc);
+ }
+
+ b->widget = gtk_fixed_new();
+ gtk_widget_size_request(GTK_WIDGET(b->labelWidget), &requisition);
+ gtk_container_add(GTK_CONTAINER(b->widget), b->labelWidget);
+ gtk_widget_set_size_request(b->widget, width?width:requisition.width,
+ requisition.height);
+ wlibControlGetSize((wControl_p)b);
+ gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
+ gtk_widget_show(b->widget);
+ gtk_widget_show(b->labelWidget);
+ wlibAddButton((wControl_p)b);
+
+ /* Reset font size to normal */
+ if (wMessageSetFont(flags)) {
+ pango_font_description_set_size(fontDesc, fontSize * PANGO_SCALE);
+ }
+
+ return b;
}
/**
@@ -212,13 +212,13 @@ wMessage_p wMessageCreateEx(
* \return expected width of message box
*/
-wPos_t
+wWinPix_t
wMessageGetWidth(const char *testString)
{
- GtkWidget *entry;
- GtkRequisition requisition;
+// GtkWidget *entry;
+// GtkRequisition requisition;
- return( wLabelWidth(testString));
+ return( wLabelWidth(testString));
// entry = gtk_entry_new();
// g_object_ref_sink(entry);
//
diff --git a/app/wlib/gtklib/notice.c b/app/wlib/gtklib/notice.c
index 0134b4f..5ab352b 100644
--- a/app/wlib/gtklib/notice.c
+++ b/app/wlib/gtklib/notice.c
@@ -41,9 +41,9 @@
static char * wlibChgMnemonic(char *label);
typedef struct {
- GtkWidget * win;
- GtkWidget * label;
- GtkWidget * butt[3];
+ GtkWidget * win;
+ GtkWidget * label;
+ GtkWidget * butt[3];
} notice_win;
static notice_win noticeW;
static long noticeValue;
@@ -55,17 +55,17 @@ static long noticeValue;
*/
static void doNotice(
- GtkWidget * widget,
- long value)
+ GtkWidget * widget,
+ long value)
{
- if (value != 2) {
- // event not from from closing the window but from a button press
- // Close the Notice dialog
- gtk_widget_destroy(noticeW.win);
- // Remember the button
- noticeValue = value;
- }
- wlibDoModal(NULL, FALSE);
+ if (value != 2) {
+ // event not from from closing the window but from a button press
+ // Close the Notice dialog
+ gtk_widget_destroy(noticeW.win);
+ // Remember the button
+ noticeValue = value;
+ }
+ wlibDoModal(NULL, FALSE);
}
/**
@@ -84,48 +84,48 @@ int wNoticeEx(int type,
const char * no)
{
- int res;
- unsigned flag;
- char *headline;
- GtkWidget *dialog;
- GtkWindow *parent = NULL;
+ int res;
+ unsigned flag = GTK_MESSAGE_ERROR;
+ char *headline = _("Error");
+ GtkWidget *dialog;
+ GtkWindow *parent = NULL;
- switch (type) {
- case NT_INFORMATION:
- flag = GTK_MESSAGE_INFO;
- headline = _("Information");
- break;
+ switch (type) {
+ case NT_INFORMATION:
+ flag = GTK_MESSAGE_INFO;
+ headline = _("Information");
+ break;
- case NT_WARNING:
- flag = GTK_MESSAGE_WARNING;
- headline = _("Warning");
- break;
+ case NT_WARNING:
+ flag = GTK_MESSAGE_WARNING;
+ headline = _("Warning");
+ break;
- case NT_ERROR:
- flag = GTK_MESSAGE_ERROR;
- headline = _("Error");
- break;
- }
+ case NT_ERROR:
+ flag = GTK_MESSAGE_ERROR;
+ headline = _("Error");
+ break;
+ }
- if (gtkMainW) {
- parent = GTK_WINDOW(gtkMainW->gtkwin);
- }
+ if (gtkMainW) {
+ parent = GTK_WINDOW(gtkMainW->gtkwin);
+ }
- wDestroySplash();
+ wDestroySplash();
- dialog = gtk_message_dialog_new(parent,
- GTK_DIALOG_DESTROY_WITH_PARENT,
- flag,
- ((no==NULL)?GTK_BUTTONS_OK:GTK_BUTTONS_YES_NO),
- "%s", msg);
- gtk_window_set_title(GTK_WINDOW(dialog), headline);
+ dialog = gtk_message_dialog_new(parent,
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ flag,
+ ((no==NULL)?GTK_BUTTONS_OK:GTK_BUTTONS_YES_NO),
+ "%s", msg);
+ gtk_window_set_title(GTK_WINDOW(dialog), headline);
- gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
+ gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
- res = gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
+ res = gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
- return res == GTK_RESPONSE_OK || res == GTK_RESPONSE_YES;
+ return res == GTK_RESPONSE_OK || res == GTK_RESPONSE_YES;
}
@@ -141,11 +141,11 @@ int wNoticeEx(int type,
*/
int wNotice(
- const char * msg, /* Message */
- const char * yes, /* First button label */
- const char * no) /* Second label (or 'NULL') */
+ const char * msg, /* Message */
+ const char * yes, /* First button label */
+ const char * no) /* Second label (or 'NULL') */
{
- return wNotice3(msg, yes, no, NULL);
+ return wNotice3(msg, yes, no, NULL);
}
/** \brief Popup a notice box with three buttons.
@@ -167,121 +167,121 @@ int wNotice(
*/
int wNotice3(
- const char * msg, /* Message */
- const char * affirmative, /* First button label */
- const char * cancel, /* Second label (or 'NULL') */
- const char * alternate)
+ const char * msg, /* Message */
+ const char * affirmative, /* First button label */
+ const char * cancel, /* Second label (or 'NULL') */
+ const char * alternate)
{
- notice_win *nw;
- GtkWidget * vbox;
- GtkWidget * hbox;
- GtkWidget * hbox1;
- GtkWidget * image;
- nw = &noticeW;
-
- char *aff = NULL;
- char *can = NULL;
- char *alt = NULL;
-
- wDestroySplash();
-
- nw->win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-
- gtk_window_set_position(GTK_WINDOW(nw->win), GTK_WIN_POS_CENTER);
- gtk_container_set_border_width(GTK_CONTAINER(nw->win), 0);
- gtk_window_set_resizable(GTK_WINDOW(nw->win), FALSE);
- gtk_window_set_modal(GTK_WINDOW(nw->win), TRUE);
- gtk_window_set_type_hint(GTK_WINDOW(nw->win), GDK_WINDOW_TYPE_HINT_DIALOG);
-
- vbox = gtk_vbox_new(FALSE, 12);
- gtk_widget_show(vbox);
- gtk_container_add(GTK_CONTAINER(nw->win), vbox);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
-
- hbox = gtk_hbox_new(FALSE, 12);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
- gtk_widget_show(hbox);
-
- image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_WARNING,
- GTK_ICON_SIZE_DIALOG);
- gtk_widget_show(image);
- gtk_box_pack_start(GTK_BOX(hbox), image, TRUE, TRUE, 0);
- gtk_misc_set_alignment(GTK_MISC(image), 0, 0);
-
- /* create the text label, allow GTK to wrap and allow for markup (for future enhancements) */
- nw->label = gtk_label_new(msg);
- gtk_widget_show(nw->label);
- gtk_box_pack_end(GTK_BOX(hbox), nw->label, TRUE, TRUE, 0);
- gtk_label_set_use_markup(GTK_LABEL(nw->label), FALSE);
- gtk_label_set_line_wrap(GTK_LABEL(nw->label), TRUE);
- gtk_misc_set_alignment(GTK_MISC(nw->label), 0, 0);
-
- /* this hbox will include the button bar */
- hbox1 = gtk_hbox_new(TRUE, 0);
- gtk_widget_show(hbox1);
- gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, TRUE, 0);
-
- /* add the respective buttons */
- aff = wlibChgMnemonic((char *) affirmative);
- nw->butt[ 0 ] = gtk_button_new_with_mnemonic(aff);
- gtk_widget_show(nw->butt[ 0 ]);
- gtk_box_pack_end(GTK_BOX(hbox1), nw->butt[ 0 ], TRUE, TRUE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(nw->butt[ 0 ]), 3);
- g_signal_connect(GTK_OBJECT(nw->butt[0]), "clicked", G_CALLBACK(doNotice),
- (void*)1);
- gtk_widget_set_can_default(nw->butt[ 0 ], TRUE);
-
- if (cancel) {
- can = wlibChgMnemonic((char *) cancel);
- nw->butt[ 1 ] = gtk_button_new_with_mnemonic(can);
- gtk_widget_show(nw->butt[ 1 ]);
- gtk_box_pack_end(GTK_BOX(hbox1), nw->butt[ 1 ], TRUE, TRUE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(nw->butt[ 1 ]), 3);
- g_signal_connect(GTK_OBJECT(nw->butt[1]), "clicked", G_CALLBACK(doNotice),
- (void*)0);
- gtk_widget_set_can_default(nw->butt[ 1 ], TRUE);
-
- if (alternate) {
- alt = wlibChgMnemonic((char *) alternate);
- nw->butt[ 2 ] = gtk_button_new_with_mnemonic(alt);
- gtk_widget_show(nw->butt[ 2 ]);
- gtk_box_pack_start(GTK_BOX(hbox1), nw->butt[ 2 ], TRUE, TRUE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(nw->butt[ 2 ]), 3);
- g_signal_connect(GTK_OBJECT(nw->butt[2]), "clicked", G_CALLBACK(doNotice),
- (void*)-1);
- gtk_widget_set_can_default(nw->butt[ 2 ], TRUE);
- }
- }
-
- g_signal_connect(GTK_WINDOW(nw->win),
- "destroy", G_CALLBACK(doNotice), (void*)2);
-
- gtk_widget_grab_default(nw->butt[ 0 ]);
- gtk_widget_grab_focus(nw->butt[ 0 ]);
-
- gtk_widget_show(nw->win);
-
- if (gtkMainW) {
- gtk_window_set_transient_for(GTK_WINDOW(nw->win), GTK_WINDOW(gtkMainW->gtkwin));
- /* gdk_window_set_group( nw->win->window, gtkMainW->gtkwin->window ); */
- }
-
- noticeValue = 0; // Default: Cancel
- wlibDoModal(NULL, TRUE);
-
- if (aff) {
- free(aff);
- }
-
- if (can) {
- free(can);
- }
-
- if (alt) {
- free(alt);
- }
-
- return noticeValue;
+ notice_win *nw;
+ GtkWidget * vbox;
+ GtkWidget * hbox;
+ GtkWidget * hbox1;
+ GtkWidget * image;
+ nw = &noticeW;
+
+ char *aff = NULL;
+ char *can = NULL;
+ char *alt = NULL;
+
+ wDestroySplash();
+
+ nw->win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
+ gtk_window_set_position(GTK_WINDOW(nw->win), GTK_WIN_POS_CENTER);
+ gtk_container_set_border_width(GTK_CONTAINER(nw->win), 0);
+ gtk_window_set_resizable(GTK_WINDOW(nw->win), FALSE);
+ gtk_window_set_modal(GTK_WINDOW(nw->win), TRUE);
+ gtk_window_set_type_hint(GTK_WINDOW(nw->win), GDK_WINDOW_TYPE_HINT_DIALOG);
+
+ vbox = gtk_vbox_new(FALSE, 12);
+ gtk_widget_show(vbox);
+ gtk_container_add(GTK_CONTAINER(nw->win), vbox);
+ gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
+
+ hbox = gtk_hbox_new(FALSE, 12);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+ gtk_widget_show(hbox);
+
+ image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_WARNING,
+ GTK_ICON_SIZE_DIALOG);
+ gtk_widget_show(image);
+ gtk_box_pack_start(GTK_BOX(hbox), image, TRUE, TRUE, 0);
+ gtk_misc_set_alignment(GTK_MISC(image), 0, 0);
+
+ /* create the text label, allow GTK to wrap and allow for markup (for future enhancements) */
+ nw->label = gtk_label_new(msg);
+ gtk_widget_show(nw->label);
+ gtk_box_pack_end(GTK_BOX(hbox), nw->label, TRUE, TRUE, 0);
+ gtk_label_set_use_markup(GTK_LABEL(nw->label), FALSE);
+ gtk_label_set_line_wrap(GTK_LABEL(nw->label), TRUE);
+ gtk_misc_set_alignment(GTK_MISC(nw->label), 0, 0);
+
+ /* this hbox will include the button bar */
+ hbox1 = gtk_hbox_new(TRUE, 0);
+ gtk_widget_show(hbox1);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, TRUE, 0);
+
+ /* add the respective buttons */
+ aff = wlibChgMnemonic((char *) affirmative);
+ nw->butt[ 0 ] = gtk_button_new_with_mnemonic(aff);
+ gtk_widget_show(nw->butt[ 0 ]);
+ gtk_box_pack_end(GTK_BOX(hbox1), nw->butt[ 0 ], TRUE, TRUE, 0);
+ gtk_container_set_border_width(GTK_CONTAINER(nw->butt[ 0 ]), 3);
+ g_signal_connect(GTK_OBJECT(nw->butt[0]), "clicked", G_CALLBACK(doNotice),
+ (void*)1);
+ gtk_widget_set_can_default(nw->butt[ 0 ], TRUE);
+
+ if (cancel) {
+ can = wlibChgMnemonic((char *) cancel);
+ nw->butt[ 1 ] = gtk_button_new_with_mnemonic(can);
+ gtk_widget_show(nw->butt[ 1 ]);
+ gtk_box_pack_end(GTK_BOX(hbox1), nw->butt[ 1 ], TRUE, TRUE, 0);
+ gtk_container_set_border_width(GTK_CONTAINER(nw->butt[ 1 ]), 3);
+ g_signal_connect(GTK_OBJECT(nw->butt[1]), "clicked", G_CALLBACK(doNotice),
+ (void*)0);
+ gtk_widget_set_can_default(nw->butt[ 1 ], TRUE);
+
+ if (alternate) {
+ alt = wlibChgMnemonic((char *) alternate);
+ nw->butt[ 2 ] = gtk_button_new_with_mnemonic(alt);
+ gtk_widget_show(nw->butt[ 2 ]);
+ gtk_box_pack_start(GTK_BOX(hbox1), nw->butt[ 2 ], TRUE, TRUE, 0);
+ gtk_container_set_border_width(GTK_CONTAINER(nw->butt[ 2 ]), 3);
+ g_signal_connect(GTK_OBJECT(nw->butt[2]), "clicked", G_CALLBACK(doNotice),
+ (void*)-1);
+ gtk_widget_set_can_default(nw->butt[ 2 ], TRUE);
+ }
+ }
+
+ g_signal_connect(GTK_WINDOW(nw->win),
+ "destroy", G_CALLBACK(doNotice), (void*)2);
+
+ gtk_widget_grab_default(nw->butt[ 0 ]);
+ gtk_widget_grab_focus(nw->butt[ 0 ]);
+
+ gtk_widget_show(nw->win);
+
+ if (gtkMainW) {
+ gtk_window_set_transient_for(GTK_WINDOW(nw->win), GTK_WINDOW(gtkMainW->gtkwin));
+ /* gdk_window_set_group( nw->win->window, gtkMainW->gtkwin->window ); */
+ }
+
+ noticeValue = 0; // Default: Cancel
+ wlibDoModal(NULL, TRUE);
+
+ if (aff) {
+ free(aff);
+ }
+
+ if (can) {
+ free(can);
+ }
+
+ if (alt) {
+ free(alt);
+ }
+
+ return noticeValue;
}
/* \brief Convert label string from Windows mnemonic to GTK
@@ -295,18 +295,18 @@ int wNotice3(
static
char * wlibChgMnemonic(char *label)
{
- char *ptr;
- char *cp;
+ char *ptr;
+ char *cp;
- cp = strdup(label);
+ cp = strdup(label);
- ptr = strchr(cp, '&');
+ ptr = strchr(cp, '&');
- if (ptr) {
- *ptr = '_';
- }
+ if (ptr) {
+ *ptr = '_';
+ }
- return (cp);
+ return (cp);
}
diff --git a/app/wlib/gtklib/opendocument.c b/app/wlib/gtklib/opendocument.c
index c03f9cb..5c057ec 100644
--- a/app/wlib/gtklib/opendocument.c
+++ b/app/wlib/gtklib/opendocument.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
@@ -55,24 +55,24 @@
static char *
ExtendPath(void)
{
- char *path = strdup(getenv("PATH"));
- DynString newPath;
- DynStringMalloc(&newPath, 16);
+ char *path = strdup(getenv("PATH"));
+ DynString newPath;
+ DynStringMalloc(&newPath, 16);
- // append XTrackCAD's directory to the path as a fallback
- DynStringCatCStrs(&newPath,
- path,
- ":",
- wGetAppLibDir(),
- NULL);
+ // append XTrackCAD's directory to the path as a fallback
+ DynStringCatCStrs(&newPath,
+ path,
+ ":",
+ wGetAppLibDir(),
+ NULL);
- setenv("PATH",
- DynStringToCStr(&newPath),
- TRUE);
+ setenv("PATH",
+ DynStringToCStr(&newPath),
+ TRUE);
- DynStringFree(&newPath);
+ DynStringFree(&newPath);
- return (path);
+ return (path);
}
/**
@@ -85,33 +85,33 @@ ExtendPath(void)
unsigned wOpenFileExternal(char * filename)
{
- int rc;
- DynString commandLine;
- char *currentPath;
-
- assert(filename != NULL);
- assert(strlen(filename));
-
- currentPath = ExtendPath();
-
- DynStringMalloc(&commandLine, 16);
- DynStringCatCStrs(&commandLine,
- DEFAULTOPENCOMMAND,
- " \"",
- filename,
- "\"",
- NULL);
-
- // the command should be found via the PATH
- rc = system(DynStringToCStr(&commandLine));
-
- // restore the PATH
- setenv("PATH",
- currentPath,
- TRUE);
-
- free(currentPath);
- DynStringFree(&commandLine);
-
- return(rc==0);
+ int rc;
+ DynString commandLine;
+ char *currentPath;
+
+ assert(filename != NULL);
+ assert(strlen(filename));
+
+ currentPath = ExtendPath();
+
+ DynStringMalloc(&commandLine, 16);
+ DynStringCatCStrs(&commandLine,
+ DEFAULTOPENCOMMAND,
+ " \"",
+ filename,
+ "\"",
+ NULL);
+
+ // the command should be found via the PATH
+ rc = system(DynStringToCStr(&commandLine));
+
+ // restore the PATH
+ setenv("PATH",
+ currentPath,
+ TRUE);
+
+ free(currentPath);
+ DynStringFree(&commandLine);
+
+ return(rc==0);
}
diff --git a/app/wlib/gtklib/osxhelp.c b/app/wlib/gtklib/osxhelp.c
index 4ec1f5e..b508961 100644
--- a/app/wlib/gtklib/osxhelp.c
+++ b/app/wlib/gtklib/osxhelp.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -28,7 +28,6 @@
#include <errno.h>
#include <fcntl.h>
-#include "misc.h"
#include "gtkint.h"
#include "i18n.h"
@@ -40,6 +39,7 @@ static pid_t pidOfChild;
static int handleOfPipe;
extern char *wExecutableName;
+extern wBool_t CheckHelpTopicExists(const char *);
/**
* Create the fully qualified filename for the help helper
@@ -51,15 +51,15 @@ extern char *wExecutableName;
static
char *ChildProgramFile(char *parentProgram)
{
- char *startOfFilename;
- char *childProgram;
+ char *startOfFilename;
+ char *childProgram;
- childProgram = malloc(strlen(parentProgram)+ sizeof(HELPERPROGRAM) + 1);
- strcpy(childProgram, parentProgram);
- startOfFilename = strrchr(childProgram, '/');
- strcpy(startOfFilename + 1, HELPERPROGRAM);
+ childProgram = malloc(strlen(parentProgram)+ sizeof(HELPERPROGRAM) + 1);
+ strcpy(childProgram, parentProgram);
+ startOfFilename = strrchr(childProgram, '/');
+ strcpy(startOfFilename + 1, HELPERPROGRAM);
- return (childProgram);
+ return (childProgram);
}
@@ -71,92 +71,93 @@ char *ChildProgramFile(char *parentProgram)
void wHelp(const char * topic)
{
- pid_t newPid;
- int status;
- const char html[] = ".html";
- static char *directory; /**< base directory for HTML files */
- char * htmlFile;
-
- struct {
- int length;
- char *page;
- } buffer;
-
- if (!CheckHelpTopicExists(topic)) return;
-
- // check whether child already exists
- if (pidOfChild != 0) {
- if (waitpid(pidOfChild, &status, WNOHANG) < 0) {
- // child exited -> clean up
- close(handleOfPipe);
- unlink(HELPCOMMANDPIPE);
- handleOfPipe = 0;
- pidOfChild = 0; // child exited
- }
- }
-
- // (re)start child
- if (pidOfChild == 0) {
- unlink(HELPCOMMANDPIPE);
- int rc = mkfifo(HELPCOMMANDPIPE, 0666);
- newPid = fork(); /* New process starts here */
-
- if (newPid > 0) {
- pidOfChild = newPid;
- } else if (newPid == 0) {
+ pid_t newPid;
+ int status;
+ const char html[] = ".html";
+ static char *directory; /**< base directory for HTML files */
+ char * htmlFile;
+
+ struct {
+ int length;
+ char *page;
+ } buffer;
+
+ if (!CheckHelpTopicExists(topic)) { return; }
+
+ // check whether child already exists
+ if (pidOfChild != 0) {
+ if (waitpid(pidOfChild, &status, WNOHANG) < 0) {
+ // child exited -> clean up
+ close(handleOfPipe);
+ unlink(HELPCOMMANDPIPE);
+ handleOfPipe = 0;
+ pidOfChild = 0; // child exited
+ }
+ }
+
+ // (re)start child
+ if (pidOfChild == 0) {
+ unlink(HELPCOMMANDPIPE);
+ int rc = mkfifo(HELPCOMMANDPIPE, 0666);
+ newPid = fork(); /* New process starts here */
+
+ if (newPid > 0) {
+ pidOfChild = newPid;
+ } else if (newPid == 0) {
char *child = ChildProgramFile(wExecutableName);
-
- if (execlp(child, child, NULL) < 0) { /* never normally returns */
- exit(8);
- }
-
- free(child);
- } else { /* -1 signifies fork failure */
- pidOfChild = 0;
- return;
- }
- }
-
- buffer.page = malloc(sizeof(int)+strlen(topic) + strlen(html) + 1);
-
- if (!buffer.page) {
- return;
- }
-
- strcpy(buffer.page, topic);
- strcat(buffer.page, html);
- buffer.length = strlen(buffer.page);
-
- if (buffer.length>255) {
- printf("Help Topic too long %s", buffer.page);
- return;
- }
-
- if (!handleOfPipe) {
+
+ if (execlp(child, child, NULL) < 0) { /* never normally returns */
+ exit(8);
+ }
+
+ free(child);
+ } else { /* -1 signifies fork failure */
+ pidOfChild = 0;
+ return;
+ }
+ }
+
+ buffer.page = malloc(sizeof(int)+strlen(topic) + strlen(html) + 1);
+
+ if (!buffer.page) {
+ return;
+ }
+
+ strcpy(buffer.page, topic);
+ strcat(buffer.page, html);
+ buffer.length = strlen(buffer.page);
+
+ if (buffer.length>255) {
+ printf("Help Topic too long %s", buffer.page);
+ return;
+ }
+
+ if (!handleOfPipe) {
handleOfPipe = open(HELPCOMMANDPIPE, O_WRONLY);
if (handleOfPipe < 0) {
- if (pidOfChild)
- kill(pidOfChild, SIGKILL); /* tidy up on next call */
+ if (pidOfChild) {
+ kill(pidOfChild, SIGKILL); /* tidy up on next call */
+ }
handleOfPipe = 0;
return;
}
}
- int written = 0;
- int towrite = sizeof(int);
+ int written = 0;
+ int towrite = sizeof(int);
- while (written < towrite){
- written += write(handleOfPipe, &buffer.length, sizeof(int));
- }
- written =0;
- towrite = strlen(buffer.page);
- while (written < towrite){
- written += write(handleOfPipe, buffer.page+written, towrite-written);
- }
+ while (written < towrite) {
+ written += write(handleOfPipe, &buffer.length, sizeof(int));
+ }
+ written =0;
+ towrite = strlen(buffer.page);
+ while (written < towrite) {
+ written += write(handleOfPipe, buffer.page+written, towrite-written);
+ }
- fsync(handleOfPipe);
+ fsync(handleOfPipe);
- free(buffer.page);
+ free(buffer.page);
}
diff --git a/app/wlib/gtklib/pixbuf.c b/app/wlib/gtklib/pixbuf.c
index 7b8d7d1..0d6e8b7 100644
--- a/app/wlib/gtklib/pixbuf.c
+++ b/app/wlib/gtklib/pixbuf.c
@@ -45,55 +45,55 @@
*/
GdkPixbuf* wlibMakePixbuf(
- wIcon_p ip)
+ wIcon_p ip)
{
- GdkPixbuf * pixbuf;
- char line0[40];
- char line2[40];
-
- assert(ip != NULL);
-
- if (ip->gtkIconType == gtkIcon_pixmap) {
- pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)ip->bits);
- } else {
- const char * bits;
- long rgb;
- int row,col,wb;
- char ** pixmapData;
-
- wb = (ip->w+7)/8;
- pixmapData = (char**)g_malloc((3+ip->h) * sizeof *pixmapData);
- pixmapData[0] = line0;
- rgb = wDrawGetRGB(ip->color);
- sprintf(line0, " %d %d 2 1", ip->w, ip->h);
- sprintf(line2, "# c #%2.2lx%2.2lx%2.2lx", (rgb>>16)&0xFF, (rgb>>8)&0xFF,
- rgb&0xFF);
- pixmapData[1] = ". c None s None";
- pixmapData[2] = line2;
- bits = ip->bits;
-
- for (row = 0; row<ip->h; row++) {
- pixmapData[row+3] = (char*)g_malloc((ip->w+1) * sizeof **pixmapData);
-
- for (col = 0; col<ip->w; col++) {
- if (bits[ row*wb+(col>>3) ] & (1<<(col&07))) {
- pixmapData[row+3][col] = '#';
- } else {
- pixmapData[row+3][col] = '.';
- }
- }
-
- pixmapData[row+3][ip->w] = 0;
- }
-
- pixbuf = gdk_pixbuf_new_from_xpm_data((const char **)pixmapData);
-
- for (row = 0; row<ip->h; row++) {
- g_free(pixmapData[row+3]);
- }
- }
-
- return pixbuf;
+ GdkPixbuf * pixbuf;
+ char line0[40];
+ char line2[40];
+
+ assert(ip != NULL);
+
+ if (ip->gtkIconType == gtkIcon_pixmap) {
+ pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)ip->bits);
+ } else {
+ const char * bits;
+ long rgb;
+ int row,col,wb;
+ char ** pixmapData;
+
+ wb = (ip->w+7)/8;
+ pixmapData = (char**)g_malloc((3+ip->h) * sizeof *pixmapData);
+ pixmapData[0] = line0;
+ rgb = wDrawGetRGB(ip->color);
+ sprintf(line0, " %ld %ld 2 1", ip->w, ip->h);
+ sprintf(line2, "# c #%2.2lx%2.2lx%2.2lx", (rgb>>16)&0xFF, (rgb>>8)&0xFF,
+ rgb&0xFF);
+ pixmapData[1] = ". c None s None";
+ pixmapData[2] = line2;
+ bits = ip->bits;
+
+ for (row = 0; row<ip->h; row++) {
+ pixmapData[row+3] = (char*)g_malloc((ip->w+1) * sizeof **pixmapData);
+
+ for (col = 0; col<ip->w; col++) {
+ if (bits[ row*wb+(col>>3) ] & (1<<(col&07))) {
+ pixmapData[row+3][col] = '#';
+ } else {
+ pixmapData[row+3][col] = '.';
+ }
+ }
+
+ pixmapData[row+3][ip->w] = 0;
+ }
+
+ pixbuf = gdk_pixbuf_new_from_xpm_data((const char **)pixmapData);
+
+ for (row = 0; row<ip->h; row++) {
+ g_free(pixmapData[row+3]);
+ }
+ }
+
+ return pixbuf;
}
diff --git a/app/wlib/gtklib/png.c b/app/wlib/gtklib/png.c
deleted file mode 100644
index 809de6a..0000000
--- a/app/wlib/gtklib/png.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/** \file png.c
- * PNG creation
- */
-
-/* XTrackCad - Model Railroad CAD
- * Copyright (C) 2015 Martin Fischer
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#define GTK_DISABLE_SINGLE_INCLUDES
-#define GDK_DISABLE_DEPRECATED
-#define GTK_DISABLE_DEPRECATED
-#define GSEAL_ENABLE
-
-#include <gtk/gtk.h>
-#include "gtkint.h"
-
-#define BITMAPFILEFORMAT "png"
-
-/**
-* Export as bitmap file.
-*
-* \param d IN the drawing area ?
-* \param fileName IN fully qualified filename for the bitmap file.
-* \return TRUE on success, FALSE on error
-*/
-
-wBool_t wBitMapWriteFile(wDraw_p d, const char * fileName)
-{
- GdkPixbuf *pixbuf;
- GError *error;
- gboolean res;
- pixbuf = gdk_pixbuf_get_from_drawable(NULL, (GdkWindow*)d->pixmap, NULL, 0, 0,
- 0, 0, d->w, d->h);
-
- if (!pixbuf) {
- wNoticeEx(NT_ERROR, "WriteBitMap: pixbuf_get failed", "Ok", NULL);
- return FALSE;
- }
-
- error = NULL;
- res = gdk_pixbuf_save(pixbuf, fileName, BITMAPFILEFORMAT, &error, NULL);
-
- if (res == FALSE) {
- wNoticeEx(NT_ERROR, "WriteBitMap: pixbuf_save failed", "Ok", NULL);
- return FALSE;
- }
-
- g_object_ref_sink(pixbuf);
- g_object_unref(pixbuf);
- return TRUE;
-}
diff --git a/app/wlib/gtklib/print.c b/app/wlib/gtklib/print.c
index 860a7c7..609efa9 100644
--- a/app/wlib/gtklib/print.c
+++ b/app/wlib/gtklib/print.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
@@ -79,8 +79,7 @@ extern struct wDraw_t psPrint_d;
static wBool_t printContinue; /**< control print job, FALSE for cancelling */
static wIndex_t pageCount; /**< unused, could be used for progress indicator */
-static wIndex_t
-totalPageCount; /**< unused, could be used for progress indicator */
+//static wIndex_t totalPageCount; /**< unused, could be used for progress indicator */
static double paperWidth; /**< physical paper width */
static double paperHeight; /**< physical paper height */
@@ -92,7 +91,7 @@ static double bBorder; /**< bottom margin */
static double scale_adjust = 1.0;
static double scale_text = 1.0;
-static long printFormat = PRINT_LANDSCAPE;
+//static long printFormat = PRINT_LANDSCAPE;
/*****************************************************************************
*
@@ -112,61 +111,61 @@ static void WlibGetPaperSize(void);
void
WlibApplySettings(GtkPrintOperation *op)
{
- gchar *filename;
- GError *err = NULL;
- GtkWidget *dialog;
-
- filename = g_build_filename(wGetAppWorkDir(), PRINTSETTINGS, NULL);
-
- if (!(settings = gtk_print_settings_new_from_file(filename, &err))) {
- if (err->code != G_FILE_ERROR_NOENT) {
- // ignore file not found error as defaults will be used
- dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- "%s",err->message);
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- } else {
- // create default print settings
- settings = gtk_print_settings_new();
- }
- g_error_free(err);
- }
-
- g_free(filename);
-
- if (settings && op) {
- gtk_print_operation_set_print_settings(op, settings);
- }
-
- err = NULL;
- filename = g_build_filename(wGetAppWorkDir(), PAGESETTINGS, NULL);
-
- if (!(page_setup = gtk_page_setup_new_from_file(filename, &err))) {
- // ignore file not found error as defaults will be used
- if (err->code != G_FILE_ERROR_NOENT) {
- dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- "%s",err->message);
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- } else {
- page_setup = gtk_page_setup_new();
- }
-
- g_error_free(err);
- } else {
- // on success get the paper dimensions
- WlibGetPaperSize();
- }
-
- g_free(filename);
-
- if (page_setup && op) {
- gtk_print_operation_set_default_page_setup(op, page_setup);
- }
+ gchar *filename;
+ GError *err = NULL;
+ GtkWidget *dialog;
+
+ filename = g_build_filename(wGetAppWorkDir(), PRINTSETTINGS, NULL);
+
+ if (!(settings = gtk_print_settings_new_from_file(filename, &err))) {
+ if (err->code != G_FILE_ERROR_NOENT) {
+ // ignore file not found error as defaults will be used
+ dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+ "%s",err->message);
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ } else {
+ // create default print settings
+ settings = gtk_print_settings_new();
+ }
+ g_error_free(err);
+ }
+
+ g_free(filename);
+
+ if (settings && op) {
+ gtk_print_operation_set_print_settings(op, settings);
+ }
+
+ err = NULL;
+ filename = g_build_filename(wGetAppWorkDir(), PAGESETTINGS, NULL);
+
+ if (!(page_setup = gtk_page_setup_new_from_file(filename, &err))) {
+ // ignore file not found error as defaults will be used
+ if (err->code != G_FILE_ERROR_NOENT) {
+ dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+ "%s",err->message);
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ } else {
+ page_setup = gtk_page_setup_new();
+ }
+
+ g_error_free(err);
+ } else {
+ // on success get the paper dimensions
+ WlibGetPaperSize();
+ }
+
+ g_free(filename);
+
+ if (page_setup && op) {
+ gtk_print_operation_set_default_page_setup(op, page_setup);
+ }
}
@@ -180,55 +179,55 @@ WlibApplySettings(GtkPrintOperation *op)
void
WlibSaveSettings(GtkPrintOperation *op)
{
- GError *err = NULL;
- gchar *filename;
- GtkWidget *dialog;
+ GError *err = NULL;
+ gchar *filename;
+ GtkWidget *dialog;
- if (op) {
- if (settings != NULL) {
- g_object_unref(settings);
- }
+ if (op) {
+ if (settings != NULL) {
+ g_object_unref(settings);
+ }
- settings = g_object_ref(gtk_print_operation_get_print_settings(op));
- }
+ settings = g_object_ref(gtk_print_operation_get_print_settings(op));
+ }
- filename = g_build_filename(wGetAppWorkDir(), PRINTSETTINGS, NULL);
+ filename = g_build_filename(wGetAppWorkDir(), PRINTSETTINGS, NULL);
- if (!gtk_print_settings_to_file(settings, filename, &err)) {
- dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- "%s",err->message);
+ if (!gtk_print_settings_to_file(settings, filename, &err)) {
+ dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+ "%s",err->message);
- g_error_free(err);
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- }
+ g_error_free(err);
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ }
- g_free(filename);
+ g_free(filename);
- if (op) {
- if (page_setup != NULL) {
- g_object_unref(page_setup);
- }
+ if (op) {
+ if (page_setup != NULL) {
+ g_object_unref(page_setup);
+ }
- page_setup = g_object_ref(gtk_print_operation_get_default_page_setup(op));
- }
+ page_setup = g_object_ref(gtk_print_operation_get_default_page_setup(op));
+ }
- filename = g_build_filename(wGetAppWorkDir(), PAGESETTINGS, NULL);
+ filename = g_build_filename(wGetAppWorkDir(), PAGESETTINGS, NULL);
- if (!gtk_page_setup_to_file(page_setup, filename, &err)) {
- dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- "%s",err->message);
+ if (!gtk_page_setup_to_file(page_setup, filename, &err)) {
+ dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+ "%s",err->message);
- g_error_free(err);
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- }
+ g_error_free(err);
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ }
- g_free(filename);
+ g_free(filename);
}
@@ -241,30 +240,32 @@ WlibSaveSettings(GtkPrintOperation *op)
void wPrintSetup(wPrintSetupCallBack_p callback)
{
- GtkPageSetup *new_page_setup;
- gchar *filename;
- GError *err;
- GtkWidget *dialog;
+ GtkPageSetup *new_page_setup;
+// gchar *filename;
+// GError *err;
+// GtkWidget *dialog;
- if ( !settings )
- WlibApplySettings(NULL);
+ if ( !settings ) {
+ WlibApplySettings(NULL);
+ }
- new_page_setup = gtk_print_run_page_setup_dialog(GTK_WINDOW(gtkMainW->gtkwin),
- page_setup, settings);
+ new_page_setup = gtk_print_run_page_setup_dialog(GTK_WINDOW(gtkMainW->gtkwin),
+ page_setup, settings);
- if (page_setup && (page_setup != new_page_setup)) { //Can be the same if no mods...
- g_object_unref(page_setup);
- }
+ if (page_setup
+ && (page_setup != new_page_setup)) { //Can be the same if no mods...
+ g_object_unref(page_setup);
+ }
- page_setup = new_page_setup;
+ page_setup = new_page_setup;
- WlibGetPaperSize();
- WlibSaveSettings(NULL);
+ WlibGetPaperSize();
+ WlibSaveSettings(NULL);
}
/*****************************************************************************
*
- *
+ *
*
*/
@@ -272,7 +273,7 @@ void wPrintSetup(wPrintSetupCallBack_p callback)
static GtkPrinter * pDefaultPrinter = NULL;
gboolean isDefaultPrinter( GtkPrinter * printer, gpointer data )
{
-const char * pPrinterName = gtk_printer_get_name( printer );
+//const char * pPrinterName = gtk_printer_get_name( printer );
if ( gtk_printer_is_default( printer ) ) {
pDefaultPrinter = printer;
return TRUE;
@@ -284,18 +285,19 @@ static void getDefaultPrinter()
{
pDefaultPrinter = NULL;
gtk_enumerate_printers( isDefaultPrinter, NULL, NULL, TRUE );
-}
+}
const char * wPrintGetName()
{
static char sPrinterName[100];
WlibApplySettings( NULL );
- const char * pPrinterName =
- gtk_print_settings_get( settings, "format-for-printer" );
+ const char * pPrinterName =
+ gtk_print_settings_get( settings, "format-for-printer" );
if ( pPrinterName == NULL ) {
getDefaultPrinter();
- if ( pDefaultPrinter )
+ if ( pDefaultPrinter ) {
pPrinterName = gtk_printer_get_name( pDefaultPrinter );
+ }
}
if ( pPrinterName == NULL ) {
pPrinterName = "";
@@ -303,8 +305,9 @@ const char * wPrintGetName()
strncpy (sPrinterName, pPrinterName, sizeof sPrinterName - 1 );
sPrinterName[ sizeof sPrinterName - 1 ] = '\0';
for ( char * cp = sPrinterName; *cp; cp++ )
- if ( *cp == ':' )
+ if ( *cp == ':' ) {
*cp = '-';
+ }
return sPrinterName;
}
/*****************************************************************************
@@ -325,71 +328,65 @@ const char * wPrintGetName()
static void setLineType(
- double lineWidth,
- wDrawLineType_e lineType,
- wDrawOpts opts)
+ double lineWidth,
+ wDrawLineType_e lineType,
+ wDrawOpts opts)
{
- cairo_t *cr = psPrint_d.printContext;
-
- double dashes[] = { DASH_LENGTH, 3 }; //Reduce gap in between dashes
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
-
- if (lineWidth < 0.0) {
- lineWidth = P2I(-lineWidth)*2.0/scale_adjust;
- }
-
- // make sure that there is a minimum line width used
- if (lineWidth <= 0.09) {
- lineWidth = 0.1/scale_adjust;
- }
-
- cairo_set_line_width(cr, lineWidth);
- switch(lineType) {
- case wDrawLineDot:
- {
- double dashes[] = { 1, 2 , 1, 2};
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cr, dashes, len_dashes, 0.0);
- break;
- }
- case wDrawLineDash:
- {
- double dashes[] = { DASH_LENGTH, 3 }; //Reduce gap in between dashes
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cr, dashes, len_dashes, 0.0);
- break;
- }
- case wDrawLineDashDot:
- {
- double dashes[] = { 3, 2, 1, 2};
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cr, dashes, len_dashes, 0.0);
- break;
- }
- case wDrawLineDashDotDot:
- {
- double dashes[] = { 3, 2, 1, 2, 1, 2};
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cr, dashes, len_dashes, 0.0);
- break;
- }
- case wDrawLineCenter:
- {
- double dashes[] = { 1.5*DASH_LENGTH, 3, DASH_LENGTH, 3};
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cr, dashes, len_dashes, 0.0);
- break;
- }
- case wDrawLinePhantom:
- {
- double dashes[] = { 1.5*DASH_LENGTH, 3, DASH_LENGTH, 3, DASH_LENGTH, 3};
- static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
- cairo_set_dash(cr, dashes, len_dashes, 0.0);
- break;
- }
- default:
- cairo_set_dash(cr, NULL, 0, 0.0);
- }
+ cairo_t *cr = psPrint_d.printContext;
+
+// double dashes[] = { DASH_LENGTH, 3 }; //Reduce gap in between dashes
+// static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+
+ if (lineWidth < 0.0) {
+ lineWidth = P2I(-lineWidth)*2.0/scale_adjust;
+ }
+
+ // make sure that there is a minimum line width used
+ if (lineWidth <= 0.09) {
+ lineWidth = 0.1/scale_adjust;
+ }
+
+ cairo_set_line_width(cr, lineWidth);
+ switch(lineType) {
+ case wDrawLineDot: {
+ double dashes[] = { 1, 2, 1, 2};
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cr, dashes, len_dashes, 0.0);
+ break;
+ }
+ case wDrawLineDash: {
+ double dashes[] = { DASH_LENGTH, 3 }; //Reduce gap in between dashes
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cr, dashes, len_dashes, 0.0);
+ break;
+ }
+ case wDrawLineDashDot: {
+ double dashes[] = { 3, 2, 1, 2};
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cr, dashes, len_dashes, 0.0);
+ break;
+ }
+ case wDrawLineDashDotDot: {
+ double dashes[] = { 3, 2, 1, 2, 1, 2};
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cr, dashes, len_dashes, 0.0);
+ break;
+ }
+ case wDrawLineCenter: {
+ double dashes[] = { 1.5*DASH_LENGTH, 3, DASH_LENGTH, 3};
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cr, dashes, len_dashes, 0.0);
+ break;
+ }
+ case wDrawLinePhantom: {
+ double dashes[] = { 1.5*DASH_LENGTH, 3, DASH_LENGTH, 3, DASH_LENGTH, 3};
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
+ cairo_set_dash(cr, dashes, len_dashes, 0.0);
+ break;
+ }
+ default:
+ cairo_set_dash(cr, NULL, 0, 0.0);
+ }
}
@@ -401,14 +398,14 @@ static void setLineType(
*/
static void psSetColor(
- wDrawColor color)
+ wDrawColor color)
{
- cairo_t *cr = psPrint_d.printContext;
- GdkColor* const gcolor = wlibGetColor(color, TRUE);
+ cairo_t *cr = psPrint_d.printContext;
+ GdkColor* const gcolor = wlibGetColor(color, TRUE);
- cairo_set_source_rgb(cr, gcolor->red / 65535.0,
- gcolor->green / 65535.0,
- gcolor->blue / 65535.0);
+ cairo_set_source_rgb(cr, gcolor->red / 65535.0,
+ gcolor->green / 65535.0,
+ gcolor->blue / 65535.0);
}
/**
@@ -423,29 +420,29 @@ static void psSetColor(
*/
void psPrintLine(
- wPos_t x0, wPos_t y0,
- wPos_t x1, wPos_t y1,
- wDrawWidth width,
- wDrawLineType_e lineType,
- wDrawColor color,
- wDrawOpts opts)
+ wDrawPix_t x0, wDrawPix_t y0,
+ wDrawPix_t x1, wDrawPix_t y1,
+ wDrawWidth width,
+ wDrawLineType_e lineType,
+ wDrawColor color,
+ wDrawOpts opts)
{
- if (color == wDrawColorWhite) {
- return;
- }
-
- if (opts&wDrawOptTemp) {
- return;
- }
-
- psSetColor(color);
- setLineType(width, lineType, opts);
-
- cairo_move_to(psPrint_d.printContext,
- x0, y0);
- cairo_line_to(psPrint_d.printContext,
- x1, y1);
- cairo_stroke(psPrint_d.printContext);
+ if (color == wDrawColorWhite) {
+ return;
+ }
+
+ if (opts&wDrawOptTemp) {
+ return;
+ }
+
+ psSetColor(color);
+ setLineType(width, lineType, opts);
+
+ cairo_move_to(psPrint_d.printContext,
+ x0, y0);
+ cairo_line_to(psPrint_d.printContext,
+ x1, y1);
+ cairo_stroke(psPrint_d.printContext);
}
/**
@@ -462,65 +459,65 @@ void psPrintLine(
*/
void psPrintArc(
- wPos_t x0, wPos_t y0,
- wPos_t r,
- double angle0,
- double angle1,
- wBool_t drawCenter,
- wDrawWidth width,
- wDrawLineType_e lineType,
- wDrawColor color,
- wDrawOpts opts)
+ wDrawPix_t x0, wDrawPix_t y0,
+ wDrawPix_t r,
+ double angle0,
+ double angle1,
+ wBool_t drawCenter,
+ wDrawWidth width,
+ wDrawLineType_e lineType,
+ wDrawColor color,
+ wDrawOpts opts)
{
- cairo_t *cr = psPrint_d.printContext;
+ cairo_t *cr = psPrint_d.printContext;
- if (color == wDrawColorWhite) {
- return;
- }
+ if (color == wDrawColorWhite) {
+ return;
+ }
- if (opts&wDrawOptTemp) {
- return;
- }
+ if (opts&wDrawOptTemp) {
+ return;
+ }
- psSetColor(color);
- setLineType(width, lineType, opts);
+ psSetColor(color);
+ setLineType(width, lineType, opts);
- if (angle1 >= 360.0) {
- angle1 = 359.999;
- }
+ if (angle1 >= 360.0) {
+ angle1 = 359.999;
+ }
- angle1 = 90.0-(angle0+angle1);
+ angle1 = 90.0-(angle0+angle1);
- while (angle1 < 0.0) {
- angle1 += 360.0;
- }
+ while (angle1 < 0.0) {
+ angle1 += 360.0;
+ }
- while (angle1 >= 360.0) {
- angle1 -= 360.0;
- }
+ while (angle1 >= 360.0) {
+ angle1 -= 360.0;
+ }
- angle0 = 90.0-angle0;
+ angle0 = 90.0-angle0;
- while (angle0 < 0.0) {
- angle0 += 360.0;
- }
+ while (angle0 < 0.0) {
+ angle0 += 360.0;
+ }
- while (angle0 >= 360.0) {
- angle0 -= 360.0;
- }
+ while (angle0 >= 360.0) {
+ angle0 -= 360.0;
+ }
- // draw the curve
- cairo_arc(cr, x0, y0, r, angle1 * M_PI / 180.0, angle0 * M_PI / 180.0);
+ // draw the curve
+ cairo_arc(cr, x0, y0, r, angle1 * M_PI / 180.0, angle0 * M_PI / 180.0);
- if (drawCenter) {
- // draw crosshair for center of curve
- cairo_move_to(cr, x0 - CENTERMARK_LENGTH / 2, y0);
- cairo_line_to(cr, x0 + CENTERMARK_LENGTH / 2, y0);
- cairo_move_to(cr, x0, y0 - CENTERMARK_LENGTH / 2);
- cairo_line_to(cr, x0, y0 + CENTERMARK_LENGTH / 2);
- }
+ if (drawCenter) {
+ // draw crosshair for center of curve
+ cairo_move_to(cr, x0 - CENTERMARK_LENGTH / 2, y0);
+ cairo_line_to(cr, x0 + CENTERMARK_LENGTH / 2, y0);
+ cairo_move_to(cr, x0, y0 - CENTERMARK_LENGTH / 2);
+ cairo_line_to(cr, x0, y0 + CENTERMARK_LENGTH / 2);
+ }
- cairo_stroke(psPrint_d.printContext);
+ cairo_stroke(psPrint_d.printContext);
}
/**
@@ -534,28 +531,28 @@ void psPrintArc(
*/
void psPrintFillRectangle(
- wPos_t x0, wPos_t y0,
- wPos_t x1, wPos_t y1,
- wDrawColor color,
- wDrawOpts opts)
+ wDrawPix_t x0, wDrawPix_t y0,
+ wDrawPix_t x1, wDrawPix_t y1,
+ wDrawColor color,
+ wDrawOpts opts)
{
- cairo_t *cr = psPrint_d.printContext;
- double width = x0 - x1;
- double height = y0 - y1;
+ cairo_t *cr = psPrint_d.printContext;
+ double width = x0 - x1;
+ double height = y0 - y1;
- if (color == wDrawColorWhite) {
- return;
- }
+ if (color == wDrawColorWhite) {
+ return;
+ }
- if (opts&wDrawOptTemp) {
- return;
- }
+ if (opts&wDrawOptTemp) {
+ return;
+ }
- psSetColor(color);
+ psSetColor(color);
- cairo_rectangle(cr, x0, y0, width, height);
+ cairo_rectangle(cr, x0, y0, width, height);
- cairo_fill(cr);
+ cairo_fill(cr);
}
/**
@@ -570,34 +567,34 @@ void psPrintFillRectangle(
*/
void psPrintFillPolygon(
- wPos_t p[][2],
- wPolyLine_e type[],
- int cnt,
- wDrawColor color,
- wDrawOpts opts,
- int fill,
- int open )
+ wDrawPix_t p[][2],
+ wPolyLine_e type[],
+ int cnt,
+ wDrawColor color,
+ wDrawOpts opts,
+ int fill,
+ int open )
{
- int inx;
- cairo_t *cr = psPrint_d.printContext;
+ int inx;
+ cairo_t *cr = psPrint_d.printContext;
- if (color == wDrawColorWhite) {
- return;
- }
+ if (color == wDrawColorWhite) {
+ return;
+ }
- if (opts&wDrawOptTemp) {
- return;
- }
+ if (opts&wDrawOptTemp) {
+ return;
+ }
- psSetColor(color);
+ psSetColor(color);
- wPos_t mid0[2], mid1[2], mid2[2], mid3[2], mid4[2];
+ wDrawPix_t mid0[2], mid1[2], /*mid2[2],*/ mid3[2], mid4[2];
- for (inx=0; inx<cnt; inx++) {
- int j = inx-1;
- int k = inx+1;
- if (j < 0) j = cnt-1;
- if (k > cnt-1) k = 0;
+ for (inx=0; inx<cnt; inx++) {
+ int j = inx-1;
+ int k = inx+1;
+ if (j < 0) { j = cnt-1; }
+ if (k > cnt-1) { k = 0; }
double len0, len1;
double d0x = (p[inx][0]-p[j][0]);
double d0y = (p[inx][1]-p[j][1]);
@@ -623,35 +620,39 @@ void psPrintFillPolygon(
mid3[1] = (p[inx][1]-mid0[1])/2+mid0[1];
mid4[0] = (mid1[0]-p[inx][0])/2+p[inx][0];
mid4[1] = (mid1[1]-p[inx][1])/2+p[inx][1];
- wPos_t save[2];
+ wDrawPix_t save[2];
if (inx==0) {
- if (!type || (type && type[0] == wPolyLineStraight) || open) {
- cairo_move_to(cr, p[ 0 ][ 0 ], p[ 0 ][ 1 ]);
- save[0] = p[0][0]; save[1] = p[0][1];
- } else {
- cairo_move_to(cr, mid0[0], mid0[1]);
- if (type[inx] == wPolyLineSmooth)
- cairo_curve_to(cr, p[inx][0], p[inx][1], p[inx][0], p[inx][1], mid1[0], mid1[1]);
- else
- cairo_curve_to(cr, mid3[0], mid3[1], mid4[0], mid4[1], mid1[0], mid1[1]);
- save[0] = mid0[0]; save[1] = mid0[1];
- }
- } else if (!type || (type && type[inx] == wPolyLineStraight) || (open && (inx==cnt-1)) ) {
+ if (!type || (type && type[0] == wPolyLineStraight) || open) {
+ cairo_move_to(cr, p[ 0 ][ 0 ], p[ 0 ][ 1 ]);
+ save[0] = p[0][0]; save[1] = p[0][1];
+ } else {
+ cairo_move_to(cr, mid0[0], mid0[1]);
+ if (type[inx] == wPolyLineSmooth) {
+ cairo_curve_to(cr, p[inx][0], p[inx][1], p[inx][0], p[inx][1], mid1[0],
+ mid1[1]);
+ } else {
+ cairo_curve_to(cr, mid3[0], mid3[1], mid4[0], mid4[1], mid1[0], mid1[1]);
+ }
+ save[0] = mid0[0]; save[1] = mid0[1];
+ }
+ } else if (!type || (type && type[inx] == wPolyLineStraight) || (open
+ && (inx==cnt-1)) ) {
cairo_line_to(cr, p[ inx ][ 0 ], p[ inx ][ 1 ]);
} else {
cairo_line_to(cr, mid0[ 0 ], mid0[ 1 ]);
- if (type && type[inx] == wPolyLineSmooth)
+ if (type && type[inx] == wPolyLineSmooth) {
cairo_curve_to(cr, p[inx][0],p[inx][1],p[inx][0],p[inx][1],mid1[0],mid1[1]);
- else
+ } else {
cairo_curve_to(cr, mid3[0],mid3[1],mid4[0],mid4[1],mid1[0],mid1[1]);
+ }
}
if ((inx==cnt-1) && !open) {
cairo_line_to(cr, save[0], save[1]);
}
- }
+ }
- if (fill && !open) cairo_fill(cr);
- else cairo_stroke(cr);
+ if (fill && !open) { cairo_fill(cr); }
+ else { cairo_stroke(cr); }
}
/**
@@ -665,25 +666,25 @@ void psPrintFillPolygon(
*/
void psPrintFillCircle(
- wPos_t x0, wPos_t y0,
- wPos_t r,
- wDrawColor color,
- wDrawOpts opts)
+ wDrawPix_t x0, wDrawPix_t y0,
+ wDrawPix_t r,
+ wDrawColor color,
+ wDrawOpts opts)
{
- if (color == wDrawColorWhite) {
- return;
- }
+ if (color == wDrawColorWhite) {
+ return;
+ }
- if (opts&wDrawOptTemp) {
- return;
- }
+ if (opts&wDrawOptTemp) {
+ return;
+ }
- psSetColor(color);
+ psSetColor(color);
- cairo_arc(psPrint_d.printContext,
- x0, y0, r, 0.0, 2 * M_PI);
+ cairo_arc(psPrint_d.printContext,
+ x0, y0, r, 0.0, 2 * M_PI);
- cairo_fill(psPrint_d.printContext);
+ cairo_fill(psPrint_d.printContext);
}
@@ -710,97 +711,102 @@ void psPrintFillCircle(
*/
void psPrintString(
- wPos_t x, wPos_t y,
- double a,
- char * s,
- wFont_p fp,
- double fs,
- wDrawColor color,
- wDrawOpts opts)
+ wDrawPix_t x, wDrawPix_t y,
+ double a,
+ char * s,
+ wFont_p fp,
+ double fs,
+ wDrawColor color,
+ wDrawOpts opts)
{
- char * cp;
- double x0 = (double)x, y0 = (double)y;
- int text_height, text_width;
- double ascent;
+// char * cp;
+ double x0 = (double)x, y0 = (double)y;
+ int text_height, text_width;
+// double ascent;
+
+ cairo_t *cr;
+ cairo_matrix_t matrix;
+
+ PangoLayout *layout;
+ PangoFontDescription *desc;
+// PangoFontMetrics *metrics;
+ PangoContext *pcontext;
- cairo_t *cr;
- cairo_matrix_t matrix;
+ if (color == wDrawColorWhite) {
+ return;
+ }
- PangoLayout *layout;
- PangoFontDescription *desc;
- PangoFontMetrics *metrics;
- PangoContext *pcontext;
+ cr = psPrint_d.printContext;
- if (color == wDrawColorWhite) {
- return;
- }
+ // get the current transformation matrix and transform the starting
+ // point of the string
- cr = psPrint_d.printContext;
+ cairo_save(cr);
- // get the current transformation matrix and transform the starting
- // point of the string
+ cairo_get_matrix(cr, &matrix);
- cairo_save(cr);
+ cairo_matrix_transform_point(&matrix, &x0, &y0);
- cairo_get_matrix(cr, &matrix);
+ cairo_identity_matrix(cr);
- cairo_matrix_transform_point(&matrix, &x0, &y0);
+ layout = pango_cairo_create_layout(cr);
- cairo_identity_matrix(cr);
+ // set the correct font and size
+ /** \todo use a getter function instead of double conversion */
+ desc = pango_font_description_from_string(wlibFontTranslate(fp));
- layout = pango_cairo_create_layout(cr);
+ pango_font_description_set_size(desc, fs * PANGO_SCALE * scale_text);
- // set the correct font and size
- /** \todo use a getter function instead of double conversion */
- desc = pango_font_description_from_string(wlibFontTranslate(fp));
+ // render the string to a Pango layout
+ pango_layout_set_font_description(layout, desc);
- pango_font_description_set_size(desc, fs * PANGO_SCALE * scale_text);
+ gchar *utf8 = wlibConvertInput(s);
- // render the string to a Pango layout
- pango_layout_set_font_description(layout, desc);
- pango_layout_set_text(layout, s, -1);
- pango_layout_set_width(layout, -1);
- pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
- pango_layout_get_size(layout, &text_width, &text_height);
+ pango_layout_set_text(layout, utf8, -1);
+ pango_layout_set_width(layout, -1);
+ pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
+ pango_layout_get_size(layout, &text_width, &text_height);
- text_width = text_width / PANGO_SCALE;
- text_height = text_height / PANGO_SCALE;
+ text_width = text_width / PANGO_SCALE;
+ text_height = text_height / PANGO_SCALE;
- // get the height of the string
- pcontext = pango_cairo_create_context(cr);
- metrics = pango_context_get_metrics(pcontext, desc,
- pango_context_get_language(pcontext));
+ // get the height of the string
+ pcontext = pango_cairo_create_context(cr);
+// metrics = pango_context_get_metrics(pcontext, desc,
+// pango_context_get_language(pcontext));
- ascent = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE;
+// ascent = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE;
- int baseline = pango_layout_get_baseline(layout) / PANGO_SCALE;
+ int baseline = pango_layout_get_baseline(layout) / PANGO_SCALE;
- cairo_translate(cr, x0, y0 );
- cairo_rotate(cr, -a * M_PI / 180.0);
- cairo_translate( cr, 0, -baseline );
+ cairo_translate(cr, x0, y0 );
+ cairo_rotate(cr, -a * M_PI / 180.0);
+ cairo_translate( cr, 0, -baseline );
- cairo_move_to(cr,0,0);
+ cairo_move_to(cr,0,0);
- pango_cairo_update_layout(cr, layout);
+ pango_cairo_update_layout(cr, layout);
- // set the color
- psSetColor(color);
+ // set the color
+ psSetColor(color);
- // and show the string
- if(!(opts & wDrawOutlineFont)) {
+ // and show the string
+ if(!(opts & wDrawOutlineFont)) {
pango_cairo_show_layout(cr, layout);
+ cairo_stroke( cr );
} else {
PangoLayoutLine *line;
line = pango_layout_get_line_readonly (layout, 0);
+ setLineType( wDrawLineSolid, 0, 0 );
pango_cairo_layout_line_path (cr, line);
- cairo_stroke( cr );
+ cairo_stroke( cr );
}
- // free unused objects
- g_object_unref(layout);
- g_object_unref(pcontext);
+ // free unused objects
+ g_object_unref(layout);
+ g_object_unref(pcontext);
- cairo_restore(cr);
+ cairo_restore(cr);
}
/**
@@ -811,14 +817,14 @@ void psPrintString(
* \return
*/
-void wPrintClip(wPos_t x, wPos_t y, wPos_t w, wPos_t h)
+void wPrintClip(wDrawPix_t x, wDrawPix_t y, wDrawPix_t w, wDrawPix_t h)
{
- cairo_move_to(psPrint_d.printContext, x, y);
- cairo_rel_line_to(psPrint_d.printContext, w, 0);
- cairo_rel_line_to(psPrint_d.printContext, 0, h);
- cairo_rel_line_to(psPrint_d.printContext, -w, 0);
- cairo_close_path(psPrint_d.printContext);
- cairo_clip(psPrint_d.printContext);
+ cairo_move_to(psPrint_d.printContext, x, y);
+ cairo_rel_line_to(psPrint_d.printContext, w, 0);
+ cairo_rel_line_to(psPrint_d.printContext, 0, h);
+ cairo_rel_line_to(psPrint_d.printContext, -w, 0);
+ cairo_close_path(psPrint_d.printContext);
+ cairo_clip(psPrint_d.printContext);
}
/*****************************************************************************
@@ -835,22 +841,22 @@ void wPrintClip(wPos_t x, wPos_t y, wPos_t w, wPos_t h)
static void
WlibGetPaperSize(void)
{
- double temp;
-
- bBorder = gtk_page_setup_get_bottom_margin(page_setup, GTK_UNIT_INCH);
- tBorder = gtk_page_setup_get_top_margin(page_setup, GTK_UNIT_INCH);
- lBorder = gtk_page_setup_get_left_margin(page_setup, GTK_UNIT_INCH);
- rBorder = gtk_page_setup_get_right_margin(page_setup, GTK_UNIT_INCH);
- paperHeight = gtk_page_setup_get_paper_height(page_setup, GTK_UNIT_INCH);
- paperWidth = gtk_page_setup_get_paper_width(page_setup, GTK_UNIT_INCH);
-
- // XTrackCAD does page orientation itself. Basic assumption is that the
- // paper is always oriented in portrait mode. Ignore settings by user
- if (paperHeight < paperWidth) {
- temp = paperHeight;
- paperHeight = paperWidth;
- paperWidth = temp;
- }
+ double temp;
+
+ bBorder = gtk_page_setup_get_bottom_margin(page_setup, GTK_UNIT_INCH);
+ tBorder = gtk_page_setup_get_top_margin(page_setup, GTK_UNIT_INCH);
+ lBorder = gtk_page_setup_get_left_margin(page_setup, GTK_UNIT_INCH);
+ rBorder = gtk_page_setup_get_right_margin(page_setup, GTK_UNIT_INCH);
+ paperHeight = gtk_page_setup_get_paper_height(page_setup, GTK_UNIT_INCH);
+ paperWidth = gtk_page_setup_get_paper_width(page_setup, GTK_UNIT_INCH);
+
+ // XTrackCAD does page orientation itself. Basic assumption is that the
+ // paper is always oriented in portrait mode. Ignore settings by user
+ if (paperHeight < paperWidth) {
+ temp = paperHeight;
+ paperHeight = paperWidth;
+ paperWidth = temp;
+ }
}
/**
@@ -863,15 +869,15 @@ WlibGetPaperSize(void)
void wPrintGetMargins(
- double * tMargin,
- double * rMargin,
- double * bMargin,
- double * lMargin )
+ double * tMargin,
+ double * rMargin,
+ double * bMargin,
+ double * lMargin )
{
- if ( tMargin ) *tMargin = tBorder;
- if ( rMargin ) *rMargin = rBorder;
- if ( bMargin ) *bMargin = bBorder;
- if ( lMargin ) *lMargin = lBorder;
+ if ( tMargin ) { *tMargin = tBorder; }
+ if ( rMargin ) { *rMargin = rBorder; }
+ if ( bMargin ) { *bMargin = bBorder; }
+ if ( lMargin ) { *lMargin = lBorder; }
}
@@ -884,18 +890,18 @@ void wPrintGetMargins(
*/
void wPrintGetPageSize(
- double * w,
- double * h)
+ double * w,
+ double * h)
{
- // if necessary load the settings
- if (!settings) {
- WlibApplySettings(NULL);
- }
+ // if necessary load the settings
+ if (!settings) {
+ WlibApplySettings(NULL);
+ }
- WlibGetPaperSize();
+ WlibGetPaperSize();
- *w = paperWidth;
- *h = paperHeight;
+ *w = paperWidth;
+ *h = paperHeight;
}
/**
@@ -904,11 +910,11 @@ void wPrintGetPageSize(
* \param context IN unused
* \return
*/
-static void printAbort(void * context)
-{
- printContinue = FALSE;
+//static void printAbort(void * context)
+//{
+// printContinue = FALSE;
// wWinShow( printAbortW, FALSE );
-}
+//}
/**
* Initialize new page.
@@ -920,11 +926,11 @@ static void printAbort(void * context)
*/
wDraw_p wPrintPageStart(void)
{
- pageCount++;
+ pageCount++;
- cairo_save(psPrint_d.printContext);
+ cairo_save(psPrint_d.printContext);
- return &psPrint_d;
+ return &psPrint_d;
}
/**
@@ -940,11 +946,11 @@ wDraw_p wPrintPageStart(void)
wBool_t wPrintPageEnd(wDraw_p p)
{
- cairo_show_page(psPrint_d.printContext);
+ cairo_show_page(psPrint_d.printContext);
- cairo_restore(psPrint_d.printContext);
+ cairo_restore(psPrint_d.printContext);
- return printContinue;
+ return printContinue;
}
/*****************************************************************************
@@ -965,112 +971,134 @@ wBool_t wPrintPageEnd(wDraw_p p)
wBool_t wPrintDocStart(const char * title, int fTotalPageCount, int * copiesP)
{
- GtkWidget *printDialog;
- gint res;
- cairo_surface_type_t surface_type;
- cairo_matrix_t matrix;
+ GtkWidget *printDialog;
+ gint res;
+// cairo_surface_type_t surface_type;
+// cairo_matrix_t matrix;
+
+
+ printDialog = gtk_print_unix_dialog_new(title, GTK_WINDOW(gtkMainW->gtkwin));
+
+ // load the settings
+ WlibApplySettings(NULL);
+
+ // and apply them to the printer dialog
+ gtk_print_unix_dialog_set_settings((GtkPrintUnixDialog *)printDialog, settings);
+ gtk_print_unix_dialog_set_page_setup((GtkPrintUnixDialog *)printDialog,
+ page_setup);
+ res = gtk_dialog_run((GtkDialog *)printDialog);
- printDialog = gtk_print_unix_dialog_new(title, GTK_WINDOW(gtkMainW->gtkwin));
+ if (res == GTK_RESPONSE_OK) {
+ selPrinter = gtk_print_unix_dialog_get_selected_printer((
+ GtkPrintUnixDialog *)printDialog);
- // load the settings
- WlibApplySettings(NULL);
+ if (settings) {
+ g_object_unref(settings);
+ }
+
+ settings = gtk_print_unix_dialog_get_settings((GtkPrintUnixDialog *)
+ printDialog);
- // and apply them to the printer dialog
- gtk_print_unix_dialog_set_settings((GtkPrintUnixDialog *)printDialog, settings);
- gtk_print_unix_dialog_set_page_setup((GtkPrintUnixDialog *)printDialog,
- page_setup);
+ if (page_setup) {
+ g_object_unref(page_setup);
+ }
- res = gtk_dialog_run((GtkDialog *)printDialog);
+ page_setup = gtk_print_unix_dialog_get_page_setup((GtkPrintUnixDialog *)
+ printDialog);
- if (res == GTK_RESPONSE_OK) {
- selPrinter = gtk_print_unix_dialog_get_selected_printer((
- GtkPrintUnixDialog *)printDialog);
+ curPrintJob = gtk_print_job_new(title,
+ selPrinter,
+ settings,
+ page_setup);
- if (settings) {
- g_object_unref(settings);
- }
+ psPrint_d.curPrintSurface = gtk_print_job_get_surface(curPrintJob,
+ NULL);
+ psPrint_d.printContext = cairo_create(psPrint_d.curPrintSurface);
- settings = gtk_print_unix_dialog_get_settings((GtkPrintUnixDialog *)
- printDialog);
+ WlibApplySettings( NULL );
+ //update the paper dimensions
+ WlibGetPaperSize();
- if (page_setup) {
- g_object_unref(page_setup);
- }
+ /* for all surfaces including files the resolution is always 72 ppi (as all GTK uses PDF) */
+ /*surface_type = */cairo_surface_get_type(psPrint_d.curPrintSurface);
- page_setup = gtk_print_unix_dialog_get_page_setup((GtkPrintUnixDialog *)
- printDialog);
+ /*
+ * Override up-scaling for some printer drivers/Linux systems that don't support the latest CUPS
+ * - the user either sets preferences or the environment variable XTRKCADPRINTSCALE to a value
+ * and we just let the dpi default to 72ppi and set scaling to that value.
+ * And for PangoText we allow an override via preferences or variable XTRKCADPRINTTEXTSCALE
+ * Note - doing this will introduce differing artifacts.
+ *
+ */
+ char * sEnvScale = PRODUCT "PRINTSCALE";
+ char * sEnvTextScale = PRODUCT "PRINTTEXTSCALE";
- curPrintJob = gtk_print_job_new(title,
- selPrinter,
- settings,
- page_setup);
+ scale_text = 1.0;
+ scale_adjust = 1.0;
- psPrint_d.curPrintSurface = gtk_print_job_get_surface(curPrintJob,
- NULL);
- psPrint_d.printContext = cairo_create(psPrint_d.curPrintSurface);
+ double printScale,printTextScale;
- WlibApplySettings( NULL );
- //update the paper dimensions
- WlibGetPaperSize();
+ wPrefGetFloat(PREFSECTION, PRINTSCALE, &printScale, -1.0);
+ wPrefGetFloat(PREFSECTION, PRINTTEXTSCALE, &printTextScale, -1.0);
- /* for all surfaces including files the resolution is always 72 ppi (as all GTK uses PDF) */
- surface_type = cairo_surface_get_type(psPrint_d.curPrintSurface);
- /*
- * Override up-scaling for some printer drivers/Linux systems that don't support the latest CUPS
- * - the user sets the environment variable XTRKCADPRINTSCALE to a value
- * and we just let the dpi default to 72ppi and set scaling to that value.
- * And for PangoText we allow an override via variable XTRKCADPRINTTEXTSCALE
- * Note - doing this will introduce differing artifacts.
- *
- */
- char * sEnvScale = PRODUCT "PRINTSCALE";
+ //If the preferences are not set, look at environmental variables
- const char * sPrinterName = gtk_printer_get_name( selPrinter );
- if ((strcmp(sPrinterName,"Print to File") == 0) || getenv(sEnvScale) == NULL) {
+ if (printScale < 0.0 ) {
+ if (getenv(sEnvScale) && (atof(getenv(sEnvScale)) > 0.0)) {
+ printScale = atof(getenv(sEnvScale));
+ }
+ }
+ if (printTextScale < 0.0 ) {
+ if (getenv(sEnvTextScale) && (atof(getenv(sEnvTextScale)) > 0.0)) {
+ printTextScale = atof(getenv(sEnvTextScale));
+ }
+ }
+
+ const char * sPrinterName = gtk_printer_get_name( selPrinter );
+ if ((strcmp(sPrinterName,"Print to File") == 0) || printScale < 0.0) {
double p_def = 600;
cairo_surface_set_fallback_resolution(psPrint_d.curPrintSurface, p_def, p_def);
psPrint_d.dpi = p_def;
scale_adjust = 72/p_def;
} else {
- char * sEnvTextScale = PRODUCT "PRINTTEXTSCALE";
- if (getenv(sEnvTextScale) && (atof(getenv(sEnvTextScale)) != 0.0)) {
- scale_text = atof(getenv(sEnvTextScale));
- } else scale_text = 1.0;
- if (getenv(sEnvScale) && (atof(getenv(sEnvScale)) != 0.0)) {
- scale_adjust = atof(getenv(sEnvScale));
- } else scale_adjust = 1.0;
+ if (printTextScale > 0.0) {
+ scale_text = printTextScale;
+ }
+ if (printScale > 0.0) {
+ scale_adjust = printScale;
+ }
psPrint_d.dpi = 72;
}
- // in XTrackCAD 0,0 is top left, in cairo bottom left. This is
- // corrected via the following transformations.
- // also the translate makes sure that the drawing is rendered
- // within the paper margin
+ // in XTrackCAD 0,0 is top left, in cairo bottom left. This is
+ // corrected via the following transformations.
+ // also the translate makes sure that the drawing is rendered
+ // within the paper margin
- cairo_translate(psPrint_d.printContext, lBorder*72, (paperHeight-bBorder)*72 );
+ cairo_translate(psPrint_d.printContext, lBorder*72, (paperHeight-bBorder)*72 );
- cairo_scale(psPrint_d.printContext, 1.0 * scale_adjust, -1.0 * scale_adjust);
+ cairo_scale(psPrint_d.printContext, 1.0 * scale_adjust, -1.0 * scale_adjust);
- //cairo_translate(psPrint_d.printContext, 0, -paperHeight* psPrint_d.dpi);
+ //cairo_translate(psPrint_d.printContext, 0, -paperHeight* psPrint_d.dpi);
- WlibSaveSettings(NULL);
- }
+ WlibSaveSettings(NULL);
+ }
- gtk_widget_destroy(printDialog);
+ gtk_widget_destroy(printDialog);
- if (copiesP) {
- *copiesP = 1;
- }
+ if (copiesP) {
+ *copiesP = 1;
+ }
- printContinue = TRUE;
+ printContinue = TRUE;
- if (res != GTK_RESPONSE_OK) {
- return FALSE;
- } else {
- return TRUE;
- }
+ if (res != GTK_RESPONSE_OK) {
+ return FALSE;
+ } else {
+ return TRUE;
+ }
}
/**
@@ -1085,16 +1113,16 @@ wBool_t wPrintDocStart(const char * title, int fTotalPageCount, int * copiesP)
void
doPrintJobFinished(GtkPrintJob *job, void *data, GError *err)
{
- GtkWidget *dialog;
+// GtkWidget *dialog;
- cairo_destroy(psPrint_d.printContext);
+ cairo_destroy(psPrint_d.printContext);
- if (err) {
- dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- "%s",err->message);
- }
+ if (err) {
+ /*dialog = */gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+ "%s",err->message);
+ }
}
/**
@@ -1104,12 +1132,12 @@ doPrintJobFinished(GtkPrintJob *job, void *data, GError *err)
void wPrintDocEnd(void)
{
- cairo_surface_finish(psPrint_d.curPrintSurface);
+ cairo_surface_finish(psPrint_d.curPrintSurface);
- gtk_print_job_send(curPrintJob,
- doPrintJobFinished,
- NULL,
- NULL);
+ gtk_print_job_send(curPrintJob,
+ doPrintJobFinished,
+ NULL,
+ NULL);
// wWinShow( printAbortW, FALSE );
}
@@ -1117,11 +1145,11 @@ void wPrintDocEnd(void)
wBool_t wPrintQuit(void)
{
- return FALSE;
+ return FALSE;
}
wBool_t wPrintInit(void)
{
- return TRUE;
+ return TRUE;
}
diff --git a/app/wlib/gtklib/single.c b/app/wlib/gtklib/single.c
index 600f1dd..6204ed5 100644
--- a/app/wlib/gtklib/single.c
+++ b/app/wlib/gtklib/single.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#define GTK_DISABLE_SINGLE_INCLUDES
@@ -35,7 +35,6 @@
#include "gtkint.h"
-#define TIMEOUT_INACTIVITY (500) /**< timeout for entry fields in millisecs */
/*
*****************************************************************************
@@ -54,7 +53,6 @@ struct wString_t {
wBool_t enter_pressed; /**< flag if enter was pressed */
wBool_t hasSignal; /** needs signal to be suppressed */
int count; /** number of 100ms since last entry **/
- guint timer; /**< timer source for inactivity timer */
};
/**
@@ -62,24 +60,27 @@ struct wString_t {
*
* \param b IN widget to be updated
* \param arg IN new string value
- * \return
+ * \return
*/
void wStringSetValue(
- wString_p b,
- const char *arg)
+ wString_p b,
+ const char *arg)
{
- if (b->widget == NULL)
+ if (b->widget == NULL) {
abort();
-
+ }
+
// the contents should not be changed programatically while
// the user is editing it
- if( !(gtk_widget_has_focus(b->widget))) {
- if (b->hasSignal)
- gtk_signal_handler_block_by_data(GTK_OBJECT(b->widget), b);
+ if( (b->option&BO_IGNFOCUS) || !(gtk_widget_has_focus(b->widget))) {
+ if (b->hasSignal) {
+ gtk_signal_handler_block_by_data(GTK_OBJECT(b->widget), b);
+ }
gtk_entry_set_text(GTK_ENTRY(b->widget), arg);
- if (b->hasSignal)
+ if (b->hasSignal) {
gtk_signal_handler_unblock_by_data(GTK_OBJECT(b->widget), b);
+ }
}
}
@@ -88,12 +89,12 @@ void wStringSetValue(
*
* \param b IN widget to be updated
* \param w IN new width
- * \return
+ * \return
*/
void wStringSetWidth(
- wString_p b,
- wPos_t w)
+ wString_p b,
+ wWinPix_t w)
{
gtk_widget_set_size_request(b->widget, w, -1);
b->w = w;
@@ -107,113 +108,71 @@ void wStringSetWidth(
*/
const char *wStringGetValue(
- wString_p b)
+ wString_p b)
{
- if ( !b->widget )
+ if ( !b->widget ) {
abort();
-
+ }
+
return gtk_entry_get_text(GTK_ENTRY(b->widget));
}
-/**
- * Kill an active timer
- *
- * \param b IN entry field
- * \return the entered text
- */
-
-static gboolean killTimer(
- GtkEntry *widget,
- GdkEvent *event,
- wString_p b)
-{
-
- // remove all timers related to this widget
- while( g_source_remove_by_user_data( b ))
- ;
- b->timer = 0;
-
- if (b->action) {
- const char *s;
-
- s = gtk_entry_get_text(GTK_ENTRY(b->widget));
- b->action(s, b->data);
- }
- gtk_editable_select_region( GTK_EDITABLE( widget ), 0, 0 );
- return( FALSE );
-}
/**
- * Timer handler for string activity. This timer checks the input if the user
- * doesn't change an entry value for the preset time (0.5s).
+ * Do the current active string's action when a button was pushed
+ * Used to validate input
*/
-
-static gboolean
-timeoutString( wString_p bs )
+static wString_p stringControl = NULL;
+void wlibStringUpdate()
{
- const char *new_value;
- if ( !bs )
- return( FALSE );
- if (bs->widget == 0)
- abort();
-
- bs->count--;
-
- if (bs->count==0) {
- // get the currently entered value
- new_value = wStringGetValue(bs);
- if (bs->valueP != NULL)
- strcpy(bs->valueP, new_value);
-
- if (bs->action) {
- bs->enter_pressed = FALSE; //Normal input
- if ( new_value )
- bs->action(new_value,bs->data);
- }
- }
- if (bs->count<=0) {
- bs->timer = 0;
- return( FALSE ); //Stop timer
- } else {
- return TRUE; //Wait 100ms
+ if ( stringControl && stringControl->action ) {
+ stringControl->action( wStringGetValue(stringControl), stringControl->data );
+ stringControl = NULL;
}
}
+
/**
* Signal handler for 'activate' signal: enter pressed - callback with the current value and then
* select the whole default value
*
* \param widget IN the edit field
* \param b IN the widget data structure
- * \return
+ * \return
*/
static gboolean stringActivated(
- GtkEntry *widget,
- wString_p b)
+ GtkEntry *widget,
+ wString_p b)
{
+ if ( debugWindow >= 1 ) {
+ printf( "stringActivated: %s\n", b->labelStr );
+ }
const char *s;
const char * output = "\n";
- if ( !b )
+ if ( !b ) {
return( FALSE );
-
+ }
+
s = wStringGetValue(b);
- if (b->valueP)
+ if (b->valueP) {
strcpy(b->valueP, s);
+ }
if (b->action) {
b->enter_pressed = TRUE;
b->action( output, b->data);
}
-
+
// select the complete default value to make editing it easier
gtk_editable_select_region( GTK_EDITABLE( widget ), 0, -1 );
return( TRUE );
}
-static gboolean stringExposed(GtkWidget* widget, GdkEventExpose * event, gpointer g )
+static gboolean stringExposed(GtkWidget* widget, GdkEventExpose * event,
+ gpointer g )
{
wControl_p b = (wControl_p)g;
return wControlExpose(widget,event,b);
@@ -225,40 +184,113 @@ static gboolean stringExposed(GtkWidget* widget, GdkEventExpose * event, gpointe
*
* \param widget IN
* \param entry field IN
- * \return
+ * \return
*/
-static void stringChanged(
- GtkEntry *widget,
- wString_p b)
+static int stringChanged(
+ GtkEntry *widget,
+ wString_p b)
{
- const char *new_value;
-
- if ( !b )
- return;
-
- b->count = 5; /* set ~500 ms from now */
-
- // get the entered value
- //new_value = wStringGetValue(b);
- //if (b->valueP != NULL)
- // strcpy(b->valueP, new_value);
- //
- //
- if (b->action){
- // if one exists, remove the inactivity timer
- if( !b->timer ) {
- //g_source_remove( b->timer );
-
- // create a new timer
- b->timer = g_timeout_add( TIMEOUT_INACTIVITY/5,
- (GSourceFunc)timeoutString,
- b );
- }
- }
- return;
+ if ( debugWindow >= 1 ) {
+ printf( "stringChanged: %s\n", b->labelStr);
+ }
+ stringControl = b;
+ return FALSE;
}
+static int stringPreeditChanged(
+ GtkEntry *widget,
+ wString_p b)
+{
+ if ( debugWindow >= 1 ) {
+ printf( "stringPreeditChanged: %s\n", b->labelStr );
+ }
+ return FALSE;
+}
+static int stringFocusOutEvent(
+ GtkEntry *widget,
+ GdkEvent * event,
+ wString_p b)
+{
+ if ( debugWindow >= 1 ) {
+ printf( "stringFocusOut: %s\n", b->labelStr );
+ }
+ if (b->action) {
+ const char *s;
+ s = gtk_entry_get_text(GTK_ENTRY(b->widget));
+ b->action(s, b->data);
+ }
+ gtk_editable_select_region( GTK_EDITABLE( widget ), 0, 0 );
+ return FALSE;
+}
+static int stringFocusInEvent(
+ GtkEntry *widget,
+ GdkEvent * event,
+ wString_p b)
+{
+ if ( debugWindow >= 1 ) {
+ printf( "stringFocusIn: %s\n", b->labelStr );
+ }
+ stringControl = b;
+ return FALSE;
+}
+static int stringLeaveNotifyEvent(
+ GtkEntry *widget,
+ GdkEvent * event,
+ wString_p b)
+{
+ if ( debugWindow >= 3 ) {
+ printf( "stringLeaveNotfyEvent: %s\n", b->labelStr );
+ }
+ return FALSE;
+}
+static int stringEventAfter(
+ GtkEntry *widget,
+ wString_p b)
+{
+ if ( debugWindow >= 3 ) {
+ printf( "stringEventAfter: %s\n", b->labelStr );
+ }
+ return FALSE;
+}
+static int stringEvent(
+ GtkEntry *widget,
+ wString_p b)
+{
+ if ( debugWindow >= 3 ) {
+ printf( "stringEvent: %s\n", b->labelStr );
+ }
+ return FALSE;
+}
+static int stringKeyPressEvent(
+ GtkEntry *widget,
+ GdkEvent * event,
+ wString_p b)
+{
+ if ( debugWindow >= 1 ) {
+ printf( "stringKeyPressEvent: %s\n", b->labelStr );
+ }
+ return FALSE;
+}
+static int stringStateChanged(
+ GtkEntry *widget,
+ int state,
+ wString_p b)
+{
+ if ( debugWindow >= 1 ) {
+ printf( "stringStateChanged: %s\n", b->labelStr );
+ }
+ return FALSE;
+}
+static int stringActivate(
+ GtkEntry *widget,
+ wString_p b)
+{
+ if ( debugWindow >= 1 ) {
+ printf( "stringActivate: %s\n", b->labelStr );
+ }
+ return stringChanged( widget, b );
+}
/**
* Create a single line entry field for a string value
*
@@ -268,86 +300,109 @@ static void stringChanged(
* \param helpStr IN help anchor
* \param labelStr IN label
* \param option IN option (supported BO_READONLY )
- * \param width IN width of entry field
+ * \param width IN width of entry field
* \param valueP IN default value
- * \param valueL IN maximum length of entry
+ * \param valueL IN maximum length of entry
* \param action IN application callback function
* \param data IN application data
* \return the created widget
*/
wString_p wStringCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char *helpStr,
- const char *labelStr,
- long option,
- wPos_t width,
- char *valueP,
- wIndex_t valueL,
- wStringCallBack_p action,
- void *data)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char *helpStr,
+ const char *labelStr,
+ long option,
+ wWinPix_t width,
+ char *valueP,
+ wIndex_t valueL,
+ wStringCallBack_p action,
+ void *data)
{
wString_p b;
- // create and initialize the widget
+ // create and initialize the widget
b = (wString_p)wlibAlloc(parent, B_TEXT, x, y, labelStr, sizeof *b, data);
b->valueP = valueP;
b->action = action;
b->option = option;
b->valueL = valueL;
- b->timer = 0;
b->hasSignal = 0;
wlibComputePos((wControl_p)b);
- // create the gtk entry field and set maximum length if desired
+ // create the gtk entry field and set maximum length if desired
b->widget = (GtkWidget *)gtk_entry_new();
- if (b->widget == NULL) abort();
+ if (b->widget == NULL) { abort(); }
- if( valueL )
+ if( valueL ) {
gtk_entry_set_max_length( GTK_ENTRY( b->widget ), valueL );
-
+ }
+
// it is assumed that the parent is a fixed layout widget and the entry can
// be placed at a specific position
gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
-
- // set minimum size for widget
- if (width)
+
+ // set minimum size for widget
+ if (width) {
gtk_widget_set_size_request(b->widget, width, -1);
-
+ }
+
// get the resulting size
wlibControlGetSize((wControl_p)b);
// if desired, place a label in front of the created widget
- if (labelStr)
+ if (labelStr) {
b->labelW = wlibAddLabel((wControl_p)b, labelStr);
-
- if (option & BO_READONLY)
+ }
+
+ if (option & BO_READONLY) {
gtk_editable_set_editable(GTK_EDITABLE(b->widget), FALSE);
-
+ }
+
// set the default text and select it to make replacing it easier
if (b->valueP) {
wStringSetValue(b, b->valueP);
// select the text only if text is editable
}
-
+
// show
gtk_widget_show(b->widget);
-
+
// add the new widget to the list of created widgets
wlibAddButton((wControl_p)b);
-
- // link into help
+
+ // link into help
wlibAddHelpString(b->widget, helpStr);
-
- //g_signal_connect(GTK_OBJECT(b->widget), "changed", G_CALLBACK(stringChanged), b);
+
+ g_signal_connect(GTK_OBJECT(b->widget), "changed", G_CALLBACK(stringChanged),
+ b);
+ g_signal_connect(GTK_OBJECT(b->widget), "preedit-changed",
+ G_CALLBACK(stringPreeditChanged), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "focus-out-event",
+ G_CALLBACK(stringFocusOutEvent), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "focus-in-event",
+ G_CALLBACK(stringFocusInEvent), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "leave-notify-event",
+ G_CALLBACK(stringLeaveNotifyEvent), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "event", G_CALLBACK(stringEvent), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "event-after",
+ G_CALLBACK(stringEventAfter), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "key-press-event",
+ G_CALLBACK(stringKeyPressEvent), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "state-changed",
+ G_CALLBACK(stringStateChanged), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "activate", G_CALLBACK(stringActivate),
+ b);
+
//if (option&BO_ENTER)
- g_signal_connect(GTK_OBJECT(b->widget), "activate", G_CALLBACK(stringActivated), b);
+ g_signal_connect(GTK_OBJECT(b->widget), "activate", G_CALLBACK(stringActivated),
+ b);
b->hasSignal = 1;
- g_signal_connect_after(GTK_OBJECT(b->widget), "expose-event",
- G_CALLBACK(stringExposed), b);
-
+ g_signal_connect_after(GTK_OBJECT(b->widget), "expose-event",
+ G_CALLBACK(stringExposed), b);
+
// set the default text and select it to make replacing it easier
if (b->valueP) {
wStringSetValue(b, b->valueP);
@@ -355,7 +410,6 @@ wString_p wStringCreate(
}
gtk_widget_add_events( b->widget, GDK_FOCUS_CHANGE_MASK );
- g_signal_connect(GTK_OBJECT(b->widget), "focus-out-event", G_CALLBACK(killTimer), b);
-
+
return b;
}
diff --git a/app/wlib/gtklib/splash.c b/app/wlib/gtklib/splash.c
index 5d56e9f..d42b7c0 100644
--- a/app/wlib/gtklib/splash.c
+++ b/app/wlib/gtklib/splash.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <string.h>
@@ -50,65 +50,65 @@ static GtkWidget *message; /**< window handle for progress message */
int
wCreateSplash(char *appName, char *appVer)
{
- GtkWidget *vbox;
- GtkWidget *image;
- GtkWidget *label;
- char *temp;
- char logoPath[BUFSIZ];
-
- /* create the basic window */
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
- gtk_window_set_title(GTK_WINDOW(window), appName);
- gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
- gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
- gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_SPLASHSCREEN);
+ GtkWidget *vbox;
+ GtkWidget *image;
+ GtkWidget *label;
+ char *temp;
+ char logoPath[BUFSIZ];
+
+ /* create the basic window */
+ window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
+ gtk_window_set_title(GTK_WINDOW(window), appName);
+ gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
+ gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
+ gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_SPLASHSCREEN);
#if GTK_MAJOR_VERSION > 1 || GTK_MINOR_VERSION > 5
- gtk_window_set_focus_on_map(GTK_WINDOW(window), FALSE);
+ gtk_window_set_focus_on_map(GTK_WINDOW(window), FALSE);
#endif
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_widget_show(vbox);
- gtk_container_add(GTK_CONTAINER(window), vbox);
+ vbox = gtk_vbox_new(FALSE, 0);
+ gtk_widget_show(vbox);
+ gtk_container_add(GTK_CONTAINER(window), vbox);
- /* add the logo image to the top of the splash window */
- sprintf(logoPath, "%s/" LOGOFILENAME, wGetAppLibDir());
- image = gtk_image_new_from_file(logoPath);
- gtk_widget_show(image);
- gtk_box_pack_start(GTK_BOX(vbox), image, TRUE, TRUE, 0);
- gtk_misc_set_alignment(GTK_MISC(image), 0, 0);
+ /* add the logo image to the top of the splash window */
+ sprintf(logoPath, "%s/" LOGOFILENAME, wGetAppLibDir());
+ image = gtk_image_new_from_file(logoPath);
+ gtk_widget_show(image);
+ gtk_box_pack_start(GTK_BOX(vbox), image, TRUE, TRUE, 0);
+ gtk_misc_set_alignment(GTK_MISC(image), 0, 0);
- /* put the product name into the window */
+ /* put the product name into the window */
- temp = malloc(strlen(appName) + strlen(appVer) + 2);
+ temp = malloc(strlen(appName) + strlen(appVer) + 2);
- if (!temp) {
- return (FALSE);
- }
+ if (!temp) {
+ return (FALSE);
+ }
- sprintf(temp, "%s %s", appName, appVer);
+ sprintf(temp, "%s %s", appName, appVer);
- label = gtk_label_new(temp);
- gtk_widget_show(label);
- gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
- gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_FILL);
- gtk_label_set_selectable(GTK_LABEL(label), FALSE);
- gtk_misc_set_padding(GTK_MISC(label), 6, 2);
+ label = gtk_label_new(temp);
+ gtk_widget_show(label);
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+ gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_FILL);
+ gtk_label_set_selectable(GTK_LABEL(label), FALSE);
+ gtk_misc_set_padding(GTK_MISC(label), 6, 2);
- free(temp);
+ free(temp);
- label = gtk_label_new("Application is starting...");
- gtk_widget_show(label);
- gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
- gtk_label_set_line_wrap(GTK_LABEL(label), FALSE);
- gtk_misc_set_padding(GTK_MISC(label), 6, 2);
+ label = gtk_label_new("Application is starting...");
+ gtk_widget_show(label);
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+ gtk_label_set_line_wrap(GTK_LABEL(label), FALSE);
+ gtk_misc_set_padding(GTK_MISC(label), 6, 2);
#if GTK_MINOR_VERSION > 5
- gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_START);
+ gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_START);
#endif
- message = label;
+ message = label;
- gtk_widget_show(window);
- return (TRUE);
+ gtk_widget_show(window);
+ return (TRUE);
}
/**
@@ -120,14 +120,13 @@ wCreateSplash(char *appName, char *appVer)
int
wSetSplashInfo(char *msg)
{
- if (!window) return FALSE;
- if (msg && message) {
- gtk_label_set_text(GTK_LABEL(message), msg);
- wFlush();
- return TRUE;
- }
-
- return FALSE;
+ if (!window) { return FALSE; }
+ if (msg && message) {
+ gtk_label_set_text(GTK_LABEL(message), msg);
+ return TRUE;
+ }
+
+ return FALSE;
}
/**
@@ -138,9 +137,9 @@ wSetSplashInfo(char *msg)
void
wDestroySplash(void)
{
- /* kill window */
- if (window) gtk_widget_destroy(window);
- window = NULL;
+ /* kill window */
+ if (window) { gtk_widget_destroy(window); }
+ window = NULL;
- return;
+ return;
}
diff --git a/app/wlib/gtklib/statusbar.c b/app/wlib/gtklib/statusbar.c
index 3a2fd0d..78d54ac 100644
--- a/app/wlib/gtklib/statusbar.c
+++ b/app/wlib/gtklib/statusbar.c
@@ -39,10 +39,10 @@
#include "gtkint.h"
struct wStatus_t {
- WOBJ_COMMON
- GtkWidget * labelWidget;
- const char * message;
- wPos_t labelWidth;
+ WOBJ_COMMON
+ GtkWidget * labelWidget;
+ const char * message;
+ wWinPix_t labelWidth;
};
/**
@@ -54,20 +54,20 @@ struct wStatus_t {
*/
void wStatusSetValue(
- wStatus_p b,
- const char * arg)
+ wStatus_p b,
+ const char * arg)
{
- if (b->widget == 0) {
- abort();
- }
+ if (b->widget == 0) {
+ abort();
+ }
- if (gtk_entry_get_max_length(GTK_ENTRY(b->labelWidget))<strlen(arg)) {
- gtk_entry_set_max_length(GTK_ENTRY(b->labelWidget), strlen(arg));
- gtk_entry_set_width_chars(GTK_ENTRY(b->labelWidget), strlen(arg));
- }
+ if (gtk_entry_get_max_length(GTK_ENTRY(b->labelWidget))<strlen(arg)) {
+ gtk_entry_set_max_length(GTK_ENTRY(b->labelWidget), strlen(arg));
+ gtk_entry_set_width_chars(GTK_ENTRY(b->labelWidget), strlen(arg));
+ }
- gtk_entry_set_text(GTK_ENTRY(b->labelWidget), wlibConvertInput(arg));
- gtk_widget_queue_draw (GTK_WIDGET(b->labelWidget));
+ gtk_entry_set_text(GTK_ENTRY(b->labelWidget), wlibConvertInput(arg));
+ gtk_widget_queue_draw (GTK_WIDGET(b->labelWidget));
}
/**
* Create a window for a simple text.
@@ -83,38 +83,37 @@ void wStatusSetValue(
*/
wStatus_p wStatusCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * labelStr,
- wPos_t width,
- const char *message)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * labelStr,
+ wWinPix_t width,
+ const char *message)
{
- wStatus_p b;
- GtkRequisition requisition;
- b = (wStatus_p)wlibAlloc(parent, B_STATUS, x, y, NULL, sizeof *b, NULL);
- wlibComputePos((wControl_p)b);
- b->message = message;
- b->labelWidth = width;
- b->labelWidget = gtk_entry_new();
- gtk_editable_set_editable(GTK_EDITABLE(b->labelWidget), FALSE);
- gtk_entry_set_has_frame(GTK_ENTRY(b->labelWidget), FALSE);
- gtk_widget_set_can_focus(b->labelWidget, FALSE);
- gtk_widget_set_sensitive(b->labelWidget, FALSE);
- GdkColor black = {0, 0x0000, 0x0000, 0x0000};
- gtk_widget_modify_text(b->labelWidget,GTK_STATE_INSENSITIVE,&black);
- gtk_entry_set_text(GTK_ENTRY(b->labelWidget),
- message?wlibConvertInput(message):"");
-
- b->widget = gtk_fixed_new();
- gtk_container_add(GTK_CONTAINER(b->widget), b->labelWidget);
- wlibControlGetSize((wControl_p)b);
- gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
- gtk_widget_show(b->widget);
- gtk_widget_show(b->labelWidget);
- wlibAddButton((wControl_p)b);
-
- return b;
+ wStatus_p b;
+ b = (wStatus_p)wlibAlloc(parent, B_STATUS, x, y, NULL, sizeof *b, NULL);
+ wlibComputePos((wControl_p)b);
+ b->message = message;
+ b->labelWidth = width;
+ b->labelWidget = gtk_entry_new();
+ gtk_editable_set_editable(GTK_EDITABLE(b->labelWidget), FALSE);
+ gtk_entry_set_has_frame(GTK_ENTRY(b->labelWidget), FALSE);
+ gtk_widget_set_can_focus(b->labelWidget, FALSE);
+ gtk_widget_set_sensitive(b->labelWidget, FALSE);
+ GdkColor black = {0, 0x0000, 0x0000, 0x0000};
+ gtk_widget_modify_text(b->labelWidget,GTK_STATE_INSENSITIVE,&black);
+ gtk_entry_set_text(GTK_ENTRY(b->labelWidget),
+ message?wlibConvertInput(message):"");
+
+ b->widget = gtk_fixed_new();
+ gtk_container_add(GTK_CONTAINER(b->widget), b->labelWidget);
+ wlibControlGetSize((wControl_p)b);
+ gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY);
+ gtk_widget_show(b->widget);
+ gtk_widget_show(b->labelWidget);
+ wlibAddButton((wControl_p)b);
+
+ return b;
}
/**
@@ -124,25 +123,25 @@ wStatus_p wStatusCreate(
* \return expected width of message box
*/
-wPos_t
+wWinPix_t
wStatusGetWidth(const char *testString)
{
- GtkWidget *entry;
- GtkRequisition requisition;
+ GtkWidget *entry;
+ GtkRequisition requisition;
- entry = gtk_entry_new();
- g_object_ref_sink(entry);
+ entry = gtk_entry_new();
+ g_object_ref_sink(entry);
- gtk_entry_set_has_frame(GTK_ENTRY(entry), FALSE);
- gtk_entry_set_width_chars(GTK_ENTRY(entry), strlen(testString));
- gtk_entry_set_max_length(GTK_ENTRY(entry), strlen(testString));
+ gtk_entry_set_has_frame(GTK_ENTRY(entry), FALSE);
+ gtk_entry_set_width_chars(GTK_ENTRY(entry), strlen(testString));
+ gtk_entry_set_max_length(GTK_ENTRY(entry), strlen(testString));
- gtk_widget_size_request(entry, &requisition);
+ gtk_widget_size_request(entry, &requisition);
- gtk_widget_destroy(entry);
- g_object_unref(entry);
+ gtk_widget_destroy(entry);
+ g_object_unref(entry);
- return (requisition.width);
+ return (requisition.width);
}
/**
@@ -152,50 +151,50 @@ wStatusGetWidth(const char *testString)
* \return text height
*/
-wPos_t wStatusGetHeight(
- long flags)
+wWinPix_t wStatusGetHeight(
+ long flags)
{
- GtkWidget * temp;
+ GtkWidget * temp;
- if (!(flags&COMBOBOX)) {
+ if (!(flags&COMBOBOX)) {
temp = gtk_entry_new(); //To get size of text itself
- gtk_entry_set_has_frame(GTK_ENTRY(temp), FALSE);
- } else {
- temp = gtk_combo_box_text_new(); //to get max size of an object in infoBar
- }
- g_object_ref_sink(temp);
-
- if (wMessageSetFont(flags)) {
- GtkStyle *style;
- PangoFontDescription *fontDesc;
- int fontSize;
- /* get the current font descriptor */
- style = gtk_widget_get_style(temp);
- fontDesc = style->font_desc;
- /* get the current font size */
- fontSize = PANGO_PIXELS(pango_font_description_get_size(fontDesc));
-
- /* calculate the new font size */
- if (flags & BM_LARGE) {
- pango_font_description_set_size(fontDesc, fontSize * 1.4 * PANGO_SCALE);
- } else {
- pango_font_description_set_size(fontDesc, fontSize * 0.7 * PANGO_SCALE);
- }
-
- /* set the new font size */
- gtk_widget_modify_font(temp, fontDesc);
- }
-
- if (flags&1L) {
- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(temp),"Test");
- }
-
- GtkRequisition temp_requisition;
- gtk_widget_size_request(temp,&temp_requisition);
- //g_object_ref_sink(temp);
- //g_object_unref(temp);
- gtk_widget_destroy(temp);
- return temp_requisition.height;
+ gtk_entry_set_has_frame(GTK_ENTRY(temp), FALSE);
+ } else {
+ temp = gtk_combo_box_text_new(); //to get max size of an object in infoBar
+ }
+ g_object_ref_sink(temp);
+
+ if (wMessageSetFont(flags)) {
+ GtkStyle *style;
+ PangoFontDescription *fontDesc;
+ int fontSize;
+ /* get the current font descriptor */
+ style = gtk_widget_get_style(temp);
+ fontDesc = style->font_desc;
+ /* get the current font size */
+ fontSize = PANGO_PIXELS(pango_font_description_get_size(fontDesc));
+
+ /* calculate the new font size */
+ if (flags & BM_LARGE) {
+ pango_font_description_set_size(fontDesc, fontSize * 1.4 * PANGO_SCALE);
+ } else {
+ pango_font_description_set_size(fontDesc, fontSize * 0.7 * PANGO_SCALE);
+ }
+
+ /* set the new font size */
+ gtk_widget_modify_font(temp, fontDesc);
+ }
+
+ if (flags&1L) {
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(temp),"Test");
+ }
+
+ GtkRequisition temp_requisition;
+ gtk_widget_size_request(temp,&temp_requisition);
+ //g_object_ref_sink(temp);
+ //g_object_unref(temp);
+ gtk_widget_destroy(temp);
+ return temp_requisition.height;
}
/**
@@ -207,9 +206,9 @@ wPos_t wStatusGetHeight(
*/
void wStatusSetWidth(
- wStatus_p b,
- wPos_t width)
+ wStatus_p b,
+ wWinPix_t width)
{
- b->labelWidth = width;
- gtk_widget_set_size_request(b->widget, width, -1);
+ b->labelWidth = width;
+ gtk_widget_set_size_request(b->widget, width, -1);
}
diff --git a/app/wlib/gtklib/sysinfo.c b/app/wlib/gtklib/sysinfo.c
new file mode 100644
index 0000000..eccd67f
--- /dev/null
+++ b/app/wlib/gtklib/sysinfo.c
@@ -0,0 +1,137 @@
+/** \file sysinfo.c
+ * Collect info about runtime environment
+*/
+
+/* XTrkCad - Model Railroad CAD
+ * Copyright (C) 2024 Martin Fischer
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <wlib.h>
+#include "gtkint.h"
+
+
+static char *buffer;
+
+/**
+ * Return the path to a temporary directory. The directory is not created.
+ * The result is put into a buffer and is only valid immediately after the call.
+ *
+ * \return pointer to fully qualified directory path
+ */
+
+char *
+wGetTempPath()
+{
+ gchar const *tempDir = g_get_tmp_dir();
+ gchar *path;
+ gchar pidString[20];
+
+ g_snprintf(pidString, 20, "xtc%d", getpid());
+ path = g_build_path("/", tempDir, pidString, (char *)0);
+
+ if(buffer) {
+ g_free(buffer);
+ }
+
+ buffer = g_strdup(path);
+ g_free(path);
+
+ return(buffer);
+}
+
+/**
+ * Get the Windows version. This function uses the Windows ver command to
+ * retrieve the OS version. The result is put into a buffer and is only
+ * valid immediately after the call.
+ *
+ * \return buffer containing the zero terminated string
+ *
+ */
+
+char *
+wGetOSVersion()
+{
+ FILE* pPipe;
+ size_t bufferSize = 80;
+
+ if(buffer) {
+ free(buffer);
+ buffer = NULL;
+ }
+
+ buffer = malloc(bufferSize);
+// pPipe = _popen("cat /etc/*-release | grep "PRETTY_NAME" | sed 's/PRETTY_NAME=//g'", "r");
+ pPipe = popen("uname -sr", "r");
+
+ while (fgets(buffer, bufferSize, pPipe))
+ ;
+
+ if (buffer[strlen(buffer) -1] == '\n')
+ buffer[strlen(buffer) -1 ] = '\0';
+ pclose(pPipe);
+
+ return(buffer);
+}
+
+
+
+/**
+ * Get the name of the current user. The result is put into a buffer and is only
+ * valid immediately after the call.
+ *
+ * \return buffer containing the zero terminated string
+ *
+ */
+
+char *
+wGetUserID()
+{
+ const gchar *name;
+
+ name = g_get_user_name();
+
+ if(buffer) {
+ g_free(buffer);
+ }
+ buffer = g_strdup( name );
+ return(buffer);
+}
+
+/** Get the user's profile directory. Other than on UNIX Windows differentiates
+ * between the home directory and and the profile directory.
+ *
+ * \return pointer to the user's profile directory
+ */
+
+const char* wGetUserHomeRootDir(void)
+{
+ return(wGetUserHomeDir());
+}
+
+const char* wGetPlatformVersion()
+{
+ if(buffer) {
+ g_free(buffer);
+ }
+
+ buffer = g_strdup_printf("%d.%d.%d", gtk_major_version, gtk_minor_version, gtk_micro_version );
+ return(buffer);
+}
+
diff --git a/app/wlib/gtklib/text.c b/app/wlib/gtklib/text.c
index 0812ace..69a7ecc 100644
--- a/app/wlib/gtklib/text.c
+++ b/app/wlib/gtklib/text.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -37,12 +37,12 @@
#include "gtkint.h"
struct PrintData {
- wText_p tb;
- gint lines_per_page;
- gdouble font_size;
- gchar **lines;
- gint total_lines;
- gint total_pages;
+ wText_p tb;
+ gint lines_per_page;
+ gdouble font_size;
+ gchar **lines;
+ gint total_lines;
+ gint total_pages;
};
#define HEADER_HEIGHT 20.0
@@ -58,10 +58,10 @@ struct PrintData {
*/
struct wText_t {
- WOBJ_COMMON
- wPos_t width, height;
- int changed;
- GtkWidget *text;
+ WOBJ_COMMON
+ wWinPix_t width, height;
+ int changed;
+ GtkWidget *text;
};
/**
@@ -74,15 +74,15 @@ struct wText_t {
void wTextClear(wText_p bt)
{
- GtkTextBuffer *tb;
- tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bt->text));
- gtk_text_buffer_set_text(tb, "", -1);
+ GtkTextBuffer *tb;
+ tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bt->text));
+ gtk_text_buffer_set_text(tb, "", -1);
- if (bt->option & BO_READONLY) {
- gtk_text_view_set_editable(GTK_TEXT_VIEW(bt->text), FALSE);
- }
+ if (bt->option & BO_READONLY) {
+ gtk_text_view_set_editable(GTK_TEXT_VIEW(bt->text), FALSE);
+ }
- bt->changed = FALSE;
+ bt->changed = FALSE;
}
/**
@@ -96,34 +96,34 @@ void wTextClear(wText_p bt)
void wTextAppend(wText_p bt,
const char *text)
{
- GtkTextBuffer *tb;
- GtkTextIter ti1;
- GtkTextMark *tm;
-
-
- if (bt->text == 0) {
- abort();
- }
-
- tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bt->text));
- // convert to utf-8
- text = wlibConvertInput(text);
- // append to end of buffer
- gtk_text_buffer_get_end_iter(tb, &ti1);
- gtk_text_buffer_insert(tb, &ti1, text, -1);
-
- if ( bt->option & BT_TOP ) {
- // and scroll to start of text
- gtk_text_buffer_get_start_iter(tb, &ti1);
- } else {
- // and scroll to end of text
- gtk_text_buffer_get_end_iter(tb, &ti1);
- }
- tm = gtk_text_buffer_create_mark(tb, NULL, &ti1, TRUE );
- gtk_text_view_scroll_mark_onscreen (GTK_TEXT_VIEW(bt->text), tm );
- gtk_text_buffer_delete_mark( tb, tm );
-
- bt->changed = FALSE;
+ GtkTextBuffer *tb;
+ GtkTextIter ti1;
+ GtkTextMark *tm;
+
+
+ if (bt->text == 0) {
+ abort();
+ }
+
+ tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bt->text));
+ // convert to utf-8
+ text = wlibConvertInput(text);
+ // append to end of buffer
+ gtk_text_buffer_get_end_iter(tb, &ti1);
+ gtk_text_buffer_insert(tb, &ti1, text, -1);
+
+ if ( bt->option & BT_TOP ) {
+ // and scroll to start of text
+ gtk_text_buffer_get_start_iter(tb, &ti1);
+ } else {
+ // and scroll to end of text
+ gtk_text_buffer_get_end_iter(tb, &ti1);
+ }
+ tm = gtk_text_buffer_create_mark(tb, NULL, &ti1, TRUE );
+ gtk_text_view_scroll_mark_onscreen (GTK_TEXT_VIEW(bt->text), tm );
+ gtk_text_buffer_delete_mark( tb, tm );
+
+ bt->changed = FALSE;
}
/**
@@ -138,21 +138,22 @@ void wTextAppend(wText_p bt,
static char *wlibGetText(wText_p bt)
{
- GtkTextBuffer *tb;
- GtkTextIter ti1, ti2;
- char *cp, *cp1, *res;
-
- if (bt->text == 0) {
- abort();
- }
-
- tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bt->text));
- gtk_text_buffer_get_bounds(tb, &ti1, &ti2);
- cp = gtk_text_buffer_get_text(tb, &ti1, &ti2, FALSE);
- //cp1 = wlibConvertOutput(cp);
- res = strdup(cp);
- g_free(cp);
- return res;
+ GtkTextBuffer *tb;
+ GtkTextIter ti1, ti2;
+ char *cp, *res;
+ //char *cp1;
+
+ if (bt->text == 0) {
+ abort();
+ }
+
+ tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bt->text));
+ gtk_text_buffer_get_bounds(tb, &ti1, &ti2);
+ cp = gtk_text_buffer_get_text(tb, &ti1, &ti2, FALSE);
+ //cp1 = wlibConvertOutput(cp);
+ res = strdup(cp);
+ g_free(cp);
+ return res;
}
/**
@@ -165,20 +166,20 @@ static char *wlibGetText(wText_p bt)
wBool_t wTextSave(wText_p bt, const char *fileName)
{
- FILE *f;
- char *cp;
- f = fopen(fileName, "w");
-
- if (f==NULL) {
- wNoticeEx(NT_ERROR, fileName, "Ok", NULL);
- return FALSE;
- }
-
- cp = wlibGetText(bt);
- fwrite(cp, 1, strlen(cp), f);
- free(cp);
- fclose(f);
- return TRUE;
+ FILE *f;
+ char *cp;
+ f = fopen(fileName, "w");
+
+ if (f==NULL) {
+ wNoticeEx(NT_ERROR, fileName, "Ok", NULL);
+ return FALSE;
+ }
+
+ cp = wlibGetText(bt);
+ fwrite(cp, 1, strlen(cp), f);
+ free(cp);
+ fclose(f);
+ return TRUE;
}
/**
@@ -196,28 +197,28 @@ begin_print(GtkPrintOperation *operation,
GtkPrintContext *context,
struct PrintData *pd)
{
- gchar *contents;
- gdouble height;
- contents = wlibGetText(pd->tb);
- pd->lines = g_strsplit(contents, "\n", 0);
- /* Count the total number of lines in the file. */
- /* ignore the header lines */
- pd->total_lines = 6;
-
- while (pd->lines[pd->total_lines] != NULL) {
- pd->total_lines++;
- }
-
- /* Based on the height of the page and font size, calculate how many lines can be
- * rendered on a single page. A padding of 3 is placed between lines as well.
- * Space for page header, table header and footer lines is subtracted from the total size
- */
- height = gtk_print_context_get_height(context) - (pd->font_size + 3) - 2 *
- (HEADER_HEIGHT + HEADER_GAP);
- pd->lines_per_page = floor(height / (pd->font_size + 3));
- pd->total_pages = (pd->total_lines - 1) / pd->lines_per_page + 1;
- gtk_print_operation_set_n_pages(operation, pd->total_pages);
- free(contents);
+ gchar *contents;
+ gdouble height;
+ contents = wlibGetText(pd->tb);
+ pd->lines = g_strsplit(contents, "\n", 0);
+ /* Count the total number of lines in the file. */
+ /* ignore the header lines */
+ pd->total_lines = 6;
+
+ while (pd->lines[pd->total_lines] != NULL) {
+ pd->total_lines++;
+ }
+
+ /* Based on the height of the page and font size, calculate how many lines can be
+ * rendered on a single page. A padding of 3 is placed between lines as well.
+ * Space for page header, table header and footer lines is subtracted from the total size
+ */
+ height = gtk_print_context_get_height(context) - (pd->font_size + 3) - 2 *
+ (HEADER_HEIGHT + HEADER_GAP);
+ pd->lines_per_page = floor(height / (pd->font_size + 3));
+ pd->total_pages = (pd->total_lines - 1) / pd->lines_per_page + 1;
+ gtk_print_operation_set_n_pages(operation, pd->total_pages);
+ free(contents);
}
/**
@@ -238,76 +239,76 @@ draw_page(GtkPrintOperation *operation,
gint page_nr,
struct PrintData *pd)
{
- cairo_t *cr;
- PangoLayout *layout;
- gdouble width, text_height, height;
- gint line, i, text_width, layout_height;
- PangoFontDescription *desc;
- gchar *page_str;
- cr = gtk_print_context_get_cairo_context(context);
- width = gtk_print_context_get_width(context);
- layout = gtk_print_context_create_pango_layout(context);
- desc = pango_font_description_from_string("Monospace");
- pango_font_description_set_size(desc, pd->font_size * PANGO_SCALE);
- /*
- * render the header line with document type parts list on left and
- * first line of layout title on right
- */
- pango_layout_set_font_description(layout, desc);
- pango_layout_set_text(layout, pd->lines[ 0 ], -1); // document type
- pango_layout_set_width(layout, -1);
- pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
- pango_layout_get_size(layout, NULL, &layout_height);
- text_height = (gdouble) layout_height / PANGO_SCALE;
- cairo_move_to(cr, 0, (HEADER_HEIGHT - text_height) / 2);
- pango_cairo_show_layout(cr, layout);
- pango_layout_set_text(layout, pd->lines[ 2 ], -1); // layout title
- pango_layout_get_size(layout, &text_width, NULL);
- pango_layout_set_alignment(layout, PANGO_ALIGN_RIGHT);
- cairo_move_to(cr, width - (text_width / PANGO_SCALE),
- (HEADER_HEIGHT - text_height) / 2);
- pango_cairo_show_layout(cr, layout);
- /* Render the column header */
- cairo_move_to(cr, 0, HEADER_HEIGHT + HEADER_GAP + pd->font_size + 3);
- pango_layout_set_text(layout, pd->lines[ 6 ], -1);
- pango_cairo_show_layout(cr, layout);
- cairo_rel_move_to(cr, 0, pd->font_size + 3);
- pango_layout_set_text(layout, pd->lines[ 7 ], -1);
- pango_cairo_show_layout(cr, layout);
- /* Render the page text with the specified font and size. */
- cairo_rel_move_to(cr, 0, pd->font_size + 3);
- line = page_nr * pd->lines_per_page + 8;
-
- for (i = 0; i < pd->lines_per_page && line < pd->total_lines; i++) {
- pango_layout_set_text(layout, pd->lines[line], -1);
- pango_cairo_show_layout(cr, layout);
- cairo_rel_move_to(cr, 0, pd->font_size + 3);
- line++;
- }
-
- /*
- * Render the footer line with date on the left and page number
- * on the right
- */
- pango_layout_set_text(layout, pd->lines[ 5 ], -1); // date
- pango_layout_set_width(layout, -1);
- pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
- pango_layout_get_size(layout, NULL, &layout_height);
- text_height = (gdouble) layout_height / PANGO_SCALE;
- height = gtk_print_context_get_height(context);
- cairo_move_to(cr, 0, height - ((HEADER_HEIGHT - text_height) / 2));
- pango_cairo_show_layout(cr, layout);
- page_str = g_strdup_printf(_("%d of %d"), page_nr + 1,
- pd->total_pages); // page number
- pango_layout_set_text(layout, page_str, -1);
- pango_layout_get_size(layout, &text_width, NULL);
- pango_layout_set_alignment(layout, PANGO_ALIGN_RIGHT);
- cairo_move_to(cr, width - (text_width / PANGO_SCALE),
- height - ((HEADER_HEIGHT - text_height) / 2));
- pango_cairo_show_layout(cr, layout);
- g_free(page_str);
- g_object_unref(layout);
- pango_font_description_free(desc);
+ cairo_t *cr;
+ PangoLayout *layout;
+ gdouble width, text_height, height;
+ gint line, i, text_width, layout_height;
+ PangoFontDescription *desc;
+ gchar *page_str;
+ cr = gtk_print_context_get_cairo_context(context);
+ width = gtk_print_context_get_width(context);
+ layout = gtk_print_context_create_pango_layout(context);
+ desc = pango_font_description_from_string("Monospace");
+ pango_font_description_set_size(desc, pd->font_size * PANGO_SCALE);
+ /*
+ * render the header line with document type parts list on left and
+ * first line of layout title on right
+ */
+ pango_layout_set_font_description(layout, desc);
+ pango_layout_set_text(layout, pd->lines[ 0 ], -1); // document type
+ pango_layout_set_width(layout, -1);
+ pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
+ pango_layout_get_size(layout, NULL, &layout_height);
+ text_height = (gdouble) layout_height / PANGO_SCALE;
+ cairo_move_to(cr, 0, (HEADER_HEIGHT - text_height) / 2);
+ pango_cairo_show_layout(cr, layout);
+ pango_layout_set_text(layout, pd->lines[ 2 ], -1); // layout title
+ pango_layout_get_size(layout, &text_width, NULL);
+ pango_layout_set_alignment(layout, PANGO_ALIGN_RIGHT);
+ cairo_move_to(cr, width - (text_width / PANGO_SCALE),
+ (HEADER_HEIGHT - text_height) / 2);
+ pango_cairo_show_layout(cr, layout);
+ /* Render the column header */
+ cairo_move_to(cr, 0, HEADER_HEIGHT + HEADER_GAP + pd->font_size + 3);
+ pango_layout_set_text(layout, pd->lines[ 6 ], -1);
+ pango_cairo_show_layout(cr, layout);
+ cairo_rel_move_to(cr, 0, pd->font_size + 3);
+ pango_layout_set_text(layout, pd->lines[ 7 ], -1);
+ pango_cairo_show_layout(cr, layout);
+ /* Render the page text with the specified font and size. */
+ cairo_rel_move_to(cr, 0, pd->font_size + 3);
+ line = page_nr * pd->lines_per_page + 8;
+
+ for (i = 0; i < pd->lines_per_page && line < pd->total_lines; i++) {
+ pango_layout_set_text(layout, pd->lines[line], -1);
+ pango_cairo_show_layout(cr, layout);
+ cairo_rel_move_to(cr, 0, pd->font_size + 3);
+ line++;
+ }
+
+ /*
+ * Render the footer line with date on the left and page number
+ * on the right
+ */
+ pango_layout_set_text(layout, pd->lines[ 5 ], -1); // date
+ pango_layout_set_width(layout, -1);
+ pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
+ pango_layout_get_size(layout, NULL, &layout_height);
+ text_height = (gdouble) layout_height / PANGO_SCALE;
+ height = gtk_print_context_get_height(context);
+ cairo_move_to(cr, 0, height - ((HEADER_HEIGHT - text_height) / 2));
+ pango_cairo_show_layout(cr, layout);
+ page_str = g_strdup_printf(_("%d of %d"), page_nr + 1,
+ pd->total_pages); // page number
+ pango_layout_set_text(layout, page_str, -1);
+ pango_layout_get_size(layout, &text_width, NULL);
+ pango_layout_set_alignment(layout, PANGO_ALIGN_RIGHT);
+ cairo_move_to(cr, width - (text_width / PANGO_SCALE),
+ height - ((HEADER_HEIGHT - text_height) / 2));
+ pango_cairo_show_layout(cr, layout);
+ g_free(page_str);
+ g_object_unref(layout);
+ pango_font_description_free(desc);
}
/**
@@ -324,8 +325,8 @@ end_print(GtkPrintOperation *operation,
GtkPrintContext *context,
struct PrintData *pd)
{
- g_strfreev(pd->lines);
- free(pd);
+ g_strfreev(pd->lines);
+ free(pd);
}
/**
@@ -341,47 +342,47 @@ end_print(GtkPrintOperation *operation,
*/
wBool_t wTextPrint(
- wText_p bt)
+ wText_p bt)
{
- GtkPrintOperation *operation;
- GtkWidget *dialog;
- GError *error = NULL;
- gint res;
- struct PrintData *data;
- /* Create a new print operation, applying saved print settings if they exist. */
- operation = gtk_print_operation_new();
- WlibApplySettings(operation);
- data = malloc(sizeof(struct PrintData));
- data->font_size = 10.0;
- data->tb = bt;
- g_signal_connect(G_OBJECT(operation), "begin_print",
- G_CALLBACK(begin_print), (gpointer) data);
- g_signal_connect(G_OBJECT(operation), "draw_page",
- G_CALLBACK(draw_page), (gpointer) data);
- g_signal_connect(G_OBJECT(operation), "end_print",
- G_CALLBACK(end_print), (gpointer) data);
- /* Run the default print operation that will print the selected file. */
- res = gtk_print_operation_run(operation,
- GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
- GTK_WINDOW(gtkMainW->gtkwin), &error);
-
- /* If the print operation was accepted, save the new print settings. */
- if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
- WlibSaveSettings(operation);
- }
- /* Otherwise, report that the print operation has failed. */
- else if (error) {
- dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- "%s",error->message);
- g_error_free(error);
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
- }
- g_object_ref_sink(operation);
- g_object_unref(operation);
- return TRUE;
+ GtkPrintOperation *operation;
+ GtkWidget *dialog;
+ GError *error = NULL;
+ gint res;
+ struct PrintData *data;
+ /* Create a new print operation, applying saved print settings if they exist. */
+ operation = gtk_print_operation_new();
+ WlibApplySettings(operation);
+ data = malloc(sizeof(struct PrintData));
+ data->font_size = 10.0;
+ data->tb = bt;
+ g_signal_connect(G_OBJECT(operation), "begin_print",
+ G_CALLBACK(begin_print), (gpointer) data);
+ g_signal_connect(G_OBJECT(operation), "draw_page",
+ G_CALLBACK(draw_page), (gpointer) data);
+ g_signal_connect(G_OBJECT(operation), "end_print",
+ G_CALLBACK(end_print), (gpointer) data);
+ /* Run the default print operation that will print the selected file. */
+ res = gtk_print_operation_run(operation,
+ GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
+ GTK_WINDOW(gtkMainW->gtkwin), &error);
+
+ /* If the print operation was accepted, save the new print settings. */
+ if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
+ WlibSaveSettings(operation);
+ }
+ /* Otherwise, report that the print operation has failed. */
+ else if (error) {
+ dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+ "%s",error->message);
+ g_error_free(error);
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ }
+ g_object_ref_sink(operation);
+ g_object_unref(operation);
+ return TRUE;
}
@@ -394,10 +395,10 @@ wBool_t wTextPrint(
int wTextGetSize(wText_p bt)
{
- char *cp = wlibGetText(bt);
- int len = strlen(cp);
- free(cp);
- return len + 1;
+ char *cp = wlibGetText(bt);
+ int len = strlen(cp);
+ free(cp);
+ return len + 1;
}
/**
@@ -411,15 +412,15 @@ int wTextGetSize(wText_p bt)
void wTextGetText(wText_p bt, char *text, int len)
{
- char *cp;
- cp = wlibGetText(bt);
- strncpy(text, cp, len);
+ char *cp;
+ cp = wlibGetText(bt);
+ strncpy(text, cp, len);
- if (len > 0) {
- text[len - 1] = '\0';
- }
+ if (len > 0) {
+ text[len - 1] = '\0';
+ }
- free(cp);
+ free(cp);
}
/**
@@ -432,13 +433,13 @@ void wTextGetText(wText_p bt, char *text, int len)
void wTextSetReadonly(wText_p bt, wBool_t ro)
{
- gtk_text_view_set_editable(GTK_TEXT_VIEW(bt->text), !ro);
+ gtk_text_view_set_editable(GTK_TEXT_VIEW(bt->text), !ro);
- if (ro) {
- bt->option |= BO_READONLY;
- } else {
- bt->option &= ~BO_READONLY;
- }
+ if (ro) {
+ bt->option |= BO_READONLY;
+ } else {
+ bt->option &= ~BO_READONLY;
+ }
}
/**
@@ -450,7 +451,7 @@ void wTextSetReadonly(wText_p bt, wBool_t ro)
wBool_t wTextGetModified(wText_p bt)
{
- return bt->changed;
+ return bt->changed;
}
/**
@@ -462,11 +463,11 @@ wBool_t wTextGetModified(wText_p bt)
* \return
*/
-void wTextSetSize(wText_p bt, wPos_t w, wPos_t h)
+void wTextSetSize(wText_p bt, wWinPix_t w, wWinPix_t h)
{
- gtk_widget_set_size_request(bt->widget, w, h);
- bt->w = w;
- bt->h = h;
+ gtk_widget_set_size_request(bt->widget, w, h);
+ bt->w = w;
+ bt->h = h;
}
/**
@@ -481,11 +482,12 @@ void wTextSetSize(wText_p bt, wPos_t w, wPos_t h)
* \return
*/
-void wTextComputeSize(wText_p bt, int rows, int cols, wPos_t *width,
- wPos_t *height)
+void wTextComputeSize(wText_p bt, wWinPix_t rows, wWinPix_t cols,
+ wWinPix_t *width,
+ wWinPix_t *height)
{
- *width = rows * 7;
- *height = cols * 14;
+ *width = rows * 7;
+ *height = cols * 14;
}
/**
@@ -498,7 +500,7 @@ void wTextComputeSize(wText_p bt, int rows, int cols, wPos_t *width,
void wTextSetPosition(wText_p bt, int pos)
{
- /* TODO */
+ /* TODO TextSetPosition */
}
/**
@@ -511,11 +513,11 @@ void wTextSetPosition(wText_p bt, int pos)
static void textChanged(GtkWidget *widget, wText_p bt)
{
- if (bt == 0) {
- return;
- }
+ if (bt == 0) {
+ return;
+ }
- bt->changed = TRUE;
+ bt->changed = TRUE;
}
/**
@@ -536,69 +538,69 @@ static void textChanged(GtkWidget *widget, wText_p bt)
wText_p
wTextCreate(wWin_p parent,
- wPos_t x,
- wPos_t y,
+ wWinPix_t x,
+ wWinPix_t y,
const char *helpStr,
const char *labelStr,
long option,
- wPos_t width,
- wPos_t height)
+ wWinPix_t width,
+ wWinPix_t height)
{
- wText_p bt;
- GtkTextBuffer *tb;
- // create the widget
- bt = wlibAlloc(parent, B_MULTITEXT, x, y, labelStr, sizeof *bt, NULL);
- bt->width = width;
- bt->height = height;
- bt->option = option;
- wlibComputePos((wControl_p)bt);
- // create a scroll window with scroll bars that are automatically created
- bt->widget = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(bt->widget),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
- // create a text view and place it inside the scroll widget
- bt->text = gtk_text_view_new();
-
- if (bt->text == 0) {
- abort();
- }
-
- gtk_container_add(GTK_CONTAINER(bt->widget), bt->text);
- // get the text buffer and add a bold tag to it
- tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bt->text));
- gtk_text_buffer_create_tag(tb, "bold", "weight", PANGO_WEIGHT_BOLD, NULL);
-
- // this seems to assume some fixed size fonts, not really helpful
- if (option&BT_CHARUNITS) {
- width *= 7;
- height *= 14;
- }
-
- // show the widgets
- gtk_widget_show(bt->text);
- gtk_widget_show(bt->widget);
- // set the size???
- gtk_widget_set_size_request(GTK_WIDGET(bt->widget),
- width+15/*requisition.width*/, height);
-
- // configure read-only mode
- if (bt->option&BO_READONLY) {
- gtk_text_view_set_editable(GTK_TEXT_VIEW(bt->text), FALSE);
- gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(bt->text), FALSE);
- }
-
- if (labelStr) {
- bt->labelW = wlibAddLabel((wControl_p)bt, labelStr);
- }
-
- wlibAddHelpString(bt->widget, helpStr);
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(bt->text), GTK_WRAP_WORD);
- g_signal_connect(G_OBJECT(tb), "changed", G_CALLBACK(textChanged), bt);
- // place the widget in a fixed position of the parent
- gtk_fixed_put(GTK_FIXED(parent->widget), bt->widget, bt->realX, bt->realY);
- wlibControlGetSize((wControl_p)bt);
- wlibAddButton((wControl_p)bt);
- // done, return the finished widget
- return bt;
+ wText_p bt;
+ GtkTextBuffer *tb;
+ // create the widget
+ bt = wlibAlloc(parent, B_MULTITEXT, x, y, labelStr, sizeof *bt, NULL);
+ bt->width = width;
+ bt->height = height;
+ bt->option = option;
+ wlibComputePos((wControl_p)bt);
+ // create a scroll window with scroll bars that are automatically created
+ bt->widget = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(bt->widget),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+ // create a text view and place it inside the scroll widget
+ bt->text = gtk_text_view_new();
+
+ if (bt->text == 0) {
+ abort();
+ }
+
+ gtk_container_add(GTK_CONTAINER(bt->widget), bt->text);
+ // get the text buffer and add a bold tag to it
+ tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bt->text));
+ gtk_text_buffer_create_tag(tb, "bold", "weight", PANGO_WEIGHT_BOLD, NULL);
+
+ // this seems to assume some fixed size fonts, not really helpful
+ if (option&BT_CHARUNITS) {
+ width *= 7;
+ height *= 14;
+ }
+
+ // show the widgets
+ gtk_widget_show(bt->text);
+ gtk_widget_show(bt->widget);
+ // set the size???
+ gtk_widget_set_size_request(GTK_WIDGET(bt->widget),
+ width+15/*requisition.width*/, height);
+
+ // configure read-only mode
+ if (bt->option&BO_READONLY) {
+ gtk_text_view_set_editable(GTK_TEXT_VIEW(bt->text), FALSE);
+ gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(bt->text), FALSE);
+ }
+
+ if (labelStr) {
+ bt->labelW = wlibAddLabel((wControl_p)bt, labelStr);
+ }
+
+ wlibAddHelpString(bt->widget, helpStr);
+ gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(bt->text), GTK_WRAP_WORD);
+ g_signal_connect(G_OBJECT(tb), "changed", G_CALLBACK(textChanged), bt);
+ // place the widget in a fixed position of the parent
+ gtk_fixed_put(GTK_FIXED(parent->widget), bt->widget, bt->realX, bt->realY);
+ wlibControlGetSize((wControl_p)bt);
+ wlibAddButton((wControl_p)bt);
+ // done, return the finished widget
+ return bt;
}
diff --git a/app/wlib/gtklib/timer.c b/app/wlib/gtklib/timer.c
index 80c71fb..9e70458 100644
--- a/app/wlib/gtklib/timer.c
+++ b/app/wlib/gtklib/timer.c
@@ -52,14 +52,14 @@ static setTriggerCallback_p triggerFunc = NULL;
*/
static gint doAlarm(
- gpointer data)
+ gpointer data)
{
- wAlarmCallBack_p func = (wAlarmCallBack_p)data;
+ wAlarmCallBack_p func = (wAlarmCallBack_p)data;
- func();
+ func();
- alarmTimer = 0;
- return FALSE;
+ alarmTimer = 0;
+ return FALSE;
}
/**
@@ -70,34 +70,34 @@ static gint doAlarm(
*/
void wAlarm(
- long count,
- wAlarmCallBack_p func) /* milliseconds */
+ long count,
+ wAlarmCallBack_p func) /* milliseconds */
{
- gtkPaused = TRUE;
+ gtkPaused = TRUE;
- if (alarmTimer) {
- g_source_remove(alarmTimer);
- }
+ if (alarmTimer) {
+ g_source_remove(alarmTimer);
+ }
- alarmTimer = g_timeout_add(count, doAlarm, (void *)(GSourceFunc)func);
+ alarmTimer = g_timeout_add(count, doAlarm, (void *)(GSourceFunc)func);
}
static void doTrigger(void)
{
- if (triggerControl && triggerFunc) {
- triggerFunc(triggerControl);
- triggerFunc = NULL;
- triggerControl = NULL;
- }
+ if (triggerControl && triggerFunc) {
+ triggerFunc(triggerControl);
+ triggerFunc = NULL;
+ triggerControl = NULL;
+ }
}
void wlibSetTrigger(
- wControl_p b,
- setTriggerCallback_p trigger)
+ wControl_p b,
+ setTriggerCallback_p trigger)
{
- triggerControl = b;
- triggerFunc = trigger;
- wAlarm(500, doTrigger);
+ triggerControl = b;
+ triggerFunc = trigger;
+ wAlarm(500, doTrigger);
}
/**
@@ -107,27 +107,28 @@ void wlibSetTrigger(
*/
void wPause(
- long count) /* milliseconds */
+ long count) /* milliseconds */
{
- while (gtk_events_pending())
- gtk_main_iteration(); //Allow GTK to finish before pausing
-
- struct timeval timeout;
- sigset_t signal_mask;
- sigset_t oldsignal_mask;
- gdk_display_sync(gdk_display_get_default());
- timeout.tv_sec = count/1000;
- timeout.tv_usec = (count%1000)*1000;
- sigemptyset(&signal_mask);
- sigaddset(&signal_mask, SIGIO);
- sigaddset(&signal_mask, SIGALRM);
- sigprocmask(SIG_BLOCK, &signal_mask, &oldsignal_mask);
-
- if (select(0, NULL, NULL, NULL, &timeout) == -1) {
- perror("wPause:select");
- }
-
- sigprocmask(SIG_BLOCK, &oldsignal_mask, NULL);
+ while (gtk_events_pending()) {
+ gtk_main_iteration(); //Allow GTK to finish before pausing
+ }
+
+ struct timeval timeout;
+ sigset_t signal_mask;
+ sigset_t oldsignal_mask;
+ gdk_display_sync(gdk_display_get_default());
+ timeout.tv_sec = count/1000;
+ timeout.tv_usec = (count%1000)*1000;
+ sigemptyset(&signal_mask);
+ sigaddset(&signal_mask, SIGIO);
+ sigaddset(&signal_mask, SIGALRM);
+ sigprocmask(SIG_BLOCK, &signal_mask, &oldsignal_mask);
+
+ if (select(0, NULL, NULL, NULL, &timeout) == -1) {
+ perror("wPause:select");
+ }
+
+ sigprocmask(SIG_BLOCK, &oldsignal_mask, NULL);
}
/**
@@ -139,9 +140,9 @@ void wPause(
unsigned long wGetTimer(void)
{
- struct timeval tv;
- struct timezone tz;
-
- gettimeofday(&tv, &tz);
- return (tv.tv_sec-startTime.tv_sec+1) * 1000 + tv.tv_usec /1000;
+ struct timeval tv;
+ struct timezone tz;
+
+ gettimeofday(&tv, &tz);
+ return (tv.tv_sec-startTime.tv_sec+1) * 1000 + tv.tv_usec /1000;
}
diff --git a/app/wlib/gtklib/tooltip.c b/app/wlib/gtklib/tooltip.c
index 20a1ba9..75c8870 100644
--- a/app/wlib/gtklib/tooltip.c
+++ b/app/wlib/gtklib/tooltip.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -47,18 +47,18 @@ static GtkWidget * balloonPI;
static char balloonMsg[100] = "";
static wControl_p balloonB;
-static wPos_t balloonDx, balloonDy;
+static wWinPix_t balloonDx, balloonDy;
static wBool_t balloonVisible = FALSE;
/**
* Hide the currently displayed Balloon Help.
*/
-
+
void
wlibHelpHideBalloon()
{
- wControlSetBalloon( balloonB, 0, 0, NULL );
+ wControlSetBalloon( balloonB, 0, 0, NULL );
}
/**
@@ -70,7 +70,7 @@ wlibHelpHideBalloon()
void wSetBalloonHelp( wBalloonHelp_t * bh )
{
- balloonHelpStrings = bh;
+ balloonHelpStrings = bh;
}
/**
@@ -82,7 +82,7 @@ void wSetBalloonHelp( wBalloonHelp_t * bh )
void wEnableBalloonHelp( int enable )
{
- enableBalloonHelp = enable;
+ enableBalloonHelp = enable;
}
/**
@@ -93,10 +93,10 @@ void wEnableBalloonHelp( int enable )
*/
void wControlSetHelp(
- wControl_p b,
- const char * help )
+ wControl_p b,
+ const char * help )
{
- wControlSetBalloonText( b, help );
+ wControlSetBalloonText( b, help );
}
/**
@@ -107,13 +107,13 @@ void wControlSetHelp(
*/
void wControlSetBalloonText(
- wControl_p b,
- const char * label )
+ wControl_p b,
+ const char * label )
{
- assert(b->widget != NULL);
+ assert(b->widget != NULL);
- gtk_widget_set_tooltip_text( b->widget, label );
+ gtk_widget_set_tooltip_text( b->widget, label );
}
/**
@@ -128,84 +128,93 @@ void wControlSetBalloonText(
* \return
*/
-void wControlSetBalloon( wControl_p b, wPos_t dx, wPos_t dy, const char * msg )
+void wControlSetBalloon( wControl_p b, wWinPix_t dx, wWinPix_t dy,
+ const char * msg )
{
- PangoLayout * layout;
-
- wPos_t x, y;
- wPos_t w, h;
- wPos_t xx, yy;
- const char * msgConverted;
- GtkRequisition size;
-
- /* return if there is nothing to do */
- if (balloonVisible && balloonB == b &&
- balloonDx == dx && balloonDy == dy && msg != NULL && !balloonMsg[0])
- if (strcmp(msg,balloonMsg)==0)
- return;
-
- /* hide the tooltip */
- if ( msg == NULL ) {
- if ( balloonF != NULL && balloonVisible) {
- gtk_widget_hide( balloonF );
- balloonVisible = FALSE;
- }
- balloonMsg[0] = '\0';
- return;
- }
- msgConverted = wlibConvertInput(msg);
-
- if ( balloonF == NULL ) {
+ gint x, y;
+ gint w, h;
+ wWinPix_t xx, yy;
+ const char * msgConverted;
+ GtkRequisition size;
+
+ /* return if there is nothing to do */
+ if (balloonVisible && balloonB == b &&
+ balloonDx == dx && balloonDy == dy && msg != NULL && !balloonMsg[0])
+ if (strcmp(msg,balloonMsg)==0) {
+ return;
+ }
+
+ /* hide the tooltip */
+ if ( msg == NULL ) {
+ if ( balloonF != NULL && balloonVisible) {
+ gtk_widget_hide( balloonF );
+ balloonVisible = FALSE;
+ }
+ balloonMsg[0] = '\0';
+ return;
+ }
+ msgConverted = wlibConvertInput(msg);
+
+ if ( balloonF == NULL ) {
//GtkWidget *alignment;
-
- balloonF = gtk_window_new( GTK_WINDOW_POPUP );
- gtk_window_set_type_hint( GTK_WINDOW( balloonF), GDK_WINDOW_TYPE_HINT_TOOLTIP );
- gtk_window_set_decorated (GTK_WINDOW (balloonF), FALSE );
- gtk_window_set_resizable( GTK_WINDOW (balloonF), FALSE );
- gtk_window_set_accept_focus(GTK_WINDOW( balloonF), FALSE);
-
+
+ GdkColor color;
+ color.red = 0x00C5 * 65536/255;
+ color.green = 0x006F * 65536/255;
+ color.blue = 0x0078 * 65536/255;
+
+ balloonF = gtk_window_new( GTK_WINDOW_POPUP );
+ gtk_window_set_type_hint( GTK_WINDOW( balloonF), GDK_WINDOW_TYPE_HINT_TOOLTIP );
+ gtk_window_set_decorated (GTK_WINDOW (balloonF), FALSE );
+ gtk_window_set_resizable( GTK_WINDOW (balloonF), FALSE );
+ gtk_window_set_accept_focus(GTK_WINDOW( balloonF), FALSE);
+ gtk_widget_modify_bg(GTK_WIDGET(balloonF), GTK_STATE_NORMAL, &color);
+
GtkWidget * alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
gtk_alignment_set_padding( GTK_ALIGNMENT(alignment), 6, 6, 6, 6 );
gtk_container_add (GTK_CONTAINER (balloonF), alignment);
-
+
gtk_widget_show (alignment);
-
- balloonPI = gtk_label_new(msgConverted);
- gtk_container_add( GTK_CONTAINER(alignment), balloonPI );
- gtk_widget_show_all( balloonPI );
- }
- gtk_label_set_text( GTK_LABEL(balloonPI), msgConverted );
-
- balloonDx = dx;
- balloonDy = dy;
- balloonB = b;
- snprintf(balloonMsg, sizeof(balloonMsg), "%s", msg);
- gtk_widget_get_requisition(balloonPI, &size );
- w = size.width;
- h = size.height;
-
- gtk_window_get_position( GTK_WINDOW(b->parent->gtkwin), &x, &y);
-
- x += b->realX + dx;
- y += b->realY + b->h - dy;
- xx = gdk_screen_width();
- yy = gdk_screen_height();
- if ( x < 0 ) {
- x = 0;
- } else if ( x+w > xx ) {
- x = xx - w;
- }
- if ( y < 0 ) {
- y = 0;
- } else if ( y+h > yy ) {
- y = yy - h ;
- }
- gtk_window_move( GTK_WINDOW( balloonF ), x, y );
- gtk_widget_show_all( balloonF );
- gtk_widget_show( balloonPI );
-
- balloonVisible = TRUE;
+
+ balloonPI = gtk_label_new(msgConverted);
+ gtk_container_add( GTK_CONTAINER(alignment), balloonPI );
+ gtk_widget_show_all( balloonPI );
+ }
+ gtk_label_set_text( GTK_LABEL(balloonPI), msgConverted );
+
+ balloonDx = dx;
+ balloonDy = dy;
+ balloonB = b;
+ snprintf(balloonMsg, sizeof(balloonMsg), "%s", msg);
+ gtk_widget_get_requisition(balloonPI, &size );
+ w = size.width;
+ h = size.height;
+
+ gtk_window_get_position( GTK_WINDOW(b->parent->gtkwin), &x, &y);
+
+ x += b->realX + dx;
+ y += b->realY + b->h - dy;
+#ifdef __linux__
+ y += 7; // balloon popup overlaps the control
+#endif
+ xx = gdk_screen_width();
+ yy = gdk_screen_height();
+ if ( x < 0 ) {
+ x = 0;
+ } else if ( x+w > xx ) {
+ x = xx - w;
+ }
+ if ( y < 0 ) {
+ y = 0;
+ } else if ( y+h > yy ) {
+ y = yy - h ;
+ }
+ gtk_window_move( GTK_WINDOW( balloonF ), x, y );
+ gtk_widget_show_all( balloonF );
+ gtk_widget_show( balloonPI );
+
+ balloonVisible = TRUE;
}
/**
@@ -223,36 +232,41 @@ void wBalloonHelpUpdate( void )
*/
void wlibAddHelpString(
- GtkWidget * widget,
- const char * helpStr )
+ GtkWidget * widget,
+ const char * helpStr )
{
- char *string;
- char *wAppName = wlibGetAppName();
- wBalloonHelp_t * bhp;
-
- if (helpStr==NULL || *helpStr==0)
- return;
- if ( balloonHelpStrings == NULL )
- return;
-
- // search for the helpStr, bhp points to the entry when found
- for ( bhp = balloonHelpStrings; bhp->name && strcmp(bhp->name,helpStr) != 0; bhp++ )
- ;
-
- if (listMissingHelpStrings && !bhp->name) {
- printf( "Missing Help String: %s\n", helpStr );
- return;
- }
-
- string = malloc( strlen(wAppName) + 5 + strlen(helpStr) + 1 );
- sprintf( string, "%sHelp/%s", wAppName, helpStr );
-
- if(bhp->value)
+ char *string;
+ char *wAppName = wlibGetAppName();
+ wBalloonHelp_t * bhp;
+
+ if (helpStr==NULL || *helpStr==0) {
+ return;
+ }
+ if ( balloonHelpStrings == NULL ) {
+ return;
+ }
+
+ // search for the helpStr, bhp points to the entry when found
+ for ( bhp = balloonHelpStrings; bhp->name
+ && strcmp(bhp->name,helpStr) != 0; bhp++ )
+ ;
+
+ if (listMissingHelpStrings && !bhp->name) {
+ printf( "Missing Help String: %s\n", helpStr );
+ return;
+ }
+
+ string = malloc( strlen(wAppName) + 5 + strlen(helpStr) + 1 );
+ sprintf( string, "%sHelp/%s", wAppName, helpStr );
+
+ if(bhp->value) {
gtk_widget_set_tooltip_text( widget, wlibConvertInput(_(bhp->value)) );
+ }
- g_object_set_data( G_OBJECT( widget ), HELPDATAKEY, string );
+ g_object_set_data( G_OBJECT( widget ), HELPDATAKEY, string );
- if (listHelpStrings)
- printf( "HELPSTR - %s\n", string );
+ if (listHelpStrings) {
+ printf( "HELPSTR - %s\n", string );
+ }
}
diff --git a/app/wlib/gtklib/treeview.c b/app/wlib/gtklib/treeview.c
index 2b743cb..b3f2d77 100644
--- a/app/wlib/gtklib/treeview.c
+++ b/app/wlib/gtklib/treeview.c
@@ -53,7 +53,7 @@
int
wTreeViewGetCount(wList_p b)
{
- return b->count;
+ return b->count;
}
/**
@@ -65,9 +65,9 @@ wTreeViewGetCount(wList_p b)
void
wTreeViewClear(wList_p b)
{
- assert(b != NULL);
+ assert(b != NULL);
- wlibListStoreClear(b->listStore);
+ wlibListStoreClear(b->listStore);
}
/**
@@ -81,15 +81,15 @@ wTreeViewClear(wList_p b)
void *
wTreeViewGetItemContext(wList_p b, int row)
{
- wListItem_p id_p;
+ wListItem_p id_p;
- id_p = wlibListItemGet(b->listStore, row, NULL);
+ id_p = wlibListItemGet(b->listStore, row, NULL);
- if (id_p) {
- return id_p->itemData;
- } else {
- return NULL;
- }
+ if (id_p) {
+ return id_p->itemData;
+ } else {
+ return NULL;
+ }
}
/**
@@ -101,11 +101,11 @@ wTreeViewGetItemContext(wList_p b, int row)
*/
wIndex_t wListGetIndex(
- wList_p b)
+ wList_p b)
{
- assert(b!=NULL);
+ assert(b!=NULL);
- return b->last;
+ return b->last;
}
/**
@@ -119,48 +119,48 @@ wIndex_t wListGetIndex(
void
wlibTreeViewSetSelected(wList_p b, int index)
{
- GtkTreeSelection *sel;
- GtkTreeIter iter;
+ GtkTreeSelection *sel;
+ GtkTreeIter iter;
- wListItem_p id_p;
+ wListItem_p id_p;
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(b->treeView));
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(b->treeView));
- if (gtk_tree_selection_count_selected_rows(sel)) {
+ if (gtk_tree_selection_count_selected_rows(sel)) {
int inx;
-
- gtk_tree_selection_unselect_all(sel);
- // and synchronize the internal data structures
- wTreeViewGetCount(b);
+ gtk_tree_selection_unselect_all(sel);
- for (inx=0; inx<b->count; inx++) {
- id_p = wlibListItemGet(b->listStore, inx, NULL);
- id_p->selected = FALSE;
- }
- }
+ // and synchronize the internal data structures
+ wTreeViewGetCount(b);
- if (index != -1) {
+ for (inx=0; inx<b->count; inx++) {
+ id_p = wlibListItemGet(b->listStore, inx, NULL);
+ id_p->selected = FALSE;
+ }
+ }
+
+ if (index != -1) {
gint childs;
-
+
childs = gtk_tree_model_iter_n_children (GTK_TREE_MODEL(b->listStore),
- NULL );
+ NULL );
if(index < childs) {
gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(b->listStore),
- &iter,
- NULL,
- index);
+ &iter,
+ NULL,
+ index);
gtk_tree_selection_select_iter(sel,
- &iter);
+ &iter);
id_p = wlibListItemGet(b->listStore, index, NULL);
-
+
if (id_p) {
id_p->selected = TRUE;
}
- }
- }
+ }
+ }
}
/**
@@ -175,35 +175,37 @@ wlibTreeViewSetSelected(wList_p b, int index)
GtkWidget *
wlibNewTreeView(GtkListStore *ls, int showTitles, int multiSelection)
{
- GtkWidget *treeView;
- GtkTreeSelection *sel;
- assert(ls != NULL);
+ GtkWidget *treeView;
+ GtkTreeSelection *sel;
+ assert(ls != NULL);
- /* create and configure the tree view */
- treeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ls));
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeView), showTitles);
+ /* create and configure the tree view */
+ treeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ls));
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeView), showTitles);
- /* set up selection handling */
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView));
- gtk_tree_selection_set_mode(sel,
- (multiSelection)?GTK_SELECTION_MULTIPLE:GTK_SELECTION_BROWSE);
+ /* set up selection handling */
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView));
+ gtk_tree_selection_set_mode(sel,
+ (multiSelection)?GTK_SELECTION_MULTIPLE:GTK_SELECTION_BROWSE);
- return (treeView);
+ return (treeView);
}
+#if 0
static int changeListColumnWidth(
- GtkTreeViewColumn * column,
- void * width)
+ GtkTreeViewColumn * column,
+ void * width)
{
- //wList_p bl = (wList_p)data;
+ //wList_p bl = (wList_p)data;
- //if (bl->recursion)
- //return 0;
- //if ( col >= 0 && col < bl->colCnt )
- //bl->colWidths[col] = width;
- return 0;
+ //if (bl->recursion)
+ //return 0;
+ //if ( col >= 0 && col < bl->colCnt )
+ //bl->colWidths[col] = width;
+ return 0;
}
+#endif
/**
* Create and initialize a column in treeview. Initially all columns are
@@ -220,17 +222,17 @@ static void
wlibAddColumn(GtkWidget *tv, int visibility, GtkCellRenderer *renderer,
char *attribute, int value)
{
- GtkTreeViewColumn *column;
+ GtkTreeViewColumn *column;
- column = gtk_tree_view_column_new();
- gtk_tree_view_column_pack_start(column,
- renderer,
- TRUE);
- gtk_tree_view_column_add_attribute(column, renderer, attribute, value);
- gtk_tree_view_column_set_visible(column, visibility);
- gtk_tree_view_column_set_resizable(column, TRUE);
+ column = gtk_tree_view_column_new();
+ gtk_tree_view_column_pack_start(column,
+ renderer,
+ TRUE);
+ gtk_tree_view_column_add_attribute(column, renderer, attribute, value);
+ gtk_tree_view_column_set_visible(column, visibility);
+ gtk_tree_view_column_set_resizable(column, TRUE);
- gtk_tree_view_append_column(GTK_TREE_VIEW(tv), column);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(tv), column);
// g_signal_connect( column, "notify::width", G_CALLBACK(changeListColumnWidth), tv );
}
@@ -247,22 +249,22 @@ wlibAddColumn(GtkWidget *tv, int visibility, GtkCellRenderer *renderer,
int
wlibTreeViewAddColumns(GtkWidget *tv, int count)
{
- GtkCellRenderer *renderer;
- int i;
+ GtkCellRenderer *renderer;
+ int i;
- assert(tv != NULL);
- renderer = gtk_cell_renderer_pixbuf_new();
- /* first visible column is used for bitmaps */
- wlibAddColumn(tv, FALSE, renderer, "pixbuf", LISTCOL_BITMAP);
+ assert(tv != NULL);
+ renderer = gtk_cell_renderer_pixbuf_new();
+ /* first visible column is used for bitmaps */
+ wlibAddColumn(tv, FALSE, renderer, "pixbuf", LISTCOL_BITMAP);
- renderer = gtk_cell_renderer_text_new();
+ renderer = gtk_cell_renderer_text_new();
- /* add renderers to all columns */
- for (i = 0; i < count; i++) {
- wlibAddColumn(tv, TRUE, renderer, "text", i + LISTCOL_TEXT);
- }
+ /* add renderers to all columns */
+ for (i = 0; i < count; i++) {
+ wlibAddColumn(tv, TRUE, renderer, "text", i + LISTCOL_TEXT);
+ }
- return i;
+ return i;
}
/**
@@ -276,26 +278,26 @@ wlibTreeViewAddColumns(GtkWidget *tv, int count)
int
wlibAddColumnTitles(GtkWidget *tv, const char **titles)
{
- int i = 0;
-
- assert(tv != NULL);
-
- if (titles) {
- while (*titles) {
- GtkTreeViewColumn *column;
-
- column = gtk_tree_view_get_column(GTK_TREE_VIEW(tv), i + 1);
-
- if (column) {
- gtk_tree_view_column_set_title(column, titles[ i ]);
- i++;
- } else {
- break;
- }
- }
- }
-
- return i;
+ int i = 0;
+
+ assert(tv != NULL);
+
+ if (titles) {
+ while (*titles) {
+ GtkTreeViewColumn *column;
+
+ column = gtk_tree_view_get_column(GTK_TREE_VIEW(tv), i + 1);
+
+ if (column) {
+ gtk_tree_view_column_set_title(column, titles[ i ]);
+ i++;
+ } else {
+ break;
+ }
+ }
+ }
+
+ return i;
}
/**
@@ -313,20 +315,20 @@ int
wlibTreeViewAddData(GtkWidget *tv, int cols, char *label, GdkPixbuf *pixbuf,
wListItem_p userData)
{
- GtkListStore *listStore = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(
- tv)));
+ GtkListStore *listStore = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(
+ tv)));
+
+ wlibListStoreAddData(listStore, pixbuf, cols, userData);
- wlibListStoreAddData(listStore, pixbuf, cols, userData);
+ if (pixbuf) {
+ GtkTreeViewColumn *column;
- if (pixbuf) {
- GtkTreeViewColumn *column;
-
- // first column in list store has pixbuf
- column = gtk_tree_view_get_column(GTK_TREE_VIEW(tv), 0);
- gtk_tree_view_column_set_visible(column,
- TRUE);
- }
- return 0;
+ // first column in list store has pixbuf
+ column = gtk_tree_view_get_column(GTK_TREE_VIEW(tv), 0);
+ gtk_tree_view_column_set_visible(column,
+ TRUE);
+ }
+ return 0;
}
@@ -344,28 +346,28 @@ wlibTreeViewAddData(GtkWidget *tv, int cols, char *label, GdkPixbuf *pixbuf,
void
wlibTreeViewAddRow(wList_p b, char *label, wIcon_p bm, wListItem_p id_p)
{
- GtkAdjustment *adj;
- GdkPixbuf *pixbuf = NULL;
+ GtkAdjustment *adj;
+ GdkPixbuf *pixbuf = NULL;
- if (bm) {
- pixbuf = wlibMakePixbuf(bm);
- }
+ if (bm) {
+ pixbuf = wlibMakePixbuf(bm);
+ }
- wlibTreeViewAddData(b->treeView, b->colCnt, (char *)label, pixbuf, id_p);
+ wlibTreeViewAddData(b->treeView, b->colCnt, (char *)label, pixbuf, id_p);
- adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(b->widget));
+ adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(b->widget));
- if (gtk_adjustment_get_upper(adj) < gtk_adjustment_get_step_increment(adj) *
- (b->count+1)) {
- gtk_adjustment_set_upper(adj,
- gtk_adjustment_get_upper(adj) +
- gtk_adjustment_get_step_increment(adj));
- gtk_adjustment_changed(adj);
- }
+ if (gtk_adjustment_get_upper(adj) < gtk_adjustment_get_step_increment(adj) *
+ (b->count+1)) {
+ gtk_adjustment_set_upper(adj,
+ gtk_adjustment_get_upper(adj) +
+ gtk_adjustment_get_step_increment(adj));
+ gtk_adjustment_changed(adj);
+ }
- b->last = gtk_tree_model_iter_n_children(gtk_tree_view_get_model(GTK_TREE_VIEW(
- b->treeView)),
- NULL);
+ b->last = gtk_tree_model_iter_n_children(gtk_tree_view_get_model(GTK_TREE_VIEW(
+ b->treeView)),
+ NULL);
}
@@ -390,36 +392,34 @@ changeSelection(GtkTreeSelection *selection,
gboolean path_currently_selected,
gpointer data)
{
- GtkTreeIter iter;
- GValue value = { 0 };
- wListItem_p id_p = NULL;
- wList_p bl = (wList_p)data;
- int row;
- char *text;
+ GtkTreeIter iter;
+ GValue value = { 0 };
+ wListItem_p id_p = NULL;
+ wList_p bl = (wList_p)data;
+ int row;
+ char *text;
- text = gtk_tree_path_to_string(path);
- row = atoi(text);
- g_free(text);
+ text = gtk_tree_path_to_string(path);
+ row = atoi(text);
+ g_free(text);
- gtk_tree_model_get_iter(model, &iter, path);
- gtk_tree_model_get_value(model, &iter, LISTCOL_DATA, &value);
+ gtk_tree_model_get_iter(model, &iter, path);
+ gtk_tree_model_get_value(model, &iter, LISTCOL_DATA, &value);
- id_p = g_value_get_pointer(&value);
- id_p->selected = !path_currently_selected;
+ id_p = g_value_get_pointer(&value);
+ id_p->selected = !path_currently_selected;
- if (id_p->selected) {
- bl->last = row;
+ bl->last = row;
- if (bl->valueP) {
- *bl->valueP = row;
- }
+ if (bl->valueP) {
+ *bl->valueP = row;
+ }
- if (bl->action) {
- bl->action(row, id_p->label, 1, bl->data, id_p->itemData);
- }
- }
+ if (bl->action) {
+ bl->action(row, id_p->label, id_p->selected, bl->data, id_p->itemData);
+ }
- return TRUE;
+ return TRUE;
}
/**
@@ -444,88 +444,88 @@ changeSelection(GtkTreeSelection *selection,
*/
wList_p wListCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- const char * labelStr,
- long option,
- long number,
- wPos_t width,
- int colCnt,
- wPos_t * colWidths,
- wBool_t * colRightJust,
- const char ** colTitles,
- long *valueP,
- wListCallBack_p action,
- void *data)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ long option,
+ long number,
+ wWinPix_t width,
+ int colCnt,
+ wWinPix_t * colWidths,
+ wBool_t * colRightJust,
+ const char ** colTitles,
+ long *valueP,
+ wListCallBack_p action,
+ void *data)
{
- GtkTreeSelection *sel;
- wList_p bl;
- static wPos_t zeroPos = 0;
+ GtkTreeSelection *sel;
+ wList_p bl;
+ static wWinPix_t zeroPos = 0;
- assert(width != 0);
+ assert(width != 0);
- bl = (wList_p)wlibAlloc(parent, B_LIST, x, y, labelStr, sizeof *bl, data);
- bl->option = option;
- bl->number = number;
- bl->count = 0;
- bl->last = -1;
- bl->valueP = valueP;
- bl->action = action;
- bl->listX = bl->realX;
+ bl = (wList_p)wlibAlloc(parent, B_LIST, x, y, labelStr, sizeof *bl, data);
+ bl->option = option;
+ bl->number = number;
+ bl->count = 0;
+ bl->last = -1;
+ bl->valueP = valueP;
+ bl->action = action;
+ bl->listX = bl->realX;
- if (colCnt <= 0) {
- colCnt = 1;
- colWidths = &zeroPos;
- }
+ if (colCnt <= 0) {
+ colCnt = 1;
+ colWidths = &zeroPos;
+ }
- bl->colCnt = colCnt;
- bl->colWidths = (wPos_t*)malloc(colCnt * sizeof *(wPos_t*)0);
- memcpy(bl->colWidths, colWidths, colCnt * sizeof *(wPos_t*)0);
+ bl->colCnt = colCnt;
+ bl->colWidths = (wWinPix_t*)malloc(colCnt * sizeof *(wWinPix_t*)0);
+ memcpy(bl->colWidths, colWidths, colCnt * sizeof *(wWinPix_t*)0);
- /* create the data structure for data */
- bl->listStore = wlibNewListStore(colCnt);
- /* create the widget for the list store */
- bl->treeView = wlibNewTreeView(bl->listStore,
- colTitles != NULL,
- option & BL_MANY);
+ /* create the data structure for data */
+ bl->listStore = wlibNewListStore(colCnt);
+ /* create the widget for the list store */
+ bl->treeView = wlibNewTreeView(bl->listStore,
+ colTitles != NULL,
+ option & BL_MANY);
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(bl->treeView));
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(bl->treeView));
- gtk_tree_selection_set_select_function(sel,
- changeSelection,
- bl,
- NULL);
+ gtk_tree_selection_set_select_function(sel,
+ changeSelection,
+ bl,
+ NULL);
- wlibTreeViewAddColumns(bl->treeView, colCnt);
+ wlibTreeViewAddColumns(bl->treeView, colCnt);
- wlibAddColumnTitles(bl->treeView, colTitles);
+ wlibAddColumnTitles(bl->treeView, colTitles);
- wlibComputePos((wControl_p)bl);
+ wlibComputePos((wControl_p)bl);
- bl->widget = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(bl->widget),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(bl->widget),
- bl->treeView);
+ bl->widget = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(bl->widget),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(bl->widget),
+ bl->treeView);
- gtk_widget_set_size_request(bl->widget, width, (number+1)*ROW_HEIGHT);
+ gtk_widget_set_size_request(bl->widget, width, (number+1)*ROW_HEIGHT);
/// g_signal_connect( GTK_OBJECT(bl->list), "resize_column", G_CALLBACK(changeListColumnWidth), bl );
- gtk_widget_show_all(bl->widget);
+ gtk_widget_show_all(bl->widget);
- gtk_fixed_put(GTK_FIXED(parent->widget), bl->widget, bl->realX, bl->realY);
- wlibControlGetSize((wControl_p)bl);
+ gtk_fixed_put(GTK_FIXED(parent->widget), bl->widget, bl->realX, bl->realY);
+ wlibControlGetSize((wControl_p)bl);
- if (labelStr) {
- bl->labelW = wlibAddLabel((wControl_p)bl, labelStr);
- }
+ if (labelStr) {
+ bl->labelW = wlibAddLabel((wControl_p)bl, labelStr);
+ }
- wlibAddButton((wControl_p)bl);
- wlibAddHelpString(bl->widget, helpStr);
+ wlibAddButton((wControl_p)bl);
+ wlibAddHelpString(bl->widget, helpStr);
- return bl;
+ return bl;
}
diff --git a/app/wlib/gtklib/uthash.h b/app/wlib/gtklib/uthash.h
index 39fd891..bf74f7b 100644
--- a/app/wlib/gtklib/uthash.h
+++ b/app/wlib/gtklib/uthash.h
@@ -890,22 +890,22 @@ for((el)=(head),(tmp)=DECLTYPE(el)((head)?(head)->hh.next:NULL);
#define HASH_CNT(hh,head) ((head)?((head)->hh.tbl->num_items):0)
typedef struct UT_hash_bucket {
- struct UT_hash_handle *hh_head;
- unsigned count;
-
- /* expand_mult is normally set to 0. In this situation, the max chain length
- * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If
- * the bucket's chain exceeds this length, bucket expansion is triggered).
- * However, setting expand_mult to a non-zero value delays bucket expansion
- * (that would be triggered by additions to this particular bucket)
- * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH.
- * (The multiplier is simply expand_mult+1). The whole idea of this
- * multiplier is to reduce bucket expansions, since they are expensive, in
- * situations where we know that a particular bucket tends to be overused.
- * It is better to let its chain length grow to a longer yet-still-bounded
- * value, than to do an O(n) bucket expansion too often.
- */
- unsigned expand_mult;
+ struct UT_hash_handle *hh_head;
+ unsigned count;
+
+ /* expand_mult is normally set to 0. In this situation, the max chain length
+ * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If
+ * the bucket's chain exceeds this length, bucket expansion is triggered).
+ * However, setting expand_mult to a non-zero value delays bucket expansion
+ * (that would be triggered by additions to this particular bucket)
+ * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH.
+ * (The multiplier is simply expand_mult+1). The whole idea of this
+ * multiplier is to reduce bucket expansions, since they are expensive, in
+ * situations where we know that a particular bucket tends to be overused.
+ * It is better to let its chain length grow to a longer yet-still-bounded
+ * value, than to do an O(n) bucket expansion too often.
+ */
+ unsigned expand_mult;
} UT_hash_bucket;
@@ -914,47 +914,47 @@ typedef struct UT_hash_bucket {
#define HASH_BLOOM_SIGNATURE 0xb12220f2
typedef struct UT_hash_table {
- UT_hash_bucket *buckets;
- unsigned num_buckets, log2_num_buckets;
- unsigned num_items;
- struct UT_hash_handle *tail; /* tail hh in app order, for fast append */
- ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */
-
- /* in an ideal situation (all buckets used equally), no bucket would have
- * more than ceil(#items/#buckets) items. that's the ideal chain length. */
- unsigned ideal_chain_maxlen;
-
- /* nonideal_items is the number of items in the hash whose chain position
- * exceeds the ideal chain maxlen. these items pay the penalty for an uneven
- * hash distribution; reaching them in a chain traversal takes >ideal steps */
- unsigned nonideal_items;
-
- /* ineffective expands occur when a bucket doubling was performed, but
- * afterward, more than half the items in the hash had nonideal chain
- * positions. If this happens on two consecutive expansions we inhibit any
- * further expansion, as it's not helping; this happens when the hash
- * function isn't a good fit for the key domain. When expansion is inhibited
- * the hash will still work, albeit no longer in constant time. */
- unsigned ineff_expands, noexpand;
-
- uint32_t signature; /* used only to find hash tables in external analysis */
+ UT_hash_bucket *buckets;
+ unsigned num_buckets, log2_num_buckets;
+ unsigned num_items;
+ struct UT_hash_handle *tail; /* tail hh in app order, for fast append */
+ ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */
+
+ /* in an ideal situation (all buckets used equally), no bucket would have
+ * more than ceil(#items/#buckets) items. that's the ideal chain length. */
+ unsigned ideal_chain_maxlen;
+
+ /* nonideal_items is the number of items in the hash whose chain position
+ * exceeds the ideal chain maxlen. these items pay the penalty for an uneven
+ * hash distribution; reaching them in a chain traversal takes >ideal steps */
+ unsigned nonideal_items;
+
+ /* ineffective expands occur when a bucket doubling was performed, but
+ * afterward, more than half the items in the hash had nonideal chain
+ * positions. If this happens on two consecutive expansions we inhibit any
+ * further expansion, as it's not helping; this happens when the hash
+ * function isn't a good fit for the key domain. When expansion is inhibited
+ * the hash will still work, albeit no longer in constant time. */
+ unsigned ineff_expands, noexpand;
+
+ uint32_t signature; /* used only to find hash tables in external analysis */
#ifdef HASH_BLOOM
- uint32_t bloom_sig; /* used only to test bloom exists in external analysis */
- uint8_t *bloom_bv;
- char bloom_nbits;
+ uint32_t bloom_sig; /* used only to test bloom exists in external analysis */
+ uint8_t *bloom_bv;
+ char bloom_nbits;
#endif
} UT_hash_table;
typedef struct UT_hash_handle {
- struct UT_hash_table *tbl;
- void *prev; /* prev element in app order */
- void *next; /* next element in app order */
- struct UT_hash_handle *hh_prev; /* previous hh in bucket order */
- struct UT_hash_handle *hh_next; /* next hh in bucket order */
- void *key; /* ptr to enclosing struct's key */
- unsigned keylen; /* enclosing struct's key len */
- unsigned hashv; /* result of hash-fcn(key) */
+ struct UT_hash_table *tbl;
+ void *prev; /* prev element in app order */
+ void *next; /* next element in app order */
+ struct UT_hash_handle *hh_prev; /* previous hh in bucket order */
+ struct UT_hash_handle *hh_next; /* next hh in bucket order */
+ void *key; /* ptr to enclosing struct's key */
+ unsigned keylen; /* enclosing struct's key len */
+ unsigned hashv; /* result of hash-fcn(key) */
} UT_hash_handle;
#endif /* UTHASH_H */
diff --git a/app/wlib/gtklib/util.c b/app/wlib/gtklib/util.c
index a265938..3f746e6 100644
--- a/app/wlib/gtklib/util.c
+++ b/app/wlib/gtklib/util.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -37,41 +37,43 @@
#include "gtkint.h"
#include "i18n.h"
-wWin_p gtkMainW;
+extern wWin_p gtkMainW;
long debugWindow = 0;
char wConfigName[ 256 ];
const char * wNames[] = {
- "MAIN",
- "POPUP",
- "BUTT",
- "CANCEL",
- "POPUP",
- "TEXT",
- "INTEGER",
- "FLOAT",
- "LIST",
- "DROPLIST",
- "COMBOLIST",
- "RADIO",
- "TOGGLE",
- "DRAW",
- "MENU"
- "MULTITEXT",
- "MESSAGE",
- "LINES",
- "MENUITEM",
- "BOX"
+ "MAIN",
+ "POPUP",
+ "BUTT",
+ "CANCEL",
+ "POPUP",
+ "TEXT",
+ "INTEGER",
+ "FLOAT",
+ "LIST",
+ "DROPLIST",
+ "COMBOLIST",
+ "RADIO",
+ "TOGGLE",
+ "DRAW",
+ "MENU"
+ "MULTITEXT",
+ "MESSAGE",
+ "LINES",
+ "MENUITEM",
+ "BOX"
};
+#if 0
static wBool_t reverseIcon =
#if defined(linux)
- FALSE;
+ FALSE;
#else
- TRUE;
+ TRUE;
+#endif
#endif
@@ -92,50 +94,49 @@ static wBool_t reverseIcon =
*/
GdkPixbuf* wlibPixbufFromXBM(
- wIcon_p ip)
+ wIcon_p ip)
{
- GdkPixbuf * pixbuf;
-
- char line0[40];
- char line2[40];
-
- char ** pixmapData;
- int row, col, wb;
- long rgb;
- const char * bits;
-
- wb = (ip->w + 7) / 8;
- pixmapData = (char**) malloc((3 + ip->h) * sizeof *pixmapData);
- pixmapData[0] = line0;
- rgb = wDrawGetRGB(ip->color);
- sprintf(line0, " %d %d 2 1", ip->w, ip->h);
- sprintf(line2, "# c #%2.2lx%2.2lx%2.2lx", (rgb >> 16)&0xFF, (rgb >> 8)&0xFF,
- rgb & 0xFF);
- pixmapData[1] = ". c None s None";
- pixmapData[2] = line2;
- bits = ip->bits;
-
- for (row = 0; row < ip->h; row++) {
- pixmapData[row + 3] = (char*) malloc((ip->w + 1) * sizeof **pixmapData);
-
- for (col = 0; col < ip->w; col++) {
- if (bits[ row * wb + (col >> 3) ] & (1 << (col & 07))) {
- pixmapData[row + 3][col] = '#';
- }
- else {
- pixmapData[row + 3][col] = '.';
- }
- }
- pixmapData[row + 3][ip->w] = 0;
- }
-
- pixbuf = gdk_pixbuf_new_from_xpm_data((const char **) pixmapData);
-
- for (row = 0; row < ip->h; row++) {
- free(pixmapData[row + 3]);
- }
- free(pixmapData);
- return pixbuf;
+ GdkPixbuf * pixbuf;
+
+ char line0[40];
+ char line2[40];
+
+ char ** pixmapData;
+ int row, col, wb;
+ long rgb;
+ const char * bits;
+
+ wb = (ip->w + 7) / 8;
+ pixmapData = (char**) malloc((3 + ip->h) * sizeof *pixmapData);
+ pixmapData[0] = line0;
+ rgb = wDrawGetRGB(ip->color);
+ sprintf(line0, " %ld %ld 2 1", ip->w, ip->h);
+ sprintf(line2, "# c #%2.2lx%2.2lx%2.2lx", (rgb >> 16)&0xFF, (rgb >> 8)&0xFF,
+ rgb & 0xFF);
+ pixmapData[1] = ". c None s None";
+ pixmapData[2] = line2;
+ bits = ip->bits;
+
+ for (row = 0; row < ip->h; row++) {
+ pixmapData[row + 3] = (char*) malloc((ip->w + 1) * sizeof **pixmapData);
+
+ for (col = 0; col < ip->w; col++) {
+ if (bits[ row * wb + (col >> 3) ] & (1 << (col & 07))) {
+ pixmapData[row + 3][col] = '#';
+ } else {
+ pixmapData[row + 3][col] = '.';
+ }
+ }
+ pixmapData[row + 3][ip->w] = 0;
+ }
+
+ pixbuf = gdk_pixbuf_new_from_xpm_data((const char **) pixmapData);
+
+ for (row = 0; row < ip->h; row++) {
+ free(pixmapData[row + 3]);
+ }
+ free(pixmapData);
+ return pixbuf;
}
/**
@@ -148,23 +149,25 @@ GdkPixbuf* wlibPixbufFromXBM(
int wlibAddLabel(wControl_p b, const char * labelStr)
{
- GtkRequisition requisition, reqwidget;
-
- if (labelStr == NULL) {
- return 0;
- }
-
- b->label = gtk_label_new(wlibConvertInput(labelStr));
- gtk_widget_size_request(b->label, &requisition);
- if (b->widget)
- gtk_widget_size_request(b->widget, &reqwidget);
- else
- reqwidget.height = requisition.height;
- gtk_container_add(GTK_CONTAINER(b->parent->widget), b->label);
- gtk_fixed_move(GTK_FIXED(b->parent->widget), b->label,
- b->realX - requisition.width - 8, b->realY + (reqwidget.height/2 - requisition.height/2));
- gtk_widget_show(b->label);
- return requisition.width + 8;
+ GtkRequisition requisition, reqwidget;
+
+ if (labelStr == NULL) {
+ return 0;
+ }
+
+ b->label = gtk_label_new(wlibConvertInput(labelStr));
+ gtk_widget_size_request(b->label, &requisition);
+ if (b->widget) {
+ gtk_widget_size_request(b->widget, &reqwidget);
+ } else {
+ reqwidget.height = requisition.height;
+ }
+ gtk_container_add(GTK_CONTAINER(b->parent->widget), b->label);
+ gtk_fixed_move(GTK_FIXED(b->parent->widget), b->label,
+ b->realX - requisition.width - 8,
+ b->realY + (reqwidget.height/2 - requisition.height/2));
+ gtk_widget_show(b->label);
+ return requisition.width + 8;
}
/**
@@ -181,44 +184,44 @@ int wlibAddLabel(wControl_p b, const char * labelStr)
*/
void * wlibAlloc(
- wWin_p parent,
- wType_e type,
- wPos_t origX,
- wPos_t origY,
- const char * labelStr,
- int size,
- void * data)
+ wWin_p parent,
+ wType_e type,
+ wWinPix_t origX,
+ wWinPix_t origY,
+ const char * labelStr,
+ int size,
+ void * data)
{
- wControl_p w = (wControl_p) malloc(size);
- char * cp;
- memset(w, 0, size);
+ wControl_p w = (wControl_p) malloc(size);
+ char * cp;
+ memset(w, 0, size);
- if (w == NULL) {
- abort();
- }
+ if (w == NULL) {
+ abort();
+ }
- w->outline = FALSE;
+ w->outline = FALSE;
- w->type = type;
- w->parent = parent;
- w->origX = origX;
- w->origY = origY;
+ w->type = type;
+ w->parent = parent;
+ w->origX = origX;
+ w->origY = origY;
- if (labelStr) {
- cp = (char*) malloc(strlen(labelStr) + 1);
- w->labelStr = cp;
+ if (labelStr) {
+ cp = (char*) malloc(strlen(labelStr) + 1);
+ w->labelStr = cp;
- for (; *labelStr; labelStr++)
- if (*labelStr != '&') {
- *cp++ = *labelStr;
- }
+ for (; *labelStr; labelStr++)
+ if (*labelStr != '&') {
+ *cp++ = *labelStr;
+ }
- *cp = 0;
- }
+ *cp = 0;
+ }
- w->doneProc = NULL;
- w->data = data;
- return w;
+ w->doneProc = NULL;
+ w->data = data;
+ return w;
}
/**
@@ -228,23 +231,22 @@ void * wlibAlloc(
*/
void wlibComputePos(
- wControl_p b)
+ wControl_p b)
{
- wWin_p w = b->parent;
-
- if (b->origX >= 0) {
- b->realX = b->origX;
- }
- else {
- b->realX = w->lastX + (-b->origX) - 1;
- }
-
- if (b->origY >= 0) {
- b->realY = b->origY + BORDERSIZE + ((w->option & F_MENUBAR) ? w->menu_height : 0);
- }
- else {
- b->realY = w->lastY + (-b->origY) - 1;
- }
+ wWin_p w = b->parent;
+
+ if (b->origX >= 0) {
+ b->realX = b->origX;
+ } else {
+ b->realX = w->lastX + (-b->origX) - 1;
+ }
+
+ if (b->origY >= 0) {
+ b->realY = b->origY + BORDERSIZE + ((w->option & F_MENUBAR) ? w->menu_height :
+ 0);
+ } else {
+ b->realY = w->lastY + (-b->origY) - 1;
+ }
}
/**
@@ -254,12 +256,12 @@ void wlibComputePos(
*/
void wlibControlGetSize(
- wControl_p b)
+ wControl_p b)
{
- GtkRequisition requisition;
- gtk_widget_size_request(b->widget, &requisition);
- b->w = requisition.width;
- b->h = requisition.height;
+ GtkRequisition requisition;
+ gtk_widget_size_request(b->widget, &requisition);
+ b->w = requisition.width;
+ b->h = requisition.height;
}
/**
@@ -268,50 +270,49 @@ void wlibControlGetSize(
*/
void wlibAddButton(
- wControl_p b)
+ wControl_p b)
{
- wWin_p win = b->parent;
- wBool_t resize = FALSE;
-
- if (win->first == NULL) {
- win->first = b;
- }
- else {
- win->last->next = b;
- }
-
- win->last = b;
- b->next = NULL;
- b->parent = win;
- win->lastX = b->realX + b->w;
- win->lastY = b->realY + b->h;
-
- if (win->option & F_AUTOSIZE) {
- if (win->lastX > win->realX) {
- win->realX = win->lastX;
-
- if (win->w != (win->realX + win->origX)) {
- resize = TRUE;
- win->w = (win->realX + win->origX);
- }
- }
-
- if (win->lastY > win->realY) {
- win->realY = win->lastY;
-
- if (win->h != (win->realY + win->origY)) {
- resize = TRUE;
- win->h = (win->realY + win->origY);
- }
- }
-
- if (win->shown) {
- if (resize) {
- gtk_widget_set_size_request(win->gtkwin, win->w, win->h);
- gtk_widget_set_size_request(win->widget, win->w, win->h);
- }
- }
- }
+ wWin_p win = b->parent;
+ wBool_t resize = FALSE;
+
+ if (win->first == NULL) {
+ win->first = b;
+ } else {
+ win->last->next = b;
+ }
+
+ win->last = b;
+ b->next = NULL;
+ b->parent = win;
+ win->lastX = b->realX + b->w;
+ win->lastY = b->realY + b->h;
+
+ if (win->option & F_AUTOSIZE) {
+ if (win->lastX > win->realX) {
+ win->realX = win->lastX;
+
+ if (win->w != (win->realX + win->origX)) {
+ resize = TRUE;
+ win->w = (win->realX + win->origX);
+ }
+ }
+
+ if (win->lastY > win->realY) {
+ win->realY = win->lastY;
+
+ if (win->h != (win->realY + win->origY)) {
+ resize = TRUE;
+ win->h = (win->realY + win->origY);
+ }
+ }
+
+ if (win->shown) {
+ if (resize) {
+ gtk_widget_set_size_request(win->gtkwin, win->w, win->h);
+ gtk_widget_set_size_request(win->widget, win->w, win->h);
+ }
+ }
+ }
}
/**
@@ -323,26 +324,26 @@ void wlibAddButton(
*/
wControl_p wlibGetControlFromPos(
- wWin_p win,
- wPos_t x,
- wPos_t y)
+ wWin_p win,
+ wWinPix_t x,
+ wWinPix_t y)
{
- wControl_p b;
- wPos_t xx, yy;
-
- for (b = win->first; b != NULL; b = b->next) {
- if (b->widget && gtk_widget_get_visible(b->widget)) {
- xx = b->realX;
- yy = b->realY;
-
- if (xx <= x && x < xx + b->w &&
- yy <= y && y < yy + b->h) {
- return b;
- }
- }
- }
-
- return NULL;
+ wControl_p b;
+ wWinPix_t xx, yy;
+
+ for (b = win->first; b != NULL; b = b->next) {
+ if (b->widget && gtk_widget_get_visible(b->widget)) {
+ xx = b->realX;
+ yy = b->realY;
+
+ if (xx <= x && x < xx + b->w &&
+ yy <= y && y < yy + b->h) {
+ return b;
+ }
+ }
+ }
+
+ return NULL;
}
@@ -360,7 +361,7 @@ wControl_p wlibGetControlFromPos(
*/
void wBeep(void)
{
- gdk_display_beep(gdk_display_get_default());
+ gdk_display_beep(gdk_display_get_default());
}
/**
@@ -368,13 +369,13 @@ void wBeep(void)
*/
void wFlush(
- void)
+ void)
{
- while (gtk_events_pending()) {
- gtk_main_iteration_do(FALSE);
- }
+ while (gtk_events_pending()) {
+ gtk_main_iteration_do(FALSE);
+ }
- gdk_display_sync(gdk_display_get_default());
+ gdk_display_sync(gdk_display_get_default());
}
/**
@@ -386,6 +387,8 @@ void wWinTop(wWin_p win)
{
}
+extern long dontHideCursor;
+
/**
* Set the cursor in GTK
*
@@ -397,69 +400,71 @@ void wSetCursor(wDraw_p bd, wCursor_t cursor)
static GdkCursor * gdkcursors[wCursorQuestion+1];
GdkCursor * gdkcursor;
//GdkWindow * gdkwindow = gtk_widget_get_window(GTK_WIDGET(win->gtkwin));;
- GdkWindow * gdkwindow = gdk_get_default_root_window();
- GdkDisplay * display = gdk_window_get_display(gdkwindow);
+// GdkWindow * gdkwindow = gdk_get_default_root_window();
+// GdkDisplay * display = gdk_window_get_display(gdkwindow);
+ if ((cursor == wCursorNone) && dontHideCursor) { return; } //Ignore if we dont want to suppress
if (!gdkcursors[cursor]) {
switch(cursor) {
- case wCursorAppStart:
- //gdkcursor = gdk_cursor_new_from_name (display,"progress");
- gdkcursor = gdk_cursor_new(GDK_WATCH);
- break;
- case wCursorHand:
- //gdkcursor = gdk_cursor_new_from_name (display,"pointer");
- gdkcursor = gdk_cursor_new(GDK_HAND2);
- break;
- case wCursorNo:
- //gdkcursor = gdk_cursor_new_from_name (display,"not-allowed");
- gdkcursor = gdk_cursor_new(GDK_X_CURSOR);
- break;
- case wCursorSizeAll:
- //gdkcursor = gdk_cursor_new_from_name (display,"move");
- gdkcursor = gdk_cursor_new(GDK_FLEUR);
- break;
- case wCursorSizeNESW:
- //gdkcursor = gdk_cursor_new_from_name (display,"nesw-resize");
- gdkcursor = gdk_cursor_new(GDK_BOTTOM_LEFT_CORNER);
- break;
- case wCursorSizeNS:
- //gdkcursor = gdk_cursor_new_from_name (display,"ns-resize");
- gdkcursor = gdk_cursor_new(GDK_DOUBLE_ARROW);
- break;
- case wCursorSizeNWSE:
- //gdkcursor = gdk_cursor_new_from_name (display,"nwse-resize");
- gdkcursor = gdk_cursor_new(GDK_BOTTOM_RIGHT_CORNER);
- break;
- case wCursorSizeWE:
- //gdkcursor = gdk_cursor_new_from_name (display,"ew-resize");
- gdkcursor = gdk_cursor_new(GDK_SB_H_DOUBLE_ARROW);
- break;
- case wCursorWait:
- //gdkcursor = gdk_cursor_new_from_name (display,"wait");
- gdkcursor = gdk_cursor_new(GDK_WATCH);
- break;
- case wCursorIBeam:
- //gdkcursor = gdk_cursor_new_from_name (display,"text");
- gdkcursor = gdk_cursor_new(GDK_XTERM);
- break;
- case wCursorCross:
- //gdkcursor = gdk_cursor_new_from_name (display,"crosshair");
- gdkcursor = gdk_cursor_new(GDK_TCROSS);
- break;
- case wCursorQuestion:
- //gdkcursor = gdk_cursor_new_from_name (display,"help");
- gdkcursor = gdk_cursor_new(GDK_QUESTION_ARROW);
- break;
- case wCursorNone:
- gdkcursor = gdk_cursor_new(GDK_BLANK_CURSOR);
- case wCursorNormal:
- default:
- //gdkcursor = gdk_cursor_new_from_name (display,"default");
- gdkcursor = gdk_cursor_new(GDK_LEFT_PTR);
- break;
+ case wCursorAppStart:
+ //gdkcursor = gdk_cursor_new_from_name (display,"progress");
+ gdkcursor = gdk_cursor_new(GDK_WATCH);
+ break;
+ case wCursorHand:
+ //gdkcursor = gdk_cursor_new_from_name (display,"pointer");
+ gdkcursor = gdk_cursor_new(GDK_HAND2);
+ break;
+ case wCursorNo:
+ //gdkcursor = gdk_cursor_new_from_name (display,"not-allowed");
+ gdkcursor = gdk_cursor_new(GDK_X_CURSOR);
+ break;
+ case wCursorSizeAll:
+ //gdkcursor = gdk_cursor_new_from_name (display,"move");
+ gdkcursor = gdk_cursor_new(GDK_FLEUR);
+ break;
+ case wCursorSizeNESW:
+ //gdkcursor = gdk_cursor_new_from_name (display,"nesw-resize");
+ gdkcursor = gdk_cursor_new(GDK_BOTTOM_LEFT_CORNER);
+ break;
+ case wCursorSizeNS:
+ //gdkcursor = gdk_cursor_new_from_name (display,"ns-resize");
+ gdkcursor = gdk_cursor_new(GDK_DOUBLE_ARROW);
+ break;
+ case wCursorSizeNWSE:
+ //gdkcursor = gdk_cursor_new_from_name (display,"nwse-resize");
+ gdkcursor = gdk_cursor_new(GDK_BOTTOM_RIGHT_CORNER);
+ break;
+ case wCursorSizeWE:
+ //gdkcursor = gdk_cursor_new_from_name (display,"ew-resize");
+ gdkcursor = gdk_cursor_new(GDK_SB_H_DOUBLE_ARROW);
+ break;
+ case wCursorWait:
+ //gdkcursor = gdk_cursor_new_from_name (display,"wait");
+ gdkcursor = gdk_cursor_new(GDK_WATCH);
+ break;
+ case wCursorIBeam:
+ //gdkcursor = gdk_cursor_new_from_name (display,"text");
+ gdkcursor = gdk_cursor_new(GDK_XTERM);
+ break;
+ case wCursorCross:
+ //gdkcursor = gdk_cursor_new_from_name (display,"crosshair");
+ gdkcursor = gdk_cursor_new(GDK_TCROSS);
+ break;
+ case wCursorQuestion:
+ //gdkcursor = gdk_cursor_new_from_name (display,"help");
+ gdkcursor = gdk_cursor_new(GDK_QUESTION_ARROW);
+ break;
+ case wCursorNone:
+ gdkcursor = gdk_cursor_new(GDK_BLANK_CURSOR);
+ break;
+ case wCursorNormal:
+ default:
+ //gdkcursor = gdk_cursor_new_from_name (display,"default");
+ gdkcursor = gdk_cursor_new(GDK_LEFT_PTR);
+ break;
}
gdkcursors[cursor] = gdkcursor;
- } else gdkcursor = gdkcursors[cursor];
+ } else { gdkcursor = gdkcursors[cursor]; }
gdk_window_set_cursor ( gtk_widget_get_window(bd->widget), gdkcursor);
}
@@ -471,7 +476,7 @@ void wSetCursor(wDraw_p bd, wCursor_t cursor)
const char * wMemStats(void)
{
- return "No stats available";
+ return "No stats available";
}
/**
@@ -481,14 +486,14 @@ const char * wMemStats(void)
* \param h IN pointer to height
*/
-void wGetDisplaySize(wPos_t * w, wPos_t * h)
+void wGetDisplaySize(wWinPix_t * w, wWinPix_t * h)
{
GdkScreen *screen = gdk_screen_get_default();
guint monitor = gdk_screen_get_primary_monitor(screen);
GdkRectangle screen_geometry = { 0, 0, 0, 0 };
-
+
gdk_screen_get_monitor_geometry( screen, monitor, &screen_geometry );
-
+
*w = screen_geometry.width;
*h = screen_geometry.height;
}
@@ -505,42 +510,41 @@ static dynArr_t conversionBuffer_da;
char * wlibConvertInput(const char * inString)
{
- const char * cp;
- char * cq;
- int extCharCnt, inCharCnt;
-
- /* Already UTF-8 encoded? */
- if (g_utf8_validate(inString, -1, NULL))
- /* Yes, do not double-convert */ {
- return (char*) inString;
- }
-
- for (cp = inString, extCharCnt = 0; *cp; cp++) {
- if (((*cp)&0x80) != '\0') {
- extCharCnt++;
- }
- }
-
- inCharCnt = cp - inString;
-
- if (extCharCnt == '\0') {
- return (char*) inString;
- }
-
- DYNARR_SET(char, conversionBuffer_da, inCharCnt + extCharCnt + 1);
-
- for (cp = inString, cq = (char*) conversionBuffer_da.ptr; *cp; cp++) {
- if (((*cp)&0x80) != 0) {
- *cq++ = 0xC0 + (((*cp)&0xC0) >> 6);
- *cq++ = 0x80 + ((*cp)&0x3F);
- }
- else {
- *cq++ = *cp;
- }
- }
-
- *cq = 0;
- return (char*) conversionBuffer_da.ptr;
+ const char * cp;
+ char * cq;
+ int extCharCnt, inCharCnt;
+
+ /* Already UTF-8 encoded? */
+ if (g_utf8_validate(inString, -1, NULL))
+ /* Yes, do not double-convert */ {
+ return (char*) inString;
+ }
+
+ for (cp = inString, extCharCnt = 0; *cp; cp++) {
+ if (((*cp)&0x80) != '\0') {
+ extCharCnt++;
+ }
+ }
+
+ inCharCnt = cp - inString;
+
+ if (extCharCnt == '\0') {
+ return (char*) inString;
+ }
+
+ DYNARR_SET(char, conversionBuffer_da, inCharCnt + extCharCnt + 1);
+
+ for (cp = inString, cq = (char*) conversionBuffer_da.ptr; *cp; cp++) {
+ if (((*cp)&0x80) != 0) {
+ *cq++ = 0xC0 + (((*cp)&0xC0) >> 6);
+ *cq++ = 0x80 + ((*cp)&0x3F);
+ } else {
+ *cq++ = *cp;
+ }
+ }
+
+ *cq = 0;
+ return (char*) conversionBuffer_da.ptr;
}
/**
@@ -552,36 +556,35 @@ char * wlibConvertInput(const char * inString)
char * wlibConvertOutput(const char * inString)
{
- const char * cp;
- char * cq;
- int extCharCnt, inCharCnt;
-
- for (cp = inString, extCharCnt = 0; *cp; cp++) {
- if (((*cp)&0xC0) == 0x80) {
- extCharCnt++;
- }
- }
-
- inCharCnt = cp - inString;
-
- if (extCharCnt == '\0') {
- return (char*) inString;
- }
-
- DYNARR_SET(char, conversionBuffer_da, inCharCnt + 1);
-
- for (cp = inString, cq = (char*) conversionBuffer_da.ptr; *cp; cp++) {
- if (((*cp)&0x80) != 0) {
- *cq++ = 0xC0 + (((*cp)&0xC0) >> 6);
- *cq++ = 0x80 + ((*cp)&0x3F);
- }
- else {
- *cq++ = *cp;
- }
- }
-
- *cq = '\0';
- return (char*) conversionBuffer_da.ptr;
+ const char * cp;
+ char * cq;
+ int extCharCnt, inCharCnt;
+
+ for (cp = inString, extCharCnt = 0; *cp; cp++) {
+ if (((*cp)&0xC0) == 0x80) {
+ extCharCnt++;
+ }
+ }
+
+ inCharCnt = cp - inString;
+
+ if (extCharCnt == '\0') {
+ return (char*) inString;
+ }
+
+ DYNARR_SET(char, conversionBuffer_da, inCharCnt + 1);
+
+ for (cp = inString, cq = (char*) conversionBuffer_da.ptr; *cp; cp++) {
+ if (((*cp)&0x80) != 0) {
+ *cq++ = 0xC0 + (((*cp)&0xC0) >> 6);
+ *cq++ = 0x80 + ((*cp)&0x3F);
+ } else {
+ *cq++ = *cp;
+ }
+ }
+
+ *cq = '\0';
+ return (char*) conversionBuffer_da.ptr;
}
/*-----------------------------------------------------------------*/
@@ -591,32 +594,32 @@ static dynArr_t accelData_da;
#define accelData(N) DYNARR_N( accelData_t, accelData_da, N )
static guint accelKeyMap[] = {
- 0, /* wAccelKey_None, */
- GDK_KEY_Delete, /* wAccelKey_Del, */
- GDK_KEY_Insert, /* wAccelKey_Ins, */
- GDK_KEY_Home, /* wAccelKey_Home, */
- GDK_KEY_End, /* wAccelKey_End, */
- GDK_KEY_Page_Up, /* wAccelKey_Pgup, */
- GDK_KEY_Page_Down, /* wAccelKey_Pgdn, */
- GDK_KEY_Up, /* wAccelKey_Up, */
- GDK_KEY_Down, /* wAccelKey_Down, */
- GDK_KEY_Right, /* wAccelKey_Right, */
- GDK_KEY_Left, /* wAccelKey_Left, */
- GDK_KEY_BackSpace, /* wAccelKey_Back, */
- GDK_KEY_F1, /* wAccelKey_F1, */
- GDK_KEY_F2, /* wAccelKey_F2, */
- GDK_KEY_F3, /* wAccelKey_F3, */
- GDK_KEY_F4, /* wAccelKey_F4, */
- GDK_KEY_F5, /* wAccelKey_F5, */
- GDK_KEY_F6, /* wAccelKey_F6, */
- GDK_KEY_F7, /* wAccelKey_F7, */
- GDK_KEY_F8, /* wAccelKey_F8, */
- GDK_KEY_F9, /* wAccelKey_F9, */
- GDK_KEY_F10, /* wAccelKey_F10, */
- GDK_KEY_F11, /* wAccelKey_F11, */
- GDK_KEY_F12, /* wAccelKey_F12, */
- GDK_KEY_KP_Add, /* wAccelKey_Numpad_Add */
- GDK_KEY_KP_Subtract /* wAccelKey_Numpad_Subtract */
+ 0, /* wAccelKey_None, */
+ GDK_KEY_Delete, /* wAccelKey_Del, */
+ GDK_KEY_Insert, /* wAccelKey_Ins, */
+ GDK_KEY_Home, /* wAccelKey_Home, */
+ GDK_KEY_End, /* wAccelKey_End, */
+ GDK_KEY_Page_Up, /* wAccelKey_Pgup, */
+ GDK_KEY_Page_Down, /* wAccelKey_Pgdn, */
+ GDK_KEY_Up, /* wAccelKey_Up, */
+ GDK_KEY_Down, /* wAccelKey_Down, */
+ GDK_KEY_Right, /* wAccelKey_Right, */
+ GDK_KEY_Left, /* wAccelKey_Left, */
+ GDK_KEY_BackSpace, /* wAccelKey_Back, */
+ GDK_KEY_F1, /* wAccelKey_F1, */
+ GDK_KEY_F2, /* wAccelKey_F2, */
+ GDK_KEY_F3, /* wAccelKey_F3, */
+ GDK_KEY_F4, /* wAccelKey_F4, */
+ GDK_KEY_F5, /* wAccelKey_F5, */
+ GDK_KEY_F6, /* wAccelKey_F6, */
+ GDK_KEY_F7, /* wAccelKey_F7, */
+ GDK_KEY_F8, /* wAccelKey_F8, */
+ GDK_KEY_F9, /* wAccelKey_F9, */
+ GDK_KEY_F10, /* wAccelKey_F10, */
+ GDK_KEY_F11, /* wAccelKey_F11, */
+ GDK_KEY_F12, /* wAccelKey_F12, */
+ GDK_KEY_KP_Add, /* wAccelKey_Numpad_Add */
+ GDK_KEY_KP_Subtract /* wAccelKey_Numpad_Subtract */
};
/**
@@ -629,24 +632,24 @@ static guint accelKeyMap[] = {
*/
void wAttachAccelKey(
- wAccelKey_e key,
- int modifier,
- wAccelKeyCallBack_p action,
- void * data)
+ wAccelKey_e key,
+ int modifier,
+ wAccelKeyCallBack_p action,
+ void * data)
{
- accelData_t * ad;
+ accelData_t * ad;
// if (key < 1 || key > wAccelKey_F12) {
// fprintf(stderr, "wAttachAccelKey(%d) out of range\n", (int) key);
// return;
// }
- DYNARR_APPEND(accelData_t, accelData_da, 10);
- ad = &accelData(accelData_da.cnt - 1);
- ad->key = key;
- ad->modifier = modifier;
- ad->action = action;
- ad->data = data;
+ DYNARR_APPEND(accelData_t, accelData_da, 10);
+ ad = &accelData(accelData_da.cnt - 1);
+ ad->key = key;
+ ad->modifier = modifier;
+ ad->action = action;
+ ad->data = data;
}
/**
@@ -657,30 +660,30 @@ void wAttachAccelKey(
*/
struct accelData_t * wlibFindAccelKey(
- GdkEventKey * event)
+ GdkEventKey * event)
{
- accelData_t * ad;
- int modifier = 0;
+ accelData_t * ad;
+ int modifier = 0;
- if ((event->state & GDK_SHIFT_MASK)) {
- modifier |= WKEY_SHIFT;
- }
+ if ((event->state & GDK_SHIFT_MASK)) {
+ modifier |= WKEY_SHIFT;
+ }
- if ((event->state & GDK_CONTROL_MASK)) {
- modifier |= WKEY_CTRL;
- }
+ if ((event->state & GDK_CONTROL_MASK)) {
+ modifier |= WKEY_CTRL;
+ }
- if ((event->state & GDK_MOD1_MASK)) {
- modifier |= WKEY_ALT;
- }
+ if ((event->state & GDK_MOD1_MASK)) {
+ modifier |= WKEY_ALT;
+ }
- for (ad = &accelData(0); ad<&accelData(accelData_da.cnt); ad++)
- if (event->keyval == accelKeyMap[ad->key] &&
- modifier == ad->modifier) {
- return ad;
- }
+ for (ad = &accelData(0); ad<&accelData(accelData_da.cnt); ad++)
+ if (event->keyval == accelKeyMap[ad->key] &&
+ modifier == ad->modifier) {
+ return ad;
+ }
- return NULL;
+ return NULL;
}
/**
@@ -691,16 +694,16 @@ struct accelData_t * wlibFindAccelKey(
*/
wBool_t wlibHandleAccelKey(
- GdkEventKey *event)
+ GdkEventKey *event)
{
- accelData_t * ad = wlibFindAccelKey(event);
+ accelData_t * ad = wlibFindAccelKey(event);
- if (ad) {
- ad->action(ad->key, ad->data);
- return TRUE;
- }
+ if (ad) {
+ ad->action(ad->key, ad->data);
+ return TRUE;
+ }
- return FALSE;
+ return FALSE;
}
/**
@@ -717,13 +720,13 @@ wBool_t wlibHandleAccelKey(
void wControlLinkedSet(wControl_p b1, wControl_p b2)
{
- b2->synonym = b1->synonym;
+ b2->synonym = b1->synonym;
- if (b2->synonym == NULL) {
- b2->synonym = b1;
- }
+ if (b2->synonym == NULL) {
+ b2->synonym = b1;
+ }
- b1->synonym = b2;
+ b1->synonym = b2;
}
/**
@@ -736,26 +739,24 @@ void wControlLinkedSet(wControl_p b1, wControl_p b2)
void wControlLinkedActive(wControl_p b, int active)
{
- wControl_p savePtr = b;
+ wControl_p savePtr = b;
- if (savePtr->type == B_MENUITEM) {
- wMenuPushEnable((wMenuPush_p) savePtr, active);
- }
- else {
- wControlActive(savePtr, active);
- }
+ if (savePtr->type == B_MENUITEM) {
+ wMenuPushEnable((wMenuPush_p) savePtr, active);
+ } else {
+ wControlActive(savePtr, active);
+ }
- savePtr = savePtr->synonym;
+ savePtr = savePtr->synonym;
- while (savePtr && savePtr != b) {
+ while (savePtr && savePtr != b) {
- if (savePtr->type == B_MENUITEM) {
- wMenuPushEnable((wMenuPush_p) savePtr, active);
- }
- else {
- wControlActive(savePtr, active);
- }
+ if (savePtr->type == B_MENUITEM) {
+ wMenuPushEnable((wMenuPush_p) savePtr, active);
+ } else {
+ wControlActive(savePtr, active);
+ }
- savePtr = savePtr->synonym;
- }
+ savePtr = savePtr->synonym;
+ }
}
diff --git a/app/wlib/gtklib/window.c b/app/wlib/gtklib/window.c
index 1468c89..b8a3cdf 100644
--- a/app/wlib/gtklib/window.c
+++ b/app/wlib/gtklib/window.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -40,11 +40,8 @@
wWin_p gtkMainW;
-#define MIN_WIN_WIDTH 150
-#define MIN_WIN_HEIGHT 150
-
-#define MIN_WIN_WIDTH_MAIN 400
-#define MIN_WIN_HEIGHT_MAIN 400
+#define MIN_WIN_WIDTH 50
+#define MIN_WIN_HEIGHT 50
#define SECTIONWINDOWSIZE "gtklib window size"
#define SECTIONWINDOWPOS "gtklib window pos"
@@ -55,6 +52,9 @@ static wControl_p firstWin = NULL, lastWin;
static int keyState;
static wBool_t gtkBlockEnabled = TRUE;
static wBool_t maximize_at_next_show = FALSE;
+
+#include "../../bin/bitmaps/xtc.xpm"
+static GdkPixbuf *windowIconPixbuf = NULL;
/*
*****************************************************************************
@@ -70,7 +70,8 @@ static wBool_t maximize_at_next_show = FALSE;
*
*/
-static GdkRectangle getMonitorDimensions(GtkWidget * widget) {
+static GdkRectangle getMonitorDimensions(GtkWidget * widget)
+{
GdkRectangle monitor_dimensions;
@@ -81,9 +82,10 @@ static GdkRectangle getMonitorDimensions(GtkWidget * widget) {
GtkWidget * toplevel = gtk_widget_get_toplevel(widget);
if (gtk_widget_is_toplevel(GTK_WIDGET(toplevel)) &&
- gtk_widget_get_parent_window(GTK_WIDGET(toplevel))) {
+ gtk_widget_get_parent_window(GTK_WIDGET(toplevel))) {
- GdkWindow * window = GDK_WINDOW(gtk_widget_get_parent_window(GTK_WIDGET(toplevel)));
+ GdkWindow * window = GDK_WINDOW(gtk_widget_get_parent_window(GTK_WIDGET(
+ toplevel)));
screen = gdk_window_get_screen(GDK_WINDOW(window));
@@ -113,46 +115,39 @@ static GdkRectangle getMonitorDimensions(GtkWidget * widget) {
static void getWinSize(wWin_p win, const char * nameStr)
{
- int w=50, h=50;
- const char *cp;
- char *cp1, *cp2;
-
-
- /*
- * Clamp window to be no bigger than one monitor size (to start - the user can always maximize)
- */
-
- GdkRectangle monitor_dimensions = getMonitorDimensions(GTK_WIDGET(win->gtkwin));
-
- wPos_t maxDisplayWidth = monitor_dimensions.width-10;
- wPos_t maxDisplayHeight = monitor_dimensions.height-50;
-
-
-
- if ((win->option&F_RECALLSIZE) &&
- (win->option&F_RECALLPOS) &&
- (cp = wPrefGetString(SECTIONWINDOWSIZE, nameStr)) &&
- (w = strtod(cp, &cp1), cp != cp1) &&
- (h = strtod(cp1, &cp2), cp1 != cp2)) {
- win->option &= ~F_AUTOSIZE;
-
- if (w < 50) {
- w = 50;
- }
-
- if (h < 50) {
- h = 50;
- }
- }
-
- if (w > maxDisplayWidth) w = maxDisplayWidth;
- if (h > maxDisplayHeight) h = maxDisplayHeight;
-
- if (w<MIN_WIDTH) w = MIN_WIDTH;
- if (h<MIN_HEIGHT) h = MIN_HEIGHT;
-
- win->w = win->origX = w;
- win->h = win->origY = h;
+ /*
+ * original w/h values in .origX/Y
+ */
+ int w = win->w = win->origX;
+ int h = win->h = win->origY;
+
+ /*
+ * Take values from Prefs if possible
+ */
+ const char *cp;
+ char *cp1, *cp2;
+ if ((win->option&F_RESIZE) &&
+ (win->option&F_RECALLSIZE) &&
+ (cp = wPrefGetString(SECTIONWINDOWSIZE, nameStr)) &&
+ (w = strtod(cp, &cp1), cp != cp1) &&
+ (h = strtod(cp1, &cp2), cp1 != cp2)) {
+ win->option &= ~F_AUTOSIZE;
+
+ /*
+ * Clamp window to be no bigger than one monitor size (to start - the user can always maximize)
+ */
+ GdkRectangle monitor_dimensions = getMonitorDimensions(GTK_WIDGET(win->gtkwin));
+ wWinPix_t maxDisplayWidth = monitor_dimensions.width-10;
+ wWinPix_t maxDisplayHeight = monitor_dimensions.height-50;
+ if (w > maxDisplayWidth) { w = maxDisplayWidth; }
+ if (h > maxDisplayHeight) { h = maxDisplayHeight; }
+
+ if (w<MIN_WIDTH) { w = MIN_WIDTH; }
+ if (h<MIN_HEIGHT) { h = MIN_HEIGHT; }
+
+ win->w = win->origX = w;
+ win->h = win->origY = h;
+ }
}
@@ -166,14 +161,14 @@ static void getWinSize(wWin_p win, const char * nameStr)
static void saveSize(wWin_p win)
{
- if ((win->option&F_RECALLSIZE) &&
- gtk_widget_get_visible(GTK_WIDGET(win->gtkwin))) {
- char pos_s[20];
+ if ((win->option&F_RECALLSIZE) &&
+ gtk_widget_get_visible(GTK_WIDGET(win->gtkwin))) {
+ char pos_s[32];
- sprintf(pos_s, "%d %d", win->w,
- win->h-(BORDERSIZE + ((win->option&F_MENUBAR)?MENUH:0)));
- wPrefSetString(SECTIONWINDOWSIZE, win->nameStr, pos_s);
- }
+ sprintf(pos_s, "%ld %ld", win->w,
+ (win->h-(BORDERSIZE + ((win->option&F_MENUBAR)?MENUH:0))));
+ wPrefSetString(SECTIONWINDOWSIZE, win->nameStr, pos_s);
+ }
}
/**
@@ -185,47 +180,46 @@ static void saveSize(wWin_p win)
static void getPos(wWin_p win)
{
- char *cp1, *cp2;
- GdkRectangle monitor_dimensions = getMonitorDimensions(GTK_WIDGET(win->gtkwin));
+ char *cp1, *cp2;
+ GdkRectangle monitor_dimensions = getMonitorDimensions(GTK_WIDGET(win->gtkwin));
- if ((win->option&F_RECALLPOS) && (!win->shown)) {
- const char *cp;
+ if ((win->option&F_RECALLPOS) && (!win->shown)) {
+ const char *cp;
- if ((cp = wPrefGetString(SECTIONWINDOWPOS, win->nameStr))) {
- int x, y;
+ if ((cp = wPrefGetString(SECTIONWINDOWPOS, win->nameStr))) {
+ int x, y;
- x = strtod(cp, &cp1);
+ x = strtod(cp, &cp1);
- if (cp == cp1) {
- return;
- }
+ if (cp == cp1) {
+ return;
+ }
- y = strtod(cp1, &cp2);
+ y = strtod(cp1, &cp2);
- if (cp2 == cp1) {
- return;
- }
+ if (cp2 == cp1) {
+ return;
+ }
- if (y > monitor_dimensions.height+monitor_dimensions.y-win->h) {
- y = monitor_dimensions.height+monitor_dimensions.y-win->h;
- }
+ if (y > monitor_dimensions.height+monitor_dimensions.y-win->h) {
+ y = monitor_dimensions.height+monitor_dimensions.y-win->h;
+ }
- if (x > monitor_dimensions.width+monitor_dimensions.x-win->w) {
- x = monitor_dimensions.width+monitor_dimensions.x-win->w;
- }
+ if (x > monitor_dimensions.width+monitor_dimensions.x-win->w) {
+ x = monitor_dimensions.width+monitor_dimensions.x-win->w;
+ }
- if (x <= 0) {
- x = 1;
- }
+ if (x <= 0) {
+ x = 1;
+ }
- if (y <= 0) {
- y = 1;
- }
+ if (y <= 0) {
+ y = 1;
+ }
- gtk_window_move(GTK_WINDOW(win->gtkwin), x, y);
- //gtk_window_resize(GTK_WINDOW(win->gtkwin), win->w, win->h);
- }
- }
+ gtk_window_move(GTK_WINDOW(win->gtkwin), x, y);
+ }
+ }
}
/**
@@ -237,17 +231,17 @@ static void getPos(wWin_p win)
static void savePos(wWin_p win)
{
- int x, y;
+ int x, y;
- if ((win->option&F_RECALLPOS)) {
- char pos_s[20];
+ if ((win->option&F_RECALLPOS)) {
+ char pos_s[32];
- gdk_window_get_position(gtk_widget_get_window(GTK_WIDGET(win->gtkwin)), &x, &y);
- x -= 5;
- y -= 25;
- sprintf(pos_s, "%d %d", x, y);
- wPrefSetString(SECTIONWINDOWPOS, win->nameStr, pos_s);
- }
+ gdk_window_get_position(gtk_widget_get_window(GTK_WIDGET(win->gtkwin)), &x, &y);
+ x -= 5;
+ y -= 25;
+ sprintf(pos_s, "%d %d", x, y);
+ wPrefSetString(SECTIONWINDOWPOS, win->nameStr, pos_s);
+ }
}
/**
@@ -259,28 +253,17 @@ static void savePos(wWin_p win)
*/
void wWinGetSize(
- wWin_p win, /* Window */
- wPos_t * width, /* Returned window width */
- wPos_t * height) /* Returned window height */
+ wWin_p win, /* Window */
+ wWinPix_t * width, /* Returned window width */
+ wWinPix_t * height) /* Returned window height */
{
- GtkRequisition requisition;
- wPos_t w, h;
- gtk_widget_size_request(win->gtkwin, &requisition);
- w = win->w;
- h = win->h;
-
- if (win->option&F_AUTOSIZE) {
- if (win->realX > w) {
- w = win->realX;
- }
-
- if (win->realY > h) {
- h = win->realY;
- }
- }
-
- *width = w;
- *height = h - BORDERSIZE - ((win->option&F_MENUBAR)?win->menu_height:0);
+ GtkRequisition requisition;
+ wWinPix_t w, h;
+ gtk_widget_size_request(win->gtkwin, &requisition);
+ w = win->w;
+ h = win->h;
+ *width = w;
+ *height = h - BORDERSIZE - ((win->option&F_MENUBAR)?win->menu_height:0);
}
/**
@@ -292,24 +275,23 @@ void wWinGetSize(
*/
void wWinSetSize(
- wWin_p win, /* Window */
- wPos_t width, /* Window width */
- wPos_t height) /* Window height */
+ wWin_p win, /* Window */
+ wWinPix_t width, /* Window width */
+ wWinPix_t height) /* Window height */
{
- win->busy = TRUE;
- win->w = width;
- win->h = height + BORDERSIZE + ((win->option&F_MENUBAR)?MENUH:0);
- if (win->option&F_RESIZE) {
- gtk_window_resize(GTK_WINDOW(win->gtkwin), win->w, win->h);
- gtk_widget_set_size_request(win->widget, win->w-10, win->h-10);
- }
- else {
- gtk_widget_set_size_request(win->gtkwin, win->w, win->h);
- gtk_widget_set_size_request(win->widget, win->w, win->h);
- }
-
-
- win->busy = FALSE;
+ win->busy = TRUE;
+ win->w = width;
+ win->h = height + BORDERSIZE + ((win->option&F_MENUBAR)?MENUH:0);
+ if (win->option&F_RESIZE) {
+ gtk_window_resize(GTK_WINDOW(win->gtkwin), win->w, win->h);
+ gtk_widget_set_size_request(win->widget, win->w-10, win->h-10);
+ } else {
+ gtk_widget_set_size_request(win->gtkwin, win->w, win->h);
+ gtk_widget_set_size_request(win->widget, win->w, win->h);
+ }
+
+
+ win->busy = FALSE;
}
/**
@@ -322,93 +304,93 @@ void wWinSetSize(
*/
void wWinShow(
- wWin_p win, /* Window */
- wBool_t show) /* Command */
+ wWin_p win, /* Window */
+ wBool_t show) /* Command */
{
- //GtkRequisition min_req, pref_req;
+ //GtkRequisition min_req, pref_req;
- if (debugWindow >= 2) {
- printf("Set Show %s\n", win->labelStr?win->labelStr:"No label");
- }
+ if (debugWindow >= 2) {
+ printf("Set Show %s\n", win->labelStr?win->labelStr:"No label");
+ }
- if (win->widget == 0) {
- abort();
- }
+ if (win->widget == 0) {
+ abort();
+ }
- int width, height;
+ int width, height;
- if (show) {
- keyState = 0;
- getPos(win);
+ if (show) {
+ keyState = 0;
+ getPos(win);
- if (!win->shown) {
+ if (!win->shown) {
gtk_widget_show(win->gtkwin);
gtk_widget_show(win->widget);
}
- if (win->option & F_AUTOSIZE) {
- GtkAllocation allocation;
- GtkRequisition requistion;
- gtk_widget_size_request(win->widget,&requistion);
+ if (win->option & F_AUTOSIZE) {
+ GtkAllocation allocation;
+ GtkRequisition requistion;
+ gtk_widget_size_request(win->widget,&requistion);
- width = win->w;
- height = win->h;
+ width = win->w;
+ height = win->h;
- if (requistion.width != width || requistion.height != height ) {
+ if (requistion.width != width || requistion.height != height ) {
width = requistion.width;
height = requistion.height;
- win->w = width;
- win->h = height;
+ win->w = width;
+ win->h = height;
- gtk_window_set_resizable(GTK_WINDOW(win->gtkwin),TRUE);
+ gtk_window_set_resizable(GTK_WINDOW(win->gtkwin),TRUE);
- if (win->option&F_MENUBAR) {
- gtk_widget_set_size_request(win->menubar, win->w-20, MENUH);
+ if (win->option&F_MENUBAR) {
+ gtk_widget_set_size_request(win->menubar, win->w-20, MENUH);
- gtk_widget_get_allocation(win->menubar, &allocation);
- win->menu_height = allocation.height;
- }
- }
- gtk_window_resize(GTK_WINDOW(win->gtkwin), width+10, height+10);
- }
+ gtk_widget_get_allocation(win->menubar, &allocation);
+ win->menu_height = allocation.height;
+ }
+ }
+ gtk_window_resize(GTK_WINDOW(win->gtkwin), width+10, height+10);
+ }
- gtk_window_present(GTK_WINDOW(win->gtkwin));
+ gtk_window_present(GTK_WINDOW(win->gtkwin));
- gdk_window_raise(gtk_widget_get_window(win->gtkwin));
+ gdk_window_raise(gtk_widget_get_window(win->gtkwin));
- if (win->shown && win->modalLevel > 0) {
- gtk_widget_set_sensitive(GTK_WIDGET(win->gtkwin), TRUE);
- }
+ if (win->shown && win->modalLevel > 0) {
+ gtk_widget_set_sensitive(GTK_WIDGET(win->gtkwin), TRUE);
+ }
- win->shown = show;
- win->modalLevel = 0;
+ win->shown = show;
+ win->modalLevel = 0;
- if ((!gtkBlockEnabled) || (win->option & F_BLOCK) == 0) {
- wFlush();
- } else {
- wlibDoModal(win, TRUE);
- }
- if (maximize_at_next_show) {
- gtk_window_maximize(GTK_WINDOW(win->gtkwin));
- maximize_at_next_show = FALSE;
- }
- } else {
- wFlush();
- saveSize(win);
- savePos(win);
- win->shown = show;
+ if ((!gtkBlockEnabled) || (win->option & F_BLOCK) == 0) {
+ wFlush();
+ } else {
+ wlibDoModal(win, TRUE);
+ }
+ if (maximize_at_next_show) {
+ gtk_window_maximize(GTK_WINDOW(win->gtkwin));
+ maximize_at_next_show = FALSE;
+ }
+ } else {
+ wFlush();
+ saveSize(win);
+ savePos(win);
+ win->shown = show;
- if (gtkBlockEnabled && (win->option & F_BLOCK) != 0) {
- wlibDoModal(win, FALSE);
- }
+ if (gtkBlockEnabled && (win->option & F_BLOCK) != 0) {
+ wlibDoModal(win, FALSE);
+ }
- gtk_widget_hide(win->gtkwin);
- gtk_widget_hide(win->widget);
- }
+ gtk_widget_hide(win->gtkwin);
+ gtk_widget_hide(win->widget);
+ }
}
/**
@@ -418,9 +400,9 @@ void wWinShow(
*/
void wWinBlockEnable(
- wBool_t enabled)
+ wBool_t enabled)
{
- gtkBlockEnabled = enabled;
+ gtkBlockEnabled = enabled;
}
/**
@@ -431,9 +413,9 @@ void wWinBlockEnable(
*/
wBool_t wWinIsVisible(
- wWin_p win)
+ wWin_p win)
{
- return win->shown;
+ return win->shown;
}
/**
@@ -445,7 +427,7 @@ wBool_t wWinIsVisible(
wBool_t wWinIsMaximized(wWin_p win)
{
- return win->maximize_initially;
+ return win->maximize_initially;
}
/**
@@ -456,10 +438,10 @@ wBool_t wWinIsMaximized(wWin_p win)
*/
void wWinSetTitle(
- wWin_p win, /* Window */
- const char * title) /* New title */
+ wWin_p win, /* Window */
+ const char * title) /* New title */
{
- gtk_window_set_title(GTK_WINDOW(win->gtkwin), title);
+ gtk_window_set_title(GTK_WINDOW(win->gtkwin), title);
}
/**
@@ -470,28 +452,28 @@ void wWinSetTitle(
*/
void wWinSetBusy(
- wWin_p win, /* Window */
- wBool_t busy) /* Command */
+ wWin_p win, /* Window */
+ wBool_t busy) /* Command */
{
- GdkCursor * cursor;
+ GdkCursor * cursor;
- if (win->gtkwin == 0) {
- abort();
- }
+ if (win->gtkwin == 0) {
+ abort();
+ }
- if (busy) {
- cursor = gdk_cursor_new(GDK_WATCH);
- } else {
- cursor = NULL;
- }
+ if (busy) {
+ cursor = gdk_cursor_new(GDK_WATCH);
+ } else {
+ cursor = NULL;
+ }
- gdk_window_set_cursor(gtk_widget_get_window(win->gtkwin), cursor);
+ gdk_window_set_cursor(gtk_widget_get_window(win->gtkwin), cursor);
- if (cursor) {
- gdk_cursor_unref(cursor);
- }
+ if (cursor) {
+ gdk_cursor_unref(cursor);
+ }
- gtk_widget_set_sensitive(GTK_WIDGET(win->gtkwin), busy==0);
+ gtk_widget_set_sensitive(GTK_WIDGET(win->gtkwin), busy==0);
}
/**
@@ -507,42 +489,42 @@ void wWinSetBusy(
*/
void wlibDoModal(
- wWin_p win0,
- wBool_t modal)
+ wWin_p win0,
+ wBool_t modal)
{
- wWin_p win;
-
- for (win=(wWin_p)firstWin; win; win=(wWin_p)win->next) {
- if (win->shown && win != win0) {
- if (modal) {
- if (win->modalLevel == 0) {
- gtk_widget_set_sensitive(GTK_WIDGET(win->gtkwin), FALSE);
- }
-
- win->modalLevel++;
- } else {
- if (win->modalLevel > 0) {
- win->modalLevel--;
-
- if (win->modalLevel == 0) {
- gtk_widget_set_sensitive(GTK_WIDGET(win->gtkwin), TRUE);
- }
- }
- }
-
- if (win->modalLevel < 0) {
- fprintf(stderr, "DoModal: %s modalLevel < 0",
- win->nameStr?win->nameStr:"<NULL>");
- abort();
- }
- }
- }
-
- if (modal) {
- gtk_main();
- } else {
- gtk_main_quit();
- }
+ wWin_p win;
+
+ for (win=(wWin_p)firstWin; win; win=(wWin_p)win->next) {
+ if (win->shown && win != win0) {
+ if (modal) {
+ if (win->modalLevel == 0) {
+ gtk_widget_set_sensitive(GTK_WIDGET(win->gtkwin), FALSE);
+ }
+
+ win->modalLevel++;
+ } else {
+ if (win->modalLevel > 0) {
+ win->modalLevel--;
+
+ if (win->modalLevel == 0) {
+ gtk_widget_set_sensitive(GTK_WIDGET(win->gtkwin), TRUE);
+ }
+ }
+ }
+
+ if (win->modalLevel < 0) {
+ fprintf(stderr, "DoModal: %s modalLevel < 0",
+ win->nameStr?win->nameStr:"<NULL>");
+ abort();
+ }
+ }
+ }
+
+ if (modal) {
+ gtk_main();
+ } else {
+ gtk_main_quit();
+ }
}
/**
@@ -553,32 +535,32 @@ void wlibDoModal(
*/
const char * wWinGetTitle(
- wWin_p win) /* Window */
+ wWin_p win) /* Window */
{
- return win->labelStr;
+ return win->labelStr;
}
void wWinClear(
- wWin_p win,
- wPos_t x,
- wPos_t y,
- wPos_t width,
- wPos_t height)
+ wWin_p win,
+ wWinPix_t x,
+ wWinPix_t y,
+ wWinPix_t width,
+ wWinPix_t height)
{
}
void wWinDoCancel(
- wWin_p win)
+ wWin_p win)
{
- wControl_p b;
+ wControl_p b;
- for (b=win->first; b; b=b->next) {
- if ((b->type == B_BUTTON) && (b->option & BB_CANCEL)) {
- wlibButtonDoAction((wButton_p)b);
- }
- }
+ for (b=win->first; b; b=b->next) {
+ if ((b->type == B_BUTTON) && (b->option & BB_CANCEL)) {
+ wlibButtonDoAction((wButton_p)b);
+ }
+ }
}
/*
@@ -590,155 +572,161 @@ void wWinDoCancel(
*/
static int window_redraw(
- wWin_p win,
- wBool_t doWinProc)
+ wWin_p win,
+ wBool_t doWinProc)
{
- wControl_p b;
+ wControl_p b;
- if (win==NULL) {
- return FALSE;
- }
+ if (win==NULL) {
+ return FALSE;
+ }
- for (b=win->first; b != NULL; b = b->next) {
- if (b->repaintProc) {
- b->repaintProc(b);
- }
- }
+ for (b=win->first; b != NULL; b = b->next) {
+ if (b->repaintProc) {
+ b->repaintProc(b);
+ }
+ }
- return FALSE;
+ return FALSE;
}
static gint window_delete_event(
- GtkWidget *widget,
- GdkEvent *event,
- wWin_p win)
+ GtkWidget *widget,
+ GdkEvent *event,
+ wWin_p win)
{
- wControl_p b;
- /* if you return FALSE in the "delete_event" signal handler,
- * GTK will emit the "destroy" signal. Returning TRUE means
- * you don't want the window to be destroyed.
- * This is useful for popping up 'are you sure you want to quit ?'
- * type dialogs. */
-
- /* Change TRUE to FALSE and the main window will be destroyed with
- * a "delete_event". */
-
- for (b = win->first; b; b=b->next)
- if (b->doneProc) {
- b->doneProc(b);
- }
-
- if (win->winProc) {
- win->winProc(win, wClose_e, NULL, win->data);
-
- if (win != gtkMainW) {
- wWinShow(win, FALSE);
- }
- }
-
- return (TRUE);
+ wControl_p b;
+ /* if you return FALSE in the "delete_event" signal handler,
+ * GTK will emit the "destroy" signal. Returning TRUE means
+ * you don't want the window to be destroyed.
+ * This is useful for popping up 'are you sure you want to quit ?'
+ * type dialogs. */
+
+ /* Change TRUE to FALSE and the main window will be destroyed with
+ * a "delete_event". */
+
+ for (b = win->first; b; b=b->next)
+ if (b->doneProc) {
+ b->doneProc(b);
+ }
+
+ if (win->winProc) {
+ win->winProc(win, wClose_e, NULL, win->data);
+
+ if (win != gtkMainW) {
+ wWinShow(win, FALSE);
+ }
+ }
+
+ return (TRUE);
}
static int fixed_expose_event(
- GtkWidget * widget,
- GdkEventExpose * event,
- wWin_p win)
+ GtkWidget * widget,
+ GdkEventExpose * event,
+ wWin_p win)
{
int rc;
- if (event->count==0) {
- rc = window_redraw(win, TRUE);
- } else {
- rc = FALSE;
- }
- cairo_t* cr = gdk_cairo_create (gtk_widget_get_window(widget));
-#ifdef CURSOR_SURFACE
- if (win && win->cursor_surface.surface && win->cursor_surface.show) {
- cairo_set_source_surface(cr,win->cursor_surface.surface,event->area.x, event->area.y);
- cairo_set_operator(cr,CAIRO_OPERATOR_OVER);
- cairo_rectangle(cr,event->area.x, event->area.y,
- event->area.width, event->area.height);
- cairo_fill(cr);
+ if (event->count==0) {
+ rc = window_redraw(win, TRUE);
+ } else {
+ rc = FALSE;
}
-#endif
- return rc;
+ return rc;
}
-static int resizeTime(wWin_p win) {
+static int resizeTime(wWin_p win)
+{
- if (win->resizeW == win->w && win->resizeH == win->h) { // If hasn't changed since last
+ if (debugWindow >= 2) {
+ printf( "resizeTime idleCnt %d, busyCnt %d [%d %d] [%ld %ld]\n",
+ win->timer_idle_count, win->timer_busy_count,
+ win->resizeW, win->resizeH, win->w, win->h );
+ }
+ if (win->resizeW == win->w
+ && win->resizeH == win->h) { // If hasn't changed since last
if (win->timer_idle_count>3) {
- win->winProc(win, wResize_e, NULL, win->data); //Trigger Redraw on last occasion if one-third of a second has elapsed
+ win->winProc(win, wResize_e, NULL,
+ win->data); //Trigger Redraw on last occasion if one-third of a second has elapsed
win->timer_idle_count = 0;
win->resizeTimer = 0;
win->timer_busy_count = 0;
return FALSE; //Stop Timer and don't resize
- } else win->timer_idle_count++;
+ } else { win->timer_idle_count++; }
}
if (win->busy==FALSE && win->winProc) { //Always drive once
if (win->timer_busy_count>10) {
- win->winProc(win, wResize_e, NULL, win->data); //Redraw if ten times we saw a change (1 sec)
- win->timer_busy_count = 0;
+ win->winProc(win, wResize_e, NULL,
+ win->data); //Redraw if ten times we saw a change (1 sec)
+ win->timer_busy_count = 0;
} else {
win->winProc(win, wResize_e, (void*) 1, win->data); //No Redraw
win->timer_busy_count++;
}
- win->resizeW = win->w; //Remember this one
- win->resizeH = win->h;
+ win->resizeW = win->w; //Remember this one
+ win->resizeH = win->h;
}
return TRUE; //Will redrive after another timer interval
}
static int window_configure_event(
- GtkWidget * widget,
- GdkEventConfigure * event,
- wWin_p win)
+ GtkWidget * widget,
+ GdkEventConfigure * event,
+ wWin_p win)
{
- if (win==NULL) {
- return FALSE;
- }
-
- if (win->option&F_RESIZE) {
- if (event->width < 10 || event->height < 10) {
- return TRUE;
- }
- int w = win->w;
- int h = win->h;
-
-
- if (win->w != event->width || win->h != event->height) {
- win->w = event->width;
- win->h = event->height;
-
- if (win->w < MIN_WIN_WIDTH) {
- win->w = MIN_WIN_WIDTH;
- }
-
- if (win->h < MIN_WIN_HEIGHT) {
- win->h = MIN_WIN_HEIGHT;
- }
-
- if (win->option&F_MENUBAR) {
- GtkAllocation allocation;
- gtk_widget_get_allocation(win->menubar, &allocation);
- win->menu_height= allocation.height;
- gtk_widget_set_size_request(win->menubar, win->w-20, win->menu_height);
- }
- if (win->resizeTimer) { // Already have a timer
- return FALSE;
- } else {
- win->resizeW = w; //Remember where this started
- win->resizeH = h;
- win->timer_idle_count = 0; //Start background timer on redraw
- win->timer_busy_count = 0;
- win->resizeTimer = g_timeout_add(100,(GSourceFunc)resizeTime,win); // 100ms delay
- return FALSE;
- }
- }
- }
-
- return FALSE;
+ if (win==NULL) {
+ return FALSE;
+ }
+
+ if (debugWindow >= 2) {
+ printf( "config/resize: [%d %d]\n", event->width, event->height );
+ }
+ if (win->option&F_RESIZE) {
+ if (event->width < 10 || event->height < 10) {
+ return TRUE;
+ }
+ int w = win->w;
+ int h = win->h;
+
+
+ if (win->w != event->width || win->h != event->height) {
+ if (debugWindow >= 2) {
+ printf( " Update [%ld %ld]\n", event->width-win->w, event->height-win->h );
+ }
+ win->w = event->width;
+ win->h = event->height;
+
+ if (win->w < MIN_WIN_WIDTH) {
+ win->w = MIN_WIN_WIDTH;
+ }
+
+ if (win->h < MIN_WIN_HEIGHT) {
+ win->h = MIN_WIN_HEIGHT;
+ }
+
+ if (win->option&F_MENUBAR) {
+ GtkAllocation allocation;
+ gtk_widget_get_allocation(win->menubar, &allocation);
+ win->menu_height= allocation.height;
+ gtk_widget_set_size_request(win->menubar, win->w-20, win->menu_height);
+ }
+ if (win->resizeTimer) { // Already have a timer
+ return FALSE;
+ } else {
+ win->resizeW = w; //Remember where this started
+ win->resizeH = h;
+ win->timer_idle_count = 0; //Start background timer on redraw
+ win->timer_busy_count = 0;
+ win->resizeTimer = g_timeout_add(100,(GSourceFunc)resizeTime,
+ win); // 100ms delay
+ return FALSE;
+ }
+ }
+ }
+
+ return FALSE;
}
/**
@@ -753,25 +741,25 @@ static int window_configure_event(
*/
gboolean window_state_event(
- GtkWidget *widget,
- GdkEventWindowState *event,
- wWin_p win)
+ GtkWidget *widget,
+ GdkEventWindowState *event,
+ wWin_p win)
{
- if (!win) {
- return (FALSE);
- }
+ if (!win) {
+ return (FALSE);
+ }
- win->maximize_initially = FALSE;
+ win->maximize_initially = FALSE;
- if (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) {
- win->maximize_initially = TRUE;
- }
+ if (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) {
+ win->maximize_initially = TRUE;
+ }
- if (win->busy==FALSE && win->winProc) {
- win->winProc(win, wState_e, NULL, win->data);
- }
+ if (win->busy==FALSE && win->winProc) {
+ win->winProc(win, wState_e, NULL, win->data);
+ }
- return TRUE;
+ return TRUE;
}
/**
* Get current state of shift, ctrl or alt keys.
@@ -781,87 +769,90 @@ gboolean window_state_event(
int wGetKeyState(void)
{
- return keyState;
+ return keyState;
}
wBool_t catch_shift_ctrl_alt_keys(
- GtkWidget * widget,
- GdkEventKey *event,
- void * data)
+ GtkWidget * widget,
+ GdkEventKey *event,
+ void * data)
{
- int state = 0;
- switch (event->keyval ) {
- case GDK_KEY_Shift_L:
- case GDK_KEY_Shift_R:
- state |= WKEY_SHIFT;
- break;
-
- case GDK_KEY_Control_L:
- case GDK_KEY_Control_R:
- state |= WKEY_CTRL;
- break;
-
- case GDK_KEY_Alt_L:
- case GDK_KEY_Alt_R:
- state |= WKEY_ALT;
- break;
-
- case GDK_KEY_Meta_L:
- case GDK_KEY_Meta_R:
- // Pressing SHIFT and then ALT generates a Meta key
- //printf( "Meta\n" );
- state |= WKEY_ALT;
- break;
- }
-
- if (state != 0) {
- if (event->type == GDK_KEY_PRESS) {
- keyState |= state;
- } else {
- keyState &= ~state;
- }
- return TRUE;
- }
- return FALSE;
+ int state = 0;
+ switch (event->keyval ) {
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
+ state |= WKEY_SHIFT;
+ break;
+
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
+ state |= WKEY_CTRL;
+ break;
+
+ case GDK_KEY_Alt_L:
+ case GDK_KEY_Alt_R:
+ state |= WKEY_ALT;
+ break;
+
+ case GDK_KEY_Meta_L:
+ case GDK_KEY_Meta_R:
+ // Pressing SHIFT and then ALT generates a Meta key
+ //printf( "Meta\n" );
+ state |= WKEY_ALT;
+ break;
+ }
+
+ if (state != 0) {
+ if (event->type == GDK_KEY_PRESS) {
+ keyState |= state;
+ } else {
+ keyState &= ~state;
+ }
+ return TRUE;
+ }
+ return FALSE;
}
static gint window_char_event(
- GtkWidget * widget,
- GdkEventKey *event,
- wWin_p win)
+ GtkWidget * widget,
+ GdkEventKey *event,
+ wWin_p win)
{
- wControl_p bb;
-
- if (catch_shift_ctrl_alt_keys(widget, event, win)) {
- return FALSE;
- }
-
- if (event->type == GDK_KEY_RELEASE) {
- return FALSE;
- }
-
- if ( ( event->state & GDK_MODIFIER_MASK ) == 0 ) {
- if (event->keyval == GDK_KEY_Escape) {
- for (bb=win->first; bb; bb=bb->next) {
- if (bb->type == B_BUTTON && (bb->option&BB_CANCEL)) {
- wlibButtonDoAction((wButton_p)bb);
- return TRUE;
- }
- }
- }
- }
-
- if (wlibHandleAccelKey(event)) {
- return TRUE;
- } else {
- return FALSE;
- }
+ wControl_p bb;
+
+ if (catch_shift_ctrl_alt_keys(widget, event, win)) {
+ return FALSE;
+ }
+
+ if (event->type == GDK_KEY_RELEASE) {
+ return FALSE;
+ }
+
+ if ( ( event->state & GDK_MODIFIER_MASK ) == 0 ) {
+ if (event->keyval == GDK_KEY_Escape) {
+ for (bb=win->first; bb; bb=bb->next) {
+ if (bb->type == B_BUTTON && (bb->option&BB_CANCEL)) {
+ wlibButtonDoAction((wButton_p)bb);
+ return TRUE;
+ }
+ }
+ }
+ }
+
+ if (wlibHandleAccelKey(event)) {
+ return TRUE;
+ } else {
+ return FALSE;
+ }
}
-void wSetGeometry(wWin_p win, int min_width, int max_width, int min_height, int max_height, int base_width, int base_height, double aspect_ratio ) {
+void wSetGeometry(wWin_p win, wWinPix_t min_width, wWinPix_t max_width,
+ wWinPix_t min_height, wWinPix_t max_height, wWinPix_t base_width,
+ wWinPix_t base_height, double aspect_ratio )
+{
GdkGeometry hints;
GdkWindowHints hintMask = GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE;
- hints.min_width = min_width;
+ hints.min_width = min_width;
hints.max_width = max_width;
hints.min_height = min_height;
hints.max_height = max_height;
@@ -871,16 +862,16 @@ void wSetGeometry(wWin_p win, int min_width, int max_width, int min_height, int
if( base_width != -1 && base_height != -1 ) {
hintMask |= GDK_HINT_BASE_SIZE;
}
-
+
if(aspect_ratio > -1.0 ) {
hintMask |= GDK_HINT_ASPECT;
- }
+ }
gtk_window_set_geometry_hints(
- GTK_WINDOW(win->gtkwin),
- win->gtkwin,
- &hints,
- hintMask);
+ GTK_WINDOW(win->gtkwin),
+ win->gtkwin,
+ &hints,
+ hintMask);
}
@@ -911,166 +902,158 @@ void wSetGeometry(wWin_p win, int min_width, int max_width, int min_height, int
*/
static wWin_p wWinCommonCreate(
- wWin_p parent,
- int winType,
- wPos_t x,
- wPos_t y,
- const char * labelStr,
- const char * nameStr,
- long option,
- wWinCallBack_p winProc,
- void * data)
+ wWin_p parent,
+ int winType,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * labelStr,
+ const char * nameStr,
+ long option,
+ wWinCallBack_p winProc,
+ void * data)
{
- wWin_p w;
- int h;
- w = wlibAlloc(NULL, winType, x, y, labelStr, sizeof *w, data);
- w->busy = TRUE;
- w->option = option;
+ wWin_p w;
+ int h;
+ w = wlibAlloc(NULL, winType, x, y, labelStr, sizeof *w, data);
+ w->busy = TRUE;
+ w->option = option;
w->resizeTimer = 0;
- h = BORDERSIZE;
-
- if (w->option&F_MENUBAR) {
- h += MENUH;
- }
-
- if (winType == W_MAIN) {
- w->gtkwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- } else {
- w->gtkwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-
- if (gtkMainW) {
- if (!(w->option&F_NOTTRANSIENT))
- gtk_window_set_transient_for(GTK_WINDOW(w->gtkwin),
- GTK_WINDOW(gtkMainW->gtkwin));
- }
- }
- getWinSize(w, nameStr);
- if (winType != W_MAIN) {
- gtk_widget_set_app_paintable (w->gtkwin,TRUE);
- }
-
- if (option & F_HIDE) {
- gtk_widget_hide(w->gtkwin);
- }
-
- /* center window on top of parent window */
- if (option & F_CENTER) {
- gtk_window_set_position(GTK_WINDOW(w->gtkwin), GTK_WIN_POS_CENTER_ON_PARENT);
- }
-
-
- w->widget = gtk_fixed_new();
-
- if (w->widget == 0) {
- abort();
- }
-
- if (w->option&F_MENUBAR) {
- w->menubar = gtk_menu_bar_new();
- gtk_container_add(GTK_CONTAINER(w->widget), w->menubar);
- gtk_widget_show(w->menubar);
- GtkAllocation allocation;
- gtk_widget_get_allocation(w->menubar, &allocation);
- w->menu_height = allocation.height;
- gtk_widget_set_size_request(w->menubar, -1, w->menu_height);
- }
-
- gtk_container_add(GTK_CONTAINER(w->gtkwin), w->widget);
-
-
-
-
- if (w->option&F_AUTOSIZE) {
- w->realX = 0;
- w->w = MIN_WIN_WIDTH+20;
- w->realY = h;
- w->h = MIN_WIN_HEIGHT;
- } else if (w->origX != 0){
- w->realX = w->origX;
- w->realY = w->origY+h;
-
- w->default_size_x = w->w;
- w->default_size_y = w->h;
- //gtk_widget_set_size_request(w->widget, w->w-20, w->h);
-
- if (w->option&F_MENUBAR) {
- gtk_widget_set_size_request(w->menubar, w->w-20, MENUH);
- }
- }
- int scr_w, scr_h;
- wGetDisplaySize(&scr_w, &scr_h);
- if (scr_w < MIN_WIN_WIDTH) scr_w = MIN_WIN_WIDTH+10;
- if (scr_h < MIN_WIN_HEIGHT) scr_h = MIN_WIN_HEIGHT;
+ h = BORDERSIZE;
+
+ if (w->option&F_MENUBAR) {
+ h += MENUH;
+ }
+
+ if (winType == W_MAIN) {
+ w->gtkwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ } else {
+ w->gtkwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
+ if (gtkMainW) {
+ if (!(w->option&F_NOTTRANSIENT))
+ gtk_window_set_transient_for(GTK_WINDOW(w->gtkwin),
+ GTK_WINDOW(gtkMainW->gtkwin));
+ }
+ }
+ getWinSize(w, nameStr);
if (winType != W_MAIN) {
- wSetGeometry(w, MIN_WIN_WIDTH, scr_w-10, MIN_WIN_HEIGHT, scr_h, -1, -1, -1);
+ gtk_widget_set_app_paintable (w->gtkwin,TRUE);
+ }
+
+ if (option & F_HIDE) {
+ gtk_widget_hide(w->gtkwin);
+ }
+
+ /* center window on top of parent window */
+ if (option & F_CENTER) {
+ gtk_window_set_position(GTK_WINDOW(w->gtkwin), GTK_WIN_POS_CENTER_ON_PARENT);
+ }
+
+
+ w->widget = gtk_fixed_new();
+
+ if (w->widget == 0) {
+ abort();
+ }
+
+ if (w->option&F_MENUBAR) {
+ w->menubar = gtk_menu_bar_new();
+ gtk_container_add(GTK_CONTAINER(w->widget), w->menubar);
+ gtk_widget_show(w->menubar);
+ GtkAllocation allocation;
+ gtk_widget_get_allocation(w->menubar, &allocation);
+ w->menu_height = allocation.height;
+ gtk_widget_set_size_request(w->menubar, -1, w->menu_height);
+ }
+
+ gtk_container_add(GTK_CONTAINER(w->gtkwin), w->widget);
+
+
+
+
+ if (w->option&F_AUTOSIZE) {
+ w->realX = 0;
+ w->w = 0;
+ w->realY = h;
+ w->h = 0;
+ } else if (w->origX != 0) {
+ w->realX = w->origX;
+ w->realY = w->origY+h;
+
+ //gtk_widget_set_size_request(w->widget, w->w-20, w->h);
+
+ if (w->option&F_MENUBAR) {
+ gtk_widget_set_size_request(w->menubar, w->w-20, MENUH);
+ }
+ }
+
+ w->first = w->last = NULL;
+ w->winProc = winProc;
+ g_signal_connect(GTK_OBJECT(w->gtkwin), "delete_event",
+ G_CALLBACK(window_delete_event), w);
+ g_signal_connect(GTK_OBJECT(w->widget), "expose_event",
+ G_CALLBACK(fixed_expose_event), w);
+ g_signal_connect(GTK_OBJECT(w->gtkwin), "configure_event",
+ G_CALLBACK(window_configure_event), w);
+ g_signal_connect(GTK_OBJECT(w->gtkwin), "window-state-event",
+ G_CALLBACK(window_state_event), w);
+ g_signal_connect(GTK_OBJECT(w->gtkwin), "key_press_event",
+ G_CALLBACK(window_char_event), w);
+ g_signal_connect(GTK_OBJECT(w->gtkwin), "key_release_event",
+ G_CALLBACK(window_char_event), w);
+ gtk_widget_set_events(w->widget, GDK_EXPOSURE_MASK);
+ gtk_widget_set_events(GTK_WIDGET(w->gtkwin),
+ GDK_EXPOSURE_MASK|GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK);
+
+ if (w->option & F_RESIZE) {
+ gtk_window_set_resizable(GTK_WINDOW(w->gtkwin), TRUE);
+ if ( ( w->option & F_AUTOSIZE ) == 0 ) {
+ gtk_window_resize(GTK_WINDOW(w->gtkwin), w->w, w->h);
+ }
} else {
- if (scr_w < MIN_WIN_WIDTH_MAIN+10) scr_w = MIN_WIN_WIDTH_MAIN+200;
- if (scr_h < MIN_WIN_HEIGHT_MAIN+10) scr_h = MIN_WIN_HEIGHT_MAIN+200;
- wSetGeometry(w, MIN_WIN_WIDTH_MAIN, scr_w-10, MIN_WIN_HEIGHT_MAIN, scr_h-10, -1, -1, -1);
- }
-
-
-
- w->first = w->last = NULL;
- w->winProc = winProc;
- g_signal_connect(GTK_OBJECT(w->gtkwin), "delete_event",
- G_CALLBACK(window_delete_event), w);
- g_signal_connect(GTK_OBJECT(w->widget), "expose_event",
- G_CALLBACK(fixed_expose_event), w);
- g_signal_connect(GTK_OBJECT(w->gtkwin), "configure_event",
- G_CALLBACK(window_configure_event), w);
- g_signal_connect(GTK_OBJECT(w->gtkwin), "window-state-event",
- G_CALLBACK(window_state_event), w);
- g_signal_connect(GTK_OBJECT(w->gtkwin), "key_press_event",
- G_CALLBACK(window_char_event), w);
- g_signal_connect(GTK_OBJECT(w->gtkwin), "key_release_event",
- G_CALLBACK(window_char_event), w);
- gtk_widget_set_events(w->widget, GDK_EXPOSURE_MASK);
- gtk_widget_set_events(GTK_WIDGET(w->gtkwin),
- GDK_EXPOSURE_MASK|GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK);
-
- if (w->option & F_RESIZE) {
- gtk_window_set_resizable(GTK_WINDOW(w->gtkwin), TRUE);
- gtk_window_resize(GTK_WINDOW(w->gtkwin), w->w, w->h);
- } else {
- gtk_window_set_resizable(GTK_WINDOW(w->gtkwin), FALSE);
- }
-
- w->lastX = 0;
- w->lastY = h;
- w->shown = FALSE;
- w->nameStr = nameStr?strdup(nameStr):NULL;
-
- if (labelStr) {
- gtk_window_set_title(GTK_WINDOW(w->gtkwin), labelStr);
- }
-
- if (listHelpStrings) {
- printf("WINDOW - %s\n", nameStr?nameStr:"<NULL>");
- }
-
- if (firstWin) {
- lastWin->next = (wControl_p)w;
- } else {
- firstWin = (wControl_p)w;
- }
-
- lastWin = (wControl_p)w;
- gtk_widget_show(w->widget);
- gtk_widget_realize(w->gtkwin);
- GtkAllocation allocation;
- gtk_widget_get_allocation(w->gtkwin, &allocation);
- w->menu_height = allocation.height;
-
- w->busy = FALSE;
-
- if (option&F_MAXIMIZE) {
- maximize_at_next_show = TRUE;
- }
-
- return w;
+ gtk_window_set_resizable(GTK_WINDOW(w->gtkwin), FALSE);
+ }
+
+ w->lastX = 0;
+ w->lastY = h;
+ w->shown = FALSE;
+ w->nameStr = nameStr?strdup(nameStr):NULL;
+
+ if (labelStr) {
+ gtk_window_set_title(GTK_WINDOW(w->gtkwin), labelStr);
+ }
+
+ if (listHelpStrings) {
+ printf("WINDOW - %s\n", nameStr?nameStr:"<NULL>");
+ }
+
+ if (firstWin) {
+ lastWin->next = (wControl_p)w;
+ } else {
+ firstWin = (wControl_p)w;
+ }
+
+ lastWin = (wControl_p)w;
+ gtk_widget_show(w->widget);
+ gtk_widget_realize(w->gtkwin);
+ GtkAllocation allocation;
+ gtk_widget_get_allocation(w->gtkwin, &allocation);
+ w->menu_height = allocation.height;
+
+ w->busy = FALSE;
+
+ if (option&F_MAXIMIZE) {
+ maximize_at_next_show = TRUE;
+ }
+
+ if ( windowIconPixbuf == NULL ) {
+ windowIconPixbuf = gdk_pixbuf_new_from_xpm_data((const char**)&xtc_xpm);
+ }
+ gtk_window_set_icon( GTK_WINDOW(w->gtkwin), windowIconPixbuf );
+
+ return w;
}
@@ -1091,38 +1074,38 @@ static wWin_p wWinCommonCreate(
*/
wWin_p wWinMainCreate(
- const char * name, /* Application name */
- wPos_t x, /* Initial window width */
- wPos_t y, /* Initial window height */
- const char * helpStr, /* Help topic string */
- const char * labelStr, /* Window title */
- const char * nameStr, /* Window name */
- long option, /* Options */
- wWinCallBack_p winProc, /* Call back function */
- void * data) /* User context */
+ const char * name, /* Application name */
+ wWinPix_t x, /* Initial window width */
+ wWinPix_t y, /* Initial window height */
+ const char * helpStr, /* Help topic string */
+ const char * labelStr, /* Window title */
+ const char * nameStr, /* Window name */
+ long option, /* Options */
+ wWinCallBack_p winProc, /* Call back function */
+ void * data) /* User context */
{
- char *pos;
- long isMaximized;
+ char *pos;
+ long isMaximized;
- pos = strchr(name, ';');
+ pos = strchr(name, ';');
- if (pos) {
- /* if found, split application name and configuration name */
- strcpy(wConfigName, pos + 1);
- } else {
- /* if not found, application name and configuration name are same */
- strcpy(wConfigName, name);
- }
+ if (pos) {
+ /* if found, split application name and configuration name */
+ strcpy(wConfigName, pos + 1);
+ } else {
+ /* if not found, application name and configuration name are same */
+ strcpy(wConfigName, name);
+ }
- wPrefGetInteger("draw", "maximized", &isMaximized, 0);
- option = option | (isMaximized?F_MAXIMIZE:0);
+ wPrefGetInteger("draw", "maximized", &isMaximized, 0);
+ option = option | (isMaximized?F_MAXIMIZE:0);
- gtkMainW = wWinCommonCreate(NULL, W_MAIN, x, y, labelStr, nameStr, option,
- winProc, data);
+ gtkMainW = wWinCommonCreate(NULL, W_MAIN, x, y, labelStr, nameStr, option,
+ winProc, data);
- wDrawColorWhite = wDrawFindColor(0xFFFFFF);
- wDrawColorBlack = wDrawFindColor(0x000000);
- return gtkMainW;
+ wDrawColorWhite = wDrawFindColor(0xFFFFFF);
+ wDrawColorBlack = wDrawFindColor(0x000000);
+ return gtkMainW;
}
/**
@@ -1141,29 +1124,29 @@ wWin_p wWinMainCreate(
*/
wWin_p wWinPopupCreate(
- wWin_p parent,
- wPos_t x,
- wPos_t y,
- const char * helpStr,
- const char * labelStr,
- const char * nameStr,
- long option,
- wWinCallBack_p winProc,
- void * data)
+ wWin_p parent,
+ wWinPix_t x,
+ wWinPix_t y,
+ const char * helpStr,
+ const char * labelStr,
+ const char * nameStr,
+ long option,
+ wWinCallBack_p winProc,
+ void * data)
{
- wWin_p win;
+ wWin_p win;
- if (parent == NULL) {
- if (gtkMainW == NULL) {
- abort();
- }
+ if (parent == NULL) {
+ if (gtkMainW == NULL) {
+ abort();
+ }
- parent = gtkMainW;
- }
+ parent = gtkMainW;
+ }
- win = wWinCommonCreate(parent, W_POPUP, x, y, labelStr, nameStr, option,
- winProc, data);
- return win;
+ win = wWinCommonCreate(parent, W_POPUP, x, y, labelStr, nameStr, option,
+ winProc, data);
+ return win;
}
@@ -1178,22 +1161,22 @@ wWin_p wWinPopupCreate(
void wExit(
- int rc) /* Application return code */
+ int rc) /* Application return code */
{
- wWin_p win;
+ wWin_p win;
- for (win = (wWin_p)firstWin; win; win = (wWin_p)win->next) {
- if (gtk_widget_get_visible(GTK_WIDGET(win->gtkwin))) {
- saveSize(win);
- savePos(win);
- }
- }
+ for (win = (wWin_p)firstWin; win; win = (wWin_p)win->next) {
+ if (gtk_widget_get_visible(GTK_WIDGET(win->gtkwin))) {
+ saveSize(win);
+ savePos(win);
+ }
+ }
- wPrefFlush();
+ wPrefFlush("");
- if (gtkMainW && gtkMainW->winProc != NULL) {
- gtkMainW->winProc(gtkMainW, wQuit_e, NULL, gtkMainW->data);
- }
+ if (gtkMainW && gtkMainW->winProc != NULL) {
+ gtkMainW->winProc(gtkMainW, wQuit_e, NULL, gtkMainW->data);
+ }
- exit(rc);
+ exit(rc);
}
diff --git a/app/wlib/gtklib/wpref.c b/app/wlib/gtklib/wpref.c
index 124305a..356dd95 100644
--- a/app/wlib/gtklib/wpref.c
+++ b/app/wlib/gtklib/wpref.c
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
@@ -26,6 +26,7 @@
#include <ctype.h>
#include <dirent.h>
#include <sys/stat.h>
+#include <errno.h>
#define GTK_DISABLE_SINGLE_INCLUDES
#define GDK_DISABLE_DEPRECATED
@@ -47,6 +48,8 @@ extern char wConfigName[];
static char appLibDir[BUFSIZ];
static char appWorkDir[BUFSIZ];
static char userHomeDir[BUFSIZ];
+
+static char *profileFile;
/*
@@ -58,13 +61,13 @@ static char userHomeDir[BUFSIZ];
*/
-/** Find the directory where configuration files, help, demos etc are installed.
+/** Find the directory where configuration files, help, demos etc are installed.
* The search order is:
* 1. Directory specified by the XTRKCADLIB environment variable
* 2. Directory specified by XTRKCAD_INSTALL_PREFIX/share/xtrkcad
- * 3. /usr/lib/xtrkcad
- * 4. /usr/local/lib/xtrkcad
- *
+ * 3. /usr/share/xtrkcad
+ * 4. /usr/local/share/xtrkcad
+ *
* \return pointer to directory name
*/
@@ -79,46 +82,66 @@ const char * wGetAppLibDir( void )
return appLibDir;
}
- for (cp=wlibGetAppName(),ep=envvar; *cp; cp++,ep++)
+ for (cp=wlibGetAppName(),ep=envvar; *cp; cp++,ep++) {
*ep = toupper(*cp);
- strcpy( ep, "LIB" );
+ }
+#ifndef __APPLE__
+ if ( strstr( XTRKCAD_VERSION, "Beta" ) != NULL ) {
+ strcat( ep, "BETA" );
+ }
+#endif
+ strcat( ep, "LIB" );
ep = getenv( envvar );
if (ep != NULL) {
if ((stat( ep, &buf) == 0 ) && S_ISDIR( buf.st_mode)) {
- strncpy( appLibDir, ep, sizeof appLibDir );
+ strncpy( appLibDir, ep, sizeof(appLibDir) -1 );
+ //printf( "wAppLbDir=%s\n", appLibDir );
return appLibDir;
}
}
- strcpy(appLibDir, XTRKCAD_INSTALL_PREFIX);
- strcat(appLibDir, "/share/");
+ strcpy(appLibDir, "../share/");
strcat(appLibDir, wlibGetAppName());
-
if ((stat( appLibDir, &buf) == 0 ) && S_ISDIR( buf.st_mode)) {
+ //printf( "wAppLbDir=%s\n", appLibDir );
return appLibDir;
}
- strcpy( appLibDir, "/usr/lib/" );
+ char * dir1 = "/usr/share/";
+ char * dir2 = "/usr/local/share/";
+ char * beta = "";
+ if ( strstr( XTRKCAD_VERSION, "Beta" ) != NULL ) {
+ dir1 = "/usr/local/share/";
+ dir2 = "/usr/share/";
+#ifndef __APPLE__
+ beta = "-beta";
+#endif
+ }
+
+ strcpy( appLibDir, dir1 );
strcat( appLibDir, wlibGetAppName() );
+ strcat( appLibDir, beta );
if ((stat( appLibDir, &buf) == 0 ) && S_ISDIR( buf.st_mode)) {
+ //printf( "wAppLbDir=%s\n", appLibDir );
return appLibDir;
}
- strcpy( appLibDir, "/usr/local/lib/" );
+ strcpy( appLibDir, dir2 );
strcat( appLibDir, wlibGetAppName() );
if ((stat( appLibDir, &buf) == 0 ) && S_ISDIR( buf.st_mode)) {
+ //printf( "wAppLbDir=%s\n", appLibDir );
return appLibDir;
}
sprintf( msg,
- _("The required configuration files could not be located in the expected location.\n\n"
- "Usually this is an installation problem. Make sure that these files are installed in either \n"
- " %s/share/xtrkcad or\n"
- " /usr/lib/%s or\n"
- " /usr/local/lib/%s\n"
- "If this is not possible, the environment variable %s must contain "
- "the name of the correct directory."),
- XTRKCAD_INSTALL_PREFIX, wlibGetAppName(), wlibGetAppName(), envvar );
+ _("The required configuration files could not be located in the expected location.\n\n"
+ "Usually this is an installation problem. Make sure that these files are installed in either \n"
+ " ../share/xtrkcad or\n"
+ " /usr/share/%s or\n"
+ " /usr/local/share/%s\n"
+ "If this is not possible, the environment variable %s must contain "
+ "the name of the correct directory."),
+ wlibGetAppName(), wlibGetAppName(), envvar );
wNoticeEx( NT_ERROR, msg, _("Ok"), NULL );
appLibDir[0] = '\0';
wExit(0);
@@ -135,20 +158,26 @@ const char * wGetAppLibDir( void )
const char * wGetAppWorkDir(
- void )
+ void )
{
char tmp[BUFSIZ+20];
char * homeDir;
DIR *dirp;
-
- if (appWorkDir[0] != '\0')
+
+ if (appWorkDir[0] != '\0') {
return appWorkDir;
+ }
if ((homeDir = getenv( "HOME" )) == NULL) {
wNoticeEx( NT_ERROR, _("HOME is not set"), _("Exit"), NULL);
wExit(0);
}
sprintf( appWorkDir, "%s/.%s", homeDir, wlibGetAppName() );
+#ifndef __APPLE__
+ if ( strstr( XTRKCAD_VERSION, "Beta" ) != NULL ) {
+ strcat( appWorkDir, "-beta" );
+ }
+#endif
if ( (dirp = opendir(appWorkDir)) != NULL ) {
closedir(dirp);
} else {
@@ -157,18 +186,18 @@ const char * wGetAppWorkDir(
wNoticeEx( NT_ERROR, tmp, _("Exit"), NULL );
wExit(0);
} else {
- /*
- * check for default configuration file and copy to
+ /*
+ * check for default configuration file and copy to
* the workdir if it exists
*/
struct stat stFileInfo;
char appEtcConfig[BUFSIZ];
sprintf( appEtcConfig, "/etc/%s.rc", wlibGetAppName());
-
+
if ( stat( appEtcConfig, &stFileInfo ) == 0 ) {
char copyConfigCmd[(BUFSIZ * 2) + 3];
sprintf( copyConfigCmd, "cp %s %s", appEtcConfig, appWorkDir );
- int rc = system( copyConfigCmd );
+ system( copyConfigCmd );
}
}
}
@@ -185,16 +214,17 @@ const char * wGetAppWorkDir(
const char *wGetUserHomeDir( void )
{
char *homeDir;
-
- if( userHomeDir[ 0 ] != '\0' )
+
+ if( userHomeDir[ 0 ] != '\0' ) {
return userHomeDir;
-
+ }
+
if ((homeDir = getenv( "HOME" )) == NULL) {
wNoticeEx( NT_ERROR, _("HOME is not set"), _("Exit"), NULL);
wExit(0);
} else {
strcpy( userHomeDir, homeDir );
- }
+ }
return userHomeDir;
}
@@ -209,63 +239,116 @@ const char *wGetUserHomeDir( void )
*/
typedef struct {
- char * section;
- char * name;
- wBool_t present;
- wBool_t dirty;
- char * val;
- } prefs_t;
+ char * section;
+ char * name;
+ wBool_t present;
+ wBool_t dirty;
+ char * val;
+} prefs_t;
dynArr_t prefs_da;
#define prefs(N) DYNARR_N(prefs_t,prefs_da,N)
wBool_t prefInitted = FALSE;
/**
+ * Define the name of the configuration file. Needed size is calculated, allocated and
+ * initialized with the filename
+ *
+ * \param name overwrite default configuration
+ */
+
+void static
+wlibSetProfileFilename(char *name)
+{
+ const char *workDir;
+
+ workDir = wGetAppWorkDir();
+ if (name && name[0]) {
+ size_t length;
+ length = snprintf(profileFile, 0, "%s", name);
+ profileFile = malloc(length + sizeof(NULL));
+ snprintf( profileFile, length, "%s", name );
+ } else {
+ size_t length;
+ length = snprintf(profileFile, 0, "%s/%s.rc", workDir, wConfigName );
+ profileFile = malloc(length + sizeof(NULL));
+ length = snprintf(profileFile, length+sizeof(NULL), "%s/%s.rc", workDir, wConfigName );
+ }
+}
+
+
+/**
+ * Get the name of the configuration file.
+ *
+ * \return pointer to the filename.
+ *
+ */
+
+char *
+wGetProfileFilename()
+{
+ return(profileFile);
+}
+
+/**
* Read the configuration file into memory
*/
-static void readPrefs( void )
+static void readPrefs( char * name, wBool_t update )
{
- char tmp[BUFSIZ], *np, *vp, *cp;
- const char * workDir;
+ char tmp[BUFSIZ+32], *np, *vp, *cp;
FILE * prefFile;
prefs_t * p;
prefInitted = TRUE;
- workDir = wGetAppWorkDir();
- sprintf( tmp, "%s/%s.rc", workDir, wConfigName );
- prefFile = fopen( tmp, "r" );
- if (prefFile == NULL)
+ wlibSetProfileFilename(name);
+
+ prefFile = fopen( profileFile, "r" );
+ if (prefFile == NULL) {
+ // First run, no .rc file yet
return;
+ }
while ( ( fgets(tmp, sizeof tmp, prefFile) ) != NULL ) {
char *sp;
-
+
sp = tmp;
- while ( *sp==' ' || *sp=='\t' ) sp++;
- if ( *sp == '\n' || *sp == '#' )
+ while ( *sp==' ' || *sp=='\t' ) { sp++; }
+ if ( *sp == '\n' || *sp == '#' ) {
continue;
+ }
np = strchr( sp, '.' );
if (np == NULL) {
wNoticeEx( NT_INFORMATION, tmp, _("Continue"), NULL );
continue;
}
*np++ = '\0';
- while ( *np==' ' || *np=='\t' ) np++;
+ while ( *np==' ' || *np=='\t' ) { np++; }
vp = strchr( np, ':' );
if (vp == NULL) {
wNoticeEx( NT_INFORMATION, tmp, _("Continue"), NULL );
continue;
}
*vp++ = '\0';
- while ( *vp==' ' || *vp=='\t' ) vp++;
+ while ( *vp==' ' || *vp=='\t' ) { vp++; }
cp = vp + strlen(vp) -1;
- while ( cp >= vp && (*cp=='\n' || *cp==' ' || *cp=='\t') ) cp--;
+ while ( cp >= vp && (*cp=='\n' || *cp==' ' || *cp=='\t') ) { cp--; }
cp[1] = '\0';
- DYNARR_APPEND( prefs_t, prefs_da, 10 );
- p = &prefs(prefs_da.cnt-1);
- p->name = strdup(np);
- p->section = strdup(sp);
- p->dirty = FALSE;
- p->val = strdup(vp);
+ if (update) {
+ for (int i=0; i<prefs_da.cnt; i++) {
+ p = &DYNARR_N(prefs_t,prefs_da,i);
+ if (strcmp(p->name,np)==0 && strcmp(p->section,sp)==0) {
+ p->val = strdup(vp);
+ p->dirty = TRUE;
+ break;
+ }
+ }
+ } else {
+ DYNARR_APPEND( prefs_t, prefs_da, 10 );
+ p = &prefs(prefs_da.cnt-1);
+ p->name = strdup(np);
+ p->section = strdup(sp);
+ p->dirty = FALSE;
+ p->val = strdup(vp);
+ }
}
fclose( prefFile );
}
@@ -279,19 +362,21 @@ static void readPrefs( void )
*/
void wPrefSetString(
- const char * section, /* Section */
- const char * name, /* Name */
- const char * sval ) /* Value */
+ const char * section, /* Section */
+ const char * name, /* Name */
+ const char * sval ) /* Value */
{
prefs_t * p;
- if (!prefInitted)
- readPrefs();
-
+ if (!prefInitted) {
+ readPrefs("", FALSE);
+ }
+
for (p=&prefs(0); p<&prefs(prefs_da.cnt); p++) {
if ( strcmp( p->section, section ) == 0 && strcmp( p->name, name ) == 0 ) {
- if (p->val)
+ if (p->val) {
free(p->val);
+ }
p->dirty = TRUE;
p->val = (sval?strdup( sval ):NULL);
return;
@@ -313,14 +398,15 @@ void wPrefSetString(
*/
char * wPrefGetStringBasic(
- const char * section, /* Section */
- const char * name ) /* Name */
+ const char * section, /* Section */
+ const char * name ) /* Name */
{
prefs_t * p;
- if (!prefInitted)
- readPrefs();
-
+ if (!prefInitted) {
+ readPrefs("", FALSE);
+ }
+
for (p=&prefs(0); p<&prefs(prefs_da.cnt); p++) {
if ( strcmp( p->section, section ) == 0 && strcmp( p->name, name ) == 0 ) {
return p->val;
@@ -337,14 +423,14 @@ char * wPrefGetStringBasic(
* \param lval IN value to save
*/
- void wPrefSetInteger(
- const char * section, /* Section */
- const char * name, /* Name */
- long lval ) /* Value */
+void wPrefSetInteger(
+ const char * section, /* Section */
+ const char * name, /* Name */
+ long lval ) /* Value */
{
char tmp[20];
- sprintf(tmp, "%ld", lval );
+ snprintf(tmp, sizeof(tmp), "%ld", lval );
wPrefSetString( section, name, tmp );
}
@@ -359,13 +445,13 @@ char * wPrefGetStringBasic(
*/
wBool_t wPrefGetIntegerBasic(
- const char * section, /* Section */
- const char * name, /* Name */
- long * res, /* Address of result */
- long def ) /* Default value */
+ const char * section, /* Section */
+ const char * name, /* Name */
+ long * res, /* Address of result */
+ long def ) /* Default value */
{
const char * cp;
- char *cp1;
+ char *cp1;
cp = wPrefGetStringBasic( section, name );
if (cp == NULL) {
@@ -381,21 +467,21 @@ wBool_t wPrefGetIntegerBasic(
}
/**
- * Save a float value in the preferences file.
+ * Save a float value in the preferences file.
*
* \param section IN the file section into which the value should be saved
* \param name IN the name of the preference
* \param lval IN the value
*/
- void wPrefSetFloat(
- const char * section, /* Section */
- const char * name, /* Name */
- double lval ) /* Value */
+void wPrefSetFloat(
+ const char * section, /* Section */
+ const char * name, /* Name */
+ double lval ) /* Value */
{
char tmp[20];
- sprintf(tmp, "%0.6f", lval );
+ snprintf(tmp, sizeof(tmp), "%0.6f", lval );
wPrefSetString( section, name, tmp );
}
@@ -411,13 +497,13 @@ wBool_t wPrefGetIntegerBasic(
wBool_t wPrefGetFloatBasic(
- const char * section, /* Section */
- const char * name, /* Name */
- double * res, /* Address of result */
- double def ) /* Default value */
+ const char * section, /* Section */
+ const char * name, /* Name */
+ double * res, /* Address of result */
+ double def ) /* Default value */
{
const char * cp;
- char *cp1;
+ char *cp1;
cp = wPrefGetStringBasic( section, name );
if (cp == NULL) {
@@ -432,55 +518,117 @@ wBool_t wPrefGetFloatBasic(
return TRUE;
}
+void wPrefsLoad(char * name)
+{
+ readPrefs(name,TRUE);
+}
+
/**
* Save the configuration to a file. The config parameters are held and updated in an array.
- * To make the settings persistant, this function has to be called.
+ * To make the settings persistant, this function has to be called.
*
*/
void wPrefFlush(
- void )
+ char * name )
{
prefs_t * p;
- char tmp[BUFSIZ];
- const char *workDir;
+ char tmp[BUFSIZ+32];
FILE * prefFile;
- if (!prefInitted)
+ if (!prefInitted) {
return;
-
- workDir = wGetAppWorkDir();
- sprintf( tmp, "%s/%s.rc", workDir, wConfigName );
- prefFile = fopen( tmp, "w" );
- if (prefFile == NULL)
+ }
+
+ wlibSetProfileFilename(name);
+
+ prefFile = fopen( profileFile, "w" );
+ if (prefFile == NULL) {
+ // Can not write pref file
+ size_t n = BUFSIZ+32-1-strlen(tmp);
+ strncat( tmp, ": ", n );
+ strncat( tmp, strerror(errno), n-2 );
+ wNoticeEx( NT_ERROR, tmp, "Ok", NULL );
return;
+ }
for (p=&prefs(0); p<&prefs(prefs_da.cnt); p++) {
if(p->val) {
fprintf( prefFile, "%s.%s: %s\n", p->section, p->name, p->val );
- }
+ }
}
fclose( prefFile );
}
/**
* Clear the preferences from memory
- * \return
+ * \return
*/
void wPrefReset(
- void )
+ void )
{
prefs_t * p;
prefInitted = FALSE;
for (p=&prefs(0); p<&prefs(prefs_da.cnt); p++) {
- if (p->section)
+ if (p->section) {
free( p->section );
- if (p->name)
+ }
+ if (p->name) {
free( p->name );
- if (p->val)
+ }
+ if (p->val) {
free( p->val );
+ }
}
prefs_da.cnt = 0;
}
+
+/**
+ * Split a line from the config file ie. rc ini-file into separate tokens. The
+ * line is split into sections, name of value and value following. Pointers
+ * to the respective token are returned. These are zero-terminated.
+ * If a token is not present, NULL is returned instead.
+ * The input line is modified.
+ *
+ * \param line input line, modified during excution of function
+ * \param section section if present
+ * \param name name of config value if present
+ * \param value name of value if present
+ */
+void
+wPrefTokenize(char* line, char** section, char** name, char** value)
+{
+ *section = NULL;
+ *name = NULL;
+ *value = NULL;
+
+ *section = strtok(line, ".");
+ *name = strtok(NULL, ":");
+ *value = strtok(NULL, "\n");
+ if(*value)
+ g_strstrip(*value);
+
+}
+
+/**
+ * A valid line for a config file is created from the individual elements.
+ * Values not need for specific statement are ignored. Eg. when section is
+ * present, name and value are not used.
+ * The caller has to make sure, that the return buffer is large enough.
+ *
+ * \param section section, first token, dellimited with '.'
+ * \param name name, left side of ':'
+ * \param value value, right side of ':'
+ * \param result pointer to buffer for formated line.
+ */
+
+void
+wPrefFormatLine(const char* section, const char* name, const char* value, char* result)
+{
+ if (!value || *value == '\0') {
+ value = "";
+ }
+ sprintf(result, "%s.%s: %s", section, name, value);
+} \ No newline at end of file
diff --git a/app/wlib/gtklib/writebitmap.c b/app/wlib/gtklib/writebitmap.c
new file mode 100644
index 0000000..0f5041a
--- /dev/null
+++ b/app/wlib/gtklib/writebitmap.c
@@ -0,0 +1,102 @@
+/** \file writebitmap.c
+ * Bitmap file creation
+ */
+
+/* XTrackCad - Model Railroad CAD
+ * Copyright (C) 2015 Martin Fischer
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#define GTK_DISABLE_SINGLE_INCLUDES
+#define GDK_DISABLE_DEPRECATED
+#define GTK_DISABLE_DEPRECATED
+#define GSEAL_ENABLE
+
+#include <string.h>
+#include <gtk/gtk.h>
+#include "gtkint.h"
+
+#define PNGFORMAT "png"
+#define JPEGFORMAT "jpeg"
+
+/**
+ * Get the Extension part of a filename
+ *
+ * /param fname the filename
+ *
+ * /return char* point to the extension
+ */
+
+static const char *
+GetExtension(const char *fname)
+{
+ const char *end = fname + strlen(fname);
+
+ while (end > fname && *end != '.') {
+ --end;
+ }
+ return( end + 1 );
+}
+
+/**
+* Export as bitmap file.
+*
+* \param d IN the drawing area ?
+* \param fileName IN fully qualified filename for the bitmap file.
+* \return TRUE on success, FALSE on error
+*/
+
+wBool_t wBitMapWriteFile(wDraw_p d, const char * fileName)
+{
+ GdkPixbuf *pixbuf;
+ GError *error;
+ gboolean res;
+ const char *fileFormat = GetExtension(fileName);
+ char *writeFormat = NULL;
+
+ if(!strcasecmp(fileFormat, PNGFORMAT )) {
+ writeFormat = PNGFORMAT;
+ }
+ if( !strcasecmp(fileFormat, "jpg") ||
+ !strcasecmp(fileFormat, "jpeg")) {
+ writeFormat = JPEGFORMAT;
+ }
+
+ if(!writeFormat) {
+ wNoticeEx(NT_ERROR, "WriteBitMap: invalid file format!", "Ok", NULL);
+ return FALSE;
+ }
+
+ pixbuf = gdk_pixbuf_get_from_drawable(NULL, (GdkWindow*)d->pixmap, NULL, 0, 0,
+ 0, 0, d->w, d->h);
+
+ if (!pixbuf) {
+ wNoticeEx(NT_ERROR, "WriteBitMap: pixbuf_get failed", "Ok", NULL);
+ return FALSE;
+ }
+
+ error = NULL;
+ res = gdk_pixbuf_save(pixbuf, fileName, writeFormat, &error, NULL);
+
+ if (res == FALSE) {
+ wNoticeEx(NT_ERROR, "WriteBitMap: pixbuf_save failed", "Ok", NULL);
+ return FALSE;
+ }
+
+ g_object_ref_sink(pixbuf);
+ g_object_unref(pixbuf);
+ return TRUE;
+}