1/*  This file is part of PLGI.
    2
    3    Copyright (C) 2015 Keri Harris <keri@gentoo.org>
    4
    5    PLGI is free software: you can redistribute it and/or modify
    6    it under the terms of the GNU Lesser General Public License as
    7    published by the Free Software Foundation, either version 2.1
    8    of the License, or (at your option) any later version.
    9
   10    PLGI is distributed in the hope that it will be useful,
   11    but WITHOUT ANY WARRANTY; without even the implied warranty of
   12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   13    GNU General Public License for more details.
   14
   15    You should have received a copy of the GNU General Public License
   16    along with PLGI.  If not, see <http://www.gnu.org/licenses/>.
   17*/
   18
   19:- module(plgi, [
   20                 plgi_use_namespace/1,
   21                 plgi_use_namespace/2,
   22                 plgi_use_namespace_from_dir/2,
   23                 plgi_current_namespace/1,
   24
   25                 plgi_registered_namespace/1,
   26                 plgi_registered_callback/1,
   27                 plgi_registered_enum/1,
   28                 plgi_registered_object/1,
   29                 plgi_registered_struct/1,
   30                 plgi_registered_union/1,
   31
   32                 plgi_struct_new/2,
   33                 plgi_struct_get_field/3,
   34                 plgi_struct_set_field/3,
   35                 plgi_struct_term/2,
   36
   37                 plgi_union_new/2,
   38                 plgi_union_get_field/3,
   39                 plgi_union_set_field/3,
   40
   41                 plgi_enum_value/2,
   42
   43                 plgi_version/1,
   44
   45                 plgi_debug/1
   46                ]).   47
   48:- use_foreign_library(foreign(plgi), install_plgi).   49
   50:- dynamic   user:file_search_path/2.   51:- multifile user:file_search_path/2.   52
   53user:file_search_path(plgi, library(plgi)).
   54
   55
   56
   57plgi_use_namespace(Namespace) :-
   58	plgi_load_namespace(Namespace),
   59	plgi_import_namespace(Namespace),
   60	plgi_namespace_deps(Namespace, Dependencies),
   61	forall(member(Dependency, Dependencies),
   62	       plgi_use_namespace(Dependency)
   63	      ).
   64
   65plgi_use_namespace(Namespace, Version) :-
   66	plgi_load_namespace_version(Namespace, Version),
   67	plgi_import_namespace(Namespace),
   68	plgi_namespace_deps(Namespace, Dependencies),
   69	forall(member(Dependency, Dependencies),
   70	       plgi_use_namespace(Dependency)
   71	      ).
   72
   73plgi_use_namespace_from_dir(Namespace, Directory) :-
   74	plgi_load_namespace_from_dir(Namespace, Directory),
   75	plgi_import_namespace(Namespace).
   76
   77plgi_import_namespace(Namespace) :-
   78	(   plgi_overrides_module(Namespace, OverridesModule)
   79	->  use_module(plgi(Namespace)),
   80	    forall(( current_predicate(OverridesModule:Name/Arity),
   81	             functor(Head, Name, Arity),
   82	             predicate_property(OverridesModule:Head, exported)
   83	           ),
   84	           ( user:import(OverridesModule:Name/Arity)
   85	           )
   86	          )
   87	;   true
   88	),
   89	forall(( current_predicate(Namespace:Predicate),
   90                 \+ current_predicate(user:Predicate)
   91               ),
   92	       ( Namespace:export(Predicate),
   93	         user:import(Namespace:Predicate)
   94	       )
   95	      ).
   96
   97
   98:- multifile
   99	prolog:message/3.  100
  101prolog:error_message(plgi_error(Message)) -->
  102	[ 'PLGI Error: ~w'-[Message] ].
  103
  104prolog:error_message(glib_error(Domain, Code, Message)) -->
  105	[ 'GLib Error: [~w:~w] ~w'-[Domain, Code, Message] ].
  106
  107prolog:message(plgi_warning(Message)) -->
  108	[ 'PLGI Warning: ~w'-[Message] ].
  109
  110
  111plgi_overrides_module('GLib',    'GLib_overrides').
  112plgi_overrides_module('GObject', 'GObject_overrides').
  113plgi_overrides_module('Gtk',     'Gtk_overrides')