1 /*
2  *  This file is part of the XForms library package.
3  *
4  *  XForms is free software; you can redistribute it and/or modify it
5  *  under the terms of the GNU Lesser General Public License as
6  *  published by the Free Software Foundation; either version 2.1, or
7  *  (at your option) any later version.
8  *
9  *  XForms is distributed in the hope that it will be useful, but
10  *  WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  *  Lesser General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Lesser General Public License
15  *  along with XForms. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 /**
19  *  \file flinternal.h
20  *
21  *  This file is part of the XForms library package.
22  *  Copyright (c) 1996-1998  T.C. Zhao and Mark Overmars
23  *  All rights reserved.
24  *
25  * Internal routines used by the Forms Library. An application should
26  * not use any of this since there is no guarantee that exactly some
27  * thing will exist in future versions of XForms.
28  */
29 
30 #ifndef FLINTERNAL_H
31 #define FLINTERNAL_H
32 
33 #include <stdlib.h>
34 #include <signal.h>
35 #include "local.h"
36 #include "ulib.h"
37 
38 
39 /*  macros  and constants */
40 
41 /* FL_DEBUG controls some conditional compilations. Even if the code
42  * is compiled in, it still needs -debug level on the command line
43  * to activate the message output. FL_DEBUG less than ML_ERR probably
44  * is not a good idea. Only when making real production executables
45  * should FL_DEBUG be less than ML_ERR (say ML_ERR-1)
46  *
47  *   ML_ERR    -- print some error messages
48  *   ML_WARN    -- print some error messages
49  *   ML_INFO1  -- some messages
50  *   ML_INFO2  -- more messages
51  *   ML_DEBUG  -- debugging code compiled in
52  *   ML_TRACE  -- can be unbearable
53  */
54 
55 #ifndef FL_DEBUG
56 #define FL_DEBUG   ML_WARN
57 #endif
58 
59 
60 /* Mask for all possible events */
61 
62 #define AllEventsMask   ( ( OwnerGrabButtonMask << 1 ) - 1 )
63 
64 
65 /* There are two ways to handle interaction. One is to process object
66  * Q only if there are no more event pending. This can result in
67  * an event entered into object Q more than once if the connection
68  * is slow and clicking is rapid. If subsequently the object is
69  * hidden or deleted/freed, problem occurs as the callback will
70  * still be processed. To fix this, need to flush the object Q
71  * when hiding/deleting objects. Also if an object is entered
72  * multiple times, and its status changed each time, when the
73  * Q is handled, we get wrong status.
74  *
75  * The other way to handle the interaction is to process object
76  * Q as soon as the status of the object is changed. This is
77  * the correct behavior. However, a change in status is typically
78  * preceeded by a redraw (say mouse release on button), and due to
79  * the X buffering mechnism, the redraw probably not get shown yet
80  * when the callback is evoked. To fix this, an explicit flush
81  * is needed. This can be time consuming. Also objects that do
82  * not have callbacks may be handled out of order (after the one's
83  * having callbacks). */
84 
85 #if 1
86 #define DELAYED_ACTION
87 #endif
88 
89 
90 /* If we want to have gamma correction as a built-in feature.
91  * Probably useless */
92 
93 #define DO_GAMMA_CORRECTION
94 
95 
96 /* XForms internal colormap */
97 
98 typedef struct {
99     const char     * name;
100     FL_COLOR         index;
101     unsigned short   r;
102     unsigned short   g;
103     unsigned short   b;
104     unsigned short   a;
105     int              grayval;
106 } FLI_IMAP;
107 
108 #define BadPixel  FL_NoColor
109 
110 #define Clamp( v, vmin, vmax ) ( ( v ) < ( vmin ) ? \
111                                  ( vmin ) : ( ( v ) > ( vmax ) ? \
112                                               ( vmax ) :( v ) ) )
113 
114 #define IsValidClass( o, c ) ( ( o ) && ( o )->objclass == ( c ) )
115 
116 #define fli_safe_free( p )   \
117     do { if ( p ) {          \
118              fl_free( p );   \
119              p = NULL;       \
120           }                  \
121        } while( 0 )
122 
123 #define fli_class( i )     fl_state[ i ].vclass
124 #define fli_depth( i )     fl_state[ i ].depth
125 #define fli_visual( i )    fl_state[ i ].xvinfo->visual
126 #define fli_colormap( i )  fl_state[ i ].colormap
127 #define fli_map( i )       fl_state[ i ].colormap
128 #define fli_dithered( i )  fl_state[ i ].dithered
129 
130 enum {
131     FLI_FIND_INPUT,
132     FLI_FIND_AUTOMATIC,
133     FLI_FIND_MOUSE,
134     FLI_FIND_CANVAS,
135     FLI_FIND_KEYSPECIAL,
136     FLI_FIND_RETURN
137 };
138 
139 /* events.c or event related */
140 
141 void fli_obj_queue_delete( void );
142 
143 void fli_event_queue_delete( void );
144 
145 void fli_object_qenter( FL_OBJECT *,
146                         int );
147 
148 void fli_filter_returns( FL_OBJECT * );
149 
150 FL_OBJECT * fli_object_qread( void );
151 
152 void fli_object_qflush( FL_FORM * );
153 
154 void fli_object_qflush_object( FL_OBJECT * );
155 
156 FL_OBJECT *fli_object_qtest( void );
157 
158 void fli_treat_user_events( void );
159 
160 void fli_treat_interaction_events( int );
161 
162 void fli_compress_event( XEvent *,
163                          unsigned long );
164 
165 const char *fli_event_name( int );
166 
167 XEvent * fli_xevent_name( const char *,
168                           const XEvent * );
169 
170 void fli_handle_idling( XEvent * xev,
171                         long     msec,
172                         int      do_idle_cb );
173 
174 /* Variables defined in handling.c */
175 
176 extern FL_FORM * mouseform;         /* the current form under mouse */
177 extern FL_FORM * keyform;           /* keyboard focus form */
178 
179 extern FL_OBJECT * fli_pushobj;
180 extern FL_OBJECT * fli_mouseobj;
181 
182 extern FL_Coord fli_mousex,
183                 fli_mousey;
184 extern unsigned int fli_keymask;
185 
186 extern unsigned int fli_query_age;
187 
188 
189 /* Misc. utilitnes */
190 
191 FL_FORM * fli_find_event_form( XEvent * );
192 
193 void fli_print_version( int );
194 
195 /* from forms.c and object.c */
196 
197 void fli_scale_form( FL_FORM *,
198                      double,
199                      double );
200 
201 void fli_handle_form( FL_FORM *,
202                       int, int,
203                       XEvent * );
204 
205 FL_OBJECT *fli_end_group( void );
206 
207 void fli_handle_object( FL_OBJECT *,
208                         int,
209                         FL_Coord,
210                         FL_Coord,
211                         int,
212                         XEvent *,
213                         int );
214 
215 FL_OBJECT * fli_find_first( FL_FORM *,
216                             int,
217                             FL_Coord,
218                             FL_Coord );
219 
220 void fli_show_object( FL_OBJECT * );
221 
222 void fli_recalc_intersections( FL_FORM * );
223 
224 FL_OBJECT * fli_find_last( FL_FORM *,
225                            int,
226                            FL_Coord,
227                            FL_Coord );
228 
229 FL_OBJECT *fli_find_object( FL_OBJECT *,
230                             int,
231                             FL_Coord,
232                             FL_Coord );
233 
234 FL_OBJECT *fli_find_object_backwards( FL_OBJECT *,
235                                       int,
236                                       FL_Coord,
237                                       FL_Coord );
238 
239 void fli_insert_object( FL_OBJECT *,
240                         FL_OBJECT * );
241 
242 void fli_scale_object( FL_OBJECT *,
243                        double     ,
244                        double );
245 
246 void fli_set_object_visibility( FL_OBJECT * obj,
247                                 int         vis );
248 
249 
250 int fli_mouse_wheel_to_keypress( int       * ev,
251                                  int       * key,
252                                  void      * xev );
253 
254 void fli_notify_object( FL_OBJECT * obj,
255                         int         reason );
256 
257 /* double buffering etc. */
258 
259 void fli_free_flpixmap( FL_pixmap * );
260 
261 void fli_create_object_pixmap( FL_OBJECT * );
262 
263 void fli_show_object_pixmap( FL_OBJECT * );
264 
265 void fli_create_form_pixmap( FL_FORM * );
266 
267 void fli_show_form_pixmap( FL_FORM * );
268 
269 /* windowing support */
270 
271 void fli_default_xswa( void );
272 
273 Window fli_cmap_winopen( Window,
274                          Colormap,
275                          const char * );
276 
277 Window fli_create_window( Window,
278                           Colormap,
279                           const char * );
280 
281 void fli_create_gc( Window );
282 
283 enum {
284     FLI_COMMAND_PROP = 1,
285     FLI_PROP_SET     = ( 1 << 10 )  /* really set */
286 };
287 
288 void fli_set_winproperty( Window,
289                           unsigned int );
290 
291 /* graphics related */
292 
293 void fli_init_colormap( int );
294 
295 void fli_free_colormap( int );
296 
297 void fli_dump_state_info( int,
298                           const char * );
299 
300 void fli_init_stipples( void );
301 
302 void fli_draw_button( FL_OBJECT * );
303 
304 /* for fdesign */
305 
306 const char * fli_query_colorname( FL_COLOR );
307 
308 long fli_query_namedcolor( const char *s );
309 
310 void fli_free_xtext_workmem( void );
311 
312 int fli_get_pos_in_string( int,
313                            FL_Coord,
314                            FL_Coord,
315                            FL_Coord,
316                            FL_Coord,
317                            int,
318                            int,
319                            FL_Coord,
320                            FL_Coord,
321                            const char *,
322                            int *,
323                            int *,
324                            int * );
325 
326 int fli_draw_stringTAB( Window,
327                         GC,
328                         int,
329                         int,
330                         int,
331                         int,
332                         const char *,
333                         int,
334                         int );
335 
336 int fli_draw_string( int,
337                      FL_Coord,
338                      FL_Coord,
339                      FL_Coord,
340                      FL_Coord,
341                      int,
342                      FL_COLOR,
343                      FL_COLOR,
344                      FL_COLOR,
345                      int,
346                      int,
347                      int,
348                      int,
349                      int,
350                      const char *,
351                      int,
352                      int,
353                      int,
354                      FL_COLOR );
355 
356 int fli_get_max_pixels_line( void );
357 
358 int fli_get_string_widthTABfs( XFontStruct *,
359                                const char *,
360                                int );
361 
362 void fli_init_font( void );
363 
364 void fli_canonicalize_rect( FL_Coord *,
365                             FL_Coord *,
366                             FL_Coord *,
367                             FL_Coord * );
368 
369 void fli_get_goodie_title( FL_FORM *,
370                            const char * );
371 
372 void fli_add_q_icon( FL_Coord,
373                      FL_Coord,
374                      FL_Coord,
375                      FL_Coord );
376 
377 void fli_add_warn_icon( FL_Coord,
378                         FL_Coord,
379                         FL_Coord,
380                         FL_Coord );
381 
382 void fli_check_key_focus( const char *,
383                           Window );
384 
385 void fli_free_cmdline_args( void );
386 
387 FL_RECT * fli_get_underline_rect( XFontStruct *,
388                                   FL_Coord,
389                                   FL_Coord,
390                                   const char *,
391                                   int );
392 
393 
394 /* Group some WM stuff into a structure for easy maintainance */
395 
396 typedef struct {
397     unsigned int pos_request;   /* USPOSITION or PPOSITION            */
398 } FLI_WM_STUFF;
399 
400 
401 /* Routines in sldraw.c. */
402 
403 typedef struct {
404     FL_Coord x;
405     FL_Coord y;
406     FL_Coord w;
407     FL_Coord h;
408 } FLI_SCROLLBAR_KNOB;
409 
410 enum {
411     FLI_SLIDER_NONE = 0,
412     FLI_SLIDER_BOX  = 1,
413     FLI_SLIDER_KNOB = 2,
414     FLI_SLIDER_ALL  = 3
415 };
416 
417 
418 void fli_calc_slider_size( FL_OBJECT *,
419                            FLI_SCROLLBAR_KNOB * );
420 
421 void fli_draw_slider( FL_OBJECT *,
422                       FL_COLOR,
423                       FL_COLOR,
424                       const char *,
425                       int );
426 
427 void fli_draw_checkbox( int      type,
428                         FL_Coord x,
429                         FL_Coord y,
430                         FL_Coord w,
431                         FL_Coord h,
432                         FL_COLOR col,
433                         int      bw );
434 
435 void fli_set_global_clipping( FL_Coord,
436                               FL_Coord,
437                               FL_Coord,
438                               FL_Coord );
439 
440 void fli_unset_global_clipping( void );
441 
442 void fli_set_additional_clipping( FL_Coord,
443                                   FL_Coord,
444                                   FL_Coord,
445                                   FL_Coord );
446 
447 FL_RECT * fli_get_global_clip_rect( void );
448 
449 
450 /* Application windows */
451 
452 typedef struct fli_win_ {
453     struct fli_win_ * next;
454     Window            win;
455     FL_APPEVENT_CB    pre_emptive;      /* always gets called first if set */
456     FL_APPEVENT_CB    callback[ LASTEvent ];
457     void            * pre_emptive_data;
458     void            * user_data[ LASTEvent ];
459     FL_APPEVENT_CB    default_callback;
460     unsigned long     mask;
461 } FLI_WIN;
462 
463 extern FLI_WIN * fl_app_win;
464 
465 void fli_set_form_window( FL_FORM * );
466 
467 void fli_unmap_canvas_window( FL_OBJECT * );
468 
469 FL_APPEVENT_CB fli_set_preemptive_callback( Window,
470                                             FL_APPEVENT_CB,
471                                             void * );
472 
473 unsigned long fli_xevent_to_mask( int );
474 
475 int fli_initialize_program_visual( void );
476 
477 
478 #define FLI_TIMER_RES           50  /* resolution of FL_STEP event */
479 
480 
481 /* Currently only one idle procedure is permitted, so the next
482  * field is of no much use */
483 
484 typedef struct fli_idle_cb_ {
485     FL_APPEVENT_CB        callback;
486     void                * data;
487 } FLI_IDLE_REC;
488 
489 typedef struct fli_io_event_ {
490     struct fli_io_event_ * next;
491     FL_IO_CALLBACK         callback;
492     void                 * data;
493     unsigned int           mask;
494     int                    source;
495 } FLI_IO_REC;
496 
497 
498 /* signals */
499 
500 #if ! defined HAVE_SIGACTION
501 typedef RETSIGTYPE ( * FLI_OSSIG_HANDLER )( int );
502 #endif
503 
504 typedef struct fli_signallist_ {
505     struct fli_signallist_ * next;
506     FL_SIGNAL_HANDLER        callback;
507 #if defined HAVE_SIGACTION
508     struct sigaction         old_sigact;
509 #else
510     FLI_OSSIG_HANDLER        ocallback; /* default OS signal handler */
511 #endif
512     void                   * data;
513     int                      signum;
514     int                      caught;
515 } FLI_SIGNAL_REC;
516 
517 void fli_remove_all_signal_callbacks( void );
518 
519 /* timeouts */
520 
521 typedef struct fli_timeout_ {
522     int                    id;
523     struct fli_timeout_  * next;
524     struct fli_timeout_  * prev;
525     long                   start_sec,
526                            start_usec;
527     long                   ms_to_wait;
528     FL_TIMEOUT_CALLBACK    callback;
529     void                 * data;
530 } FLI_TIMEOUT_REC;
531 
532 void fli_remove_all_timeouts( void );
533 
534 /*
535  *  Intenal controls.
536  */
537 
538 typedef struct fli_context_ {
539     FL_FORM_ATCLOSE      atclose;           /* what to do if WM_DELETE_WINDOW */
540     void               * close_data;
541     FLI_IDLE_REC       * idle_rec;          /* idle callback record   */
542     FLI_IO_REC         * io_rec;            /* async IO record        */
543     FLI_SIGNAL_REC     * signal_rec;        /* list of app signals    */
544     FLI_TIMEOUT_REC    * timeout_rec;       /* timeout callbacks      */
545     int                  idle_delta;        /* timer resolution       */
546     int                  last_event;        /* last event received    */
547     long                 mouse_button;      /* push/release record    */
548     int                  pup_id;            /* current active pup id  */
549     FL_FORM            * modal;             /* current modal form     */
550     long                 max_request_size;  /* max protocol size      */
551     int                  num_io;
552     int                  hscb,
553                          vscb;              /* default scrollbar      */
554     long                 ext_request_size;  /* extended request size  */
555     int                  tooltip_time;
556 #ifdef XlibSpecificationRelease
557     XIM                  xim;               /* input method           */
558     XIC                  xic;               /* input context          */
559 #else
560     void               * xim;
561     void               * xic;
562 #endif
563     unsigned int         navigate_mask;     /* input field            */
564     long                 reserverd[ 6 ];
565 } FLI_CONTEXT;
566 
567 /* Some X info that helps to make the windowing system independent
568  * API work (fl_color() etc. */
569 
570 typedef struct {
571     Display       * display;
572     Window          win;
573     GC              gc,
574                     textgc;
575     GC              miscgc;
576     int             isRGBColor;
577     int             isMBFont;       /* multi-byte font       */
578     unsigned long   bktextcolor;
579     int             newpix;
580     int             fdesc;          /* font descent          */
581     int             fasc;           /* font ascent           */
582     int             fheight;        /* font height           */
583     Colormap        colormap;
584     XFontStruct   * fs;
585     unsigned long   color;          /* last color. cache     */
586     unsigned long   textcolor;      /* last textcolor. cache */
587     unsigned long   bkcolor;
588     int             screen;
589 } FLI_TARGET;
590 
591 
592 typedef struct {
593     FL_FORM      ** forms;             /* all forms, visible and hidden */
594     int             formnumb;          /* number of visible forms */
595     int             hidden_formnumb;   /* number of hidden forms */
596     size_t          auto_count;
597     int             unmanaged_count;
598 
599     FL_Coord        mousex,            /* last recorded mouse position */
600                     mousey;
601     unsigned int    keymask;           /* state of buttons and modifier keys */
602     unsigned int    query_age;         /* age of recorded information */
603 
604     FL_FORM       * mouseform;         /* the current form under the mouse */
605     FL_FORM       * keyform;           /* keyboard focus form */
606 
607     FL_OBJECT * pushobj;               /* latest pushed object */
608     FL_OBJECT * mouseobj;              /* object under the mouse */
609 } FLI_INTERNAL;
610 
611 extern FLI_INTERNAL fli_int;
612 
613 
614 void fli_init_context( void );
615 
616 
617 #include "extern.h"
618 
619 
620 void fli_watch_io( FLI_IO_REC *,
621                    long );
622 
623 int fli_do_shortcut( FL_FORM *,
624                      int,
625                      FL_Coord,
626                      FL_Coord,
627                      XEvent * );
628 
629 int fli_test_lalign( int          align,
630                      const char * txt );
631 
632 void fli_get_hv_align( int,
633                        int *,
634                        int * );
635 
636 void fli_get_outside_align( int,
637                             int,
638                             int,
639                             int,
640                             int,
641                             int *,
642                             int *,
643                             int * );
644 
645 void fli_init_symbols( void );
646 
647 void fli_release_symbols( void );
648 
649 int fli_handle_event_callbacks( XEvent * );
650 
651 
652 /* Some macros to test how an object can be moved or resized, depending on
653    its gravity settings (ULC = uppler left hand cornner, LRC = lower right
654    hand corner) */
655 
656 #define ULC_POS_LEFT_FIXED( obj )                \
657     (    ( obj )->nwgravity == FL_NorthWest      \
658       || ( obj )->nwgravity == FL_West           \
659       || ( obj )->nwgravity == FL_SouthWest )
660 
661 #define ULC_POS_RIGHT_FIXED( obj )               \
662     (    ( obj )->nwgravity == FL_NorthEast      \
663       || ( obj )->nwgravity == FL_East           \
664       || ( obj )->nwgravity == FL_SouthEast )
665 
666 #define LRC_POS_LEFT_FIXED( obj )                \
667     (    ( obj )->segravity == FL_NorthWest      \
668       || ( obj )->segravity == FL_West           \
669       || ( obj )->segravity == FL_SouthWest )
670 
671 #define LRC_POS_RIGHT_FIXED( obj )               \
672     (    ( obj )->segravity == FL_NorthEast      \
673       || ( obj )->segravity == FL_East           \
674       || ( obj )->segravity == FL_SouthEast )
675 
676 #define HAS_FIXED_HORI_ULC_POS( obj )                             \
677     ( ULC_POS_LEFT_FIXED( obj ) || ULC_POS_RIGHT_FIXED( obj ) )
678 
679 #define HAS_FIXED_HORI_LRC_POS( obj )                             \
680     ( LRC_POS_LEFT_FIXED( obj ) || LRC_POS_RIGHT_FIXED( obj ) )
681 
682 #define HAS_FIXED_WIDTH( obj )                                          \
683     ( HAS_FIXED_HORI_ULC_POS( obj ) && HAS_FIXED_HORI_LRC_POS( obj ) )
684 
685 
686 #define ULC_POS_TOP_FIXED( obj )                 \
687     (    ( obj )->nwgravity == FL_NorthWest      \
688       || ( obj )->nwgravity == FL_North          \
689       || ( obj )->nwgravity == FL_NorthEast )
690 
691 #define ULC_POS_BOTTOM_FIXED( obj )              \
692     (    ( obj )->nwgravity == FL_SouthWest      \
693       || ( obj )->nwgravity == FL_South          \
694       || ( obj )->nwgravity == FL_SouthEast )
695 
696 #define LRC_POS_TOP_FIXED( obj )                 \
697     (    ( obj )->segravity == FL_NorthWest      \
698       || ( obj )->segravity == FL_North          \
699       || ( obj )->segravity == FL_NorthEast )
700 
701 #define LRC_POS_BOTTOM_FIXED( obj )              \
702     (    ( obj )->segravity == FL_SouthWest      \
703       || ( obj )->segravity == FL_South          \
704       || ( obj )->segravity == FL_SouthEast )
705 
706 #define HAS_FIXED_VERT_ULC_POS( obj )                             \
707     ( ULC_POS_TOP_FIXED( obj ) || ULC_POS_BOTTOM_FIXED( obj ) )
708 
709 #define HAS_FIXED_VERT_LRC_POS( obj )                             \
710     ( LRC_POS_TOP_FIXED( obj ) || LRC_POS_BOTTOM_FIXED( obj ) )
711 
712 #define HAS_FIXED_HEIGHT( obj )                                         \
713     ( HAS_FIXED_VERT_ULC_POS( obj ) && HAS_FIXED_VERT_LRC_POS( obj ) )
714 
715 
716 
717 #define XK_PageUp    XK_Prior
718 #define XK_PageDn    XK_Next
719 
720 #define XK_PageUp    XK_Prior
721 #define XK_PageDn    XK_Next
722 
723 
724 /* some header has XK_XP_Left etc */
725 
726 #if XlibSpecificationRelease >= 6
727 
728 #define IsHome( k )     ( k == XK_Home  || k == XK_Begin || k == XK_KP_Home )
729 #define IsLeft( k )     ( k == XK_Left  || k == XK_KP_Left )
730 #define IsRight( k )    ( k == XK_Right || k == XK_KP_Right )
731 #define IsUp( k )       ( k == XK_Up    || k == XK_KP_Up )
732 #define IsDown( k )     ( k == XK_Down  || k == XK_KP_Down )
733 #define IsEnd( k )      ( k == XK_End   || k == XK_KP_End )
734 #define IsPageDown( k ) ( k == XK_Next  || k == XK_Page_Down || k == XK_KP_Page_Down )
735 #define IsPageUp( k )   ( k == XK_Prior || k == XK_Page_Up || k==XK_KP_Page_Up)
736 
737 #else
738 
739 #define IsHome( k )     ( k == XK_Home  || k == XK_Begin )
740 #define IsLeft( k )     ( k == XK_Left )
741 #define IsRight( k )    ( k == XK_Right )
742 #define IsDown( k )     ( k == XK_Down )
743 #define IsUp( k )       ( k == XK_Up )
744 #define IsEnd( k )      ( k == XK_End )
745 #define IsPageDown( k ) ( k == XK_Next )
746 #define IsPageUp( k )   ( k == XK_Prior )
747 
748 #endif
749 
750 #define FLI_HALFPAGE_UP        0x10000000
751 #define FLI_HALFPAGE_DOWN      0x20000000
752 #define FLI_NLINES_UP          0x30000000
753 #define FLI_NLINES_DOWN        0x40000000
754 #define FLI_1LINE_UP           0x50000000
755 #define FLI_1LINE_DOWN         0x60000000
756 #define IsHalfPageUp( k )      ( ( k ) == FLI_HALFPAGE_UP )
757 #define IsHalfPageDown( k )    ( ( k ) == FLI_HALFPAGE_DOWN )
758 #define IsNLinesUp( k )        ( ( k ) == FLI_NLINES_UP )
759 #define IsNLinesDown( k )      ( ( k ) == FLI_NLINES_DOWN )
760 #define Is1LineUp( k )         ( ( k ) == FLI_1LINE_UP )
761 #define Is1LineDown( k )       ( ( k ) == FLI_1LINE_DOWN )
762 
763 
764 void fli_hide_and_get_region( FL_OBJECT *,
765                               Region    * );
766 
767 int fli_convert_shortcut( const char *,
768                           long * );
769 
770 int fli_get_underline_pos( const char *,
771                            const char * );
772 
773 int fli_get_visible_forms_index( FL_FORM * );
774 
775 void fli_recount_auto_objects( void );
776 
777 int fli_get_tabpixels( XFontStruct * );
778 
779 int fli_get_default_scrollbarsize( FL_OBJECT * );
780 
781 void fli_set_app_name( const char *,
782                        const char * );
783 
784 void fli_hide_composite( FL_OBJECT *,
785                          Region    * );
786 
787 void fli_show_composite( FL_OBJECT * );
788 
789 void fli_deactivate_composite( FL_OBJECT * );
790 
791 void fli_activate_composite( FL_OBJECT * );
792 
793 void fli_delete_composite( FL_OBJECT * ob );
794 
795 void fli_free_composite( FL_OBJECT * ob );
796 
797 void fli_set_composite_gravity( FL_OBJECT *,
798                                 unsigned int,
799                                 unsigned int );
800 
801 void fli_set_composite_resize( FL_OBJECT *,
802                                unsigned int );
803 
804 void fli_composite_has_been_resized( FL_OBJECT * );
805 
806 void fli_parse_goodies_label( FL_OBJECT *,
807                               const char * );
808 
809 int fli_goodies_preemptive( FL_FORM *,
810                             void * );
811 
812 void fli_get_goodies_font( int *,
813                            int * );
814 
815 void fli_handle_goodie_font( FL_OBJECT *,
816                              FL_OBJECT * );
817 
818 void fli_goodies_cleanup( void );
819 
820 void fli_msg_cleanup( void );
821 
822 void fli_alert_cleanup( void );
823 
824 void fli_choice_cleanup( void );
825 
826 void fli_question_cleanup( void );
827 
828 void fli_input_cleanup( void );
829 
830 void fli_sinput_cleanup( void );
831 
832 void fli_handle_timeouts( long * );
833 
834 #define FL_IS_NONSQRBOX( t ) (    t == FL_SHADOW_BOX          \
835                                || t == FL_NO_BOX              \
836                                || t == FL_RFLAT_BOX           \
837                                || t == FL_ROUNDED_BOX         \
838                                || t == FL_OVAL_BOX            \
839                                || t == FL_ROUNDED3D_UPBOX     \
840                                || t == FL_ROUNDED3D_DOWNBOX )
841 
842 enum {
843     FLI_TRIANGLE_UPBOX1,
844     FLI_TRIANGLE_UPBOX2,
845     FLI_TRIANGLE_UPBOX3,
846     FLI_TRIANGLE_UPBOX4,
847     FLI_TRIANGLE_UPBOX6,
848     FLI_TRIANGLE_UPBOX7,
849     FLI_TRIANGLE_UPBOX8,
850     FLI_TRIANGLE_UPBOX9,
851     FLI_TRIANGLE_DOWNBOX1,
852     FLI_TRIANGLE_DOWNBOX2,
853     FLI_TRIANGLE_DOWNBOX3,
854     FLI_TRIANGLE_DOWNBOX4,
855     FLI_TRIANGLE_DOWNBOX6,
856     FLI_TRIANGLE_DOWNBOX7,
857     FLI_TRIANGLE_DOWNBOX8,
858     FLI_TRIANGLE_DOWNBOX9
859 };
860 
861 FL_RECT * fli_intersect_rects( const FL_RECT *,
862                                const FL_RECT * );
863 
864 void fli_xyplot_nice_label( float,
865                             int,
866                             float,
867                             char * );
868 
869 void fli_xyplot_compute_data_bounds( FL_OBJECT *,
870                                      int *,
871                                      int *,
872                                      int );
873 
874 int fli_xyplot_interpolate( FL_OBJECT *,
875                             int,
876                             int,
877                             int );
878 
879 void fli_insert_composite_after( FL_OBJECT *,
880                                  FL_OBJECT * );
881 
882 void fli_add_composite( FL_OBJECT * );
883 
884 void fli_insert_composite( FL_OBJECT *,
885                            FL_OBJECT * );
886 
887 int fli_is_watched_io( int );
888 
889 const char * fli_object_class_name( FL_OBJECT * );
890 
891 char * fli_read_line( FILE * fp );
892 
893 char * fli_sstrcpy( char       * dest,
894                     const char * src,
895                     size_t       n );
896 
897 void fli_set_form_icon_data( FL_FORM *,
898                              char ** );
899 
900 char *fli_getcwd( char *,
901                   int );
902 
903 void fli_replacepup_text( int,
904                           int,
905                           const char * );
906 
907 int fli_valuator_handle_drag( FL_OBJECT *,
908                               double );
909 
910 int fli_valuator_handle_release( FL_OBJECT *,
911                                  double );
912 
913 void *fli_init_valuator( FL_OBJECT * );
914 
915 double fli_valuator_round_and_clamp( FL_OBJECT *,
916                                      double );
917 
918 double fli_clamp( double,
919                   double,
920                   double );
921 
922 void fli_inherit_attributes( FL_OBJECT *,
923                              FL_OBJECT * );
924 
925 int fli_boxtype2frametype( int );
926 
927 void fli_xvisual2flstate( FL_State *,
928                           XVisualInfo * );
929 
930 int fli_find_closest_color( int,
931                             int,
932                             int,
933                             XColor *,
934                             int,
935                             unsigned long * );
936 
937 void fli_rgbmask_to_shifts( unsigned long,
938                             unsigned int *,
939                             unsigned int * );
940 
941 void fli_show_tooltip( const char *,
942                        int,
943                        int );
944 
945 void fli_hide_tooltip( void );
946 
947 int fli_is_tooltip_form( FL_FORM * );
948 
949 void fli_do_radio_push( FL_OBJECT *,
950                         FL_Coord,
951                         FL_Coord,
952                         int,
953                         void *,
954                         int );
955 
956 long fli_getpid( void );
957 
958 void fli_xlinestyle( Display *,
959                      GC,
960                      int );
961 
962 #define FLI_BROKEN_BOX  ( 1 << 10 )
963 
964 FLI_TARGET * fli_internal_init( void );
965 
966 void fli_switch_target( FLI_TARGET * );
967 
968 void fli_restore_target( void );
969 
970 void fli_draw_text_inside( int align,
971                            FL_Coord,
972                            FL_Coord,
973                            FL_Coord,
974                            FL_Coord,
975                            const char *,
976                            int,
977                            int,
978                            FL_COLOR,
979                            FL_COLOR,
980                            int );
981 
982 /* Misc. stuff */
983 
984 void fli_add_vertex( FL_Coord x,
985                      FL_Coord y );
986 
987 void fli_add_float_vertex( float x,
988                            float y );
989 
990 void fli_reset_vertex( void );
991 
992 void fli_endpolygon( void );
993 
994 void fli_endclosedline( void );
995 
996 void fli_endline( void );
997 
998 const char * fli_get_xevent_name( const XEvent * );
999 
1000 void fli_set_input_navigate( unsigned int mask );
1001 
1002 void fli_adjust_browser_scrollbar( FL_OBJECT * );
1003 
1004 FL_POPUP * fli_popup_add( Window,
1005                           const char *,
1006                           const char * );
1007 
1008 FL_POPUP_ENTRY * fli_popup_add_entries( FL_POPUP *,
1009                                         const char *,
1010                                         va_list,
1011                                         const char *,
1012                                         int );
1013 
1014 FL_POPUP_ENTRY * fli_popup_insert_entries( FL_POPUP *,
1015                                            FL_POPUP_ENTRY *,
1016                                            const char *,
1017                                            va_list,
1018                                            const char *,
1019                                            int );
1020 
1021 FL_POPUP_ENTRY * fli_popup_insert_items( FL_POPUP       *,
1022                                          FL_POPUP_ENTRY *,
1023                                          FL_POPUP_ITEM  *,
1024                                          const char * );
1025 
1026 void fli_popup_init( void );
1027 
1028 void fli_popup_finish( void );
1029 
1030 int fli_check_popup_exists( FL_POPUP * );
1031 
1032 int fli_check_popup_entry_exists( FL_POPUP_ENTRY * );
1033 
1034 FL_POPUP_RETURN * fli_set_popup_return( FL_POPUP_ENTRY * );
1035 
1036 void fli_popup_reset_counter( FL_POPUP * );
1037 
1038 void fli_free_cursors( void );
1039 
1040 void fli_free_fselectors( void );
1041 
1042 
1043 /*  Some utility stuff */
1044 
1045 typedef struct {
1046     int          val;
1047     const char * name;
1048 } FLI_VN_PAIR;
1049 
1050 int fli_get_vn_value( FLI_VN_PAIR * vn_pair,
1051                       const char  * name );
1052 
1053 const char * fli_get_vn_name( FLI_VN_PAIR * vn_pair,
1054                               int           val );
1055 
1056 #if XlibSpecificationRelease == 6
1057 
1058 #  define IsTab( ksym )  ( ksym == XK_ISO_Left_Tab || ksym== XK_Tab )
1059 
1060 #else
1061 
1062 #  define IsTab( ksym )  ( ksym == XK_Tab )
1063 
1064 #endif
1065 
1066 void fli_set_tab_color( FL_OBJECT * obj,
1067                         FL_COLOR    col1,
1068                         FL_COLOR    col2 );
1069 
1070 void fli_set_tab_lcolor( FL_OBJECT * obj,
1071                          FL_COLOR    lcol );
1072 
1073 void fli_set_tab_lsize( FL_OBJECT * obj,
1074                         int         lsize );
1075 
1076 void fli_set_tab_lstyle( FL_OBJECT * obj,
1077                          int         lstyle );
1078 
1079 void fli_set_tab_lalign( FL_OBJECT * obj,
1080                          int         align );
1081 
1082 void fli_set_tab_bw( FL_OBJECT * obj,
1083                      int         bw );
1084 void fli_textcolor( FL_COLOR col );
1085 
1086 void fli_bk_textcolor( FL_COLOR col );
1087 
1088 char * fli_fix_dirname( char * dir );
1089 
1090 Cursor fli_get_cursor_byname( int name );
1091 
1092 void fli_hide_canvas( FL_OBJECT * ob );
1093 
1094 const char * fli_vclass_name( int n );
1095 
1096 int fli_vclass_val( const char * v );
1097 
1098 void fli_set_ul_property( int prop,
1099                           int thickness );
1100 
1101 int fli_is_valid_dir( const char * name );
1102 
1103 #endif /* ! defined FL_INTERNAL_H */
1104 
1105 
1106 /*
1107  * Local variables:
1108  * tab-width: 4
1109  * indent-tabs-mode: nil
1110  * End:
1111  */
1112