view lwlib/xlwcheckbox.c @ 5494:861f2601a38b

Sync s/ files with GNU 23.1.92, delete obsolete stuff, simplify other stuff --- ChangeLog 2010-02-20 Ben Wing <ben@xemacs.org> * configure: * configure.ac (XE_EXPAND_VARIABLE): * configure.ac (TAB): irix6-0.h renamed to irix6-5.h; sco7.h deleted. bsd4-3.h renamed to bsd-common.h. Simplify setting machine= for intel386, mips. Put back linux.h. Incorporate some stuff about debug/optimization flags in irix6-5.h into configure.ac. Add a comment about LCC stuff with optimization flags that should be fixed up. --- src/ChangeLog 2010-02-20 Ben Wing <ben@xemacs.org> * sysdep.c: * sysdep.c (qxe_reliable_signal): * sysdep.c (retry_open_1): * sysdep.c (retry_close): * sysdep.c (retry_read_1): * sysdep.c (retry_write_1): * sysdep.c (retry_fopen): * sysdep.c (retry_fclose): * sysdep.c (retry_fread): * sysdep.c (retry_fwrite): Remove conditionalization on INTERRUPTIBLE_IO, INTERRUPTIBLE_OPEN, INTERRUPTIBLE_CLOSE -- always check for EINTR as there's no harm in it. Remove old #if 0'ed out SA_RESTART code. Use manifest constant IRIX6_5 instead of IRIX. * Makefile.in.in: * dired.c: * dired.c (Ffile_attributes): Use manifest constant IRIX6_5 instead of IRIX. Eliminate constant BSD4_2, use BSD4_3 instead. * getloadavg.c: * getloadavg.c (getloadavg): * getloadavg.c (LDAV_PRIVILEGED): * getloadavg.c (LDAV_DONE): Sync with GNU 23.1.92. 2010-02-20 Ben Wing <ben@xemacs.org> * s/README: * s/aix4-2.h: * s/aix4-2.h (MAIL_USE_LOCKF): * s/bsd-common.h: * s/freebsd.h: * s/freebsd.h (Carey): * s/freebsd.h (or): * s/gnu.h: * s/gnu.h (DATA_START): * s/hpux11-shr.h: * s/hpux11.h: * s/hpux11.h (random): * s/irix6-5.h: * s/linux.h: * s/mach-bsd4-3.h: * s/netbsd.h: * s/netbsd.h (or): * s/netbsd.h (A_TEXT_OFFSET): * s/netbsd.h (NO_MATHERR): * s/openbsd.h: * s/sol2.h: * s/usg5-4-2.h: * s/usg5-4.h: * s/usg5-4.h (or): * s/usg5-4.h (ORDINARY_LINK): Sync with GNU 23.1.92. Put back linux.h. Rename: bsd4-3.h -> bsd-common.h; irix6-0.h -> irix6-5.h. Delete: template.h (useless). Delete a whole bunch of obsolete stuff in sol2.h, linux.h, freebsd.h -- assume anything over 10 years old is sufficiently obsolete to be deleted. Remove LIBS_DEBUG, C_DEBUG_SWITCH, C_OPTIMIZE_SWITCH, KERNEL_FILE, LDAV_SYMBOL, most remaining PTY stuff, remaining TERMINFO/TERMCAP stuff. Update README appropriately. Remove stuff in hpux11-shr.h duplicated in hpux11.h. Remove sco7.h, identical with usg5-4-2.h. Remove unused POSIX flag, BROKEN_TIOC*, NO_SIOCTL_H. 2010-02-20 Ben Wing <ben@xemacs.org> * m/arm.h: * m/hp800.h: * m/intel386.h: * m/mips.h: * m/powerpc.h: * m/sparc.h: * m/template.h: Temporarily ifdef out all defines involving load-average stuff -- using define ENABLE_SM_FILE_DECLS_OF_LOADAVG_STUFF, which is not defined. I'm pretty sure getloadavg.c will take care of defining stuff properly on all systems without the need to duplicate the info in m/*. --ben Delete LIBS_TERMCAP; configure auto-handles this. Delete extra stuff in hp800.h. Delete C_DEBUG_SWITCH, C_OPTIMIZE_SWITCH, LDAV_SYMBOL; incorporate some stuff into configure.ac.
author Ben Wing <ben@xemacs.org>
date Sat, 20 Feb 2010 06:03:00 -0600
parents 5460287a3327
children 308d34e9f07d
line wrap: on
line source

/* Checkbox Widget for XEmacs.
   Copyright (C) 1999 Edward A. Falk

This file is part of XEmacs.

XEmacs 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, or (at your option) any
later version.

XEmacs 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 XEmacs; see the file COPYING.  If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */

/* Synched up with: Checkbox.c 1.1 */

/*
 * Checkbox.c - Checkbox button widget
 *
 * Author: Edward A. Falk
 *         falk@falconer.vip.best.com
 *
 * Date:   June 30, 1997
 *
 * Overview:  This widget is identical to the Radio widget in behavior,
 * except that the button is square and has a check mark.
 */


#include <config.h>
#include <stdio.h>

#include <X11/IntrinsicP.h>
#include <X11/StringDefs.h>
#include ATHENA_XawInit_h_
#include "xt-wrappers.h"
#include "xlwcheckboxP.h"


/* by using the same size for the checkbox as for the diamond box,
 * we can let the Radio widget do the vast majority of the work.
 */

#define	BOX_SIZE	8
#define	DRAW_CHECK	0	/* don't draw the check mark */

#define	cclass(w)	((CheckboxWidgetClass)((w)->core.widget_class))

#ifdef	_ThreeDP_h
#define	swid(cw)	((cw)->threeD.shadow_width)
#else
#define	swid(cw)	((cw)->core.border_width)
#endif

#define	bsize(cw)	(cclass(cw)->radio_class.dsize)
#define	bs(cw)		(bsize(cw) + 2*swid(cw))


#if	DRAW_CHECK
#define check_width 14
#define check_height 14
static unsigned char check_bits[] = {
   0x00, 0x00, 0x00, 0x20, 0x00, 0x18, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x03,
   0x8c, 0x03, 0xde, 0x01, 0xff, 0x01, 0xfe, 0x00, 0xfc, 0x00, 0x78, 0x00,
   0x70, 0x00, 0x20, 0x00};
#endif


/****************************************************************
 *
 * Full class record constant
 *
 ****************************************************************/


#if DRAW_CHECK
static char defaultTranslations[] =
    "<EnterWindow>:	highlight()\n\
     <LeaveWindow>:	unpress(draw) unhighlight()\n\
     <Btn1Down>:	press()\n\
     <Btn1Down>,<Btn1Up>:   unpress(nodraw) toggle() notify()";
#endif



#define	offset(field)	XtOffsetOf(CheckboxRec, checkbox.field)
#define res(name,_class,intrepr,type,member,extrepr,value) \
  Xt_RESOURCE (name, _class, intrepr, type, offset(member), extrepr, value)
static	XtResource	resources[] = {
  res (XtNtristate, XtCTristate, XtRBoolean, Boolean, tristate,
       XtRImmediate, FALSE),
} ;
#undef	offset

	/* Member functions */

static void CheckboxClassInit (void);
static void CheckboxInit (Widget, Widget, ArgList, Cardinal *);
#if DRAW_CHECK
static void CheckboxRealize (Widget, Mask *, XSetWindowAttributes *);
#endif
static void DrawCheck (Widget);


	/* Action procs */
#if DRAW_CHECK
static void CheckboxPress   (Widget, XEvent *, String *, Cardinal *);
static void CheckboxUnpress (Widget, XEvent *, String *, Cardinal *);
#endif

	/* internal privates */

#if DRAW_CHECK
static	XtActionsRec	actionsList[] =
{
  {"press",	CheckboxPress},
  {"unpress",	CheckboxUnpress},
} ;
#endif

#define SuperClass ((RadioWidgetClass)&radioClassRec)

CheckboxClassRec checkboxClassRec = {
  {
    (WidgetClass) SuperClass,		/* superclass		*/
    (String) "Checkbox",		/* class_name		*/
    sizeof(CheckboxRec),		/* size			*/
    CheckboxClassInit,			/* class_initialize	*/
    NULL,				/* class_part_initialize  */
    FALSE,				/* class_inited		*/
    CheckboxInit,			/* initialize		*/
    NULL,				/* initialize_hook	*/
#if DRAW_CHECK
    CheckboxRealize,			/* realize		*/
    actionsList,			/* actions		*/
    XtNumber(actionsList),		/* num_actions		*/
#else
    XtInheritRealize,			/* realize		*/
    NULL,				/* actions		*/
    0,					/* num_actions		*/
#endif
    resources,				/* resources		*/
    XtNumber(resources),		/* resource_count	*/
    NULLQUARK,				/* xrm_class		*/
    TRUE,				/* compress_motion	*/
    TRUE,				/* compress_exposure	*/
    TRUE,				/* compress_enterleave	*/
    FALSE,				/* visible_interest	*/
    NULL,				/* destroy		*/
    XtInheritResize,			/* resize		*/
    XtInheritExpose,			/* expose		*/
    NULL,				/* set_values		*/
    NULL,				/* set_values_hook	*/
    XtInheritSetValuesAlmost,		/* set_values_almost	*/
    NULL,				/* get_values_hook	*/
    NULL,				/* accept_focus		*/
    XtVersion,				/* version		*/
    NULL,				/* callback_private	*/
#if DRAW_CHECK
    defaultTranslations,		/* tm_table		*/
#else
    XtInheritTranslations,		/* tm_table		*/
#endif
    XtInheritQueryGeometry,		/* query_geometry	*/
    XtInheritDisplayAccelerator,	/* display_accelerator	*/
    NULL				/* extension		*/
  },  /* CoreClass fields initialization */
  {
    XtInheritChangeSensitive		/* change_sensitive	*/
  },  /* SimpleClass fields initialization */
#ifdef	_ThreeDP_h
  {
    XtInheritXaw3dShadowDraw		/* field not used	*/
  },  /* ThreeDClass fields initialization */
#endif
  {
    0					  /* field not used	*/
  },  /* LabelClass fields initialization */
  {
    0					  /* field not used	*/
  },  /* CommandClass fields initialization */
  {
      RadioSet,				/* Set Procedure.	*/
      RadioUnset,			/* Unset Procedure.	*/
      NULL				/* extension.		*/
  },  /* ToggleClass fields initialization */
  {
      BOX_SIZE,
      DrawCheck,			/* draw procedure */
      NULL				/* extension. */
  },  /* RadioClass fields initialization */
  {
      NULL				/* extension. */
  },  /* CheckboxClass fields initialization */
};

  /* for public consumption */
WidgetClass checkboxWidgetClass = (WidgetClass) &checkboxClassRec;






/****************************************************************
 *
 * Class Methods
 *
 ****************************************************************/

static void
CheckboxClassInit (void)
{
  XawInitializeWidgetSet();
}


/*ARGSUSED*/
static void
CheckboxInit (Widget   UNUSED (request),
#if DRAW_CHECK
	      Widget   new,
#else
	      Widget   UNUSED (new_),
#endif
	      ArgList  UNUSED (args),
	      Cardinal *UNUSED (num_args))
{
#if DRAW_CHECK
    CheckboxWidget cw = (CheckboxWidget) new_;
    cw->checkbox.checkmark = None ;
    cw->checkbox.checkmark_GC = None ;
#endif
}


#if DRAW_CHECK
static void
CheckboxRealize(Widget w,
		Mask *valueMask,
		XSetWindowAttributes *attributes)
{
    CheckboxWidget cw = (CheckboxWidget) w;
    XtGCMask	value_mask, dynamic_mask, dontcare_mask ;
    XGCValues	values ;

    /* first, call superclass realize */
    (*checkboxWidgetClass->core_class.superclass->core_class.realize)
	(w, valueMask, attributes);

    /* TODO: cache this via xmu */
    if( cw->checkbox.checkmark == None )
      cw->checkbox.checkmark =
	XCreateBitmapFromData( XtDisplay(w), XtWindow(w),
		check_bits,check_width,check_height);

    values.fill_style = FillStippled ;
    values.stipple = cw->checkbox.checkmark ;
    values.foreground = cw->label.foreground ;
    value_mask = GCFillStyle | GCStipple | GCForeground ;
    dynamic_mask = GCTileStipXOrigin | GCTileStipYOrigin ;
    dontcare_mask = GCLineWidth | GCLineStyle | GCCapStyle | GCJoinStyle |
    	GCFont | GCSubwindowMode | GCGraphicsExposures |
	GCDashOffset | GCDashList | GCArcMode ;
    cw->checkbox.checkmark_GC =
      XtAllocateGC(w, 0, value_mask, &values, dynamic_mask, dontcare_mask) ;
}
#endif


/*	Function Name: CheckboxDestroy
 *	Description: Destroy Callback for checkbox widget.
 *	Arguments: w - the checkbox widget that is being destroyed.
 *                 junk, garbage - not used.
 *	Returns: none.
 */

/* ARGSUSED */
#if DRAW_CHECK
static void
CheckboxDestroy (
		 Widget w,
		 XtPointer UNUSED (junk),
		 XtPointer UNUSED (garbage))
{
    CheckboxWidget cw = (CheckboxWidget) w;

    /* TODO: cache this via xmu */
    if( cw->checkbox.checkmark != None )
      XFreePixmap( XtDisplay(w), cw->checkbox.checkmark ) ;
    if( cw->checkbox.checkmark_GC != None )
      XtReleaseGC(w, cw->checkbox.checkmark_GC) ;
}
#endif /* DRAW_CHECK */



#if DRAW_CHECK
/************************************************************
 *
 *  Actions Procedures
 *
 ************************************************************/

/* ARGSUSED */
static	void
CheckboxPress (Widget   w,
	       XEvent   *event,
	       String   *params,     /* unused */
	       Cardinal *num_params) /* unused */
{
  CheckboxWidget	cw = (CheckboxWidget) w ;
  if( !cw->checkbox.pressed ) {
    cw->checkbox.pressed = TRUE ;
    ((CheckboxWidgetClass)(w->core.widget_class))->radio_class.drawDiamond(w) ;
  }
}

static	void
CheckboxUnpress (Widget   w,
		 XEvent   *event,
		 String   *params,     /* unused */
		 Cardinal *num_params) /* unused */
{
  CheckboxWidget	cw = (CheckboxWidget) w ;
  int			i ;

  if( cw->checkbox.pressed ) {
    cw->checkbox.pressed = FALSE ;
    if( *num_params > 0  &&  **params == 'd' )
      ((CheckboxWidgetClass)(w->core.widget_class))->radio_class.drawDiamond(w);
  }
}
#endif





/************************************************************
 *
 *  Internal Procedures
 *
 ************************************************************/

static	void
DrawCheck (Widget w)
{
	CheckboxWidget	cw = (CheckboxWidget) w ;
	Display		*dpy = XtDisplay(w) ;
	Window		win = XtWindow(w) ;
	GC		gc ;

#ifdef	_ThreeDP_h
	XPoint		pts[6] ;
#endif
	Dimension	s = swid(cw);
	Dimension	bsz = bsize(cw);
	Position	bx,by ;		/* Check upper-left */
	Dimension	bh ;
#ifdef	_ThreeDP_h
	Dimension	bw;
	GC		top, bot;
#endif
	GC		ctr ;

	/* foreground GC */
	gc = XtIsSensitive(w) ? cw->command.normal_GC : cw->label.gray_GC ;

	bh = bs(cw) ;
	bx = cw->label.internal_width ;
	by = cw->core.height/2 - bh/2 ;

#ifdef	_ThreeDP_h
	bw = bh ;

	if( !cw->command.set ) {
	  top = cw->threeD.top_shadow_GC ;
	  bot = cw->threeD.bot_shadow_GC ;
	} else {
	  top = cw->threeD.bot_shadow_GC ;
	  bot = cw->threeD.top_shadow_GC ;
	}
	ctr = cw->command.inverse_GC ;
#else
	ctr = cw->command.set ? cw->command.normal_GC : cw->command.inverse_GC ;
#endif

	XFillRectangle(dpy,win,ctr, bx+s,by+s, bsz,bsz) ;

#ifdef	_ThreeDP_h
	/* top-left shadow */
	pts[0].x = bx ;		pts[0].y = by ;
	pts[1].x = bw ;		pts[1].y = 0 ;
	pts[2].x = -s ;		pts[2].y = s ;
	pts[3].x = -bsz ;	pts[3].y = 0 ;
	pts[4].x = 0 ;		pts[4].y = bsz ;
	pts[5].x = -s ;		pts[5].y = s ;
	XFillPolygon(dpy,win,top, pts,6, Nonconvex,CoordModePrevious) ;
	/* bottom-right shadow */
	pts[0].x = bx+bw ;	pts[0].y = by+bh ;
	pts[1].x = -bw ;	pts[1].y = 0 ;
	pts[2].x = s ;		pts[2].y = -s ;
	pts[3].x = bsz ;	pts[3].y = 0 ;
	pts[4].x = 0 ;		pts[4].y = -bsz ;
	pts[5].x = s ;		pts[5].y = -s ;
	XFillPolygon(dpy,win,bot, pts,6, Nonconvex,CoordModePrevious) ;
#else
	XDrawRectangle(dpy,win,gc, bx+s,by+s, bsz,bsz) ;
#endif

#if DRAW_CHECK
	if( cw->command.set && cw->checkbox.checkmark_GC != None ) {
	  XSetTSOrigin(dpy,cw->checkbox.checkmark_GC, bx+s, by+s) ;
	  XFillRectangle(dpy,win,cw->checkbox.checkmark_GC,
	  	bx+s, by+s, check_width,check_height) ;
	}
#endif
}