Re: [AD] mouse pointer colors

[ Thread Index | Date Index | More lists.liballeg.org/allegro-developers Archives ]


In reply to Peter Wang <tjaden@xxxxxxxxxx>:
>I don't know if it's worth the trouble and mess to remove the 
>`show_mouse' and `_mouse_screen' references.

The solution isn't really that messy. In the patch I have included, I
have tried to come up with a consistent way to expose interfaces such
that they are only accessible if the user code links in the relevant
object file. To this end, I created some structures, and the constructor
functions sets up those structures to point at the relevant interface.

If the constructor function isn't executed, the interface isn't
available.

I believe all the dependencies for MIDI and for the mouse routines are
now removed, although the patch might be worth looking at to see if it
is at least logical :-)

Whenever somebody spots another similar dependency, they can either copy
this system or get me to do it for them; working in this way, it should
be possible to reduce the overall size of Allegro statically-linked
executables.

Here is the patch:

Index: include/allegro/aintern.h
===================================================================
RCS file: /cvsroot/alleg/allegro/include/allegro/aintern.h,v
retrieving revision 1.18
diff -u -r1.18 aintern.h
--- include/allegro/aintern.h	2001/02/14 23:34:03	1.18
+++ include/allegro/aintern.h	2001/03/04 18:14:46
@@ -830,9 +831,6 @@
 AL_VAR(int, _sound_irq);
 
 
-AL_FUNCPTR(int, _midi_init, (void));
-AL_FUNCPTR(void, _midi_exit, (void));
-
 AL_FUNC(int, _midi_allocate_voice, (int min, int max));
 
 AL_VAR(volatile long, _midi_tick);
@@ -972,6 +970,20 @@
 /* for readbmp.c */
 AL_FUNC(void, register_bitmap_file_type_init, (void));
 
+
+/* for module linking system; see comment in allegro.c */
+struct _AL_LINKER_MIDI {
+    AL_METHOD(int, init, (void));
+    AL_METHOD(void, exit, (void));
+};
+AL_VAR(struct _AL_LINKER_MIDI*, _al_linker_midi);
+
+struct _AL_LINKER_MOUSE {
+    AL_METHOD(void, set_mouse_etc, (void));
+    AL_METHOD(void, show_mouse, (BITMAP*));
+    BITMAP** mouse_screen_ptr;
+};
+AL_VAR(struct _AL_LINKER_MOUSE*, _al_linker_mouse);
 
 #ifdef __cplusplus
    }
Index: src/allegro.c
===================================================================
RCS file: /cvsroot/alleg/allegro/src/allegro.c,v
retrieving revision 1.7
diff -u -r1.7 allegro.c
--- src/allegro.c	2001/02/15 00:56:33	1.7
+++ src/allegro.c	2001/03/04 18:15:13
@@ -196,6 +196,16 @@
 static int (*trace_handler)(AL_CONST char *msg) = NULL;
 
 
+/* module linking system stuff: if an object file is linked in, then its
+ * constructor function is executed; this function should fill in the
+ * data structures below (declared in aintern.h). If the module is not
+ * linked in, then the structure pointers will be null, so we don't need
+ * to bother with that bit of code elsewhere.
+ */
+struct _AL_LINKER_MIDI* _al_linker_midi = 0;
+struct _AL_LINKER_MOUSE* _al_linker_mouse = 0;
+
+
 /* dynamic registration system for cleanup code */
 struct al_exit_func {
    void (*funcptr)(void);
@@ -257,9 +267,11 @@
       /* call constructor functions manually */
       extern void _initialize_datafile_types();
       extern void _midi_constructor();
+      extern void _mouse_constructor();
 
       _initialize_datafile_types();
       _midi_constructor();
+      _mouse_constructor();
    #endif
 
    if (errno_ptr)
Index: src/dispsw.c
===================================================================
RCS file: /cvsroot/alleg/allegro/src/dispsw.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 dispsw.c
--- src/dispsw.c	2000/05/14 20:16:54	1.1.1.1
+++ src/dispsw.c	2001/03/04 18:15:19
@@ -341,8 +341,8 @@
    if (!screen)
       return;
 
-   if (is_same_bitmap(_mouse_screen, screen)) {
-      show_mouse(NULL);
+   if (_al_linker_mouse && is_same_bitmap(*(_al_linker_mouse->mouse_screen_ptr), screen)) {
+      _al_linker_mouse->show_mouse(NULL);
       hadmouse = TRUE;
    }
    else
@@ -357,7 +357,7 @@
    _dispsw_status = switch_mode;
 
    if (hadmouse)
-      show_mouse(screen);
+      _al_linker_mouse->show_mouse(screen);
 }
 
 
@@ -393,8 +393,8 @@
    if (!screen)
       return;
 
-   if (is_same_bitmap(_mouse_screen, screen)) {
-      show_mouse(NULL);
+   if (_al_linker_mouse && is_same_bitmap(*(_al_linker_mouse->mouse_screen_ptr), screen)) {
+      _al_linker_mouse->show_mouse(NULL);
       hadmouse = TRUE;
    }
    else
@@ -419,7 +419,7 @@
    }
 
    if (hadmouse)
-      show_mouse(screen);
+      _al_linker_mouse->show_mouse(screen);
 
    _timer_installed = hadtimer;
 }
Index: src/graphics.c
===================================================================
RCS file: /cvsroot/alleg/allegro/src/graphics.c,v
retrieving revision 1.4
diff -u -r1.4 graphics.c
--- src/graphics.c	2000/12/10 19:16:18	1.4
+++ src/graphics.c	2001/03/04 18:15:24
@@ -380,7 +380,8 @@
 
    /* close down any existing graphics driver */
    if (gfx_driver) {
-      show_mouse(NULL);
+      if(_al_linker_mouse)
+     _al_linker_mouse->show_mouse(NULL);
 
       while (vram_bitmap_list)
 	 destroy_bitmap(vram_bitmap_list->bmp);
@@ -561,7 +562,10 @@
    }
 
    clear(screen);
-   _set_mouse_range();
+
+   if (_al_linker_mouse)
+      _al_linker_mouse->set_mouse_etc();
+
    LOCK_DATA(gfx_driver, sizeof(GFX_DRIVER));
 
    _register_switch_bitmap(screen, NULL);
Index: src/midi.c
===================================================================
RCS file: /cvsroot/alleg/allegro/src/midi.c,v
retrieving revision 1.5
diff -u -r1.5 midi.c
--- src/midi.c	2000/12/05 23:31:16	1.5
+++ src/midi.c	2001/03/04 18:15:34
@@ -1513,9 +1513,13 @@
    CONSTRUCTOR_FUNCTION(void _midi_constructor());
 #endif
 
+static struct _AL_LINKER_MIDI midi_linker = {
+    midi_init,
+    midi_exit
+};
+
 void _midi_constructor()
 {
-   _midi_init = midi_init;
-   _midi_exit = midi_exit;
+    _al_linker_midi = &midi_linker;
 }
 
Index: src/mouse.c
===================================================================
RCS file: /cvsroot/alleg/allegro/src/mouse.c,v
retrieving revision 1.6
diff -u -r1.6 mouse.c
--- src/mouse.c	2001/03/03 00:17:28	1.6
+++ src/mouse.c	2001/03/04 18:15:40
@@ -773,11 +773,11 @@
 
 
 
-/* _set_mouse_range:
+/* set_mouse_etc:
  *  Hook for setting up the motion range, cursor graphic, etc, called by
  *  the mouse init and whenever we change the graphics mode.
  */
-void _set_mouse_range()
+static void set_mouse_etc(void)
 {
    if ((!mouse_driver) || (!gfx_driver))
       return;
@@ -905,7 +905,7 @@
 
    _mouse_installed = TRUE;
 
-   _set_mouse_range();
+   set_mouse_etc();
    _add_exit_func(remove_mouse);
 
    if (mouse_driver->timer_poll)
@@ -955,3 +955,22 @@
 
    _remove_exit_func(remove_mouse);
 }
+
+/* _mouse_constructor:
+ *  Register mouse functions if this object file is linked in.
+ */
+#ifdef CONSTRUCTOR_FUNCTION
+   CONSTRUCTOR_FUNCTION(void _mouse_constructor());
+#endif
+
+static struct _AL_LINKER_MOUSE mouse_linker = {
+    set_mouse_etc,
+    show_mouse,
+    &_mouse_screen
+};
+
+void _mouse_constructor()
+{
+    _al_linker_mouse = &mouse_linker;
+}
+
Index: src/sound.c
===================================================================
RCS file: /cvsroot/alleg/allegro/src/sound.c,v
retrieving revision 1.3
diff -u -r1.3 sound.c
--- src/sound.c	2000/07/29 10:18:44	1.3
+++ src/sound.c	2001/03/04 18:15:49
@@ -153,11 +153,8 @@
 static void update_sweeps(void);
 static void sound_lock_mem(void);
 
-int (*_midi_init)(void) = NULL;
-void (*_midi_exit)(void) = NULL;
 
 
-
 /* read_sound_config:
  *  Helper for reading the sound hardware configuration data.
  */
@@ -313,8 +310,8 @@
       _phys_voice[c].num = -1;
 
    /* initialise the MIDI file player */
-   if (_midi_init)
-      if (_midi_init() != 0)
+   if (_al_linker_midi)
+      if (_al_linker_midi->init() != 0)
 	 return -1;
 
    usetc(allegro_error, 0);
@@ -360,8 +357,8 @@
 	 digi_driver = digi_drivers[c].driver;
 	 if (!digi_driver->detect(FALSE)) {
 	    digi_driver = &digi_none; 
-	    if (_midi_exit)
-	       _midi_exit();
+	    if (_al_linker_midi)
+	       _al_linker_midi->exit();
 	    if (!ugetc(allegro_error))
 	       ustrcpy(allegro_error, get_config_text("Digital sound driver not found"));
 	    return -1;
@@ -402,8 +399,8 @@
 	 if (!midi_driver->detect(FALSE)) {
 	    digi_driver = &digi_none; 
 	    midi_driver = &midi_none; 
-	    if (_midi_exit)
-	       _midi_exit();
+	    if (_al_linker_midi)
+	       _al_linker_midi->exit();
 	    if (!ugetc(allegro_error))
 	       ustrcpy(allegro_error, get_config_text("MIDI music driver not found"));
 	    return -1;
@@ -452,8 +449,8 @@
       usprintf(allegro_error, get_config_text("Insufficient %s voices available"), (digi_voices > DIGI_VOICES) ? get_config_text("digital") : get_config_text("MIDI"));
       digi_driver = &digi_none; 
       midi_driver = &midi_none; 
-      if (_midi_exit)
-	 _midi_exit();
+      if (_al_linker_midi)
+	 _al_linker_midi->exit();
       return -1;
    }
 
@@ -461,8 +458,8 @@
    if (digi_driver->init(FALSE, digi_voices) != 0) {
       digi_driver = &digi_none; 
       midi_driver = &midi_none; 
-      if (_midi_exit)
-	 _midi_exit();
+      if (_al_linker_midi)
+	 _al_linker_midi->exit();
       if (!ugetc(allegro_error))
 	 ustrcpy(allegro_error, get_config_text("Failed to init digital sound driver"));
       return -1;
@@ -473,8 +470,8 @@
       digi_driver->exit(FALSE);
       digi_driver = &digi_none; 
       midi_driver = &midi_none; 
-      if (_midi_exit)
-	 _midi_exit();
+      if (_al_linker_midi)
+	 _al_linker_midi->exit();
       if (!ugetc(allegro_error))
 	 ustrcpy(allegro_error, get_config_text("Failed to init MIDI music driver"));
       return -1;
@@ -491,8 +488,8 @@
       digi_driver->exit(FALSE);
       digi_driver = &digi_none; 
       midi_driver = &midi_none; 
-      if (_midi_exit)
-	 _midi_exit();
+      if (_al_linker_midi)
+	 _al_linker_midi->exit();
       return -1;
    }
 
@@ -668,8 +665,8 @@
 	 if (_voice[c].sample)
 	    deallocate_voice(c);
 
-      if (_midi_exit)
-	 _midi_exit();
+      if (_al_linker_midi)
+	 _al_linker_midi->exit();
 
       midi_driver->exit(FALSE);
       midi_driver = &midi_none; 
Also, a very small change to fix a potential bug in sound.c:

--- sound.old	Sun Mar  4 18:21:22 2001
+++ sound.c	Sun Mar  4 18:21:40 2001
@@ -113,7 +113,7 @@
 int digi_card = DIGI_AUTODETECT;          /* current driver ID numbers */
 int midi_card = MIDI_AUTODETECT;
 
-int digi_input_card = MIDI_AUTODETECT;
+int digi_input_card = DIGI_AUTODETECT;
 int midi_input_card = MIDI_AUTODETECT;
 
 DIGI_DRIVER *digi_driver = &digi_none;    /* these things do all the work */
Bye for now,
-- 
Laurence Withers, lwithers@xxxxxxxxxx
                http://www.lwithers.demon.co.uk/

Attachment: signature.asc
Description: PGP signature



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/