File 1174-wx-add-object-set-check-funcions.patch of Package erlang

From a3a5bcab69695b7bfe8a77f4c1b245a1b58fb5fb Mon Sep 17 00:00:00 2001
From: Dan Gudmundsson <dgud@erlang.org>
Date: Wed, 30 Mar 2016 09:48:30 +0200
Subject: [PATCH] wx: add object set/check funcions

Needed functionality, to avoid abusing opauqe objects.
---
 lib/wx/src/wx.erl              |  6 +++++-
 lib/wx/src/wx_object.erl       |  8 +++++++-
 lib/wx/test/wx_basic_SUITE.erl |  9 ++++++++-
 lib/wx/test/wx_obj_test.erl    | 11 ++++++++---
 4 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/lib/wx/src/wx.erl b/lib/wx/src/wx.erl
index a1a9344..6498b58 100644
--- a/lib/wx/src/wx.erl
+++ b/lib/wx/src/wx.erl
@@ -66,7 +66,7 @@
 	 get_env/0,set_env/1, debug/1,
 	 batch/1,foreach/2,map/2,foldl/3,foldr/3,
 	 getObjectType/1, typeCast/2,
-	 null/0, is_null/1]).
+	 null/0, is_null/1, equal/2]).
 
 -export([create_memory/1, get_memory_bin/1,
 	 retain_memory/1, release_memory/1]).
@@ -153,6 +153,10 @@ null() ->
 -spec is_null(wx_object()) -> boolean().
 is_null(#wx_ref{ref=NULL}) -> NULL =:= 0.
 
+%% @doc Returns true if both arguments references the same object, false otherwise
+-spec equal(wx_object(), wx_object()) -> boolean().
+equal(#wx_ref{ref=Ref1}, #wx_ref{ref=Ref2}) -> Ref1 =:= Ref2.
+
 %% @doc Returns the object type
 -spec getObjectType(wx_object()) -> atom().
 getObjectType(#wx_ref{type=Type}) ->
diff --git a/lib/wx/src/wx_object.erl b/lib/wx/src/wx_object.erl
index a2acbb0..c22a083 100644
--- a/lib/wx/src/wx_object.erl
+++ b/lib/wx/src/wx_object.erl
@@ -107,7 +107,8 @@
 	 call/2, call/3,
 	 cast/2,
 	 reply/2,
-	 get_pid/1
+	 get_pid/1,
+	 set_pid/2
 	]).
 
 %% -export([behaviour_info/1]).
@@ -306,6 +307,11 @@ cast(Name, Request) when is_atom(Name) orelse is_pid(Name) ->
 get_pid(#wx_ref{state=Pid}) when is_pid(Pid) ->
     Pid.
 
+%% @spec (Ref::wxObject(), pid()) -> wxObject()
+%% @doc Sets the controlling process of the object handle.
+set_pid(#wx_ref{}=R, Pid) when is_pid(Pid) ->
+    R#wx_ref{state=Pid}.
+
 %% -----------------------------------------------------------------
 %% Send a reply to the client.
 %% -----------------------------------------------------------------
diff --git a/lib/wx/test/wx_basic_SUITE.erl b/lib/wx/test/wx_basic_SUITE.erl
index 5fe0de4..f89f252 100644
--- a/lib/wx/test/wx_basic_SUITE.erl
+++ b/lib/wx/test/wx_basic_SUITE.erl
@@ -361,7 +361,8 @@ wx_object(Config) ->
     wx:new(),
     Me = self(),
     Init = fun() ->
-		   Frame = wxFrame:new(wx:null(), ?wxID_ANY, "Test wx_object", [{size, {500, 400}}]),
+		   Frame0 = wxFrame:new(wx:null(), ?wxID_ANY, "Test wx_object", [{size, {500, 400}}]),
+		   Frame = wx_object:set_pid(Frame0, self()),
 		   Sz = wxBoxSizer:new(?wxHORIZONTAL),
 		   Panel = wxPanel:new(Frame),
 		   wxSizer:add(Sz, Panel, [{flag, ?wxEXPAND}, {proportion, 1}]),
@@ -371,6 +372,7 @@ wx_object(Config) ->
 		   {Frame, {Frame, Panel}}
 	   end,
     Frame = ?mt(wxFrame, wx_obj_test:start([{init, Init}])),
+
     timer:sleep(500),
     ?m(ok, check_events(flush())),
 
@@ -378,6 +380,11 @@ wx_object(Config) ->
     ?m({call, foobar, {Me, _}}, wx_object:call(Frame, foobar)),
     ?m(ok, wx_object:cast(Frame, foobar2)),
     ?m([{cast, foobar2}|_], flush()),
+
+    ?m(Frame, wx_obj_test:who_are_you(Frame)),
+    {call, {Frame,Panel}, _} = wx_object:call(Frame, fun(US) -> US end),
+    ?m(false, wxWindow:getParent(Panel) =:= Frame),
+    ?m(true, wx:equal(wxWindow:getParent(Panel),Frame)),
     FramePid = wx_object:get_pid(Frame),
     io:format("wx_object pid ~p~n",[FramePid]),
     FramePid ! foo3,
diff --git a/lib/wx/test/wx_obj_test.erl b/lib/wx/test/wx_obj_test.erl
index cf99728..23142e2 100644
--- a/lib/wx/test/wx_obj_test.erl
+++ b/lib/wx/test/wx_obj_test.erl
@@ -19,13 +19,13 @@
 -module(wx_obj_test).
 -include_lib("wx/include/wx.hrl").
 
--export([start/1, stop/1]).
+-export([start/1, stop/1, who_are_you/1]).
 
 %% wx_object callbacks
 -export([init/1, handle_info/2, terminate/2, code_change/3, handle_call/3,
 	 handle_sync_event/3, handle_event/2, handle_cast/2]).
 
--record(state, {parent, opts, user_state}).
+-record(state, {parent, me, opts, user_state}).
 
 start(Opts) ->
     wx_object:start_link(?MODULE, [{parent, self()}| Opts], []).
@@ -33,12 +33,15 @@ start(Opts) ->
 stop(Object) ->
     wx_object:stop(Object).
 
+who_are_you(Object) ->
+    wx_object:call(Object, who_are_you).
+
 init(Opts) ->
     Parent = proplists:get_value(parent, Opts),
     put(parent_pid, Parent),
     Init = proplists:get_value(init, Opts),
     {Obj, UserState} = Init(),
-    {Obj, #state{parent=Parent, opts=Opts, user_state=UserState}}.
+    {Obj, #state{me=Obj, parent=Parent, opts=Opts, user_state=UserState}}.
 
 handle_sync_event(Event = #wx{obj=Panel, event=#wxPaint{}},
 		  WxEvent, #state{parent=Parent, user_state=US, opts=Opts}) ->
@@ -59,6 +62,8 @@ handle_event(Event, State = #state{parent=Parent}) ->
     Parent ! {event, Event},
     {noreply, State}.
 
+handle_call(who_are_you, _From, State = #state{me=Me}) ->
+    {reply, Me, State};
 handle_call(What, From, State = #state{user_state=US}) when is_function(What) ->
     Result = What(US),
     {reply, {call, Result, From}, State};
-- 
2.1.4

openSUSE Build Service is sponsored by