aboutsummaryrefslogtreecommitdiffstats
path: root/lib/tv/src/tv_pw.erl
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
committerErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
commit84adefa331c4159d432d22840663c38f155cd4c1 (patch)
treebff9a9c66adda4df2106dfd0e5c053ab182a12bd /lib/tv/src/tv_pw.erl
downloadotp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz
otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2
otp-84adefa331c4159d432d22840663c38f155cd4c1.zip
The R13B03 release.OTP_R13B03
Diffstat (limited to 'lib/tv/src/tv_pw.erl')
-rw-r--r--lib/tv/src/tv_pw.erl327
1 files changed, 327 insertions, 0 deletions
diff --git a/lib/tv/src/tv_pw.erl b/lib/tv/src/tv_pw.erl
new file mode 100644
index 0000000000..8b3186e090
--- /dev/null
+++ b/lib/tv/src/tv_pw.erl
@@ -0,0 +1,327 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%%*********************************************************************
+%%%
+%%% Description: Code for pw, the window controlling part of the table tool.
+%%%
+%%%*********************************************************************
+
+
+-module(tv_pw).
+
+
+
+-export([pw/1]).
+
+
+
+
+-include("tv_int_def.hrl").
+-include("tv_int_msg.hrl").
+-include("tv_pw_int_def.hrl").
+
+
+
+
+
+
+
+%%%*********************************************************************
+%%% EXTERNAL FUNCTIONS
+%%%*********************************************************************
+
+
+
+
+%%======================================================================
+%% Function: pw.
+%%
+%% Return Value: None.
+%%
+%% Description: Process controlling the graphical window, as well as the
+%% menubuttons.
+%%
+%% Parameters: None.
+%%======================================================================
+
+
+
+pw(Master) ->
+ process_flag(trap_exit, true),
+ ProcVars = #process_variables{master_pid = Master},
+ blocked(ProcVars).
+
+
+
+
+
+
+
+
+
+%%%********************************************************************
+%%% INTERNAL FUNCTIONS
+%%%********************************************************************
+
+
+
+
+
+%%======================================================================
+%% Function: blocked.
+%%
+%% Return Value: None.
+%%
+%% Description: When started or explicitly blocked, pw enters this state,
+%% where nothing is performed until the module explicitly is
+%% deblocked.
+%%
+%% Parameters:
+%%======================================================================
+
+
+blocked(ProcVars) ->
+ receive
+ Msg ->
+ case Msg of
+ #pw_deblock{} ->
+ deblock(Msg, ProcVars);
+ _Other ->
+ blocked(ProcVars)
+ end
+ end.
+
+
+
+
+
+
+
+
+
+%%======================================================================
+%% Function: deblocked.
+%%
+%% Return Value: None.
+%%
+%% Description: When deblocked, a window shall be created according to
+%% specification received in pw_deblock message.
+%%
+%% Parameters: Rec: received pw_deblock message.
+%%======================================================================
+
+
+
+deblock(Msg, ProcVars) ->
+ #process_variables{window_params = WinP,
+ menu_params = MenuP} = ProcVars,
+
+ NewWinP = ?WIN_FUNC_FILE:create_window(Msg, WinP),
+ NewMenuP = ?WIN_FUNC_FILE:create_menubar(NewWinP, MenuP),
+
+ Sender = Msg#pw_deblock.sender,
+ Sender ! #pw_deblock_cfm{sender = self(),
+ win_id = NewWinP#window_params.window_id
+ },
+
+ NewProcVars = ProcVars#process_variables{window_params = NewWinP,
+ menu_params = NewMenuP
+ },
+ deblocked_loop(NewProcVars).
+
+
+
+
+
+
+
+
+
+
+%%======================================================================
+%% Function:
+%%
+%% Return Value:
+%%
+%% Description:
+%%
+%% Parameters:
+%%======================================================================
+
+
+deblocked_loop(ProcVars) ->
+ receive
+ Msg ->
+ case Msg of
+
+ {gs, Id, Event, Data, Args} ->
+ NewProcVars = gs_messages({Id, Event, Data, Args}, ProcVars),
+ deblocked_loop(NewProcVars);
+
+ % Messages from pc!
+ #pw_select_menu{menu=Menu} ->
+ gs:config(Menu, [{select,true}]),
+ deblocked_loop(ProcVars);
+
+ #pw_create_menu{} ->
+ NewProcVars = ?WIN_FUNC_FILE:create_menu(Msg, ProcVars),
+ % Send confirmation...
+ Sender = Msg#pw_create_menu.sender,
+ Sender ! #pw_create_menu_cfm{sender = self()},
+ deblocked_loop(NewProcVars);
+
+ #pw_set_window_title{win_title = WinTitle} ->
+ WinP = ProcVars#process_variables.window_params,
+ gs:config(WinP#window_params.window_id, [{title, "[TV] " ++ WinTitle}]),
+ NewWinP = WinP#window_params{window_title = WinTitle},
+ NewProcVars = ProcVars#process_variables{window_params = NewWinP},
+ deblocked_loop(NewProcVars);
+
+ #pw_deblock{} ->
+ deblock(Msg, ProcVars);
+
+ % Exit signals!
+ {'EXIT', Pid, Reason} ->
+ MasterPid = ProcVars#process_variables.master_pid,
+ exit_signals({Pid, Reason}, MasterPid),
+ deblocked_loop(ProcVars);
+
+ _Other ->
+ deblocked_loop(ProcVars)
+
+ end
+ end.
+
+
+
+
+
+
+
+
+
+%%======================================================================
+%% Function:
+%%
+%% Return Value:
+%%
+%% Description:
+%%
+%% Parameters:
+%%======================================================================
+
+
+exit_signals(Exit_info, MasterPid) ->
+ case Exit_info of
+ {MasterPid, _Reason} -> % When from master, just quit!
+ exit(normal);
+ _Other ->
+ done
+ end.
+
+
+
+
+
+
+
+
+
+
+%%======================================================================
+%% Function:
+%%
+%% Return Value:
+%%
+%% Description:
+%%
+%% Parameters:
+%%======================================================================
+
+
+gs_messages(Msg, ProcVars) ->
+ MasterPid = ProcVars#process_variables.master_pid,
+ case Msg of
+
+ {_Id, click, Data, _Args} ->
+ MasterPid ! #pc_menu_msg{sender = self(),
+ data = Data},
+ ProcVars;
+
+ {_Win, keypress, _Data, [Key, _ , _, 1 | _T]} ->
+ MenuP = ProcVars#process_variables.menu_params,
+ ShortcutList = MenuP#menu_params.shortcuts,
+ send_shortcut_data(Key, ShortcutList, MasterPid),
+ ProcVars;
+
+ Msg0 = {Win, configure, _, _} ->
+ {Win, configure, _, [W, H | _T]} = flush_msgs(Msg0),
+ WinP = ProcVars#process_variables.window_params,
+ #window_params{window_id = WindowId,
+ min_window_width = MinAllowedWidth,
+ min_window_height = MinAllowedHeight} = WinP,
+ FinalWidth = ?COMM_FUNC_FILE:max(W, MinAllowedWidth),
+ FinalHeight = ?COMM_FUNC_FILE:max(H, MinAllowedHeight),
+ ?WIN_FUNC_FILE:resize_window(WindowId, FinalWidth, FinalHeight),
+ MasterPid ! #pc_win_conf{sender = self(),
+ width = FinalWidth,
+ height = FinalHeight},
+ NewWinP = WinP#window_params{window_width = FinalWidth,
+ window_height = FinalHeight
+ },
+ ProcVars#process_variables{window_params = NewWinP};
+
+ {_Win, destroy, _Data, _Args} ->
+ exit(normal);
+
+ _Other ->
+ ProcVars
+ end.
+
+flush_msgs(Msg0 = {Win, Op, _, _}) ->
+ receive {gs, Win,Op,D,P} ->
+ flush_msgs({Win,Op,D,P})
+ after 200 ->
+ Msg0
+ end.
+
+send_shortcut_data(_Key, [], _MasterPid) ->
+ done;
+send_shortcut_data(Key, ShortcutList, MasterPid) ->
+ case lists:keysearch(Key, 1, ShortcutList) of
+ {value, {Key, Data}} ->
+ MasterPid ! #pc_menu_msg{sender = self(),
+ data = Data};
+ false ->
+ done
+ end.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+