Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/xgap/src.x11/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 14.8.2025 mit Größe 10 kB image not shown  

Quelle  popdial.c   Sprache: C

 
/****************************************************************************
**
*W  popdial.c XGAP source                  Frank Celler
**
**
*Y  Copyright 1995-1997,  Lehrstuhl D fuer Mathematik,  RWTH Aachen,  Germany
*Y  Copyright 1997,       Frank Celler,                 Huerth,       Germany
**
**  This  file  contains functions for popping up dialogs.  Two functions are
**  exported:
**
**  CreatePopupDialog( <app>, <top>, <name>, <bt>, <def>, <pix> )
**  -------------------------------------------------------------
**
**  'CreatePopupDialog'  creates a popup dialog  structure.  A popup shell of
**  type "transientShellWidgetClass" is created together with a dialog widget
**  and  buttons according to <bt>. None  of these widgets are realised, this
**  is  done by   calling 'PopupDialog'.  The  default   button  activated by
**  pressing "return" is <def>.
**
**  Possible buttons are: PD_YES, PD_NO, PD_OK, PD_CANCEL, PD_ABORT, PD_RETRY
**                        PD_APPEND, PD_OVERWRITE
**
**  PopupDialog( <dialog>, <message>, <deflt>, <result> )
**  -----------------------------------------------------
**
**  'PopupDialog' will pop up a dialog created  with 'CreatePopupDialog'.  It
**  then grabs  the keyboard  and  returns only if a   button or  "return" is
**  pressed.  A pointer to the result is stored in <result> and the number of
**  the button  pressed  is returned.  If  "return"  was hit by  the user the
**  button number is the number given as <def> in 'CreatePopupDialog'.
**
**  The layout of the popup dialog is basically:
**
**       +-----------------------------------------+
**       |                                         |
**       |  pixmap    some text <message>          |
**       |  <pix>                                  |
**       |                                         |
**       |  [[[ INPUT FIELD (default: <deflt>) ]]] |
**       |                                         |
**       |  Btn1  Btn2 ... BtnN                    |
**       |                                         |
**       +-----------------------------------------+
**
**  PopupDialogBrokenWM()
**  ---------------------
**
**  Some window  manager  don't handle transient shell widgets correctly.  In
**  this case  calling  'PopupDialogBrokenWM' will  toggle  a flag such  that
**  a override shell widet is used instead.
*/

#include    "utils.h"
#include    "popdial.h"   /* this package */


/****************************************************************************
**

*F  ButtonSelected( <w>, <cld>, <cd> ) . . . . . . callback for button click
*/

static struct { String name;  Int flag; } buttons[] =
{
    { "yes",     PD_YES       },
    { "no",         PD_NO        },
    { "OK",         PD_OK        },
    { "cancel",     PD_CANCEL    },
    { "abort",      PD_ABORT     },
    { "retry",      PD_RETRY     },
    { "append",     PD_APPEND    },
    { "overwrite",  PD_OVERWRITE }
};

static void ButtonSelected (
    Widget          w,
    XtPointer       cld,
    XtPointer       cd)
{
    Int             i;
    Int           * res = (int*) cld;
    String          name;

    /* find name in <buttons> and set result */
    XtVaGetValues( w, XtNlabel, (XtArgVal)&name, (String)NULL );
    for ( i = 0;  i < XtNumber(buttons);  i++ )
 if ( ! strcmp( buttons[i].name, name ) )
     (*res) |= buttons[i].flag;
}


/****************************************************************************
**
*F  CreatePopupDialog( <app>, <top>, <name>, <button>, <def>, <pix> )  create
*/

#include "bitmaps/return.bm"

static Boolean BrokenWM = False;

TypePopupDialog CreatePopupDialog (
    XtAppContext        app,
    Widget              top,
    String              name,
    Int                 bt,
    Int                 def,
    Pixmap              pix)
{
    Display           * dp;
    TypePopupDialog     dialog;
    Int                 i;
    static Pixmap       symbol = 0;              

    
    /* create pixmap for default button */
    if ( symbol == 0 )
    {
 dp = XtDisplay(top);
 symbol = XCreateBitmapFromData( dp, DefaultRootWindow(dp),
                     return_bits, return_width, return_height );
    }

    /* create a new popup variable */
    dialog = (TypePopupDialog) XtMalloc( sizeofstruct _popup_dialog ) );
    dialog->topLevel   = top;

    if ( BrokenWM )
        dialog->popupShell = XtVaCreatePopupShell(
                                 name, overrideShellWidgetClass,  top,
                   XtNallowShellResize, (XtArgVal)True,
            (String)NULL );
    else
        dialog->popupShell = XtVaCreatePopupShell(
                name, transientShellWidgetClass, top,
            XtNallowShellResize, (XtArgVal)True,
            XtNtransientFor,     (XtArgVal)top,
            (String)NULL );
    if ( pix == 0 )
        dialog->dialog = XtVaCreateManagedWidget(
                             "xgapDialog",  dialogWidgetClass,
                             dialog->popupShell,
                             (String)NULL );
    else
        dialog->dialog = XtVaCreateManagedWidget(
                             "xgapDialog",  dialogWidgetClass,
                             dialog->popupShell,
                             XtNicon, (XtArgVal)pix,
                             (String)NULL );
    dialog->button        = bt;
    dialog->context       = app;
    dialog->defaultButton = def;

    /* add buttons to the dialog */
    for ( i = 0;  i < XtNumber(buttons);  i++ )
 if ( bt & buttons[i].flag )
 {
     if ( buttons[i].flag == def )
  dialog->buttons[i] = XtVaCreateManagedWidget(
       buttons[i].name, commandWidgetClass,
       dialog->dialog, 
       XtNleftBitmap, (XtArgVal)symbol,
       (String)NULL );
     else
  dialog->buttons[i] = XtVaCreateManagedWidget(
       buttons[i].name, commandWidgetClass,
       dialog->dialog, 
       (String)NULL );
     XtAddCallback( dialog->buttons[i],
      XtNcallback,
      ButtonSelected,
      &(dialog->result) );
 }
 else
     dialog->buttons[i] = 0;
    return dialog;
}


/****************************************************************************
**                                                                           
*V  NormalFont  . . . . . . . . . . . . . . . . . normal font for text output
**
**  see xcmds.c, imported here by Max 11.3.1999, see below
*/

extern XFontStruct * NormalFont;                                                    

/****************************************************************************
**
*F  PopupDialogBrokenWM() . . . . . . . . . . . . . .  toggle <BrokenWM> flag
*/

void PopupDialogBrokenWM ( )
{
    BrokenWM = ! BrokenWM;
}


/****************************************************************************
**
*F  PopupDialog( <dialog>, <message>, <deflt>, <result> ) . . . . . . . do it
*/

static Cursor BlobCursor = 0;

Int PopupDialog (
    TypePopupDialog     dialog,
    String              message,
    String              deflt,
    String *            result)
{
    Display *           display;
    Position            x1,  y1,  tmp;
    Dimension           w1,  h1,  bw;
    Window              root;
    Window              child;
    Int                 x2,  y2,  x3,  y3;
    UInt                bt;
    Int                 i;
    Int                 textlen, deflen;

    /* create font cursor */
    display = XtDisplay(dialog->popupShell);
    if ( BlobCursor == 0 )
 BlobCursor = XCreateFontCursor( display, XC_dot );

    /* set message and default answer in dialog */
    /* Changes by Max: 11.3.1999:
       XtVaSetValues( dialog->dialog,
   XtNlabel,  "            ",
   XtNvalue,    "                      ",
   0,           0 );*/

    XtVaSetValues( dialog->dialog,
     XtNlabel,  (XtArgVal)message,
     XtNvalue,    (XtArgVal)deflt,
     (String)NULL );
    /* get size of popup dialog */
    XtVaGetValues( dialog->popupShell,
     XtNwidth,       (XtArgVal)&w1,
     (String)NULL );
    textlen = strlen(message)*NormalFont->max_bounds.width + 80;
    deflen = strlen(deflt)*NormalFont->max_bounds.width + 60;
    if (textlen > deflen) {
      if (textlen < w1)
        textlen = w1;
    } else {
      if (deflen < w1)
        textlen = w1;
      else
        textlen = deflen;
    }
    XtVaSetValues( dialog->dialog,
                   XtNwidth,textlen,
                   0,NULL );
    /* End of changes by Max. */

    XtRealizeWidget( dialog->popupShell );

    /* get size of popup dialog */
    XtVaGetValues( dialog->popupShell,
     XtNwidth,       (XtArgVal)&w1,
     XtNheight,      (XtArgVal)&h1,
     XtNborderWidth, (XtArgVal)&bw,
     (String)NULL );

    /* get position of the mouse pointer */
    XQueryPointer( display, XtWindow(dialog->popupShell),
     &root, &child, &x2, &y2, &x3, &y3, &bt );

    /* find a nice position for the dialog */
    tmp = DisplayWidth( display, DefaultScreen(display) );
    x1 = x2 - (bw+w1)/2;
    if ( tmp-w1-2*bw < x1 )  x1 = tmp-w1-2*bw;
    if ( x1 < 0 )  x1 = 0;
    tmp = DisplayHeight( display, DefaultScreen(display) );
    y1  = y2 - (bw+h1)/2;
    if ( tmp-h1-2*bw < y1 )  y1 = tmp-h1-2*bw;
    if ( y1 < 0 )  y1 = 0;

    /* move the popup dialog to this position */
    XtVaSetValues( dialog->popupShell,
     XtNx, (XtArgVal)x1,
     XtNy, (XtArgVal)y1,
     (String)NULL );

    /* pop up shell */
    XtPopup( dialog->popupShell, XtGrabExclusive );
    for ( i = 0;  i < XtNumber(buttons);  i++ )
 if ( dialog->buttons[i] )
     XDefineCursor( display,
      XtWindow(dialog->buttons[i]), BlobCursor );


    /* and grab keyboard */
    XGrabKeyboard( display, XtWindow(dialog->dialog), False,
     GrabModeAsync, GrabModeAsync, CurrentTime );

    /* wait until at least one button is selected */
    dialog->result = 0;
    while ( ( dialog->result & dialog->button ) == 0 )
    {
 XEvent event;
 char    str[128];
 KeySym  keysym;
 Int     len;

 /* get next application event */
 XtAppNextEvent(dialog->context, &event);

 /* is the event a key event */
 if ( event.type == KeyPress )
 {
     if ( dialog->defaultButton != 0 )
     {

  /* convert key event into text string and check for return */
  len = XLookupString((XKeyEvent*)&event,str,128,&keysym,0);
  if ( len != 0 && ( str[0] == '\n' || str[0] == '\r' ) )
  {
      dialog->result |= dialog->defaultButton;
      continue;
  }
     }
 }

 /* dipatch event normally */
 XtDispatchEvent(&event);
    }

    /* return answer string in <result> */
    if ( result )
        *result = XawDialogGetValueString(dialog->dialog);
    
    /* remove pop up menu from screen */
    XtPopdown(dialog->popupShell);
    return dialog->result & dialog->button;
}


/****************************************************************************
**

*E  popdial.c . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here
*/


96%


¤ Dauer der Verarbeitung: 0.31 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung ist noch experimentell.