There is a problem as I understand it with checking for the SC_MARK_AVAILABLE marker to see if a marker is available...
Markers seem by default to be set to 0 (SC_MARK_CIRCLE) by scintilla. So there is no way to tell if a marker is being used with the default marker icon (SC_MARK_CIRCLE), or is not being used. The following code dropped in anywhere that it will get run (I placed it in the DefineMarkers function of geanynummberedbookmarks) will demonstrate:
GtkWidget *dialog; gchar temp[10000]; gint m[32]; for(i=0;i<32;i++) m[i]=scintilla_send_message(sci,SCI_MARKERSYMBOLDEFINED,i,0); sprintf(temp,"%d %d %d %d %d %d %d %d\n%d %d %d %d %d %d %d %d\n%d %d %d %d %d %d %d %d\n%d %d %d %d %d %d %d %d",m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8],m[9],m[10],m[11],m[12],m[13],m[14],m[15],m[16],m[17],m[18],m[19],m[20],m[21],m[22],m[23],m[24],m[25],m[26],m[27],m[28],m[29],m[30],m[31]); dialog=gtk_message_dialog_new(GTK_WINDOW(geany->main_widgets->window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_NONE, "%s",temp); gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Okay"),GTK_RESPONSE_OK); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); g_free(temp);
This displays the value of each marker, and those that aren't being used for anything are showing up as 0, and not 28 (SC_MARK_AVAILABLE).
I can see 4 options, and I'd like to see what people think about them, or if they can think of any better solutions: 1) agree between plugin developers which markers they will use and use them staticly (as we are now, but ensuring they don't overlap) 2) change scintilla or geany so that markers are set to SC_MARK_AVAILABLE when it is initialised. 3) Have a plugin that is run before any others or some static code usable by all plugins that sets all editor unused markers to SC_MARK_AVAILABLE ready for the other plugins. 4) Have an option in the preferences for each plugin that uses markers to allow users to define which markers are to be used by that plugin.
There are pros & cons to each of these:
With option 1 we will probably run out of markers for anyone wanting to develop a new plugin. Also would have to change code if editor's use of markers changed. It is easiest to implement here and now.
Option 2 would be the most versatile in the long run, but would require altering someone else's project purely for our own devices, and it would require anyone using a plugin using markers to have to use the latest version of geany.
Option 3 would mean we could handle marker allocation in-house, but would require an extra plugin, and can we ensure that it would be loaded before any other plugin? Or would we agree that any plugin using markers would have to access a shared piece of code that's keeping track of which markers are being used to see what's available?
Option 4 would be simple for us to implement, but would be messy, and complicated for the user (like having to set IRQ numbers in the old day to get your PC to work).
My personal preference would be some shared static function that any plugin using markers could access.
Looking forward to your opinions.
William Fraser