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_from_dir/2,
   22                 plgi_current_namespace/1,
   23
   24                 plgi_registered_namespace/1,
   25                 plgi_registered_callback/1,
   26                 plgi_registered_enum/1,
   27                 plgi_registered_object/1,
   28                 plgi_registered_struct/1,
   29                 plgi_registered_union/1,
   30
   31                 plgi_struct_new/2,
   32                 plgi_struct_get_field/3,
   33                 plgi_struct_set_field/3,
   34                 plgi_struct_term/2,
   35
   36                 plgi_union_new/2,
   37                 plgi_union_get_field/3,
   38                 plgi_union_set_field/3,
   39
   40                 plgi_enum_value/2,
   41
   42                 plgi_version/1,
   43
   44                 plgi_debug/1
   45                ]).   46
   47:- use_foreign_library(foreign(plgi), install_plgi).   48
   49:- dynamic   user:file_search_path/2.   50:- multifile user:file_search_path/2.   51
   52user:file_search_path(plgi, library(plgi)).
   53
   54
   55
   56plgi_use_namespace(Namespace) :-
   57	plgi_load_namespace(Namespace),
   58	plgi_import_namespace(Namespace),
   59	plgi_namespace_deps(Namespace, Dependencies),
   60	forall(member(Dependency, Dependencies),
   61	       plgi_use_namespace(Dependency)
   62	      ).
   63
   64plgi_use_namespace_from_dir(Namespace, Directory) :-
   65	plgi_load_namespace_from_dir(Namespace, Directory),
   66	plgi_import_namespace(Namespace).
   67
   68plgi_import_namespace(Namespace) :-
   69	(   plgi_overrides_module(Namespace, OverridesModule)
   70	->  use_module(plgi(Namespace)),
   71	    forall(( current_predicate(OverridesModule:Name/Arity),
   72	             functor(Head, Name, Arity),
   73	             predicate_property(OverridesModule:Head, exported)
   74	           ),
   75	           ( user:import(OverridesModule:Name/Arity)
   76	           )
   77	          )
   78	;   true
   79	),
   80	forall(( current_predicate(Namespace:Predicate),
   81                 \+ current_predicate(user:Predicate)
   82               ),
   83	       ( Namespace:export(Predicate),
   84	         user:import(Namespace:Predicate)
   85	       )
   86	      ).
   87
   88
   89:- multifile
   90	prolog:message/3.   91
   92prolog:error_message(plgi_error(Message)) -->
   93	[ 'PLGI Error: ~w'-[Message] ].
   94
   95prolog:error_message(glib_error(Domain, Code, Message)) -->
   96	[ 'GLib Error: [~w:~w] ~w'-[Domain, Code, Message] ].
   97
   98prolog:message(plgi_warning(Message)) -->
   99	[ 'PLGI Warning: ~w'-[Message] ].
  100
  101
  102plgi_overrides_module('GLib',    'GLib_overrides').
  103plgi_overrides_module('GObject', 'GObject_overrides').
  104plgi_overrides_module('Gtk',     'Gtk_overrides')