1
0
mirror of https://github.com/gryf/wmaker.git synced 2026-02-10 10:35:46 +01:00

Code update for Window Maker version 0.50.0

Read changes in ChangeLog and NEWS
This commit is contained in:
dan
1999-01-06 15:22:33 +00:00
parent 16698efd45
commit 0261c32636
232 changed files with 20628 additions and 8087 deletions

View File

@@ -1,3 +1,20 @@
changes since wmaker 0.20.3:
............................
- added WMSetSliderImage(), WMSetSliderKnobThickness()
- added WMGetListItemHeight()
- added WMListDidScrollNotification
- added WSetColorWellBordered()
- added hacky color dragging in colorwell
- added poll() support in WMNextEvent. WARNING: the stuff needed for
WMAddInputHandler() is not yet implemented for the poll stuff
- added WMSetFilePanelAccessoryView(), WMGetFilePanelAccessoryView()
- added WMSetPopUpButtonEnabled()
- added WMGetLabelImage()
- autoscroll for popup button menus
- added WMDrawPixmap()
- WARNING: changed parameter list for WMListDrawProc
changes since wmaker 0.20.2:
............................

View File

@@ -5,39 +5,43 @@ AUTOMAKE_OPTIONS = no-dependencies
SUBDIRS = Resources
LIBLIST= -L$(top_builddir)/wrlib -lwraster\
LIBLIST= $(top_builddir)/wrlib/libwraster.la\
@GFXLFLAGS@ @XLFLAGS@ @GFXLIBS@ @XLIBS@ \
-lm -L$(top_builddir)/libPropList -lPropList
-lm $(top_builddir)/libPropList/libPropList.la
#lib_LTLIBRARIES = libWINGs.la
lib_LIBRARIES = libWINGs.a
#libWINGs_la_LDFLAGS = -version-info 1:1:0
include_HEADERS = WINGs.h WUtil.h WINGsP.h
noinst_PROGRAMS = wtest wmquery wmfile fontl testmywidget
testmywidget_SOURCES = testmywidget.c mywidget.c mywidget.h
testmywidget_LDADD = -L. -lWINGs $(LIBLIST)
testmywidget_LDADD = libWINGs.a $(LIBLIST)
fontl_SOURCES = fontl.c
fontl_LDADD = -L. -lWINGs $(LIBLIST)
fontl_LDADD = libWINGs.a $(LIBLIST)
wtest_SOURCES = wtest.c
wtest_LDADD = -L. -lWINGs $(LIBLIST)
wtest_LDADD = libWINGs.a $(LIBLIST)
wtest_DEPENDENCIES = libWINGs.a
wmfile_SOURCES = wmfile.c
wmfile_LDADD = -L. -lWINGs $(LIBLIST)
wmfile_LDADD = libWINGs.a $(LIBLIST)
wmquery_SOURCES = wmquery.c
wmquery_LDADD = -L. -lWINGs $(LIBLIST)
wmquery_LDADD = libWINGs.a $(LIBLIST)
EXTRA_DIST = logo.xpm

View File

@@ -69,6 +69,9 @@ I18N = @I18N@
I18N_MB = @I18N_MB@
ICONEXT = @ICONEXT@
INTLIBS = @INTLIBS@
LD = @LD@
LIBTOOL = @LIBTOOL@
LITE = @LITE@
LN_S = @LN_S@
MAKEINFO = @MAKEINFO@
MOFILES = @MOFILES@
@@ -94,37 +97,41 @@ AUTOMAKE_OPTIONS = no-dependencies
SUBDIRS = Resources
LIBLIST= -L$(top_builddir)/wrlib -lwraster\
LIBLIST= $(top_builddir)/wrlib/libwraster.la\
@GFXLFLAGS@ @XLFLAGS@ @GFXLIBS@ @XLIBS@ \
-lm -L$(top_builddir)/libPropList -lPropList
-lm $(top_builddir)/libPropList/libPropList.la
#lib_LTLIBRARIES = libWINGs.la
lib_LIBRARIES = libWINGs.a
#libWINGs_la_LDFLAGS = -version-info 1:1:0
include_HEADERS = WINGs.h WUtil.h WINGsP.h
noinst_PROGRAMS = wtest wmquery wmfile fontl testmywidget
testmywidget_SOURCES = testmywidget.c mywidget.c mywidget.h
testmywidget_LDADD = -L. -lWINGs $(LIBLIST)
testmywidget_LDADD = libWINGs.a $(LIBLIST)
fontl_SOURCES = fontl.c
fontl_LDADD = -L. -lWINGs $(LIBLIST)
fontl_LDADD = libWINGs.a $(LIBLIST)
wtest_SOURCES = wtest.c
wtest_LDADD = -L. -lWINGs $(LIBLIST)
wtest_LDADD = libWINGs.a $(LIBLIST)
wtest_DEPENDENCIES = libWINGs.a
wmfile_SOURCES = wmfile.c
wmfile_LDADD = -L. -lWINGs $(LIBLIST)
wmfile_LDADD = libWINGs.a $(LIBLIST)
wmquery_SOURCES = wmquery.c
wmquery_LDADD = -L. -lWINGs $(LIBLIST)
wmquery_LDADD = libWINGs.a $(LIBLIST)
EXTRA_DIST = logo.xpm
@@ -196,20 +203,26 @@ PROGRAMS = $(noinst_PROGRAMS)
wtest_OBJECTS = wtest.o
wtest_LDFLAGS =
wmquery_OBJECTS = wmquery.o
wmquery_DEPENDENCIES =
wmquery_DEPENDENCIES = libWINGs.a $(top_builddir)/wrlib/libwraster.la \
$(top_builddir)/libPropList/libPropList.la
wmquery_LDFLAGS =
wmfile_OBJECTS = wmfile.o
wmfile_DEPENDENCIES =
wmfile_DEPENDENCIES = libWINGs.a $(top_builddir)/wrlib/libwraster.la \
$(top_builddir)/libPropList/libPropList.la
wmfile_LDFLAGS =
fontl_OBJECTS = fontl.o
fontl_DEPENDENCIES =
fontl_DEPENDENCIES = libWINGs.a $(top_builddir)/wrlib/libwraster.la \
$(top_builddir)/libPropList/libPropList.la
fontl_LDFLAGS =
testmywidget_OBJECTS = testmywidget.o mywidget.o
testmywidget_DEPENDENCIES =
testmywidget_DEPENDENCIES = libWINGs.a \
$(top_builddir)/wrlib/libwraster.la \
$(top_builddir)/libPropList/libPropList.la
testmywidget_LDFLAGS =
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
LINK = $(CC) $(CFLAGS) $(LDFLAGS) -o $@
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
LINK = $(LIBTOOL) --mode=link $(CC) $(CFLAGS) $(LDFLAGS) -o $@
HEADERS = $(include_HEADERS)
DIST_COMMON = README ChangeLog Makefile.am Makefile.in TODO
@@ -225,7 +238,7 @@ OBJECTS = $(libWINGs_a_OBJECTS) $(wtest_OBJECTS) $(wmquery_OBJECTS) $(wmfile_OBJ
all: all-recursive all-am
.SUFFIXES:
.SUFFIXES: .S .c .o .s
.SUFFIXES: .S .c .lo .o .s
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && $(AUTOMAKE) --gnu WINGs/Makefile
@@ -285,6 +298,25 @@ distclean-compile:
maintainer-clean-compile:
.c.lo:
$(LIBTOOL) --mode=compile $(COMPILE) -c $<
.s.lo:
$(LIBTOOL) --mode=compile $(COMPILE) -c $<
.S.lo:
$(LIBTOOL) --mode=compile $(COMPILE) -c $<
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
maintainer-clean-libtool:
libWINGs.a: $(libWINGs_a_OBJECTS) $(libWINGs_a_DEPENDENCIES)
-rm -f libWINGs.a
$(AR) cru libWINGs.a $(libWINGs_a_OBJECTS) $(libWINGs_a_LIBADD)
@@ -463,18 +495,19 @@ maintainer-clean-generic:
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
mostlyclean-am: mostlyclean-libLIBRARIES mostlyclean-compile \
mostlyclean-noinstPROGRAMS mostlyclean-tags \
mostlyclean-generic
mostlyclean-libtool mostlyclean-noinstPROGRAMS \
mostlyclean-tags mostlyclean-generic
clean-am: clean-libLIBRARIES clean-compile clean-noinstPROGRAMS \
clean-tags clean-generic mostlyclean-am
clean-am: clean-libLIBRARIES clean-compile clean-libtool \
clean-noinstPROGRAMS clean-tags clean-generic \
mostlyclean-am
distclean-am: distclean-libLIBRARIES distclean-compile \
distclean-noinstPROGRAMS distclean-tags \
distclean-generic clean-am
distclean-libtool distclean-noinstPROGRAMS \
distclean-tags distclean-generic clean-am
maintainer-clean-am: maintainer-clean-libLIBRARIES \
maintainer-clean-compile \
maintainer-clean-compile maintainer-clean-libtool \
maintainer-clean-noinstPROGRAMS maintainer-clean-tags \
maintainer-clean-generic distclean-am
@@ -484,6 +517,7 @@ clean: clean-recursive clean-am
distclean: distclean-recursive distclean-am
-rm -f config.status
-rm -f libtool
maintainer-clean: maintainer-clean-recursive maintainer-clean-am
@echo "This command is intended for maintainers to use;"
@@ -492,14 +526,15 @@ maintainer-clean: maintainer-clean-recursive maintainer-clean-am
.PHONY: mostlyclean-libLIBRARIES distclean-libLIBRARIES \
clean-libLIBRARIES maintainer-clean-libLIBRARIES uninstall-libLIBRARIES \
install-libLIBRARIES mostlyclean-compile distclean-compile \
clean-compile maintainer-clean-compile mostlyclean-noinstPROGRAMS \
distclean-noinstPROGRAMS clean-noinstPROGRAMS \
maintainer-clean-noinstPROGRAMS uninstall-includeHEADERS \
install-includeHEADERS install-data-recursive uninstall-data-recursive \
install-exec-recursive uninstall-exec-recursive installdirs-recursive \
uninstalldirs-recursive all-recursive check-recursive \
installcheck-recursive info-recursive dvi-recursive \
mostlyclean-recursive distclean-recursive clean-recursive \
clean-compile maintainer-clean-compile mostlyclean-libtool \
distclean-libtool clean-libtool maintainer-clean-libtool \
mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \
clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \
uninstall-includeHEADERS install-includeHEADERS install-data-recursive \
uninstall-data-recursive install-exec-recursive \
uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
all-recursive check-recursive installcheck-recursive info-recursive \
dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
distclean-tags clean-tags maintainer-clean-tags distdir info dvi \
installcheck all-am install-exec-am install-data-am uninstall-am \

View File

@@ -69,6 +69,9 @@ I18N = @I18N@
I18N_MB = @I18N_MB@
ICONEXT = @ICONEXT@
INTLIBS = @INTLIBS@
LD = @LD@
LIBTOOL = @LIBTOOL@
LITE = @LITE@
LN_S = @LN_S@
MAKEINFO = @MAKEINFO@
MOFILES = @MOFILES@
@@ -193,6 +196,7 @@ clean: clean-generic mostlyclean
distclean: distclean-generic clean
-rm -f config.status
-rm -f libtool
maintainer-clean: maintainer-clean-generic distclean
@echo "This command is intended for maintainers to use;"

View File

@@ -6,7 +6,7 @@
#include <wraster.h>
#include <X11/Xlib.h>
#define WINGS_H_VERSION 980930
#define WINGS_H_VERSION 981220
@@ -188,7 +188,7 @@ enum {
#define WSIHighlightedArrowUp 9
#define WSIArrowDown 10
#define WSIHighlightedArrowDown 11
#define WSICheckMark 12
enum {
WLDSSelected = (1 << 16),
@@ -352,8 +352,8 @@ typedef void WMCallback(void *data);
/* delegate method like stuff */
typedef void WMFreeDataProc(void *data);
typedef void WMListDrawProc(WMList *lPtr, Drawable d, char *text, int state,
WMRect *rect);
typedef void WMListDrawProc(WMList *lPtr, int index, Drawable d, char *text,
int state, WMRect *rect);
/*
typedef void WMSplitViewResizeSubviewsProc(WMSplitView *sPtr,
@@ -493,6 +493,8 @@ WMPixmap *WMCreatePixmapFromFile(WMScreen *scrPtr, char *fileName);
WMPixmap *WMCreateBlendedPixmapFromFile(WMScreen *scrPtr, char *fileName,
RColor *color);
void WMDrawPixmap(WMPixmap *pixmap, Drawable d, int x, int y);
Pixmap WMGetPixmapXID(WMPixmap *pixmap);
Pixmap WMGetPixmapMaskXID(WMPixmap *pixmap);
@@ -694,6 +696,8 @@ void WMSetLabelWraps(WMLabel *lPtr, Bool flag);
void WMSetLabelImage(WMLabel *lPtr, WMPixmap *image);
WMPixmap *WMGetLabelImage(WMLabel *lPtr);
void WMSetLabelImagePosition(WMLabel *lPtr, WMImagePosition position);
void WMSetLabelTextAlignment(WMLabel *lPtr, WMAlignment alignment);
@@ -738,6 +742,7 @@ void WMSetTextFieldEnabled(WMTextField *tPtr, Bool flag);
void WMSetTextFieldSecure(WMTextField *tPtr, Bool flag);
extern char *WMListDidScrollNotification;
extern char *WMTextDidChangeNotification;
extern char *WMTextDidBeginEditingNotification;
extern char *WMTextDidEndEditingNotification;
@@ -782,6 +787,8 @@ void WMSetListUserDrawProc(WMList *lPtr, WMListDrawProc *proc);
void WMSetListUserDrawItemHeight(WMList *lPtr, unsigned short height);
int WMGetListItemHeight(WMList *lPtr);
/* don't free the returned data */
WMListItem *WMGetListSelectedItem(WMList *lPtr);
@@ -801,6 +808,8 @@ void WMSetListBottomPosition(WMList *lPtr, int row);
int WMGetListPosition(WMList *lPtr);
extern char *WMListDidScrollNotification;
/* ....................................................................... */
WMBrowser *WMCreateBrowser(WMWidget *parent);
@@ -876,6 +885,8 @@ char *WMGetPopUpButtonItem(WMPopUpButton *bPtr, int index);
int WMGetPopUpButtonNumberOfItems(WMPopUpButton *bPtr);
void WMSetPopUpButtonEnabled(WMPopUpButton *bPtr, Bool flag);
/* ....................................................................... */
WMColorWell *WMCreateColorWell(WMWidget *parent);
@@ -884,6 +895,8 @@ void WMSetColorWellColor(WMColorWell *cPtr, WMColor *color);
WMColor *WMGetColorWellColor(WMColorWell *cPtr);
void WSetColorWellBordered(WMColorWell *cPtr, Bool flag);
/* ...................................................................... */
WMScrollView *WMCreateScrollView(WMWidget *parent);
@@ -929,6 +942,10 @@ void WMSetSliderContinuous(WMSlider *slider, Bool flag);
void WMSetSliderAction(WMSlider *slider, WMAction *action, void *data);
void WMSetSliderKnobThickness(WMSlider *sPtr, int thickness);
void WMSetSliderImage(WMSlider *sPtr, WMPixmap *pixmap);
/* ....................................................................... */
/* only supports 2 subviews */
@@ -995,6 +1012,11 @@ int WMRunModalOpenPanelForDirectory(WMFilePanel *panel, WMWindow *owner,
int WMRunModalSavePanelForDirectory(WMFilePanel *panel, WMWindow *owner,
char *path, char *name);
void WMSetFilePanelAccessoryView(WMFilePanel *panel, WMView *view);
WMView *WMGetFilePanelAccessoryView(WMFilePanel *panel);
/* ...................................................................... */
/* only 1 instance per WMScreen */

View File

@@ -6,7 +6,7 @@
#include "WINGs.h"
#include "WUtil.h"
#if WINGS_H_VERSION < 980930
#if WINGS_H_VERSION < 981220
#error There_is_an_old_WINGs.h_file_somewhere_in_your_system._Please_remove_it.
#endif
@@ -173,7 +173,9 @@ typedef struct W_Screen {
struct W_Pixmap *pullDownIndicator;
struct W_Pixmap *popUpIndicator;
struct W_Pixmap *checkMark;
struct W_Pixmap *homeIcon;
struct W_Pixmap *defaultObjectIcon;
@@ -308,7 +310,8 @@ _WINGsConfiguration WINGsConfiguration;
#define W_FONTID(f) (f)->font->fid
#define W_DRAWABLE(scr) (scr)->rootWin
#define W_DRAWABLE(scr) (scr)->rcontext->drawable
W_View *W_GetViewForXWindow(Display *display, Window window);

View File

@@ -29,6 +29,37 @@
#endif
#if (!defined (__GNUC__) || __GNUC__ < 2 || \
__GNUC_MINOR__ < (defined (__cplusplus) ? 6 : 4))
#define __ASSERT_FUNCTION ((__const char *) 0)
#else
#define __ASSERT_FUNCTION __PRETTY_FUNCTION__
#endif
#ifdef NDEBUG
#define wassertr(expr, val) ((void)0)
#else /* !NDEBUG */
#define wassertr(expr) \
if (!(expr)) { \
wwarning("%s line %i (%s): assertion %s failed",\
__FILE__, __LINE__, __ASSERT_FUNCTION, #expr);\
return;\
}
#define wassertrv(expr, val) \
if (!(expr)) { \
wwarning("%s line %i (%s): assertion %s failed",\
__FILE__, __LINE__, __ASSERT_FUNCTION, #expr);\
return (val);\
}
#endif /* !NDEBUG */
typedef enum {
WMPostWhenIdle = 1,

View File

@@ -189,12 +189,12 @@ wfindfile(char *paths, char *file)
return NULL;
if (*file=='/' || *file=='~' || *file=='$' || !paths) {
if (access(file, R_OK)<0) {
if (access(file, F_OK)<0) {
fullpath = wexpandpath(file);
if (!fullpath)
return NULL;
if (access(fullpath, R_OK)<0) {
if (access(fullpath, F_OK)<0) {
free(fullpath);
return NULL;
} else {
@@ -219,7 +219,7 @@ wfindfile(char *paths, char *file)
fullpath = wexpandpath(path);
free(path);
if (fullpath) {
if (access(fullpath, R_OK)==0) {
if (access(fullpath, F_OK)==0) {
return fullpath;
}
free(fullpath);
@@ -243,12 +243,12 @@ wfindfileinlist(char **path_list, char *file)
return NULL;
if (*file=='/' || *file=='~' || !path_list) {
if (access(file, R_OK)<0) {
if (access(file, F_OK)<0) {
fullpath = wexpandpath(file);
if (!fullpath)
return NULL;
if (access(fullpath, R_OK)<0) {
if (access(fullpath, F_OK)<0) {
free(fullpath);
return NULL;
} else {
@@ -271,8 +271,8 @@ wfindfileinlist(char **path_list, char *file)
fullpath = wexpandpath(path);
free(path);
if (fullpath) {
/* check if file is readable */
if (access(fullpath, R_OK)==0) {
/* check if file exists */
if (access(fullpath, F_OK)==0) {
return fullpath;
}
free(fullpath);

View File

@@ -23,8 +23,6 @@
extern void W_ReadConfigurations(void);
extern void W_InitNotificationCenter(void);
@@ -72,9 +70,6 @@ WMInitializeApplication(char *applicationName, int *argc, char **argv)
/* initialize notification center */
W_InitNotificationCenter();
/* read general configuration data for WINGs */
W_ReadConfigurations();
}

View File

@@ -72,8 +72,8 @@ static void setupScroller(WMBrowser *bPtr);
static void scrollToColumn(WMBrowser *bPtr, int column);
static void paintItem(WMList *lPtr, Drawable d, char *text, int state,
WMRect *rect);
static void paintItem(WMList *lPtr, int index, Drawable d, char *text,
int state, WMRect *rect);
static void loadColumn(WMBrowser *bPtr, int column);
@@ -189,7 +189,7 @@ drawTitleOfColumn(WMBrowser *bPtr, int column)
if (column < bPtr->usedColumnCount && bPtr->titles[column])
W_PaintText(bPtr->view, bPtr->view->window, scr->boldFont, x,
(bPtr->titleHeight-scr->boldFont->height)/2,
(bPtr->titleHeight-WMFontHeight(scr->boldFont))/2,
bPtr->columnSize.width, WACenter, W_GC(scr->white),
False, bPtr->titles[column], strlen(bPtr->titles[column]));
}
@@ -248,6 +248,23 @@ removeColumn(WMBrowser *bPtr, int column)
if (column < bPtr->maxVisibleColumns) {
int tmp;
#if 1
int limit;
if(bPtr->usedColumnCount < bPtr->maxVisibleColumns)
limit = bPtr->usedColumnCount;
else
limit = bPtr->maxVisibleColumns;
for (i=column; i < limit; i++) {
if (bPtr->titles[i])
free(bPtr->titles[i]);
bPtr->titles[i] = NULL;
WMClearList(bPtr->columns[i]);
bPtr->usedColumnCount--;
}
#else
for (i=column; i < bPtr->maxVisibleColumns; i++) {
if (bPtr->titles[i])
free(bPtr->titles[i]);
@@ -267,6 +284,7 @@ removeColumn(WMBrowser *bPtr, int column)
bPtr->columnCount--;
bPtr->usedColumnCount--;
}
#endif
} else {
int tmp = bPtr->columnCount;
for (i=column; i < tmp; i++) {
@@ -443,7 +461,8 @@ resizeBrowser(WMWidget *w, unsigned int width, unsigned int height)
static void
paintItem(WMList *lPtr, Drawable d, char *text, int state, WMRect *rect)
paintItem(WMList *lPtr, int index, Drawable d, char *text, int state,
WMRect *rect)
{
WMView *view = W_VIEW(lPtr);
W_Screen *scr = view->screen;

View File

@@ -29,9 +29,9 @@ static void destroyColorWell(ColorWell *cPtr);
static void paintColorWell(ColorWell *cPtr);
static void handleEvents(XEvent *event, void *data);
#if 0
static void handleDragEvents(XEvent *event, void *data);
#endif
static void handleActionEvents(XEvent *event, void *data);
static void resizeColorWell();
@@ -73,6 +73,7 @@ WMCreateColorWell(WMWidget *parent)
free(cPtr);
return NULL;
}
cPtr->view->self = cPtr;
cPtr->colorView = W_CreateView(cPtr->view);
if (!cPtr->colorView) {
@@ -80,19 +81,22 @@ WMCreateColorWell(WMWidget *parent)
free(cPtr);
return NULL;
}
cPtr->colorView->self = cPtr;
WMCreateEventHandler(cPtr->view, ExposureMask|StructureNotifyMask
|ClientMessageMask, handleEvents, cPtr);
WMCreateEventHandler(cPtr->colorView, ExposureMask, handleEvents, cPtr);
#if 0
WMCreateEventHandler(cPtr->colorView, ButtonPressMask|Button1MotionMask,
handleDragEvents, cPtr);
#endif
WMCreateEventHandler(cPtr->colorView, ButtonPressMask|ButtonMotionMask
|EnterWindowMask, handleDragEvents, cPtr);
WMCreateEventHandler(cPtr->view, ButtonPressMask, handleActionEvents,
cPtr);
cPtr->colorView->flags.mapWhenRealized = 1;
cPtr->flags.bordered = 1;
resizeColorWell(cPtr, DEFAULT_WIDTH, DEFAULT_HEIGHT);
@@ -119,6 +123,17 @@ WMGetColorWellColor(WMColorWell *cPtr)
return cPtr->color;
}
void
WSetColorWellBordered(WMColorWell *cPtr, Bool flag)
{
if (cPtr->flags.bordered != flag) {
cPtr->flags.bordered = flag;
resizeColorWell(cPtr, cPtr->view->size.width, cPtr->view->size.height);
}
}
#define MIN(a,b) ((a) > (b) ? (b) : (a))
static void
@@ -126,19 +141,28 @@ resizeColorWell(WMColorWell *cPtr, unsigned int width, unsigned int height)
{
int bw;
if (width < MIN_WIDTH)
width = MIN_WIDTH;
if (height < MIN_HEIGHT)
height = MIN_HEIGHT;
if (cPtr->flags.bordered) {
bw = (int)((float)MIN(width, height)*0.24);
W_ResizeView(cPtr->view, width, height);
W_ResizeView(cPtr->colorView, width-2*bw, height-2*bw);
if (width < MIN_WIDTH)
width = MIN_WIDTH;
if (height < MIN_HEIGHT)
height = MIN_HEIGHT;
if (cPtr->colorView->pos.x!=bw || cPtr->colorView->pos.y!=bw)
W_MoveView(cPtr->colorView, bw, bw);
bw = (int)((float)MIN(width, height)*0.24);
W_ResizeView(cPtr->view, width, height);
W_ResizeView(cPtr->colorView, width-2*bw, height-2*bw);
if (cPtr->colorView->pos.x!=bw || cPtr->colorView->pos.y!=bw)
W_MoveView(cPtr->colorView, bw, bw);
} else {
W_ResizeView(cPtr->view, width, height);
W_ResizeView(cPtr->colorView, width, height);
W_MoveView(cPtr->colorView, 0, 0);
}
}
@@ -184,7 +208,7 @@ handleEvents(XEvent *event, void *data)
}
}
#if 0
static WMPixmap*
makeDragPixmap(WMColorWell *cPtr)
{
@@ -201,6 +225,116 @@ makeDragPixmap(WMColorWell *cPtr)
}
static void
slideView(WMView *view, int srcX, int srcY, int dstX, int dstY)
{
double x, y, dx, dy;
int i;
srcX -= 8;
srcY -= 8;
dstX -= 8;
dstY -= 8;
x = srcX;
y = srcY;
dx = (double)(dstX-srcX)/20.0;
dy = (double)(dstY-srcY)/20.0;
for (i = 0; i < 20; i++) {
W_MoveView(view, x, y);
XFlush(view->screen->display);
x += dx;
y += dy;
}
}
static void
dragColor(ColorWell *cPtr, XEvent *event, WMPixmap *image)
{
WMView *dragView;
WMScreen *scr = cPtr->view->screen;
Display *dpy = scr->display;
XColor black = {0, 0,0,0, DoRed|DoGreen|DoBlue};
XColor green = {0, 0x4500,0xb000,0x4500, DoRed|DoGreen|DoBlue};
XColor back = {0, 0xffff,0xffff,0xffff, DoRed|DoGreen|DoBlue};
Bool done = False;
WMColorWell *activeWell = NULL;
dragView = W_CreateTopView(scr);
W_ResizeView(dragView, 16, 16);
dragView->attribFlags |= CWOverrideRedirect | CWSaveUnder;
dragView->attribs.event_mask = StructureNotifyMask;
dragView->attribs.override_redirect = True;
dragView->attribs.save_under = True;
W_MoveView(dragView, event->xmotion.x_root-8, event->xmotion.y_root-8);
W_RealizeView(dragView);
W_MapView(dragView);
XSetWindowBackgroundPixmap(dpy, dragView->window, WMGetPixmapXID(image));
XClearWindow(dpy, dragView->window);
XGrabPointer(dpy, dragView->window, True,
ButtonMotionMask|ButtonReleaseMask|EnterWindowMask,
GrabModeSync, GrabModeAsync,
scr->rootWin, scr->defaultCursor, CurrentTime);
while (!done) {
XEvent ev;
WMView *view;
XAllowEvents(dpy, SyncPointer, CurrentTime);
WMNextEvent(dpy, &ev);
switch (ev.type) {
case ButtonRelease:
if (activeWell != NULL) {
WMSetColorWellColor(activeWell, cPtr->color);
} else {
slideView(dragView, ev.xbutton.x_root, ev.xbutton.y_root,
event->xmotion.x_root, event->xmotion.y_root);
}
done = True;
break;
case EnterNotify:
view = W_GetViewForXWindow(dpy, ev.xcrossing.window);
if (view && view->self && W_CLASS(view->self) == WC_ColorWell
&& view->self != activeWell && view->self != cPtr) {
activeWell = view->self;
XRecolorCursor(dpy, scr->defaultCursor, &green, &back);
} else if (view->self!=NULL && view->self != activeWell) {
XRecolorCursor(dpy, scr->defaultCursor, &black, &back);
activeWell = NULL;
}
break;
case MotionNotify:
W_MoveView(dragView, ev.xmotion.x_root-8, ev.xmotion.y_root-8);
break;
default:
WMHandleEvent(&ev);
break;
}
}
XUngrabPointer(dpy, CurrentTime);
XRecolorCursor(dpy, scr->defaultCursor, &black, &back);
W_DestroyView(dragView);
}
static void
handleDragEvents(XEvent *event, void *data)
@@ -214,20 +348,24 @@ handleDragEvents(XEvent *event, void *data)
cPtr->ipoint.y = event->xbutton.y;
}
break;
case MotionNotify:
if (event->xmotion.state & Button1Mask) {
if (abs(cPtr->ipoint.x - event->xmotion.x) > 4
|| abs(cPtr->ipoint.y - event->xmotion.y) > 4) {
WMSize offs;
WMPixmap *pixmap;
offs.width = 2;
offs.height = 2;
pixmap = makeDragPixmap(cPtr);
/*
WMDragImageFromView(cPtr->view, pixmap, cPtr->view->pos,
offs, event, True);
* */
dragColor(cPtr, event, pixmap);
WMReleasePixmap(pixmap);
}
@@ -235,7 +373,7 @@ handleDragEvents(XEvent *event, void *data)
break;
}
}
#endif
static void

View File

@@ -11,6 +11,11 @@
#include <sys/types.h>
#include <unistd.h>
#ifdef HAVE_POLL_H
#include <poll.h>
#endif
#ifdef HAVE_SYS_SELECT_H
# include <sys/select.h>
#endif
@@ -708,9 +713,93 @@ WMIsDoubleClick(XEvent *event)
Bool
W_WaitForEvent(Display *dpy, unsigned long xeventmask)
{
#ifndef HAVE_SELECT
#error This_system_does_not_have_select(2)_and_is_not_supported
#if defined(HAVE_POLL) && defined(HAVE_POLL_H) && !defined(HAVE_SELECT)
struct pollfd *fds;
InputHandler *handler;
int count, timeout, nfds, k, retval;
for (nfds = 1, handler = inputHandler;
handler != 0; handler = handler->next) nfds++;
fds = wmalloc(nfds * sizeof(struct pollfd));
fds[0].fd = ConnectionNumber(dpy);
fds[0].events = POLLIN;
for (k = 1, handler = inputHandler;
handler;
handler = handler->next, k++) {
fds[k].fd = handler->fd;
fds[k].events = 0;
if (handler->mask & WIReadMask)
fds[k].events |= POLLIN;
if (handler->mask & WIWriteMask)
fds[k].events |= POLLOUT;
#if 0 /* FIXME */
if (handler->mask & WIExceptMask)
FD_SET(handler->fd, &eset);
#endif
}
/*
* Setup the select() timeout to the estimated time until the
* next timer expires.
*/
if (timerPending()) {
struct timeval tv;
delayUntilNextTimerEvent(&tv);
timeout = tv.tv_sec * 1000 + tv.tv_usec / 1000;
} else {
timeout = -1;
}
if (xeventmask==0) {
if (XPending(dpy))
return True;
} else {
XEvent ev;
if (XCheckMaskEvent(dpy, xeventmask, &ev)) {
XPutBackEvent(dpy, &ev);
return True;
}
}
count = poll(fds, nfds, timeout);
if (count > 0) {
handler = inputHandler;
k = 1;
while (handler) {
int mask;
mask = 0;
if (fds[k].revents & (POLLIN|POLLRDNORM|POLLRDBAND|POLLPRI))
mask |= WIReadMask;
if (fds[k].revents & (POLLOUT | POLLWRBAND))
mask |= WIWriteMask;
if (fds[k].revents & (POLLHUP | POLLNVAL | POLLERR))
mask |= WIExceptMask;
if (mask!=0 && handler->callback) {
(*handler->callback)(handler->fd, mask,
handler->clientData);
}
handler = handler->next;
k++;
}
}
retval = fds[0].revents & (POLLIN|POLLRDNORM|POLLRDBAND|POLLPRI);
free(fds);
return retval;
#else /* not HAVE_POLL */
#ifdef HAVE_SELECT
struct timeval timeout;
struct timeval *timeoutPtr;
fd_set rset, wset, eset;
@@ -764,7 +853,7 @@ W_WaitForEvent(Display *dpy, unsigned long xeventmask)
return True;
}
}
/* TODO: port to poll() */
count = select(1 + maxfd, &rset, &wset, &eset, timeoutPtr);
if (count > 0) {
@@ -794,10 +883,12 @@ W_WaitForEvent(Display *dpy, unsigned long xeventmask)
}
return FD_ISSET(ConnectionNumber(dpy), &rset);
#else /* not HAVE_SELECT, not HAVE_POLL */
Neither select nor poll. You lose.
#endif /* HAVE_SELECT */
#endif /* HAVE_POLL */
}
void
WMNextEvent(Display *dpy, XEvent *event)
{

View File

@@ -30,6 +30,8 @@ typedef struct W_FilePanel {
WMButton *homeButton;
WMView *accessoryView;
WMTextField *fileField;
char **fileTypes;
@@ -358,6 +360,28 @@ WMGetFilePanelFileName(WMFilePanel *panel)
}
void
WMSetFilePanelAccessoryView(WMFilePanel *panel, WMView *view)
{
WMView *v;
panel->accessoryView = view;
v = WMWidgetView(panel->win);
W_ReparentView(view, v);
W_MoveView(view, (v->size.width - v->size.width)/2, 300);
}
WMView*
WMGetFilePanelAccessoryView(WMFilePanel *panel)
{
return panel->accessoryView;
}
static char*
get_name_from_path(char *path)
{
@@ -564,3 +588,5 @@ buttonClick(WMButton *bPtr, WMFilePanel *panel)
panel->flags.done = 1;
}

View File

@@ -91,7 +91,7 @@ WMCreateFontInDefaultEncoding(WMScreen *scrPtr, char *fontName)
WMFont*
WMRetainFont(WMFont *font)
{
assert(font!=NULL);
wassertrv(font!=NULL, NULL);
font->refCount++;
@@ -102,7 +102,8 @@ WMRetainFont(WMFont *font)
void
WMReleaseFont(WMFont *font)
{
assert(font!=NULL);
wassertr(font!=NULL);
font->refCount--;
if (font->refCount < 1) {
if (font->notFontSet)
@@ -118,8 +119,8 @@ WMReleaseFont(WMFont *font)
unsigned int
WMFontHeight(WMFont *font)
{
assert(font!=NULL);
wassertrv(font!=NULL, 0);
return font->height;
}
@@ -179,6 +180,8 @@ WMBoldSystemFontOfSize(WMScreen *scrPtr, int size)
XFontSet
WMGetFontFontSet(WMFont *font)
{
wassertrv(font!=NULL, NULL);
if (font->notFontSet)
return NULL;
else
@@ -189,8 +192,8 @@ WMGetFontFontSet(WMFont *font)
int
WMWidthOfString(WMFont *font, char *text, int length)
{
assert(font!=NULL);
assert(text!=NULL);
wassertrv(font!=NULL, 0);
wassertrv(text!=NULL, 0);
if (font->notFontSet)
return XTextWidth(font->font.normal, text, length);
@@ -210,6 +213,8 @@ void
WMDrawString(WMScreen *scr, Drawable d, GC gc, WMFont *font, int x, int y,
char *text, int length)
{
wassertr(font!=NULL);
if (font->notFontSet) {
XSetFont(scr->display, gc, font->font.normal->fid);
XDrawString(scr->display, d, gc, x, y + font->y, text, length);
@@ -224,6 +229,8 @@ void
WMDrawImageString(WMScreen *scr, Drawable d, GC gc, WMFont *font, int x, int y,
char *text, int length)
{
wassertr(font != NULL);
if (font->notFontSet) {
XSetFont(scr->display, gc, font->font.normal->fid);
XDrawImageString(scr->display, d, gc, x, y + font->y, text, length);

View File

@@ -82,7 +82,7 @@ paintFrame(Frame *fPtr)
int fy, fh;
if (fPtr->caption!=NULL)
th = scrPtr->normalFont->height;
th = WMFontHeight(scrPtr->normalFont);
else {
th = 0;
}

View File

@@ -281,12 +281,30 @@ static char *PULLDOWN_INDICATOR[] = {
#define PULLDOWN_INDICATOR_HEIGHT 7
#define CHECK_MARK_WIDTH 8
#define CHECK_MARK_HEIGHT 10
static char *CHECK_MARK[] = {
"======== ",
"======= #",
"====== #%",
"===== #%=",
" #== #%==",
" #% #%===",
" % #%====",
" #%=====",
" #%======",
"#%======="};
#define STIPPLE_WIDTH 8
#define STIPPLE_HEIGHT 8
static unsigned char STIPPLE_BITS[] = {
0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa};
extern void W_ReadConfigurations(void);
extern W_ViewProcedureTable _WindowViewProcedures;
extern W_ViewProcedureTable _FrameViewProcedures;
@@ -489,6 +507,8 @@ WMCreateScreenWithRContext(Display *display, int screen, RContext *context)
initProcedureTable();
W_ReadConfigurations();
assert(W_ApplicationInitialized());
}
@@ -567,6 +587,16 @@ WMCreateScreenWithRContext(Display *display, int screen, RContext *context)
scrPtr->boldFont = WMBoldSystemFontOfSize(scrPtr, 12);
if (!scrPtr->boldFont)
scrPtr->boldFont = scrPtr->normalFont;
if (!scrPtr->normalFont) {
wwarning("could not load any fonts. Make sure your font installation"
"and locale settings are correct.");
return NULL;
}
scrPtr->checkButtonImageOn = makePixmap(scrPtr, CHECK_BUTTON_ON,
CHECK_BUTTON_ON_WIDTH,
CHECK_BUTTON_ON_HEIGHT, False);
@@ -636,6 +666,11 @@ WMCreateScreenWithRContext(Display *display, int screen, RContext *context)
scrPtr->pullDownIndicator = makePixmap(scrPtr, PULLDOWN_INDICATOR,
PULLDOWN_INDICATOR_WIDTH,
PULLDOWN_INDICATOR_HEIGHT, True);
scrPtr->checkMark = makePixmap(scrPtr, CHECK_MARK,
CHECK_MARK_WIDTH,
CHECK_MARK_HEIGHT, True);
loadPixmaps(scrPtr);
scrPtr->defaultCursor = XCreateFontCursor(display, XC_left_ptr);

View File

@@ -99,6 +99,13 @@ WMSetLabelImage(WMLabel *lPtr, WMPixmap *image)
}
WMPixmap*
WMGetLabelImage(WMLabel *lPtr)
{
return lPtr->image;
}
void
WMSetLabelImagePosition(WMLabel *lPtr, WMImagePosition position)
{

View File

@@ -4,6 +4,8 @@
#include "WINGsP.h"
char *WMListDidScrollNotification = "WMListDidScrollNotification";
typedef struct W_List {
W_Class widgetClass;
@@ -99,7 +101,7 @@ WMCreateList(WMWidget *parent)
|EnterWindowMask|LeaveWindowMask|ButtonMotionMask,
handleActionEvents, lPtr);
lPtr->itemHeight = scrPtr->normalFont->height + 1;
lPtr->itemHeight = WMFontHeight(scrPtr->normalFont) + 1;
/* create the vertical scroller */
lPtr->vScroller = WMCreateScroller(lPtr);
@@ -224,6 +226,7 @@ WMRemoveListItem(WMList *lPtr, int row)
{
WMListItem *llist;
WMListItem *tmp;
int topItem = lPtr->topItem;
CHECK_CLASS(lPtr, WC_List);
@@ -266,6 +269,8 @@ WMRemoveListItem(WMList *lPtr, int row)
if (!lPtr->idleID) {
lPtr->idleID = WMAddIdleHandler((WMCallback*)updateScroller, lPtr);
}
if (lPtr->topItem != topItem)
WMPostNotificationName(WMListDidScrollNotification, lPtr, NULL);
}
@@ -370,6 +375,13 @@ WMGetListSelectedItemRow(WMList *lPtr)
}
int
WMGetListItemHeight(WMList *lPtr)
{
return lPtr->itemHeight;
}
void
WMSetListPosition(WMList *lPtr, int row)
{
@@ -417,6 +429,7 @@ vScrollCallBack(WMWidget *scroller, void *self)
WMList *lPtr = (WMList*)self;
WMScroller *sPtr = (WMScroller*)scroller;
int height;
int topItem = lPtr->topItem;
height = lPtr->view->size.height - 4;
@@ -476,6 +489,9 @@ vScrollCallBack(WMWidget *scroller, void *self)
/* do nothing */
break;
}
if (lPtr->topItem != topItem)
WMPostNotificationName(WMListDidScrollNotification, lPtr, NULL);
}
@@ -516,8 +532,8 @@ paintItem(List *lPtr, int index)
flags |= WLDSIsBranch;
if (lPtr->draw)
(*lPtr->draw)(lPtr, view->window, itemPtr->text, flags, &rect);
(*lPtr->draw)(lPtr, index, view->window, itemPtr->text, flags,
&rect);
} else {
if (itemPtr->selected)
XFillRectangle(scr->display, view->window, W_GC(scr->white), x, y,
@@ -706,6 +722,7 @@ handleActionEvents(XEvent *event, void *data)
{
List *lPtr = (List*)data;
int tmp;
int topItem = lPtr->topItem;
CHECK_CLASS(data, WC_List);
@@ -713,14 +730,11 @@ handleActionEvents(XEvent *event, void *data)
case ButtonRelease:
lPtr->flags.buttonPressed = 0;
tmp = getItemIndexAt(lPtr, event->xbutton.y);
if (tmp == lPtr->selectedItem && tmp >= 0) {
if (WMIsDoubleClick(event)) {
if (lPtr->doubleAction)
(*lPtr->doubleAction)(lPtr, lPtr->doubleClientData);
} else {
if (lPtr->action)
(*lPtr->action)(lPtr, lPtr->clientData);
}
if (lPtr->action)
(*lPtr->action)(lPtr, lPtr->clientData);
}
break;
@@ -728,7 +742,7 @@ handleActionEvents(XEvent *event, void *data)
lPtr->flags.buttonPressed = lPtr->flags.buttonWasPressed;
lPtr->flags.buttonWasPressed = 0;
break;
case LeaveNotify:
lPtr->flags.buttonWasPressed = lPtr->flags.buttonPressed;
lPtr->flags.buttonPressed = 0;
@@ -743,6 +757,11 @@ handleActionEvents(XEvent *event, void *data)
lPtr->selectedItem = tmp;
}
lPtr->flags.buttonPressed = 1;
if (WMIsDoubleClick(event)) {
if (lPtr->doubleAction)
(*lPtr->doubleAction)(lPtr, lPtr->doubleClientData);
}
}
break;
@@ -756,6 +775,8 @@ handleActionEvents(XEvent *event, void *data)
}
break;
}
if (lPtr->topItem != topItem)
WMPostNotificationName(WMListDidScrollNotification, lPtr, NULL);
}

View File

@@ -72,7 +72,7 @@ W_DrawRelief(W_Screen *scr, Drawable d, int x, int y, unsigned int width,
XDrawLine(dpy, d, bgc, x+width-1, y, x+width-1, y+height-1);
if (height > 2 && relief!=WRPushed) {
XDrawLine(dpy, d, dgc, x+width-2, y+2, x+width-2, y+height-3);
XDrawLine(dpy, d, dgc, x+width-2, y+1, x+width-2, y+height-2);
}
}
@@ -116,12 +116,13 @@ W_GetTextHeight(WMFont *font, char *text, int width, int wrap)
int count;
int length = strlen(text);
int h;
int fheight = WMFontHeight(font);
h = 0;
while (length > 0) {
count = fitText(ptr, font, width, wrap);
h += font->height;
h += fheight;
if (isspace(ptr[count]))
count++;
@@ -142,6 +143,7 @@ W_PaintText(W_View *view, Drawable d, WMFont *font, int x, int y,
int line_width;
int line_x;
int count;
int fheight = WMFontHeight(font);
while (length > 0) {
count = fitText(ptr, font, width, wrap);
@@ -156,7 +158,7 @@ W_PaintText(W_View *view, Drawable d, WMFont *font, int x, int y,
WMDrawString(view->screen, d, gc, font, line_x, y, ptr, count);
y += font->height;
y += fheight;
if (isspace(ptr[count]))
count++;

View File

@@ -113,8 +113,8 @@ WMCreateAlertPanel(WMScreen *scrPtr, WMWindow *owner,
largeFont = WMBoldSystemFontOfSize(scrPtr, 24);
panel->tLbl = WMCreateLabel(panel->win);
WMMoveWidget(panel->tLbl, 80, (80 - largeFont->height)/2);
WMResizeWidget(panel->tLbl, 400 - 70, largeFont->height+4);
WMMoveWidget(panel->tLbl, 80, (80 - WMFontHeight(largeFont))/2);
WMResizeWidget(panel->tLbl, 400 - 70, WMFontHeight(largeFont)+4);
WMSetLabelText(panel->tLbl, title);
WMSetLabelTextAlignment(panel->tLbl, WALeft);
WMSetLabelFont(panel->tLbl, largeFont);
@@ -126,7 +126,7 @@ WMCreateAlertPanel(WMScreen *scrPtr, WMWindow *owner,
if (msg) {
panel->mLbl = WMCreateLabel(panel->win);
WMMoveWidget(panel->mLbl, 10, 83);
WMResizeWidget(panel->mLbl, 380, scrPtr->normalFont->height*4);
WMResizeWidget(panel->mLbl, 380, WMFontHeight(scrPtr->normalFont)*4);
WMSetLabelText(panel->mLbl, msg);
WMSetLabelTextAlignment(panel->mLbl, WACenter);
}
@@ -317,7 +317,7 @@ WMCreateInputPanel(WMScreen *scrPtr, WMWindow *owner, char *title, char *msg,
panel->tLbl = WMCreateLabel(panel->win);
WMMoveWidget(panel->tLbl, 20, 16);
WMResizeWidget(panel->tLbl, 320 - 40, largeFont->height+4);
WMResizeWidget(panel->tLbl, 320 - 40, WMFontHeight(largeFont)+4);
WMSetLabelText(panel->tLbl, title);
WMSetLabelTextAlignment(panel->tLbl, WALeft);
WMSetLabelFont(panel->tLbl, largeFont);
@@ -329,7 +329,8 @@ WMCreateInputPanel(WMScreen *scrPtr, WMWindow *owner, char *title, char *msg,
if (msg) {
panel->mLbl = WMCreateLabel(panel->win);
WMMoveWidget(panel->mLbl, 20, 50);
WMResizeWidget(panel->mLbl, 320 - 40,scrPtr->normalFont->height*2);
WMResizeWidget(panel->mLbl, 320 - 40,
WMFontHeight(scrPtr->normalFont)*2);
WMSetLabelText(panel->mLbl, msg);
WMSetLabelTextAlignment(panel->mLbl, WALeft);
}

View File

@@ -17,6 +17,8 @@ WMRetainPixmap(WMPixmap *pixmap)
void
WMReleasePixmap(WMPixmap *pixmap)
{
wassertr(pixmap!=NULL);
pixmap->refCount--;
if (pixmap->refCount<1) {
@@ -139,12 +141,17 @@ WMCreatePixmapFromXPMData(WMScreen *scrPtr, char **data)
Pixmap
WMGetPixmapXID(WMPixmap *pixmap)
{
wassertrv(pixmap != NULL, None);
return pixmap->pixmap;
}
Pixmap
WMGetPixmapMaskXID(WMPixmap *pixmap)
{
wassertrv(pixmap != NULL, None);
return pixmap->mask;
}
@@ -152,11 +159,13 @@ WMGetPixmapMaskXID(WMPixmap *pixmap)
WMSize
WMGetPixmapSize(WMPixmap *pixmap)
{
WMSize size;
WMSize size = {0,0};
wassertrv(pixmap != NULL, size);
size.width = pixmap->width;
size.height = pixmap->height;
return size;
}
@@ -197,9 +206,25 @@ WMGetSystemPixmap(WMScreen *scr, int image)
case WSIHighlightedArrowDown:
return WMRetainPixmap(scr->hiDownArrow);
case WSICheckMark:
return WMRetainPixmap(scr->checkMark);
default:
return NULL;
}
}
void
WMDrawPixmap(WMPixmap *pixmap, Drawable d, int x, int y)
{
WMScreen *scr = pixmap->screen;
XSetClipMask(scr->display, scr->clipGC, pixmap->mask);
XSetClipOrigin(scr->display, scr->clipGC, x, y);
XCopyArea(scr->display, pixmap->pixmap, d, scr->clipGC, 0, 0,
pixmap->width, pixmap->height, x, y);
}

View File

@@ -10,6 +10,7 @@ typedef struct ItemList {
unsigned int disabled:1;
} ItemList;
typedef struct W_PopUpButton {
W_Class widgetClass;
WMView *view;
@@ -30,12 +31,20 @@ typedef struct W_PopUpButton {
WMView *menuView; /* override redirect popup menu */
WMHandlerID timer; /* for autoscroll */
/**/
int scrollStartY; /* for autoscroll */
struct {
unsigned int pullsDown:1;
unsigned int configured:1;
unsigned int insideMenu:1;
unsigned int enabled:1;
} flags;
} PopUpButton;
@@ -43,6 +52,8 @@ typedef struct W_PopUpButton {
#define MENU_BLINK_DELAY 60000
#define MENU_BLINK_COUNT 2
#define SCROLL_DELAY 30
W_ViewProcedureTable _PopUpButtonViewProcedures = {
NULL,
@@ -94,6 +105,8 @@ WMCreatePopUpButton(WMWidget *parent)
WMCreateEventHandler(bPtr->view, ButtonPressMask|ButtonReleaseMask,
handleActionEvents, bPtr);
bPtr->flags.enabled = 1;
bPtr->menuView = W_CreateTopView(scr);
bPtr->menuView->attribs.override_redirect = True;
bPtr->menuView->attribFlags |= CWOverrideRedirect;
@@ -101,8 +114,8 @@ WMCreatePopUpButton(WMWidget *parent)
W_ResizeView(bPtr->menuView, bPtr->view->size.width, 1);
WMCreateEventHandler(bPtr->menuView, ButtonPressMask|ButtonReleaseMask
|EnterWindowMask|LeaveWindowMask|ButtonMotionMask,
handleActionEvents, bPtr);
|EnterWindowMask|LeaveWindowMask|ButtonMotionMask
|ExposureMask, handleActionEvents, bPtr);
return bPtr;
}
@@ -244,6 +257,15 @@ WMRemovePopUpButtonItem(WMPopUpButton *bPtr, int index)
}
void
WMSetPopUpButtonEnabled(WMPopUpButton *bPtr, Bool flag)
{
bPtr->flags.enabled = flag;
if (bPtr->view->flags.mapped)
paintPopUpButton(bPtr);
}
void
WMSetPopUpButtonSelectedItem(WMPopUpButton *bPtr, int index)
{
@@ -380,10 +402,11 @@ paintPopUpButton(PopUpButton *bPtr)
bPtr->view->size.height, WRRaised);
if (caption) {
W_PaintText(bPtr->view, pixmap, scr->normalFont,
6, (bPtr->view->size.height-scr->normalFont->height)/2,
bPtr->view->size.width, WALeft, W_GC(scr->black), False,
caption, strlen(caption));
W_PaintText(bPtr->view, pixmap, scr->normalFont, 6,
(bPtr->view->size.height-WMFontHeight(scr->normalFont))/2,
bPtr->view->size.width, WALeft,
bPtr->flags.enabled ? W_GC(scr->black) : W_GC(scr->darkGray),
False, caption, strlen(caption));
}
if (bPtr->flags.pullsDown) {
@@ -448,7 +471,7 @@ paintMenuEntry(PopUpButton *bPtr, int index, int highlight)
itemHeight = bPtr->view->size.height;
width = bPtr->view->size.width;
height = itemHeight * bPtr->itemCount;
yo = (itemHeight - scr->normalFont->height)/2;
yo = (itemHeight - WMFontHeight(scr->normalFont))/2;
if (!highlight) {
XClearArea(scr->display, bPtr->menuView->window, 0, index*itemHeight,
@@ -495,7 +518,7 @@ makeMenuPixmap(PopUpButton *bPtr)
itemHeight = bPtr->view->size.height;
width = bPtr->view->size.width;
height = itemHeight * bPtr->itemCount;
yo = (itemHeight - scr->normalFont->height)/2;
yo = (itemHeight - WMFontHeight(scr->normalFont))/2;
pixmap = XCreatePixmap(scr->display, bPtr->view->window, width, height,
scr->depth);
@@ -595,17 +618,71 @@ itemIsEnabled(PopUpButton *bPtr, int index)
{
ItemList *item = bPtr->items;
while (index-- > 0)
while (index-- > 0 && item)
item = item->nextPtr;
return !item->disabled;
return item ? !item->disabled : False;
}
static void
autoScroll(void *data)
{
PopUpButton *bPtr = (PopUpButton*)data;
int scrHeight = WMWidgetScreen(bPtr)->rootView->size.height;
int repeat = 0;
int dy = 0;
if (bPtr->scrollStartY >= scrHeight-1
&& bPtr->menuView->pos.y+bPtr->menuView->size.height >= scrHeight-1) {
repeat = 1;
if (bPtr->menuView->pos.y+bPtr->menuView->size.height-5
<= scrHeight - 1) {
dy = scrHeight - 1
- (bPtr->menuView->pos.y+bPtr->menuView->size.height);
} else
dy = -5;
} else if (bPtr->scrollStartY <= 1 && bPtr->menuView->pos.y < 1) {
repeat = 1;
if (bPtr->menuView->pos.y+5 > 1)
dy = 1 - bPtr->menuView->pos.y;
else
dy = 5;
}
if (repeat) {
int oldItem;
W_MoveView(bPtr->menuView, bPtr->menuView->pos.x,
bPtr->menuView->pos.y + dy);
oldItem = bPtr->highlightedItem;
bPtr->highlightedItem = (bPtr->scrollStartY - bPtr->menuView->pos.y)
/ bPtr->view->size.height;
if (oldItem!=bPtr->highlightedItem) {
paintMenuEntry(bPtr, oldItem, False);
paintMenuEntry(bPtr, bPtr->highlightedItem,
itemIsEnabled(bPtr, bPtr->highlightedItem));
}
bPtr->timer = WMAddTimerHandler(SCROLL_DELAY, autoScroll, bPtr);
} else {
bPtr->timer = NULL;
}
}
static void
handleActionEvents(XEvent *event, void *data)
{
PopUpButton *bPtr = (PopUpButton*)data;
int oldItem;
int scrHeight = WMWidgetScreen(bPtr)->rootView->size.height;
CHECK_CLASS(data, WC_PopUpButton);
@@ -614,6 +691,11 @@ handleActionEvents(XEvent *event, void *data)
switch (event->type) {
/* called for menuView */
case Expose:
paintMenuEntry(bPtr, bPtr->highlightedItem,
itemIsEnabled(bPtr, bPtr->highlightedItem));
break;
case LeaveNotify:
bPtr->flags.insideMenu = 0;
if (bPtr->menuView->flags.mapped)
@@ -624,7 +706,7 @@ handleActionEvents(XEvent *event, void *data)
case EnterNotify:
bPtr->flags.insideMenu = 1;
break;
case MotionNotify:
if (bPtr->flags.insideMenu) {
oldItem = bPtr->highlightedItem;
@@ -634,11 +716,24 @@ handleActionEvents(XEvent *event, void *data)
paintMenuEntry(bPtr, bPtr->highlightedItem,
itemIsEnabled(bPtr, bPtr->highlightedItem));
}
if (event->xmotion.y_root >= scrHeight-1
|| event->xmotion.y_root <= 1) {
bPtr->scrollStartY = event->xmotion.y_root;
if (!bPtr->timer)
autoScroll(bPtr);
} else if (bPtr->timer) {
WMDeleteTimerHandler(bPtr->timer);
bPtr->timer = NULL;
}
}
break;
/* called for bPtr->view */
case ButtonPress:
if (!bPtr->flags.enabled)
break;
popUpMenu(bPtr);
if (!bPtr->flags.pullsDown) {
bPtr->highlightedItem = bPtr->selectedItemIndex;
@@ -657,6 +752,12 @@ handleActionEvents(XEvent *event, void *data)
XUngrabPointer(bPtr->view->screen->display, event->xbutton.time);
if (!bPtr->flags.pullsDown)
popDownMenu(bPtr);
if (bPtr->timer) {
WMDeleteTimerHandler(bPtr->timer);
bPtr->timer = NULL;
}
if (bPtr->flags.insideMenu && bPtr->highlightedItem>=0) {
if (itemIsEnabled(bPtr, bPtr->highlightedItem)) {
int i;
@@ -690,6 +791,10 @@ static void
destroyPopUpButton(PopUpButton *bPtr)
{
ItemList *itemPtr, *tmp;
if (bPtr->timer) {
WMDeleteTimerHandler(bPtr->timer);
}
itemPtr = bPtr->items;
while (itemPtr!=NULL) {

View File

@@ -18,10 +18,13 @@ typedef struct W_Slider {
int value;
Pixmap knobPixmap;
WMPixmap *backPixmap;
WMAction *action;
void *clientData;
int knobThickness;
struct {
unsigned int continuous:1;
@@ -33,8 +36,6 @@ typedef struct W_Slider {
#define SLIDER_LENGTH 20
static void resizeSlider();
@@ -54,6 +55,7 @@ static void realizeSlider(Slider *sPtr);
static void handleEvents(XEvent *event, void *data);
static void handleActionEvents(XEvent *event, void *data);
static void makeKnobPixmap(Slider *sPtr);
static void
realizeObserver(void *self, WMNotification *not)
@@ -93,7 +95,9 @@ WMCreateSlider(WMWidget *parent)
sPtr->minValue = 0;
sPtr->maxValue = 100;
sPtr->value = 50;
sPtr->knobThickness = 20;
sPtr->flags.continuous = 1;
WMAddNotificationObserver(realizeObserver, sPtr,
@@ -103,6 +107,36 @@ WMCreateSlider(WMWidget *parent)
}
void
WMSetSliderImage(WMSlider *sPtr, WMPixmap *pixmap)
{
if (sPtr->backPixmap)
WMReleasePixmap(sPtr->backPixmap);
sPtr->backPixmap = WMRetainPixmap(pixmap);
if (sPtr->view->flags.mapped) {
paintSlider(sPtr);
}
}
void
WMSetSliderKnobThickness(WMSlider *sPtr, int thickness)
{
assert(thickness > 0);
sPtr->knobThickness = thickness;
if (sPtr->knobPixmap) {
makeKnobPixmap(sPtr);
}
if (sPtr->view->flags.mapped) {
paintSlider(sPtr);
}
}
int
WMGetSliderMinValue(WMSlider *slider)
@@ -204,16 +238,18 @@ makeKnobPixmap(Slider *sPtr)
if (sPtr->flags.vertical) {
w = sPtr->view->size.width-2;
h = SLIDER_LENGTH;
h = sPtr->knobThickness;
} else {
w = SLIDER_LENGTH;
w = sPtr->knobThickness;
h = sPtr->view->size.height-2;
}
pix = XCreatePixmap(scr->display, sPtr->view->window, w, h, scr->depth);
XFillRectangle(scr->display, pix, W_GC(scr->gray), 0, 0, w, h);
if (sPtr->flags.vertical) {
if (sPtr->knobThickness < 10) {
W_DrawRelief(scr, pix, 0, 0, w, h, WRRaised);
} else if (sPtr->flags.vertical) {
XDrawLine(scr->display, pix, W_GC(scr->white), 0, 0, 0, h-3);
XDrawLine(scr->display, pix, W_GC(scr->white), 1, 0, 1, h-3);
XDrawLine(scr->display, pix, W_GC(scr->darkGray), w-2, 1, w-2, h/2-2);
@@ -222,8 +258,9 @@ makeKnobPixmap(Slider *sPtr)
XDrawLine(scr->display, pix, W_GC(scr->white), 0, 0, w-2, 0);
XDrawLine(scr->display, pix, W_GC(scr->darkGray), 1, h/2-2, w-3, h/2-2);
XDrawLine(scr->display, pix, W_GC(scr->white), 0, h/2-1, w-3, h/2-1);
XDrawLine(scr->display, pix, W_GC(scr->black), w-1, 0, w-1, h-2);
XDrawLine(scr->display, pix, W_GC(scr->darkGray), 0, h-3, w-2, h-3);
XDrawLine(scr->display, pix, W_GC(scr->black), 0, h-2, w-1, h-2);
XDrawLine(scr->display, pix, W_GC(scr->darkGray), 0, h-1, w-1,h-1);
@@ -231,16 +268,19 @@ makeKnobPixmap(Slider *sPtr)
XDrawLine(scr->display, pix, W_GC(scr->white), 0, 0, w-3, 0);
XDrawLine(scr->display, pix, W_GC(scr->white), 0, 0, 0, h-2);
XDrawLine(scr->display, pix, W_GC(scr->white), 1, 0, 1, h-3);
XDrawLine(scr->display, pix, W_GC(scr->darkGray), w/2-2, 1, w/2-2, h-3);
XDrawLine(scr->display, pix, W_GC(scr->white), w/2-1, 0, w/2-1, h-3);
XDrawLine(scr->display, pix, W_GC(scr->darkGray), w-3, 0, w-3, h-2);
XDrawLine(scr->display, pix, W_GC(scr->black), w-2, 0, w-2, h-2);
XDrawLine(scr->display, pix, W_GC(scr->darkGray), w-1, 0, w-1, h-1);
XDrawLine(scr->display, pix, W_GC(scr->black), 1, h-1, w/2+1, h-1);
XDrawLine(scr->display, pix, W_GC(scr->darkGray), 1, h-2, w/2-2, h-2);
XDrawLine(scr->display, pix, W_GC(scr->darkGray), w/2, h-2, w-3,h-2);
XDrawLine(scr->display, pix, W_GC(scr->black), 0, h-1, w-2, h-1);
}
@@ -305,20 +345,30 @@ paintSlider(Slider *sPtr)
buffer = XCreatePixmap(scr->display, sPtr->view->window,
size.width, size.height, scr->depth);
XFillRectangle(scr->display, buffer, lgc, 0, 0, size.width, size.height);
XFillRectangle(scr->display, buffer, scr->stippleGC, 0, 0, size.width,
size.height);
if (sPtr->backPixmap) {
WMSize size = WMGetPixmapSize(sPtr->backPixmap);
XCopyArea(scr->display, WMGetPixmapXID(sPtr->backPixmap),
buffer, scr->copyGC, 0, 0, size.width, size.height, 1, 1);
} else {
XFillRectangle(scr->display, buffer, lgc, 0, 0, size.width,
size.height);
XFillRectangle(scr->display, buffer, scr->stippleGC, 0, 0, size.width,
size.height);
}
if (sPtr->flags.vertical) {
pos = (size.height-2-SLIDER_LENGTH)*(POSV-MINV)/(MAXV-MINV)+1;
pos = (size.height-2-sPtr->knobThickness)*(POSV-MINV)/(MAXV-MINV)+1;
/* draw knob */
XCopyArea(scr->display, sPtr->knobPixmap, buffer,
scr->copyGC, 0, 0, size.width-2, SLIDER_LENGTH, 1, pos);
scr->copyGC, 0, 0, size.width-2, sPtr->knobThickness,
1, pos);
} else {
pos = (size.width-2-SLIDER_LENGTH)*(POSV-MINV)/(MAXV-MINV)+1;
pos = (size.width-2-sPtr->knobThickness)*(POSV-MINV)/(MAXV-MINV)+1;
/* draw knob */
XCopyArea(scr->display, sPtr->knobPixmap, buffer,
scr->copyGC, 0, 0, SLIDER_LENGTH, size.height, pos, 1);
scr->copyGC, 0, 0, sPtr->knobThickness, size.height, pos, 1);
}
XDrawLine(scr->display, buffer, bgc, 0, 0, 0, size.height-1);
@@ -373,18 +423,18 @@ getSliderPart(Slider *sPtr, int x, int y)
if (sPtr->flags.vertical) {
p = y;
pos = (size.height-2-SLIDER_LENGTH)*(POSV-MINV)/(MAXV-MINV);
pos = (size.height-2-sPtr->knobThickness)*(POSV-MINV)/(MAXV-MINV);
if (p < pos)
return INCR_PART;
if (p > pos + SLIDER_LENGTH)
if (p > pos + sPtr->knobThickness)
return DECR_PART;
return KNOB_PART;
} else {
p = x;
pos = (size.width-2-SLIDER_LENGTH)*(POSV-MINV)/(MAXV-MINV);
pos = (size.width-2-sPtr->knobThickness)*(POSV-MINV)/(MAXV-MINV);
if (p < pos)
return DECR_PART;
if (p > pos + SLIDER_LENGTH)
if (p > pos + sPtr->knobThickness)
return INCR_PART;
return KNOB_PART;
}
@@ -396,11 +446,13 @@ valueForMousePoint(Slider *sPtr, int x, int y)
{
WMSize size = sPtr->view->size;
int f;
if (sPtr->flags.vertical) {
f = (y-SLIDER_LENGTH/2)*(MAXV-MINV)/((int)size.height-2-SLIDER_LENGTH);
f = (y-sPtr->knobThickness/2)*(MAXV-MINV)
/ ((int)size.height-2-sPtr->knobThickness);
} else {
f = (x-SLIDER_LENGTH/2)*(MAXV-MINV)/((int)size.width-2-SLIDER_LENGTH);
f = (x-sPtr->knobThickness/2)*(MAXV-MINV)
/ ((int)size.width-2-sPtr->knobThickness);
}
f += sPtr->minValue;
@@ -408,6 +460,7 @@ valueForMousePoint(Slider *sPtr, int x, int y)
f = sPtr->minValue;
else if (f > sPtr->maxValue)
f = sPtr->maxValue;
return f;
}
@@ -427,13 +480,13 @@ handleActionEvents(XEvent *event, void *data)
else {
#ifdef STRICT_NEXT_BEHAVIOUR
sPtr->flags.dragging = 1;
sPtr->value = valueForMousePoint(sPtr, event->xmotion.x,
event->xmotion.y);
paintSlider(sPtr);
#else
int tmp;
tmp = valueForMousePoint(sPtr, event->xmotion.x, event->xmotion.y);
if (tmp < sPtr->value)
tmp = sPtr->value-1;
@@ -447,14 +500,14 @@ handleActionEvents(XEvent *event, void *data)
}
}
break;
case ButtonRelease:
if (!sPtr->flags.continuous && sPtr->flags.dragging && sPtr->action) {
(*sPtr->action)(sPtr, sPtr->clientData);
}
sPtr->flags.dragging = 0;
break;
case MotionNotify:
if (sPtr->flags.dragging) {
sPtr->value = valueForMousePoint(sPtr, event->xmotion.x,
@@ -476,7 +529,10 @@ destroySlider(Slider *sPtr)
{
if (sPtr->knobPixmap)
XFreePixmap(sPtr->view->screen->display, sPtr->knobPixmap);
if (sPtr->backPixmap)
WMReleasePixmap(sPtr->backPixmap);
free(sPtr);
}

View File

@@ -273,41 +273,18 @@ testSlider(WMScreen *scr)
s = WMCreateSlider(win);
WMResizeWidget(s, 16, 100);
WMMoveWidget(s, 100, 100);
WMSetSliderKnobThickness(s, 8);
s = WMCreateSlider(win);
WMResizeWidget(s, 100, 16);
WMMoveWidget(s, 100, 10);
WMSetSliderKnobThickness(s, 8);
WMRealizeWidget(win);
WMMapSubwidgets(win);
WMMapWidget(win);
}
#if 0
void
testText(WMScreen *scr)
{
WMWindow *win;
WMSimpleText *text;
windowCount++;
win = WMCreateWindow(scr, "testText");
WMResizeWidget(win, 300, 300);
WMSetWindowTitle(win, "Text");
WMSetWindowCloseAction(win, closeAction, NULL);
text = WMCreateSimpleText(win);
WMResizeWidget(text, 280, 280);
WMMoveWidget(text, 10, 10);
WMRealizeWidget(win);
WMMapSubwidgets(win);
WMMapWidget(win);
}
#endif
void
testTextField(WMScreen *scr)
{
@@ -424,13 +401,15 @@ int main(int argc, char **argv)
*
* Put the testSomething() function you want to test here.
*/
#if 1
#if 0
testOpenFilePanel(scr);
testFontPanel(scr);
testList(scr);
testGradientButtons(scr);
testScrollView(scr);
#endif
testColorWell(scr);
#if 1
testSlider(scr);
testTextField(scr);
testPullDown(scr);

View File

@@ -36,6 +36,8 @@ typedef struct W_TextField {
short usableWidth;
short offsetWidth; /* offset of text from border */
WMRange selection;
#if 0
WMHandlerID timerID; /* for cursor blinking */
#endif
@@ -191,7 +193,7 @@ WMCreateTextField(WMWidget *parent)
WMSetTextFieldBordered(tPtr, DEFAULT_BORDERED);
tPtr->flags.alignment = DEFAULT_ALIGNMENT;
tPtr->offsetWidth = (tPtr->view->size.height
- tPtr->view->screen->normalFont->height)/2;
- WMFontHeight(tPtr->view->screen->normalFont))/2;
WMCreateEventHandler(tPtr->view, EnterWindowMask|LeaveWindowMask
|ButtonPressMask|KeyPressMask|Button1MotionMask,
@@ -307,8 +309,12 @@ WMSetTextFieldText(WMTextField *tPtr, char *text)
}
strcpy(tPtr->text, text);
}
/*
if (tPtr->textLen < tPtr->cursorPosition)
tPtr->cursorPosition = tPtr->textLen;
*/
tPtr->cursorPosition = 0;
tPtr->viewPosition = 0;
if (tPtr->view->flags.realized)
paintTextField(tPtr);
@@ -370,7 +376,7 @@ resizeTextField(WMTextField *tPtr, unsigned int width, unsigned int height)
W_ResizeView(tPtr->view, width, height);
tPtr->offsetWidth = (tPtr->view->size.height
- tPtr->view->screen->normalFont->height)/2;
- WMFontHeight(tPtr->view->screen->normalFont))/2;
tPtr->usableWidth = tPtr->view->size.width - 2*tPtr->offsetWidth;
}
@@ -477,7 +483,7 @@ paintTextField(TextField *tPtr)
&(tPtr->text[tPtr->viewPosition]),
tPtr->textLen - tPtr->viewPosition);
th = screen->normalFont->height;
th = WMFontHeight(screen->normalFont);
ty = tPtr->offsetWidth;
switch (tPtr->flags.alignment) {

View File

@@ -144,8 +144,9 @@ createView(W_Screen *screen, W_View *parent)
view->attribFlags = CWEventMask|CWBitGravity;
view->attribs = defAtts;
view->attribFlags |= CWBackPixel|CWColormap;
view->attribFlags |= CWBackPixel|CWColormap|CWBorderPixel;
view->attribs.background_pixel = W_PIXEL(screen->gray);
view->attribs.border_pixel = W_PIXEL(screen->black);
view->attribs.colormap = screen->colormap;
adoptChildView(parent, view);