File otp_src_19.0.5-lib-gs.patch of Package erlang
diff -Ndurp otp_src_19.0.5/lib/gs/src/gse.erl otp_src_19.0.5-lib-gs/lib/gs/src/gse.erl
--- otp_src_19.0.5/lib/gs/src/gse.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gse.erl 2016-08-25 16:37:44.560693435 +0300
@@ -24,72 +24,72 @@
%%%----------------------------------------------------------------------
-module(gse).
--compile([{nowarn_deprecated_function,{gs,arc,2}},
- {nowarn_deprecated_function,{gs,arc,3}},
- {nowarn_deprecated_function,{gs,button,2}},
- {nowarn_deprecated_function,{gs,button,3}},
- {nowarn_deprecated_function,{gs,canvas,2}},
- {nowarn_deprecated_function,{gs,canvas,3}},
- {nowarn_deprecated_function,{gs,checkbutton,2}},
- {nowarn_deprecated_function,{gs,checkbutton,3}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,create,4}},
- {nowarn_deprecated_function,{gs,create_tree,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,editor,2}},
- {nowarn_deprecated_function,{gs,editor,3}},
- {nowarn_deprecated_function,{gs,entry,2}},
- {nowarn_deprecated_function,{gs,entry,3}},
- {nowarn_deprecated_function,{gs,frame,2}},
- {nowarn_deprecated_function,{gs,frame,3}},
- {nowarn_deprecated_function,{gs,grid,2}},
- {nowarn_deprecated_function,{gs,grid,3}},
- {nowarn_deprecated_function,{gs,gridline,2}},
- {nowarn_deprecated_function,{gs,gridline,3}},
- {nowarn_deprecated_function,{gs,image,2}},
- {nowarn_deprecated_function,{gs,image,3}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,label,3}},
- {nowarn_deprecated_function,{gs,line,2}},
- {nowarn_deprecated_function,{gs,line,3}},
- {nowarn_deprecated_function,{gs,listbox,2}},
- {nowarn_deprecated_function,{gs,listbox,3}},
- {nowarn_deprecated_function,{gs,menu,2}},
- {nowarn_deprecated_function,{gs,menu,3}},
- {nowarn_deprecated_function,{gs,menubar,2}},
- {nowarn_deprecated_function,{gs,menubar,3}},
- {nowarn_deprecated_function,{gs,menubutton,2}},
- {nowarn_deprecated_function,{gs,menubutton,3}},
- {nowarn_deprecated_function,{gs,menuitem,2}},
- {nowarn_deprecated_function,{gs,menuitem,3}},
- {nowarn_deprecated_function,{gs,message,2}},
- {nowarn_deprecated_function,{gs,message,3}},
- {nowarn_deprecated_function,{gs,oval,2}},
- {nowarn_deprecated_function,{gs,oval,3}},
- {nowarn_deprecated_function,{gs,polygon,2}},
- {nowarn_deprecated_function,{gs,polygon,3}},
- {nowarn_deprecated_function,{gs,prompter,2}},
- {nowarn_deprecated_function,{gs,prompter,3}},
- {nowarn_deprecated_function,{gs,radiobutton,2}},
- {nowarn_deprecated_function,{gs,radiobutton,3}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,rectangle,2}},
- {nowarn_deprecated_function,{gs,rectangle,3}},
- {nowarn_deprecated_function,{gs,scale,2}},
- {nowarn_deprecated_function,{gs,scale,3}},
- {nowarn_deprecated_function,{gs,scrollbar,2}},
- {nowarn_deprecated_function,{gs,scrollbar,3}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,start,1}},
- {nowarn_deprecated_function,{gs,text,2}},
- {nowarn_deprecated_function,{gs,text,3}},
- {nowarn_deprecated_function,{gs,window,2}},
- {nowarn_deprecated_function,{gs,window,3}}]).
+
+-compile([{nowarn_deprecated_function, {gs, arc, 2}},
+ {nowarn_deprecated_function, {gs, arc, 3}},
+ {nowarn_deprecated_function, {gs, button, 2}},
+ {nowarn_deprecated_function, {gs, button, 3}},
+ {nowarn_deprecated_function, {gs, canvas, 2}},
+ {nowarn_deprecated_function, {gs, canvas, 3}},
+ {nowarn_deprecated_function, {gs, checkbutton, 2}},
+ {nowarn_deprecated_function, {gs, checkbutton, 3}},
+ {nowarn_deprecated_function, {gs, config, 2}},
+ {nowarn_deprecated_function, {gs, create, 3}},
+ {nowarn_deprecated_function, {gs, create, 4}},
+ {nowarn_deprecated_function, {gs, create_tree, 2}},
+ {nowarn_deprecated_function, {gs, destroy, 1}},
+ {nowarn_deprecated_function, {gs, editor, 2}},
+ {nowarn_deprecated_function, {gs, editor, 3}},
+ {nowarn_deprecated_function, {gs, entry, 2}},
+ {nowarn_deprecated_function, {gs, entry, 3}},
+ {nowarn_deprecated_function, {gs, frame, 2}},
+ {nowarn_deprecated_function, {gs, frame, 3}},
+ {nowarn_deprecated_function, {gs, grid, 2}},
+ {nowarn_deprecated_function, {gs, grid, 3}},
+ {nowarn_deprecated_function, {gs, gridline, 2}},
+ {nowarn_deprecated_function, {gs, gridline, 3}},
+ {nowarn_deprecated_function, {gs, image, 2}},
+ {nowarn_deprecated_function, {gs, image, 3}},
+ {nowarn_deprecated_function, {gs, label, 2}},
+ {nowarn_deprecated_function, {gs, label, 3}},
+ {nowarn_deprecated_function, {gs, line, 2}},
+ {nowarn_deprecated_function, {gs, line, 3}},
+ {nowarn_deprecated_function, {gs, listbox, 2}},
+ {nowarn_deprecated_function, {gs, listbox, 3}},
+ {nowarn_deprecated_function, {gs, menu, 2}},
+ {nowarn_deprecated_function, {gs, menu, 3}},
+ {nowarn_deprecated_function, {gs, menubar, 2}},
+ {nowarn_deprecated_function, {gs, menubar, 3}},
+ {nowarn_deprecated_function, {gs, menubutton, 2}},
+ {nowarn_deprecated_function, {gs, menubutton, 3}},
+ {nowarn_deprecated_function, {gs, menuitem, 2}},
+ {nowarn_deprecated_function, {gs, menuitem, 3}},
+ {nowarn_deprecated_function, {gs, message, 2}},
+ {nowarn_deprecated_function, {gs, message, 3}},
+ {nowarn_deprecated_function, {gs, oval, 2}},
+ {nowarn_deprecated_function, {gs, oval, 3}},
+ {nowarn_deprecated_function, {gs, polygon, 2}},
+ {nowarn_deprecated_function, {gs, polygon, 3}},
+ {nowarn_deprecated_function, {gs, prompter, 2}},
+ {nowarn_deprecated_function, {gs, prompter, 3}},
+ {nowarn_deprecated_function, {gs, radiobutton, 2}},
+ {nowarn_deprecated_function, {gs, radiobutton, 3}},
+ {nowarn_deprecated_function, {gs, read, 2}},
+ {nowarn_deprecated_function, {gs, rectangle, 2}},
+ {nowarn_deprecated_function, {gs, rectangle, 3}},
+ {nowarn_deprecated_function, {gs, scale, 2}},
+ {nowarn_deprecated_function, {gs, scale, 3}},
+ {nowarn_deprecated_function, {gs, scrollbar, 2}},
+ {nowarn_deprecated_function, {gs, scrollbar, 3}},
+ {nowarn_deprecated_function, {gs, start, 0}},
+ {nowarn_deprecated_function, {gs, start, 1}},
+ {nowarn_deprecated_function, {gs, text, 2}},
+ {nowarn_deprecated_function, {gs, text, 3}},
+ {nowarn_deprecated_function, {gs, window, 2}},
+ {nowarn_deprecated_function, {gs, window, 3}}]).
%%-compile(export_all).
--export([
- start/0,
+-export([start/0,
start/1,
create/3,
create_named/4,
@@ -159,10 +159,7 @@
map/1,
unmap/1,
resize/3,
- name_occupied/1
-
- ]).
-
+ name_occupied/1]).
%%
%% gse:start()
@@ -170,15 +167,13 @@
%% An identifier to a top object for the graphic system
%%
%% Errors:
-%% Exits with a {?MODULE,start,Reason} if there is a problem
+%% Exits with a {?MODULE, start, Reason} if there is a problem
%% creating the top level graphic object.
%%
-
start() ->
case gs:start() of
- {error,Reason} ->
- exit({?MODULE, start,Reason});
+ {error, Reason} -> exit({?MODULE, start, Reason});
Return -> Return
end.
@@ -188,25 +183,23 @@ start() ->
%% An identifier to a top object for the graphic system
%%
%% Errors:
-%% Exits with a {?MODULE,start,Reason} if there is a problem
+%% Exits with a {?MODULE, start, Reason} if there is a problem
%% creating the top level graphic object.
%%
-
start(Opts) ->
case gs:start(Opts) of
- {error,Reason} ->
- exit({?MODULE, start,Reason});
+ {error, Reason} -> exit({?MODULE, start, Reason});
Return -> Return
end.
%%
-%% gse:create(Objtype,Parent,Opts) replaces
+%% gse:create(Objtype, Parent, Opts) replaces
%% the unnecessary functions:
-%% gs:create(Obj,Parent)
-%% gs:create(Obj,Parent,Opt)
-%% gs:create(Obj,Parent)
-%% gs:create(Obj,Parent)
+%% gs:create(Obj, Parent)
+%% gs:create(Obj, Parent, Opt)
+%% gs:create(Obj, Parent)
+%% gs:create(Obj, Parent)
%%
%% Returns:
%% An identifier for the created object
@@ -214,21 +207,19 @@ start(Opts) ->
%% Errors: {?MODULE, create, Reason}, where Reason is one of:
%% {no_such_parent, Parent}
%% {unknown_type, Type}
-%% {incvalid_option, Type, {Option,Value}}
+%% {incvalid_option, Type, {Option, Value}}
%%
%%
-create(Objtype,Parent,Opts) when is_list(Opts) ->
- case gs:create(Objtype,Parent,Opts) of
- {error,Reason} ->
- exit({?MODULE, create,Reason});
+create(Objtype, Parent, Opts) when is_list(Opts) ->
+ case gs:create(Objtype, Parent, Opts) of
+ {error, Reason} -> exit({?MODULE, create, Reason});
Return -> Return
end.
-
%%
-%% gse:create_named(Name, Objtype,Parent, Opts) replaces
+%% gse:create_named(Name, Objtype, Parent, Opts) replaces
%% the confusing
-%% gs:create(Name,Objtype, Parent, Opts)
+%% gs:create(Name, Objtype, Parent, Opts)
%%
%% Returns:
%% An identifier for the created object
@@ -236,18 +227,15 @@ create(Objtype,Parent,Opts) when is_list
%% Errors: {?MODULE, create, Reason}, where Reason is one of:
%% {no_such_parent, Parent}
%% {unknown_type, Type}
-%% {incvalid_option, Type, {Option,Value}}
-%% {name_occupied,Name}
+%% {incvalid_option, Type, {Option, Value}}
+%% {name_occupied, Name}
%%
-create_named(Name,Objtype,Parent,Opts) when is_list(Opts) ->
- case gs:create(Objtype,Name,Parent,Opts) of
- {error,Reason} ->
- exit({?MODULE, create_named,Reason});
+create_named(Name, Objtype, Parent, Opts) when is_list(Opts) ->
+ case gs:create(Objtype, Name, Parent, Opts) of
+ {error, Reason} -> exit({?MODULE, create_named, Reason});
Return -> Return
end.
-
-
%%
%% gse:config(Object, Options) replaces
@@ -255,20 +243,18 @@ create_named(Name,Objtype,Parent,Opts) w
%% gs:config(Object, Opt)
%%
-config(Object,Opts) when is_list(Opts) ->
- case gs:config(Object,Opts) of
- {error,Reason} ->
- exit({?MODULE, config,Reason});
+config(Object, Opts) when is_list(Opts) ->
+ case gs:config(Object, Opts) of
+ {error, Reason} -> exit({?MODULE, config, Reason});
Return -> Return
end.
%%
%% gs:read(Object, OptionKey)
%%
-read(Object,OptionKey) ->
- case gs:read(Object,OptionKey) of
- {error,Reason} ->
- exit({?MODULE, read,Reason});
+read(Object, OptionKey) ->
+ case gs:read(Object, OptionKey) of
+ {error, Reason} -> exit({?MODULE, read, Reason});
Return -> Return
end.
@@ -278,8 +264,7 @@ read(Object,OptionKey) ->
destroy(Object)->
case gs:destroy(Object) of
- {error,Reason} ->
- exit({?MODULE, destroy,Reason});
+ {error, Reason} -> exit({?MODULE, destroy, Reason});
Return -> Return
end.
@@ -288,501 +273,144 @@ destroy(Object)->
%%
create_tree(Parent, Tree)->
- case gs:create_tree(Parent,Tree) of
- {error,Reason} ->
- exit({?MODULE, create_tree,Reason});
- Return -> Return
- end.
-
-
-window(Parent,Options) when is_list(Options) ->
- case gs:window(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,window,Reason});
- Return -> Return
- end.
-
-named_window(Name,Parent,Options) when is_list(Options) ->
- case gs:window(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_window,Reason});
- Return -> Return
- end.
-
-
-button(Parent,Options) when is_list(Options) ->
- case gs:button(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,button,Reason});
- Return -> Return
- end.
-
-
-named_button(Name,Parent,Options) when is_list(Options) ->
- case gs:button(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_button,Reason});
- Return -> Return
- end.
-
-
-checkbutton(Parent,Options) when is_list(Options) ->
- case gs:checkbutton(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,checkbutton,Reason});
- Return -> Return
- end.
-
-
-named_checkbutton(Name,Parent,Options) when is_list(Options) ->
- case gs:checkbutton(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_checkbutton,Reason});
- Return -> Return
- end.
-
-
-radiobutton(Parent,Options) when is_list(Options) ->
- case gs:radiobutton(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,radiobutton,Reason});
- Return -> Return
- end.
-
-
-named_radiobutton(Name,Parent,Options) when is_list(Options) ->
- case gs:radiobutton(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_radiobutton,Reason});
- Return -> Return
- end.
-
-
-frame(Parent,Options) when is_list(Options) ->
- case gs:frame(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,frame,Reason});
- Return -> Return
- end.
-
-
-named_frame(Name,Parent,Options) when is_list(Options) ->
- case gs:frame(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_frame,Reason});
- Return -> Return
- end.
-
-
-canvas(Parent,Options) when is_list(Options) ->
- case gs:canvas(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,canvas,Reason});
- Return -> Return
- end.
-
-
-named_canvas(Name,Parent,Options) when is_list(Options) ->
- case gs:canvas(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_canvas,Reason});
- Return -> Return
- end.
-
-
-label(Parent,Options) when is_list(Options) ->
- case gs:label(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,label,Reason});
- Return -> Return
- end.
-
-
-named_label(Name,Parent,Options) when is_list(Options) ->
- case gs:label(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_label,Reason});
- Return -> Return
- end.
-
-
-message(Parent,Options) when is_list(Options) ->
- case gs:message(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,message,Reason});
- Return -> Return
- end.
-
-
-named_message(Name,Parent,Options) when is_list(Options) ->
- case gs:message(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_message,Reason});
- Return -> Return
- end.
-
-
-listbox(Parent,Options) when is_list(Options) ->
- case gs:listbox(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,listbox,Reason});
- Return -> Return
- end.
-
-
-named_listbox(Name,Parent,Options) when is_list(Options) ->
- case gs:listbox(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_listbox,Reason});
- Return -> Return
- end.
-
-
-entry(Parent,Options) when is_list(Options) ->
- case gs:entry(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,entry,Reason});
- Return -> Return
- end.
-
-
-named_entry(Name,Parent,Options) when is_list(Options) ->
- case gs:entry(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_entry,Reason});
- Return -> Return
- end.
-
-
-scrollbar(Parent,Options) when is_list(Options) ->
- case gs:scrollbar(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,scrollbar,Reason});
- Return -> Return
- end.
-
-
-named_scrollbar(Name,Parent,Options) when is_list(Options) ->
- case gs:scrollbar(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_scrollbar,Reason});
- Return -> Return
- end.
-
-
-scale(Parent,Options) when is_list(Options) ->
- case gs:scale(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,scale,Reason});
- Return -> Return
- end.
-
-
-named_scale(Name,Parent,Options) when is_list(Options) ->
- case gs:scale(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_scale,Reason});
- Return -> Return
- end.
-
-
-editor(Parent,Options) when is_list(Options) ->
- case gs:editor(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,editor,Reason});
- Return -> Return
- end.
-
-
-named_editor(Name,Parent,Options) when is_list(Options) ->
- case gs:editor(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_editor,Reason});
- Return -> Return
- end.
-
-
-prompter(Parent,Options) when is_list(Options) ->
- case gs:prompter(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,prompter,Reason});
- Return -> Return
- end.
-
-
-named_prompter(Name,Parent,Options) when is_list(Options) ->
- case gs:prompter(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_prompter,Reason});
- Return -> Return
- end.
-
-
-line(Parent,Options) when is_list(Options) ->
- case gs:line(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,line,Reason});
- Return -> Return
- end.
-
-
-named_line(Name,Parent,Options) when is_list(Options) ->
- case gs:line(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_line,Reason});
- Return -> Return
- end.
-
-
-oval(Parent,Options) when is_list(Options) ->
- case gs:oval(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,oval,Reason});
- Return -> Return
- end.
-
-
-named_oval(Name,Parent,Options) when is_list(Options) ->
- case gs:oval(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_oval,Reason});
- Return -> Return
- end.
-
-
-rectangle(Parent,Options) when is_list(Options) ->
- case gs:rectangle(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,rectangle,Reason});
- Return -> Return
- end.
-
-
-named_rectangle(Name,Parent,Options) when is_list(Options) ->
- case gs:rectangle(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_rectangle,Reason});
- Return -> Return
- end.
-
-
-polygon(Parent,Options) when is_list(Options) ->
- case gs:polygon(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,polygon,Reason});
+ case gs:create_tree(Parent, Tree) of
+ {error, Reason} -> exit({?MODULE, create_tree, Reason});
Return -> Return
end.
-
-named_polygon(Name,Parent,Options) when is_list(Options) ->
- case gs:polygon(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_polygon,Reason});
+-define(OBJECT(O),
+O(Parent, Options) when is_list(Options) ->
+ case gs:O(Parent, Options) of
+ {error, Reason} -> exit({?MODULE, O, Reason});
Return -> Return
- end.
+ end).
-
-text(Parent,Options) when is_list(Options) ->
- case gs:text(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,text,Reason});
+-define(OBJECT(O, NO),
+NO(Name, Parent, Options) when is_list(Options) ->
+ case gs:O(Name, Parent, Options) of
+ {error, Reason} -> exit({?MODULE, NO, Reason});
Return -> Return
- end.
+ end).
+?OBJECT(window).
+?OBJECT(window, named_window).
-named_text(Name,Parent,Options) when is_list(Options) ->
- case gs:text(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_text,Reason});
- Return -> Return
- end.
+?OBJECT(button).
+?OBJECT(button, named_button).
-
-image(Parent,Options) when is_list(Options) ->
- case gs:image(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,image,Reason});
- Return -> Return
- end.
+?OBJECT(checkbutton).
+?OBJECT(checkbutton, named_checkbutton).
+?OBJECT(radiobutton).
+?OBJECT(radiobutton, named_radiobutton).
-named_image(Name,Parent,Options) when is_list(Options) ->
- case gs:image(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_image,Reason});
- Return -> Return
- end.
+?OBJECT(frame).
+?OBJECT(frame, named_frame).
-
-arc(Parent,Options) when is_list(Options) ->
- case gs:arc(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,arc,Reason});
- Return -> Return
- end.
+?OBJECT(canvas).
+?OBJECT(canvas, named_canvas).
+?OBJECT(label).
+?OBJECT(label, named_label).
-named_arc(Name,Parent,Options) when is_list(Options) ->
- case gs:arc(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_arc,Reason});
- Return -> Return
- end.
+?OBJECT(message).
+?OBJECT(message, named_message).
-
-menu(Parent,Options) when is_list(Options) ->
- case gs:menu(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,menu,Reason});
- Return -> Return
- end.
+?OBJECT(listbox).
+?OBJECT(listbox, named_listbox).
+?OBJECT(entry).
+?OBJECT(entry, named_entry).
-named_menu(Name,Parent,Options) when is_list(Options) ->
- case gs:menu(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_menu,Reason});
- Return -> Return
- end.
+?OBJECT(scrollbar).
+?OBJECT(scrollbar, named_scrollbar).
-
-menubutton(Parent,Options) when is_list(Options) ->
- case gs:menubutton(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,menubutton,Reason});
- Return -> Return
- end.
+?OBJECT(scale).
+?OBJECT(scale, named_scale).
+?OBJECT(editor).
+?OBJECT(editor, named_editor).
-named_menubutton(Name,Parent,Options) when is_list(Options) ->
- case gs:menubutton(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_menubutton,Reason});
- Return -> Return
- end.
+?OBJECT(prompter).
+?OBJECT(prompter, named_prompter).
-
-menubar(Parent,Options) when is_list(Options) ->
- case gs:menubar(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,menubar,Reason});
- Return -> Return
- end.
+?OBJECT(line).
+?OBJECT(line, named_line).
+?OBJECT(oval).
+?OBJECT(oval, named_oval).
-named_menubar(Name,Parent,Options) when is_list(Options) ->
- case gs:menubar(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_menubar,Reason});
- Return -> Return
- end.
+?OBJECT(rectangle).
+?OBJECT(rectangle, named_rectangle).
-
-menuitem(Parent,Options) when is_list(Options) ->
- case gs:menuitem(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,menuitem,Reason});
- Return -> Return
- end.
+?OBJECT(polygon).
+?OBJECT(polygon, named_polygon).
+?OBJECT(text).
+?OBJECT(text, named_text).
-named_menuitem(Name,Parent,Options) when is_list(Options) ->
- case gs:menuitem(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_menuitem,Reason});
- Return -> Return
- end.
+?OBJECT(image).
+?OBJECT(image, named_image).
-
-grid(Parent,Options) when is_list(Options) ->
- case gs:grid(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,grid,Reason});
- Return -> Return
- end.
+?OBJECT(arc).
+?OBJECT(arc, named_arc).
+?OBJECT(menu).
+?OBJECT(menu, named_menu).
-named_grid(Name,Parent,Options) when is_list(Options) ->
- case gs:grid(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_grid,Reason});
- Return -> Return
- end.
+?OBJECT(menubutton).
+?OBJECT(menubutton, named_menubutton).
-
-gridline(Parent,Options) when is_list(Options) ->
- case gs:gridline(Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,gridline,Reason});
- Return -> Return
- end.
+?OBJECT(menubar).
+?OBJECT(menubar, named_menubar).
+?OBJECT(menuitem).
+?OBJECT(menuitem, named_menuitem).
-named_gridline(Name,Parent,Options) when is_list(Options) ->
- case gs:gridline(Name, Parent,Options) of
- {error, Reason} ->
- exit({?MODULE,named_gridline,Reason});
- Return -> Return
- end.
+?OBJECT(grid).
+?OBJECT(grid, named_grid).
-
+?OBJECT(gridline).
+?OBJECT(gridline, named_gridline).
%% gs:config - Utility functions
-
%%
%% enable/disable
%%
-enable(Object) ->
- gse:config(Object,[{enable,true}]).
-
-disable(Object) ->
- gse:config(Object,[{enable,false}]).
-
+enable(Object) -> gse:config(Object, [{enable, true}]).
+disable(Object) -> gse:config(Object, [{enable, false}]).
%%
%% select/deselect
%%
-deselect(Object) ->
- gse:config(Object,[{select,false}]).
-
-select(Object) ->
- gse:config(Object,[{select,true}]).
+deselect(Object) -> gse:config(Object, [{select, false}]).
+select(Object) -> gse:config(Object, [{select, true}]).
%%
%% map/unmap
%%
-map(Object) ->
- gse:config(Object,[{map,true}]).
-
-unmap(Object) ->
- gse:config(Object,[{map,false}]).
-
+map(Object) -> gse:config(Object, [{map, true}]).
+unmap(Object) -> gse:config(Object, [{map, false}]).
%%
%% resize
%%
-resize(Object, Width, Height) ->
- gse:config(Object,[{width,Width}, {height, Height}]).
-
+resize(Object, Width, Height) -> gse:config(Object, [{width, Width}, {height, Height}]).
-
%%
%% Misc utility functions
%%
name_occupied(Name) ->
- case gs:read(Name,id) of
- {error,_Reason} ->
- false;
+ case gs:read(Name, id) of
+ {error, _Reason} -> false;
_Id -> true
end.
-
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gs.erl otp_src_19.0.5-lib-gs/lib/gs/src/gs.erl
--- otp_src_19.0.5/lib/gs/src/gs.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gs.erl 2016-08-25 16:37:44.561693414 +0300
@@ -26,42 +26,42 @@
-module(gs).
-deprecated(module).
--compile([{nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,create,4}},
- {nowarn_deprecated_function,{gs,create_tree,2}},
- {nowarn_deprecated_function,{gs,foreach,3}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,1}}]).
+-compile([{nowarn_deprecated_function, {gs, create, 3}},
+ {nowarn_deprecated_function, {gs, create, 4}},
+ {nowarn_deprecated_function, {gs, create_tree, 2}},
+ {nowarn_deprecated_function, {gs, foreach, 3}},
+ {nowarn_deprecated_function, {gs, read, 2}},
+ {nowarn_deprecated_function, {gs, start, 1}}]).
%% ----- Exports -----
-export([start/0, stop/0, start/1]).
-export([create/3, create/4, is_id/1]).
--export([info/1,create_tree/2]).
+-export([info/1, create_tree/2]).
-export([config/2, read/2, destroy/1]).
-export([get_id/1]).
%% ----- Not standard but convenient -----
--export([error/2,creation_error/2,assq/2,pair/2,val/2,val/3,foreach/3]).
+-export([error/2, creation_error/2, assq/2, pair/2, val/2, val/3, foreach/3]).
-export([create/2]).
--export([window/1,window/2,window/3,button/1,button/2,button/3]).
--export([radiobutton/1,radiobutton/2,radiobutton/3]).
--export([checkbutton/1,checkbutton/2,checkbutton/3]).
--export([frame/1,frame/2,frame/3,label/1,label/2,label/3]).
--export([message/1,message/2,message/3]).
--export([listbox/1,listbox/2,listbox/3,entry/1,entry/2,entry/3]).
--export([scrollbar/1,scrollbar/2,scrollbar/3]).
--export([scale/1,scale/2,scale/3]).
--export([canvas/1,canvas/2,canvas/3,editor/1,editor/2,editor/3]).
--export([prompter/1,prompter/2,prompter/3]).
--export([line/1,line/2,line/3,oval/1,oval/2,oval/3]).
--export([rectangle/1,rectangle/2,rectangle/3]).
--export([polygon/1,polygon/2,polygon/3]).
--export([text/1,text/2,text/3,image/1,image/2,image/3,arc/1,arc/2,arc/3]).
--export([menu/1,menu/2,menu/3,menubutton/1,menubutton/2,menubutton/3]).
--export([menubar/1,menubar/2,menubar/3]).
--export([grid/1,grid/2,grid/3]).
--export([gridline/1,gridline/2,gridline/3]).
--export([menuitem/1,menuitem/2,menuitem/3]).
+-export([window/1, window/2, window/3, button/1, button/2, button/3]).
+-export([radiobutton/1, radiobutton/2, radiobutton/3]).
+-export([checkbutton/1, checkbutton/2, checkbutton/3]).
+-export([frame/1, frame/2, frame/3, label/1, label/2, label/3]).
+-export([message/1, message/2, message/3]).
+-export([listbox/1, listbox/2, listbox/3, entry/1, entry/2, entry/3]).
+-export([scrollbar/1, scrollbar/2, scrollbar/3]).
+-export([scale/1, scale/2, scale/3]).
+-export([canvas/1, canvas/2, canvas/3, editor/1, editor/2, editor/3]).
+-export([prompter/1, prompter/2, prompter/3]).
+-export([line/1, line/2, line/3, oval/1, oval/2, oval/3]).
+-export([rectangle/1, rectangle/2, rectangle/3]).
+-export([polygon/1, polygon/2, polygon/3]).
+-export([text/1, text/2, text/3, image/1, image/2, image/3, arc/1, arc/2, arc/3]).
+-export([menu/1, menu/2, menu/3, menubutton/1, menubutton/2, menubutton/3]).
+-export([menubar/1, menubar/2, menubar/3]).
+-export([grid/1, grid/2, grid/3]).
+-export([gridline/1, gridline/2, gridline/3]).
+-export([menuitem/1, menuitem/2, menuitem/3]).
-include("gstk.hrl").
@@ -70,308 +70,241 @@
start() ->
start([]).
-start(Opts) ->
- Opts2 = gstk_generic:merge_default_options(gs_widgets:default_options(gs),
- lists:sort(Opts)),
- gs_frontend:start(Opts2).
+start(Opts) -> gs_frontend:start(gstk_generic:merge_default_options(gs_widgets:default_options(gs), lists:sort(Opts))).
-stop() ->
- gs_frontend:stop().
+stop() -> gs_frontend:stop().
%% ----- Widget Commands -----
-create(Objtype, Parent) ->
- GsPid = frontend(Parent),
- tag_if_ok(gs_frontend:create(GsPid,{Objtype, undefined, obj_id(Parent),[]})
- ,GsPid).
+create(Objtype, Parent) -> create(Objtype, Parent, []).
-create(Objtype, Parent, Opts) when is_list(Opts) ->
- GsPid = frontend(Parent),
- tag_if_ok(gs_frontend:create(GsPid,{Objtype,undefined,obj_id(Parent),Opts}),
- GsPid);
-create(Objtype, Parent, Opt) ->
- GsPid = frontend(Parent),
- tag_if_ok(gs_frontend:create(GsPid,
- {Objtype,undefined,obj_id(Parent),[Opt]}),
- GsPid).
+create(Objtype, Parent, Opts) when is_list(Opts) -> create(Objtype, undefined, Parent, Opts).
create(Objtype, Name, Parent, Opts) when is_list(Opts) ->
GsPid = frontend(Parent),
- tag_if_ok(gs_frontend:create(GsPid,{Objtype, Name, obj_id(Parent),Opts}),
- GsPid);
-create(Objtype, Name, Parent, Opt) ->
- GsPid = frontend(Parent),
- tag_if_ok(gs_frontend:create(GsPid,{Objtype,Name,obj_id(Parent),[Opt]}),
- GsPid).
+ tag_if_ok(gs_frontend:create(GsPid, {Objtype, Name, obj_id(Parent), Opts}), GsPid);
+create(Objtype, Name, Parent, Opt) -> create(Objtype, Name, Parent, [Opt]).
-tag_if_ok(Int,Pid) when is_integer(Int) ->
- {Int,Pid};
-tag_if_ok(Err,_) ->
- Err.
+tag_if_ok(Int, Pid) when is_integer(Int) -> {Int, Pid};
+tag_if_ok(Err, _) -> Err.
-config(IdOrName, Options) when is_list(Options) ->
- gs_frontend:config(frontend(IdOrName),{obj_id(IdOrName),Options});
-config(IdOrName, Option) ->
- gs_frontend:config(frontend(IdOrName),{obj_id(IdOrName),[Option]}).
+config(IdOrName, Options) when is_list(Options) -> gs_frontend:config(frontend(IdOrName), {obj_id(IdOrName), Options});
+config(IdOrName, Option) -> config(IdOrName, [Option]).
-read(IdOrName, Option) ->
- gs_frontend:read(frontend(IdOrName),{obj_id(IdOrName),Option}).
+read(IdOrName, Option) -> gs_frontend:read(frontend(IdOrName), {obj_id(IdOrName), Option}).
-destroy(IdOrName) ->
- gs_frontend:destroy(frontend(IdOrName),obj_id(IdOrName)).
+destroy(IdOrName) -> gs_frontend:destroy(frontend(IdOrName), obj_id(IdOrName)).
-get_id(Name) ->
- read(Name,id).
+get_id(Name) -> read(Name, id).
info(version) -> "1.3.2";
-info(Option) ->
- gs_frontend:info(Option).
+info(Option) -> gs_frontend:info(Option).
-is_id({Int,Pid}) when is_integer(Int), is_pid(Pid) -> true;
+is_id({Int, Pid}) -> is_integer(Int) andalso is_pid(Pid);
is_id(_) -> false.
-frontend({_,Pid}) when is_pid(Pid) -> Pid;
-frontend({AtomName,Node}) when is_atom(AtomName),is_atom(Node) ->
- rpc:call(Node,erlang,whereis,[gs_frontend]);
+frontend({_, Pid}) when is_pid(Pid) -> Pid;
+frontend({AtomName, Node}) when is_atom(AtomName), is_atom(Node) -> rpc:call(Node, erlang, whereis, [gs_frontend]);
frontend(Atom) when is_atom(Atom) -> whereis(gs_frontend).
-obj_id({Id,_}) -> Id;
+obj_id({Id, _}) -> Id;
obj_id(Atom) when is_atom(Atom) -> Atom.
error(Format, Data) ->
- io:format("gs error: "),
- ok = io:format(Format, Data), % don't be quiet when Format is malformed
- io:format("~n").
+ io:put_chars(standard_error, "gs error: "),
+ ok = io:format(standard_error, Format, Data), % don't be quiet when Format is malformed
+ io:nl(standard_error).
-creation_error(#gstkid{objtype=Ot}, {bad_result, BadResult}) ->
- {error, {creation_error,Ot,BadResult}};
-creation_error(#gstkid{objtype=Ot}, BadResult) ->
- {error, {creation_error,Ot,BadResult}}.
+creation_error(#gstkid{objtype = Ot}, BadResult) ->
+ {error, {creation_error, Ot, case BadResult of
+ {bad_result, Result} -> Result;
+ _ -> BadResult
+ end}}.
+create_tree(ParentId, [{Type, Name, Options, Children}|R]) ->
+ create_tree(ParentId, Name, Type, create(Type, Name, ParentId, Options), Children, R);
+create_tree(ParentId, [{Type, Name, Options}|R]) when is_atom(Name) ->
+ create_tree(ParentId, [{Type, Name, Options, []}|R]);
+create_tree(ParentId, [{Type, Options, Children}|R]) ->
+ create_tree(ParentId, Options, Type, create(Type, ParentId, Options), Children, R);
+create_tree(ParentId, [{Type, Options}|R]) -> create_tree(ParentId, [{Type, Options, []}|R]);
+create_tree(ParentId, Tuple) when is_tuple(Tuple) -> create_tree(ParentId, [Tuple]);
+create_tree(_, []) -> ok.
-create_tree(ParentId,[{Type,Name,Options,Children}|R]) ->
- case create(Type,Name,ParentId,Options) of
- {error,_Reason} -> {error,{create_tree,aborted_at,Type,Name}};
- Id ->
- case create_tree(Id,Children) of
- ok -> create_tree(ParentId,R);
- Err -> Err
- end
- end;
-create_tree(ParentId,[{Type,Name,Options}|R]) when is_atom(Name) ->
- create_tree(ParentId,[{Type,Name,Options,[]}|R]);
-create_tree(ParentId,[{Type,Options,Children}|R]) ->
- case create(Type,ParentId,Options) of
- {error,_Reason} -> {error,{create_tree,aborted_at,Type,Options}};
- Id ->
- case create_tree(Id,Children) of
- ok -> create_tree(ParentId,R);
- Err -> Err
- end
- end;
-create_tree(ParentId,[{Type,Options}|R]) ->
- create_tree(ParentId,[{Type,Options,[]}|R]);
-create_tree(ParentId,Tuple) when is_tuple(Tuple) ->
- create_tree(ParentId,[Tuple]);
-create_tree(_,[]) ->
- ok.
+create_tree(_ParentId, Arg, Type, {error, _}, _Children, _R) -> {error, {create_tree, aborted_at, Type, Arg}};
+create_tree(ParentId, _Arg, _Type, Id, Children, R) ->
+ case create_tree(Id, Children) of
+ ok -> create_tree(ParentId, R);
+ Err -> Err
+ end.
+window(ParentId) -> window(ParentId, []).
-window(ParentId) ->
- create(window,ParentId,[]).
-window(ParentId,Options) ->
- create(window,ParentId,Options).
-window(Name,ParentId,Options) ->
- create(window,Name,ParentId,Options).
+window(ParentId, Options) -> create(window, ParentId, Options).
-button(ParentId) ->
- create(button,ParentId,[]).
-button(ParentId,Options) ->
- create(button,ParentId,Options).
-button(Name,ParentId,Options) ->
- create(button,Name,ParentId,Options).
+window(Name, ParentId, Options) -> create(window, Name, ParentId, Options).
-checkbutton(ParentId) ->
- create(checkbutton,ParentId,[]).
-checkbutton(ParentId,Options) ->
- create(checkbutton,ParentId,Options).
+button(ParentId) -> button(ParentId, []).
-checkbutton(Name,ParentId,Options) ->
- create(checkbutton,Name,ParentId,Options).
+button(ParentId, Options) -> create(button, ParentId, Options).
-radiobutton(ParentId) ->
- create(radiobutton,ParentId,[]).
-radiobutton(ParentId,Options) ->
- create(radiobutton,ParentId,Options).
-radiobutton(Name,ParentId,Options) ->
- create(radiobutton,Name,ParentId,Options).
+button(Name, ParentId, Options) -> create(button, Name, ParentId, Options).
-frame(ParentId) ->
- create(frame,ParentId,[]).
-frame(ParentId,Options) ->
- create(frame,ParentId,Options).
-frame(Name,ParentId,Options) ->
- create(frame,Name,ParentId,Options).
+checkbutton(ParentId) -> checkbutton(ParentId, []).
-canvas(ParentId) ->
- create(canvas,ParentId,[]).
-canvas(ParentId,Options) ->
- create(canvas,ParentId,Options).
-canvas(Name,ParentId,Options) ->
- create(canvas,Name,ParentId,Options).
+checkbutton(ParentId, Options) -> create(checkbutton, ParentId, Options).
-label(ParentId) ->
- create(label,ParentId,[]).
-label(ParentId,Options) ->
- create(label,ParentId,Options).
-label(Name,ParentId,Options) ->
- create(label,Name,ParentId,Options).
+checkbutton(Name, ParentId, Options) -> create(checkbutton, Name, ParentId, Options).
-message(ParentId) ->
- create(message,ParentId,[]).
-message(ParentId,Options) ->
- create(message,ParentId,Options).
-message(Name,ParentId,Options) ->
- create(message,Name,ParentId,Options).
+radiobutton(ParentId) -> radiobutton(ParentId, []).
-listbox(ParentId) ->
- create(listbox,ParentId,[]).
-listbox(ParentId,Options) ->
- create(listbox,ParentId,Options).
-listbox(Name,ParentId,Options) ->
- create(listbox,Name,ParentId,Options).
+radiobutton(ParentId, Options) -> create(radiobutton, ParentId, Options).
-entry(ParentId) ->
- create(entry,ParentId,[]).
-entry(ParentId,Options) ->
- create(entry,ParentId,Options).
-entry(Name,ParentId,Options) ->
- create(entry,Name,ParentId,Options).
+radiobutton(Name, ParentId, Options) -> create(radiobutton, Name, ParentId, Options).
-scrollbar(ParentId) ->
- create(scrollbar,ParentId,[]).
-scrollbar(ParentId,Options) ->
- create(scrollbar,ParentId,Options).
-scrollbar(Name,ParentId,Options) ->
- create(scrollbar,Name,ParentId,Options).
+frame(ParentId) -> frame(ParentId, []).
-scale(ParentId) ->
- create(scale,ParentId,[]).
-scale(ParentId,Options) ->
- create(scale,ParentId,Options).
-scale(Name,ParentId,Options) ->
- create(scale,Name,ParentId,Options).
+frame(ParentId, Options) -> create(frame, ParentId, Options).
-editor(ParentId) ->
- create(editor,ParentId,[]).
-editor(ParentId,Options) ->
- create(editor,ParentId,Options).
-editor(Name,ParentId,Options) ->
- create(editor,Name,ParentId,Options).
+frame(Name, ParentId, Options) -> create(frame, Name, ParentId, Options).
-prompter(ParentId) ->
- create(prompter,ParentId,[]).
-prompter(ParentId,Options) ->
- create(prompter,ParentId,Options).
-prompter(Name,ParentId,Options) ->
- create(prompter,Name,ParentId,Options).
+canvas(ParentId) -> canvas(ParentId, []).
-line(ParentId) ->
- create(line,ParentId,[]).
-line(ParentId,Options) ->
- create(line,ParentId,Options).
-line(Name,ParentId,Options) ->
- create(line,Name,ParentId,Options).
+canvas(ParentId, Options) -> create(canvas, ParentId, Options).
-oval(ParentId) ->
- create(oval,ParentId,[]).
-oval(ParentId,Options) ->
- create(oval,ParentId,Options).
-oval(Name,ParentId,Options) ->
- create(oval,Name,ParentId,Options).
+canvas(Name, ParentId, Options) -> create(canvas, Name, ParentId, Options).
-rectangle(ParentId) ->
- create(rectangle,ParentId,[]).
-rectangle(ParentId,Options) ->
- create(rectangle,ParentId,Options).
-rectangle(Name,ParentId,Options) ->
- create(rectangle,Name,ParentId,Options).
+label(ParentId) -> label(ParentId, []).
-polygon(ParentId) ->
- create(polygon,ParentId,[]).
-polygon(ParentId,Options) ->
- create(polygon,ParentId,Options).
-polygon(Name,ParentId,Options) ->
- create(polygon,Name,ParentId,Options).
+label(ParentId, Options) -> create(label, ParentId, Options).
-text(ParentId) ->
- create(text,ParentId,[]).
-text(ParentId,Options) ->
- create(text,ParentId,Options).
-text(Name,ParentId,Options) ->
- create(text,Name,ParentId,Options).
+label(Name, ParentId, Options) -> create(label, Name, ParentId, Options).
-image(ParentId) ->
- create(image,ParentId,[]).
-image(ParentId,Options) ->
- create(image,ParentId,Options).
-image(Name,ParentId,Options) ->
- create(image,Name,ParentId,Options).
+message(ParentId) -> message(ParentId, []).
-arc(ParentId) ->
- create(arc,ParentId,[]).
-arc(ParentId,Options) ->
- create(arc,ParentId,Options).
-arc(Name,ParentId,Options) ->
- create(arc,Name,ParentId,Options).
+message(ParentId, Options) -> create(message, ParentId, Options).
-menu(ParentId) ->
- create(menu,ParentId,[]).
-menu(ParentId, Options) ->
- create(menu,ParentId,Options).
-menu(Name,ParentId,Options) ->
- create(menu,Name,ParentId,Options).
+message(Name, ParentId, Options) -> create(message, Name, ParentId, Options).
-menubutton(ParentId) ->
- create(menubutton,ParentId,[]).
-menubutton(ParentId,Options) ->
- create(menubutton,ParentId,Options).
-menubutton(Name,ParentId,Options) ->
- create(menubutton,Name,ParentId,Options).
+listbox(ParentId) -> listbox(ParentId, []).
-menubar(ParentId) ->
- create(menubar,ParentId,[]).
-menubar(ParentId,Options) ->
- create(menubar,ParentId,Options).
-menubar(Name,ParentId,Options) ->
- create(menubar,Name,ParentId,Options).
+listbox(ParentId, Options) -> create(listbox, ParentId, Options).
-menuitem(ParentId) ->
- create(menuitem,ParentId,[]).
-menuitem(ParentId,Options) ->
- create(menuitem,ParentId,Options).
-menuitem(Name,ParentId,Options) ->
- create(menuitem,Name,ParentId,Options).
+listbox(Name, ParentId, Options) -> create(listbox, Name, ParentId, Options).
-grid(ParentId) ->
- create(grid,ParentId,[]).
-grid(ParentId,Options) ->
- create(grid,ParentId,Options).
-grid(Name,ParentId,Options) ->
- create(grid,Name,ParentId,Options).
+entry(ParentId) -> entry(ParentId, []).
-gridline(ParentId) ->
- create(gridline,ParentId,[]).
-gridline(ParentId,Options) ->
- create(gridline,ParentId,Options).
-gridline(Name,ParentId,Options) ->
- create(gridline,Name,ParentId,Options).
+entry(ParentId, Options) -> create(entry, ParentId, Options).
+
+entry(Name, ParentId, Options) -> create(entry, Name, ParentId, Options).
+
+scrollbar(ParentId) -> scrollbar(ParentId, []).
+
+scrollbar(ParentId, Options) -> create(scrollbar, ParentId, Options).
+
+scrollbar(Name, ParentId, Options) -> create(scrollbar, Name, ParentId, Options).
+
+scale(ParentId) -> scale(ParentId, []).
+
+scale(ParentId, Options) -> create(scale, ParentId, Options).
+
+scale(Name, ParentId, Options) -> create(scale, Name, ParentId, Options).
+
+editor(ParentId) -> editor(ParentId, []).
+
+editor(ParentId, Options) -> create(editor, ParentId, Options).
+
+editor(Name, ParentId, Options) -> create(editor, Name, ParentId, Options).
+
+prompter(ParentId) -> prompter(ParentId, []).
+
+prompter(ParentId, Options) -> create(prompter, ParentId, Options).
+
+prompter(Name, ParentId, Options) -> create(prompter, Name, ParentId, Options).
+
+line(ParentId) -> line(ParentId, []).
+
+line(ParentId, Options) -> create(line, ParentId, Options).
+
+line(Name, ParentId, Options) -> create(line, Name, ParentId, Options).
+
+oval(ParentId) -> oval(ParentId, []).
+
+oval(ParentId, Options) -> create(oval, ParentId, Options).
+
+oval(Name, ParentId, Options) -> create(oval, Name, ParentId, Options).
+
+rectangle(ParentId) -> rectangle(ParentId, []).
+
+rectangle(ParentId, Options) -> create(rectangle, ParentId, Options).
+
+rectangle(Name, ParentId, Options) -> create(rectangle, Name, ParentId, Options).
+
+polygon(ParentId) -> polygon(ParentId, []).
+
+polygon(ParentId, Options) -> create(polygon, ParentId, Options).
+
+polygon(Name, ParentId, Options) -> create(polygon, Name, ParentId, Options).
+
+text(ParentId) -> text(ParentId, []).
+
+text(ParentId, Options) -> create(text, ParentId, Options).
+
+text(Name, ParentId, Options) -> create(text, Name, ParentId, Options).
+
+image(ParentId) -> image(ParentId, []).
+
+image(ParentId, Options) -> create(image, ParentId, Options).
+
+image(Name, ParentId, Options) -> create(image, Name, ParentId, Options).
+
+arc(ParentId) -> arc(ParentId, []).
+
+arc(ParentId, Options) -> create(arc, ParentId, Options).
+
+arc(Name, ParentId, Options) -> create(arc, Name, ParentId, Options).
+
+menu(ParentId) -> menu(ParentId, []).
+
+menu(ParentId, Options) -> create(menu, ParentId, Options).
+
+menu(Name, ParentId, Options) -> create(menu, Name, ParentId, Options).
+
+menubutton(ParentId) -> menubutton(ParentId, []).
+
+menubutton(ParentId, Options) -> create(menubutton, ParentId, Options).
+
+menubutton(Name, ParentId, Options) -> create(menubutton, Name, ParentId, Options).
+
+menubar(ParentId) -> menubar(ParentId, []).
+
+menubar(ParentId, Options) -> create(menubar, ParentId, Options).
+
+menubar(Name, ParentId, Options) -> create(menubar, Name, ParentId, Options).
+
+menuitem(ParentId) -> menuitem(ParentId, []).
+
+menuitem(ParentId, Options) -> create(menuitem, ParentId, Options).
+
+menuitem(Name, ParentId, Options) -> create(menuitem, Name, ParentId, Options).
+
+grid(ParentId) -> grid(ParentId, []).
+
+grid(ParentId, Options) -> create(grid, ParentId, Options).
+
+grid(Name, ParentId, Options) -> create(grid, Name, ParentId, Options).
+
+gridline(ParentId) -> gridline(ParentId, []).
+
+gridline(ParentId, Options) -> create(gridline, ParentId, Options).
+
+gridline(Name, ParentId, Options) -> create(gridline, Name, ParentId, Options).
%%----------------------------------------------------------------------
%% Waiting for erl44
%%----------------------------------------------------------------------
-foreach(F, ExtraArgs, [H | T]) ->
- apply(F, [H | ExtraArgs]),
+foreach(F, ExtraArgs, [H|T]) ->
+ apply(F, [H|ExtraArgs]),
foreach(F, ExtraArgs, T);
foreach(_F, _ExtraArgs, []) -> ok.
@@ -379,30 +312,24 @@ foreach(_F, _ExtraArgs, []) -> ok.
%% ASSociation with eQual key (scheme standard)
%%----------------------------------------------------------------------
assq(Key, List) ->
- case lists:keysearch(Key, 1, List) of
- {value, {_, Val}} -> {value, Val};
+ case lists:keyfind(Key, 1, List) of
+ {_, Val} -> {value, Val};
_ -> false
end.
%%----------------------------------------------------------------------
%% When we need the whole pair.
%%----------------------------------------------------------------------
-pair(Key, List) ->
- case lists:keysearch(Key, 1, List) of
- {value, Pair} -> Pair;
- _ -> false
- end.
+pair(Key, List) -> lists:keyfind(Key, 1, List).
%%----------------------------------------------------------------------
%% When we know there is a value
%%----------------------------------------------------------------------
-val(Key, List) when is_list(List) ->
- {value, {_,Val}} = lists:keysearch(Key, 1, List),
- Val.
+val(Key, List) -> val(Key, List, false).
-val(Key,List,ElseVal) when is_list(List) ->
- case lists:keysearch(Key, 1, List) of
- {value, {_, Val}} -> Val;
+val(Key, List, ElseVal) when is_list(List) ->
+ case lists:keyfind(Key, 1, List) of
+ {_, Val} -> Val;
_ -> ElseVal
end.
diff -Ndurp otp_src_19.0.5/lib/gs/src/gs_frontend.erl otp_src_19.0.5-lib-gs/lib/gs/src/gs_frontend.erl
--- otp_src_19.0.5/lib/gs/src/gs_frontend.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gs_frontend.erl 2016-08-25 16:37:44.561693414 +0300
@@ -25,8 +25,9 @@
%%
-module(gs_frontend).
--compile([{nowarn_deprecated_function,{gs,assq,2}},
- {nowarn_deprecated_function,{gs,error,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, assq, 2}},
+ {nowarn_deprecated_function, {gs, error, 2}}]).
-export([create/2,
config/2,
@@ -38,48 +39,38 @@
init/1,
event/3]).
-
-include("gstk.hrl").
-
%%----------------------------------------------------------------------
-%% The ets contains: {Obj,lives}|{Obj,{Name,Pid}}
-%% new obj is {Int,Node}
-%% {{Name,Pid},Obj}
+%% The ets contains: {Obj, lives}|{Obj, {Name, Pid}}
+%% new obj is {Int, Node}
+%% {{Name, Pid}, Obj}
%%----------------------------------------------------------------------
--record(state, {db,user,user_count,kernel,kernel_count,self}).
+-record(state, {db, user, user_count, kernel, kernel_count, self}).
%%----------------------------------------------------------------------
%% The interface.
%%----------------------------------------------------------------------
-create(GsPid,Args) ->
- request(GsPid,{create,Args}).
-
-config(GsPid,Args) ->
- request(GsPid,{config, Args}).
+create(GsPid, Args) -> request(GsPid, {create, Args}).
-read(GsPid,Args) ->
- request(GsPid,{read, Args}).
+config(GsPid, Args) -> request(GsPid, {config, Args}).
-destroy(GsPid,IdOrName) ->
- request(GsPid,{destroy, IdOrName}).
+read(GsPid, Args) -> request(GsPid, {read, Args}).
-info(Option) ->
- request(gs_frontend,{info,Option}).
+destroy(GsPid, IdOrName) -> request(GsPid, {destroy, IdOrName}).
+info(Option) -> request(gs_frontend, {info, Option}).
%%----------------------------------------------------------------------
%% Comment: Frontend is only locally registered. These functions are called
%% by any backend.
%%----------------------------------------------------------------------
-event(FrontEnd,ToOwner,EventMsg) ->
- FrontEnd ! {event, ToOwner,EventMsg}.
-
+event(FrontEnd, ToOwner, EventMsg) -> FrontEnd ! {event, ToOwner, EventMsg}.
-request(GsPid,Msg) ->
- GsPid ! {self(),Msg},
+request(GsPid, Msg) ->
+ GsPid ! {self(), Msg},
receive
- {gs_reply,R} -> R
+ {gs_reply, R} -> R
end.
%%----------------------------------------------------------------------
@@ -89,27 +80,23 @@ request(GsPid,Msg) ->
start(Opts) ->
case whereis(gs_frontend) of
undefined ->
- P = spawn_link(gs_frontend,init,[Opts]),
+ P = spawn_link(gs_frontend, init, [Opts]),
case catch register(gs_frontend, P) of
- true ->
- request(gs_frontend,{instance, backend_name(Opts), Opts});
+ true -> request(gs_frontend, {instance, backend_name(Opts), Opts});
{'EXIT', _} ->
- exit(P,kill), % a raise... and I lost this time
- start(Opts)
+ exit(P, kill), % a raise... and I lost this time
+ start(Opts)
end;
- P ->
- request(P,{instance,backend_name(Opts),Opts})
+ P -> request(P, {instance, backend_name(Opts), Opts})
end.
backend_name(Opts) ->
- case gs:assq(kernel,Opts) of
- {value,true} -> kernel;
+ case gs:assq(kernel, Opts) of
+ {value, true} -> kernel;
_ -> user
end.
-
-stop() ->
- request(gs_frontend,stop).
+stop() -> request(gs_frontend, stop).
%% ------------------------------------------------------------
%% THE FRONT END SERVER
@@ -118,254 +105,176 @@ stop() ->
%%
init(_Opts) ->
process_flag(trap_exit, true),
- DB=ets:new(gs_names,[set,public]),
- loop(#state{db=DB,self=self()}).
+ loop(#state{db = ets:new(gs_names, [set, public]), self = self()}).
loop(State) ->
receive
- X ->
- % io:format("frontend received: ~p~n",[X]),
- case catch (doit(X,State)) of
- done -> loop(State);
- NewState when is_record(NewState,state) ->
- loop(NewState);
- stop -> stop;
- Reason ->
- io:format("GS frontend. Last mgs in was:~p~n",[X]),
- io:format("exit:~p~n",[X]),
- io:format("Reason: ~p~n", [Reason]),
- terminate(Reason,State),
- exit(Reason)
- end
+ X -> case catch doit(X, State) of
+ done -> loop(State);
+ #state{} = NewState -> loop(NewState);
+ stop -> stop;
+ Reason ->
+ io:format("GS frontend. Last mgs in was:~p~nexit:~p~nReason: ~p~n", [X, X, Reason]),
+ terminate(Reason, State),
+ exit(Reason)
+ end
end.
-reply(To,Msg) ->
- To ! {gs_reply,Msg},
+reply(To, Msg) ->
+ To ! {gs_reply, Msg},
done.
-doit({FromOwner,{config, Args}},State) ->
- {IdOrName, Opts} = Args,
- #state{db=DB} = State,
- case idOrName_to_id(DB,IdOrName,FromOwner) of
- undefined ->
- reply(FromOwner,{error,{no_such_object,IdOrName}});
- Obj ->
- reply(FromOwner,gstk:config(backend(State,Obj),{Obj,Opts}))
- end;
-
-doit({event,ToOwner,{gs,Obj,Etype,Data,Args}}, #state{db=DB,self=Self}) ->
- case ets:lookup(DB,Obj) of
- [{_,{Name,ToOwner}}] -> ToOwner ! {gs,Name,Etype,Data,Args};
- _ -> ToOwner ! {gs,{Obj,Self},Etype,Data,Args}
+doit({FromOwner, {config, {IdOrName, Opts}}}, #state{db = DB} = State) ->
+ reply(FromOwner, case idOrName_to_id(DB, IdOrName, FromOwner) of
+ undefined -> {error, {no_such_object, IdOrName}};
+ Obj -> gstk:config(backend(State, Obj), {Obj, Opts})
+ end);
+doit({event, ToOwner, {gs, Obj, Etype, Data, Args}}, #state{db = DB, self = Self}) ->
+ case ets:lookup(DB, Obj) of
+ [{_, {Name, ToOwner}}] -> ToOwner ! {gs, Name, Etype, Data, Args};
+ _ -> ToOwner ! {gs, {Obj, Self}, Etype, Data, Args}
end,
done;
-
-doit({FromOwner,{create,Args}}, State) ->
- {Objtype, Name, Parent, Opts} = Args,
- #state{db=DB} = State,
- NameOccupied = case {Name, ets:lookup(DB,{Name,FromOwner})} of
- {undefined,_} -> false;
+doit({FromOwner, {create, {Objtype, Name, Parent, Opts}}}, #state{db = DB} = State) ->
+ NameOccupied = case {Name, ets:lookup(DB, {Name, FromOwner})} of
+ {undefined, _} -> false;
{_, []} -> false;
_ -> true
end,
- if NameOccupied == true ->
- reply(FromOwner, {error,{name_occupied,Name}});
- true ->
- case idOrName_to_id(DB,Parent,FromOwner) of
- undefined ->
- reply(FromOwner, {error,{no_such_parent,Parent}});
+ if
+ NameOccupied -> reply(FromOwner, {error, {name_occupied, Name}});
+ true -> case idOrName_to_id(DB, Parent, FromOwner) of
+ undefined -> reply(FromOwner, {error, {no_such_parent, Parent}});
ParentObj ->
- {Id,NewState} = inc(ParentObj,State),
- case gstk:create(backend(State,ParentObj),
- {FromOwner,{Objtype,Id,ParentObj,Opts}}) of
+ {Id, NewState} = inc(ParentObj, State),
+ case gstk:create(backend(State, ParentObj), {FromOwner, {Objtype, Id, ParentObj, Opts}}) of
ok ->
link(FromOwner),
- if Name == undefined ->
- ets:insert(DB,{Id,lives}),
- reply(FromOwner, Id),
- NewState;
- true -> % it's a real name, register it
- NamePid = {Name,FromOwner},
- ets:insert(DB,{NamePid,Id}),
- ets:insert(DB,{Id,NamePid}),
- reply(FromOwner,Id),
- NewState
- end;
- Err -> reply(FromOwner,Err)
+ ets:insert(DB, {Id, if
+ Name =:= undefined -> lives;
+ true ->
+ NamePid = {Name, FromOwner},
+ ets:insert(DB, {NamePid, Id}),
+ NamePid
+ end}),
+ reply(FromOwner, Id),
+ NewState;
+ Err -> reply(FromOwner, Err)
end
end
end;
-
-doit({FromOwner,{read, Args}}, State) ->
- #state{db=DB} = State,
- {IdOrName, Opt} = Args,
- case idOrName_to_id(DB,IdOrName,FromOwner) of
- undefined ->
- reply(FromOwner,{error,{no_such_object,IdOrName}});
- Obj ->
- reply(FromOwner,gstk:read(backend(State,Obj),{Obj,Opt}))
+doit({FromOwner, {read, {IdOrName, Opt}}}, #state{db = DB} = State) ->
+ case idOrName_to_id(DB, IdOrName, FromOwner) of
+ undefined -> reply(FromOwner, {error, {no_such_object, IdOrName}});
+ Obj -> reply(FromOwner, gstk:read(backend(State, Obj), {Obj, Opt}))
end;
-
-doit({'EXIT', UserBackend, Reason}, State)
- when State#state.user == UserBackend ->
+doit({'EXIT', UserBackend, Reason}, #state{user = UserBackend, db = DB} = State) ->
gs:error("user backend died reason ~w~n", [Reason]),
- remove_user_objects(State#state.db),
- State#state{user=undefined};
-
-doit({'EXIT', KernelBackend, Reason}, State)
- when State#state.kernel == KernelBackend ->
+ remove_user_objects(DB),
+ State#state{user = undefined};
+doit({'EXIT', KernelBackend, Reason}, #state{kernel = KernelBackend}) ->
gs:error("kernel backend died reason ~w~n", [Reason]),
- exit({gs_kernel_died,Reason});
-
-doit({'EXIT', Pid, _Reason}, #state{kernel=K,user=U,db=DB}) ->
+ exit({gs_kernel_died, Reason});
+doit({'EXIT', Pid, _Reason}, #state{kernel = K, user = U, db = DB}) ->
%% io:format("Pid ~w died reason ~w~n", [Pid, _Reason]),
- if is_pid(U) ->
- DeadObjU = gstk:pid_died(U,Pid),
- remove_objs(DB,DeadObjU);
- true -> ok
- end,
- if is_pid(K) ->
- DeadObjK = gstk:pid_died(K,Pid),
- remove_objs(DB,DeadObjK);
- true -> true end,
+ lists:foreach(fun(P) -> is_pid(P) andalso remove_objs(DB, gstk:pid_died(P, Pid)) end, [U, K]),
done;
-
-doit({FromOwner,{destroy, IdOrName}}, State) ->
- #state{db=DB} = State,
- case idOrName_to_id(DB,IdOrName,FromOwner) of
- undefined ->
- reply(FromOwner, {error,{no_such_object,IdOrName}});
- Obj ->
- DeadObj = gstk:destroy(backend(State,Obj),Obj),
- remove_objs(DB,DeadObj),
- reply(FromOwner,done)
- end;
-
-doit({From,{instance,user,Opts}},State) ->
- #state{db=DB, self=Self, user_count=UC} = State,
- case ets:lookup(DB,1) of
- [_] -> reply(From, {1,Self});
+doit({FromOwner, {destroy, IdOrName}}, #state{db = DB} = State) ->
+ reply(FromOwner, case idOrName_to_id(DB, IdOrName, FromOwner) of
+ undefined -> {error, {no_such_object, IdOrName}};
+ Obj ->
+ remove_objs(DB, gstk:destroy(backend(State, Obj), Obj)),
+ done
+ end);
+doit({From, {instance, user, Opts}}, #state{db = DB, self = Self} = State) ->
+ case ets:lookup(DB, 1) of
+ [_] -> reply(From, {1, Self});
[] ->
- ets:insert(DB,{1,lives}), % parent of all user gs objs
+ ets:insert(DB, {1, lives}), % parent of all user gs objs
case gstk:start_link(1, Self, Self, Opts) of
{ok, UserBackend} ->
reply(From, {1, Self}),
- case UC of
- undefined ->
- State#state{user_count=1, user=UserBackend};
- _N ->
- State#state{user_count=UC+2, user=UserBackend}
- end;
+ State#state{user_count = case State of
+ #state{user_count = undefined} -> 1;
+ #state{user_count = UC} -> UC + 2
+ end,
+ user = UserBackend};
{error, Reason} ->
reply(From, {error, Reason}),
stop
end
end;
-
-doit({From,{instance,kernel,Opts}},State) ->
- #state{db=DB,self=Self} = State,
- case ets:lookup(DB,0) of
- [_] -> reply(From, {0,Self});
+doit({From, {instance, kernel, Opts}}, #state{db = DB, self = Self} = State) ->
+ case ets:lookup(DB, 0) of
+ [_] -> reply(From, {0, Self});
[] ->
- ets:insert(DB,{0,lives}), % parent of all user gs objs
- case gstk:start_link(0,Self,Self,Opts) of
+ ets:insert(DB, {0, lives}), % parent of all user gs objs
+ case gstk:start_link(0, Self, Self, Opts) of
{ok, KernelBackend} ->
- reply(From, {0,Self}),
- State#state{kernel_count=0,kernel=KernelBackend};
+ reply(From, {0, Self}),
+ State#state{kernel_count = 0, kernel = KernelBackend};
{error, Reason} ->
- reply(From, {error,Reason}),
+ reply(From, {error, Reason}),
stop
end
end;
-
-
-doit({From,stop}, State) ->
- #state{kernel=K,user=U} = State,
- if is_pid(U) -> gstk:stop(U);
- true -> true end,
- if is_pid(K) -> gstk:stop(K);
- true -> true end,
- reply(From,stopped),
+doit({From, stop}, #state{kernel = K, user = U}) ->
+ lists:foreach(fun(P) -> is_pid(P) andalso gstk:stop(P) end, [U, K]),
+ reply(From, stopped),
stop;
+doit({From, {gstk, user, Msg}}, #state{user = U}) -> reply(From, gstk:request(U, Msg));
+doit({From, {gstk, kernel, Msg}}, #state{kernel = K}) -> reply(From, gstk:request(K, Msg));
+doit({From, {info, gs_db}}, #state{db = DB} = State) ->
+ io:format("gs_db: ~p~n", [ets:tab2list(DB)]),
+ reply(From, State);
+doit({From, {info, kernel_db}}, #state{kernel = K}) -> reply(From, gstk:request(K, dump_db));
+doit({From, {info, user_db}}, #state{user = U}) -> reply(From, gstk:request(U, dump_db));
+doit({From, {info, Unknown}}, _State) ->
+ io:format("gs: unknown info option '~w', use one of 'gs_db', 'kernel_db' or 'user_db'~n", [Unknown]),
+ reply(From, ok).
-doit({From,{gstk,user,Msg}},State) ->
- reply(From,gstk:request(State#state.user,Msg));
-doit({From,{gstk,kernel,Msg}},State) ->
- reply(From,gstk:request(State#state.kernel,Msg));
-
-doit({From,{info,gs_db}},State) ->
- io:format("gs_db:~p~n",[ets:tab2list(State#state.db)]),
- reply(From,State);
-doit({From,{info,kernel_db}},State) ->
- reply(From,gstk:request(State#state.kernel,dump_db));
-doit({From,{info,user_db}},State) ->
- reply(From,gstk:request(State#state.user,dump_db));
-doit({From,{info,Unknown}},_State) ->
- io:format("gs: unknown info option '~w', use one of 'gs_db', 'kernel_db' or 'user_db'~n",[Unknown]),
- reply(From,ok).
-
-terminate(_Reason,#state{db=DB}) ->
- if DB==undefined -> ok;
- true ->
- % io:format("frontend db:~p~n",[ets:tab2list(DB)])
- ok
- end.
-
+terminate(_Reason, #state{db = undefined}) -> ok;
+terminate(_Reason, #state{db = _DB}) ->
+ %io:format("frontend db: ~p~n", [ets:tab2list(_DB)])
+ ok.
-backend(#state{user=Upid,kernel=Kpid},Obj) ->
- if Obj rem 2 == 0 -> Kpid;
- true -> Upid
- end.
+backend(#state{kernel = K}, Obj) when Obj rem 2 =:= 0 -> K;
+backend(#state{user = U}, _Obj) -> U.
%%----------------------------------------------------------------------
-%% Returns: {NewId,NewState}
+%% Returns: {NewId, NewState}
%%----------------------------------------------------------------------
-inc(ParInt,State) when ParInt rem 2 == 1 ->
- X=State#state.user_count+2,
- {X,State#state{user_count=X}};
-inc(ParInt,State) when ParInt rem 2 == 0 ->
- X=State#state.kernel_count+2,
- {X,State#state{kernel_count=X}}.
+inc(ParInt, #state{kernel_count = C} = State) when ParInt rem 2 =:= 0 ->
+ X = C + 2,
+ {X, State#state{kernel_count = X}};
+inc(_ParInt, #state{user_count = C} = State) ->
+ X = C + 2,
+ {X, State#state{user_count = X}}.
-remove_user_objects(DB) ->
- DeadObj = find_user_obj(ets:first(DB),DB),
- remove_objs(DB,DeadObj).
+remove_user_objects(DB) -> remove_objs(DB, find_user_obj(ets:first(DB), DB)).
-find_user_obj(Int,DB) when is_integer(Int) ->
- if Int rem 2 == 0 -> %% a kernel obj
- find_user_obj(ets:next(DB,Int),DB);
- true -> %% a user obj
- [Int|find_user_obj(ets:next(DB,Int),DB)]
- end;
-find_user_obj('$end_of_table',_DB) ->
- [];
-find_user_obj(OtherKey,DB) ->
- find_user_obj(ets:next(DB,OtherKey),DB).
+find_user_obj('$end_of_table', _DB) -> [];
+find_user_obj(Int, DB) when Int rem 2 =/= 0 -> [Int|find_user_obj(ets:next(DB, Int), DB)];
+find_user_obj(OtherKey, DB) -> find_user_obj(ets:next(DB, OtherKey), DB).
-remove_objs(DB,[Obj|Objs]) ->
+remove_objs(DB, [Obj|Objs]) ->
case ets:lookup(DB, Obj) of
- [{_,NamePid}] ->
- ets:delete(DB,Obj),
- ets:delete(DB,NamePid);
+ [{_, NamePid}] -> lists:foreach(fun(O) -> ets:delete(DB, O) end, [Obj, NamePid]);
[] -> backend_only
end,
- remove_objs(DB,Objs);
-remove_objs(_DB,[]) -> done.
+ remove_objs(DB, Objs);
+remove_objs(_DB, []) -> done.
-idOrName_to_id(DB,IdOrName,Pid) when is_atom(IdOrName) ->
- case ets:lookup(DB,{IdOrName,Pid}) of
- [{_,Obj}] -> Obj;
+idOrName_to_id(DB, IdOrName, Pid) when is_atom(IdOrName) ->
+ case ets:lookup(DB, {IdOrName, Pid}) of
+ [{_, Obj}] -> Obj;
_ -> undefined
end;
-idOrName_to_id(DB,Obj,_Pid) ->
- case ets:lookup(DB,Obj) of
+idOrName_to_id(DB, Obj, _Pid) ->
+ case ets:lookup(DB, Obj) of
[_] -> Obj;
_ -> undefined
end.
-
-
-
%% ----------------------------------------
%% done
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gs_make.erl otp_src_19.0.5-lib-gs/lib/gs/src/gs_make.erl
--- otp_src_19.0.5/lib/gs/src/gs_make.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gs_make.erl 2016-08-25 16:37:44.561693414 +0300
@@ -20,247 +20,223 @@
%%
-module(gs_make).
--compile([{nowarn_deprecated_function,{gs,assq,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, assq, 2}}]).
-export([start/0]).
start() ->
- Terms = the_config(),
- DB=fill_ets(Terms),
- {ok,OutFd} = file:open("gstk_generic.hrl", [write]),
- put(stdout,OutFd),
-% io:format("terms: ~p ~n ets:~p~n",[Terms,ets:tab2list(DB)]),
+ DB = fill_ets(the_config()),
+ {ok, OutFd} = file:open("gstk_generic.hrl", [write]),
+ put(stdout, OutFd),
p("% Don't edit this file. It was generated by gs_make:start/0 "),
- p("at ~p-~p-~p, ~p:~p:~p.\n\n",
- lists:append(tuple_to_list(date()),tuple_to_list(time()))),
+ p("at ~p-~p-~p, ~p:~p:~p.\n\n", lists:append(tuple_to_list(date()), tuple_to_list(time()))),
gen_out_opts(DB),
gen_read(DB),
file:close(OutFd),
- {ok,"gstk_generic.hrl",DB}.
+ {ok, "gstk_generic.hrl", DB}.
-fill_ets(Terms) ->
- DB = ets:new(gs_mapping,[bag,public]),
- fill_ets(DB,Terms).
+fill_ets(Terms) -> fill_ets(ets:new(gs_mapping, [bag, public]), Terms).
-fill_ets(DB,[]) -> DB;
-fill_ets(DB,[{Objs,Opt,Fun,Access}|Terms]) ->
- fill_ets(DB,lists:flatten(Objs),Opt,Fun,Access),
- fill_ets(DB,Terms).
+fill_ets(DB, []) -> DB;
+fill_ets(DB, [{Objs, Opt, Fun, Access}|Terms]) ->
+ fill_ets(DB, lists:flatten(Objs), Opt, Fun, Access),
+ fill_ets(DB, Terms).
-fill_ets(_DB,[],_,_,_) -> done;
-fill_ets(DB,[Obj|Objs],Opt,Fun,rw) ->
- ets:insert(DB,{Obj,Opt,Fun,read}),
- ets:insert(DB,{Obj,Opt,Fun,write}),
- fill_ets(DB,Objs,Opt,Fun,rw);
-fill_ets(DB,[Obj|Objs],Opt,Fun,r) ->
- ets:insert(DB,{Obj,Opt,Fun,read}),
- fill_ets(DB,Objs,Opt,Fun,r);
-fill_ets(DB,[Obj|Objs],Opt,Fun,w) ->
- ets:insert(DB,{Obj,Opt,Fun,write}),
- fill_ets(DB,Objs,Opt,Fun,w).
+fill_ets(_DB, [], _, _, _) -> done;
+fill_ets(DB, [Obj|Objs], Opt, Fun, rw) ->
+ lists:foreach(fun(E) -> ets:insert(DB, {Obj, Opt, Fun, E}) end, [read, write]),
+ fill_ets(DB, Objs, Opt, Fun, rw);
+fill_ets(DB, Objs, Opt, Fun, r) -> fill_ets(DB, Objs, Opt, Fun, r, read);
+fill_ets(DB, Objs, Opt, Fun, w) -> fill_ets(DB, Objs, Opt, Fun, w, write).
+
+fill_ets(DB, [Obj|Objs], Opt, Fun, RW, A) ->
+ ets:insert(DB, {Obj, Opt, Fun, A}),
+ fill_ets(DB, Objs, Opt, Fun, RW).
-
-
gen_out_opts(DB) ->
- ObjTypes = lists:flatten(ordsets:from_list(ets:match(DB,{'$1','_','_',write}))),
- p("out_opts([Option|Options],Gstkid,TkW,DB,ExtraArg,S,P,C) ->\n"),
- p(" {Opt,Val} =\n"),
+ p("out_opts([Option|Options], Gstkid, TkW, DB, ExtraArg, S,P, C) ->\n"),
+ p(" {Opt, Val} =\n"),
p(" case Option of \n"),
- p(" {{default,Cat,Key},V} -> {default,{Cat,{Key,V}}};\n"),
- p(" {_Key,_V} -> Option;\n"),
- p(" {default,Cat,Opti} -> {default,{Cat,Opti}};\n"),
- p(" Atom when is_atom(Atom) -> {Atom,undefined};\n"),
- p(" _ -> {error, {invalid_option,Option}}\n"),
+ p(" {{default, Cat, Key}, V} -> {default, {Cat, {Key, V}}};\n"),
+ p(" {_Key, _V} -> Option;\n"),
+ p(" {default, Cat, Opti} -> {default, {Cat, Opti}};\n"),
+ p(" Atom when is_atom(Atom) -> {Atom, undefined};\n"),
+ p(" _ -> {error, {invalid_option, Option}}\n"),
p(" end,\n"),
p(" case Gstkid#gstkid.objtype of\n"),
- gen_out_type_case_clauses(merge_types(ObjTypes),DB),
- p(" Q -> exit({internal_error,unknown_objtype,Q})\n"),
+ gen_out_type_case_clauses(merge_types(lists:flatten(ordsets:from_list(ets:match(DB, {'$1', '_', '_', write})))),
+ DB),
+ p(" Q -> exit({internal_error, unknown_objtype, Q})\n"),
p(" end;\n"),
- p("out_opts([],_Gstkid,_TkW,_DB,_ExtraArg,S,P,C) -> \n"),
- p(" {S,P,C}.\n").
-
+ p("out_opts([], _Gstkid, _TkW, _DB, _ExtraArg, S,P, C) -> \n"),
+ p(" {S, P,C}.\n").
-gen_out_type_case_clauses([],_DB) -> done;
-gen_out_type_case_clauses([Objtype|Objtypes],DB) ->
- OptsFuns = lists:map(fun(L) -> list_to_tuple(L) end,
- ets:match(DB,{Objtype,'$1','$2',write})),
- p(" ~p -> \ncase Opt of\n",[Objtype]),
- gen_opt_case_clauses(merge_opts(opt_prio(),OptsFuns)),
+gen_out_type_case_clauses([], _DB) -> done;
+gen_out_type_case_clauses([Objtype|Objtypes], DB) ->
+ p(" ~p -> \ncase Opt of\n", [Objtype]),
+ gen_opt_case_clauses(merge_opts(opt_prio(),
+ lists:map(fun list_to_tuple/1, ets:match(DB, {Objtype, '$1', '$2', write})))),
p(" _ -> \n"),
- p(" handle_external_opt_call([Option|Options],Gstkid,TkW,DB,ExtraArg,"
- " gstk_~p:option(Option,Gstkid,TkW,DB,ExtraArg),S,P,C)\n",
+ p(" handle_external_opt_call([Option|Options], Gstkid, TkW, DB, ExtraArg,"
+ " gstk_~p:option(Option, Gstkid, TkW, DB, ExtraArg), S,P, C)\n",
[Objtype]),
p(" end;\n"),
- gen_out_type_case_clauses(Objtypes,DB).
+ gen_out_type_case_clauses(Objtypes, DB).
-gen_opt_case_clauses([]) ->
- done;
-gen_opt_case_clauses([{Opt,Fun}|OptFuncs]) ->
- p(" ~p ->\n",[Opt]),
- p(" ~p(Val,Options,Gstkid,TkW,DB,ExtraArg,S,P,C);\n",[Fun]),
+gen_opt_case_clauses([]) -> done;
+gen_opt_case_clauses([{Opt, Fun}|OptFuncs]) ->
+ p(" ~p ->\n", [Opt]),
+ p(" ~p(Val, Options, Gstkid, TkW, DB, ExtraArg, S,P, C);\n", [Fun]),
gen_opt_case_clauses(OptFuncs).
gen_read(DB) ->
- ObjTypes = lists:flatten(ordsets:from_list(ets:match(DB,{'$1','_','_',read}))),
- p("read_option(DB,Gstkid,TkW,Option,ExtraArg) ->\n"),
+ p("read_option(DB, Gstkid, TkW, Option, ExtraArg) ->\n"),
p(" Key = case Option of\n"),
p(" Atom when is_atom(Atom) -> Atom;\n"),
- p(" Opt when is_tuple(Opt) -> element(1,Opt)\n"),
+ p(" Opt when is_tuple(Opt) -> element(1, Opt)\n"),
p(" end,\n"),
p(" case Gstkid#gstkid.objtype of\n"),
- gen_read_type_clauses(merge_types(ObjTypes),DB),
- p(" Q -> exit({internal_error,unknown_objtype,Q})\n"),
+ gen_read_type_clauses(merge_types(lists:flatten(ordsets:from_list(ets:match(DB, {'$1', '_', '_', read})))), DB),
+ p(" Q -> exit({internal_error, unknown_objtype, Q})\n"),
p(" end.\n").
-
-gen_read_type_clauses([],_) -> done;
-gen_read_type_clauses([Objtype|Objtypes],DB) ->
- OptsFuns = lists:map(fun(L) -> list_to_tuple(L) end,
- ets:match(DB,{Objtype,'$1','$2',read})),
- p(" ~p -> \ncase Key of\n",[Objtype]),
- gen_readopt_case_clauses(merge_opts(opt_prio(),OptsFuns)),
- p(" _ -> \nhandle_external_read(gstk_~p:read_option(Option,Gstkid,TkW,DB,ExtraArg))\n",[Objtype]),
+gen_read_type_clauses([], _) -> done;
+gen_read_type_clauses([Objtype|Objtypes], DB) ->
+ p(" ~p -> \ncase Key of\n", [Objtype]),
+ gen_readopt_case_clauses(merge_opts(opt_prio(),
+ lists:map(fun list_to_tuple/1, ets:match(DB, {Objtype, '$1', '$2', read})))),
+ p(" _ -> \nhandle_external_read(gstk_~p:read_option(Option, Gstkid, TkW, DB, ExtraArg))\n", [Objtype]),
p(" end;\n"),
- gen_read_type_clauses(Objtypes,DB).
+ gen_read_type_clauses(Objtypes, DB).
-gen_readopt_case_clauses([]) ->
- done;
-gen_readopt_case_clauses([{Opt,Fun}|OptFuncs]) ->
- p(" ~p -> \n~p(Option,Gstkid,TkW,DB,ExtraArg);\n",[Opt,Fun]),
+gen_readopt_case_clauses([]) -> done;
+gen_readopt_case_clauses([{Opt, Fun}|OptFuncs]) ->
+ p(" ~p -> \n~p(Option, Gstkid, TkW, DB, ExtraArg);\n", [Opt, Fun]),
gen_readopt_case_clauses(OptFuncs).
+p(Str) -> ok = io:format(get(stdout), Str, []).
-p(Str) ->
- ok = io:format(get(stdout),Str,[]).
-
-p(Format,Data) ->
- ok = io:format(get(stdout),Format,Data).
+p(Format, Data) -> ok = io:format(get(stdout), Format, Data).
%%----------------------------------------------------------------------
%% There items should be placed early in a case statement.
%%----------------------------------------------------------------------
-obj_prio() -> [rectangle,line,gridline,image,button,canvas,checkbutton,radiobutton].
-opt_prio() -> [x,y,width,height,move,coords,data].
+obj_prio() -> [rectangle, line, gridline, image, button, canvas, checkbutton, radiobutton].
+opt_prio() -> [x, y, width, height, move, coords, data].
-merge_types(Types) ->
- T2 = ordsets:from_list(Types),
- P2 = ordsets:from_list(obj_prio()),
- obj_prio() ++ ordsets:subtract(T2, P2).
+merge_types(Types) -> obj_prio() ++ ordsets:subtract(ordsets:from_list(Types), ordsets:from_list(obj_prio())).
-merge_opts([],L) -> L;
-merge_opts([Opt|Opts],Dict) ->
- case gs:assq(Opt,Dict) of
- {value,V} -> [{Opt,V}|merge_opts(Opts,lists:keydelete(Opt,1,Dict))];
- false -> merge_opts(Opts,Dict)
+merge_opts([], L) -> L;
+merge_opts([Opt|Opts], Dict) ->
+ case gs:assq(Opt, Dict) of
+ {value, V} -> [{Opt, V}|merge_opts(Opts, lists:keydelete(Opt, 1, Dict))];
+ false -> merge_opts(Opts, Dict)
end.
the_config() ->
- Buttons=[button,checkbutton,radiobutton],
- AllPureTk = [Buttons,canvas,editor,entry,frame,label,listbox,
- menubar,menubutton,scale,window],
- CanvasObj = [arc,image,line,oval,polygon,rectangle,text],
- All = [AllPureTk,CanvasObj,grid,gridline,menu,menuitem,gs],
- Containers = [canvas,frame,grid,menu,menubar,menubutton,menuitem,window],
- Ob1 = [Buttons,canvas,grid,frame,label,entry,editor,listbox,scale],
- Ob2 = [button,checkbutton,radiobutton,label,menubutton],
- Ob3 = [Buttons,frame,label,entry,editor,listbox,scale,menubutton,
- menubar,menu],
- Ob4 = [canvas,editor,listbox],
- [{[Buttons,entry,scale,menubutton],enable,gen_enable,rw},
- {[Buttons,label,entry,scale,menubutton,menu],fg,gen_fg,rw},
- {[Buttons,label,entry,scale,menubutton,menu],bg,gen_bg,rw},
- {Ob1,anchor,gen_anchor,rw},
- {Ob1,height,gen_height,r},
- {Ob1--[frame],height,gen_height,w},
- {Ob1,width,gen_width,r},
- {Ob1--[frame],width,gen_width,w},
- {Ob1,pack_x,gen_pack_x,rw},
- {Ob1,pack_y,gen_pack_y,rw},
- {Ob1,pack_xy,gen_pack_xy,w},
- {Ob1,x,gen_x,rw},
- {Ob1,y,gen_y,rw},
- {Ob1,raise,gen_raise,w},
- {Ob1,lower,gen_lower,w},
- {Ob2,align,gen_align,rw},
- {Ob2,font,gen_font,rw},
- {Ob2,justify,gen_justify,rw},
- {Ob2,padx,gen_padx,rw},
- {Ob2,pady,gen_pady,rw},
- {Containers,default,gen_default,w},
- {[AllPureTk,menu],relief,gen_relief,rw},
- {[AllPureTk,menu],bw,gen_bw,rw},
- {[Buttons,canvas,frame,label,entry,scale,menubutton,menu,menubar],
- setfocus,gen_setfocus,rw},
- {Ob3,buttonpress,gen_buttonpress,rw},
- {Ob3,buttonrelease,gen_buttonrelease,rw},
- {Ob3,configure,gen_configure,rw},
- {[Ob3,window],destroy,gen_destroy,rw},
- {[Ob3,window],enter,gen_enter,rw},
- {[Ob3,window],leave,gen_leave,rw},
- {[Ob3,window],focus,gen_focus_ev,rw},
- {[Ob3,window],keypress,gen_keypress,rw},
- {[Ob3,window],keyrelease,gen_keyrelease,rw},
- {Ob3,motion,gen_motion,rw},
- %% events containing x,y are special
- {[window],buttonpress,gen_buttonpress,r},
- {[window],buttonrelease,gen_buttonrelease,r},
- {[window],motion,gen_motion,r},
- {All,font_wh,gen_font_wh,r},
- {All,choose_font,gen_choose_font,r},
- {All,data,gen_data,rw},
- {All,children,gen_children,r},
- {All,id,gen_id,r},
- {All,parent,gen_parent,r},
- {All,type,gen_type,r},
- {All,beep,gen_beep,w},
- {All,keep_opt,gen_keep_opt,w},
- {All,flush,gen_flush,rw},
- {AllPureTk,highlightbw,gen_highlightbw,rw},
- {AllPureTk,highlightbg,gen_highlightbg,rw},
- {AllPureTk,highlightfg,gen_highlightfg,rw},
- {AllPureTk,cursor,gen_cursor,rw}, % bug
- {[Buttons,label,menubutton],label,gen_label,rw},
- {[Buttons,menubutton,menu],activebg,gen_activebg,rw},
- {[Buttons,menubutton,menu],activefg,gen_activefg,rw},
- {[entry],selectbg,gen_selectbg,rw},
- {[entry],selectbw,gen_selectbw,rw},
- {[entry],selectfg,gen_selectfg,rw},
- {Ob4,activebg,gen_so_activebg,rw},
- {Ob4,bc,gen_so_bc,rw},
- {Ob4,bg,gen_so_bg,rw},
- {Ob4,hscroll,gen_so_hscroll,r},
- {Ob4,scrollbg,gen_so_scrollbg,rw},
- {Ob4,scrollfg,gen_so_scrollfg,rw},
- {Ob4,scrolls,gen_so_scrolls,w},
- {Ob4,selectbg,gen_so_selectbg,rw},
- {Ob4,selectbg,gen_so_selectbg,rw},
- {Ob4,selectbw,gen_so_selectbw,rw},
- {Ob4,selectbw,gen_so_selectbw,rw},
- {Ob4,selectfg,gen_so_selectfg,rw},
- {Ob4,selectfg,gen_so_selectfg,rw},
- {Ob4,vscroll,gen_so_vscroll,r},
- {CanvasObj,coords,gen_citem_coords,rw},
- {CanvasObj,lower,gen_citem_lower,w},
- {CanvasObj,raise,gen_citem_raise,w},
- {CanvasObj,move,gen_citem_move,w},
- {CanvasObj,setfocus,gen_citem_setfocus,rw},
- {CanvasObj,buttonpress,gen_citem_buttonpress,w}, % should be rw
- {CanvasObj,buttonrelease,gen_citem_buttonrelease,w},
- {CanvasObj,enter,gen_citem_enter,w},
- {CanvasObj,focus,gen_citem_setfocus,w},
- {CanvasObj,keypress,gen_citem_keypress,w},
- {CanvasObj,keyrelease,gen_citem_keyrelease,w},
- {CanvasObj,leave,gen_citem_leave,w},
- {CanvasObj,motion,gen_citem_motion,w},
- {CanvasObj,buttonpress,gen_buttonpress,r},
- {CanvasObj,buttonrelease,gen_buttonrelease,r},
- {CanvasObj,configure,gen_configure,r},
- {CanvasObj,destroy,gen_destroy,r},
- {CanvasObj,enter,gen_enter,r},
- {CanvasObj,leave,gen_leave,r},
- {CanvasObj,focus,gen_focus_ev,r},
- {CanvasObj,keypress,gen_keypress,r},
- {CanvasObj,keyrelease,gen_keyrelease,r},
- {CanvasObj,motion,gen_motion,r},
- {[arc,oval,polygon,rectangle],fill,gen_citem_fill,rw}].
-
+ Buttons= [button, checkbutton, radiobutton],
+ AllPureTk = [Buttons, canvas, editor, entry, frame, label, listbox, menubar, menubutton, scale, window],
+ CanvasObj = [arc, image, line, oval, polygon, rectangle, text],
+ All = [AllPureTk, CanvasObj, grid, gridline, menu, menuitem, gs],
+ Containers = [canvas, frame, grid, menu, menubar, menubutton, menuitem, window],
+ Ob1 = [Buttons, canvas, grid, frame, label, entry, editor, listbox, scale],
+ Ob2 = [button, checkbutton, radiobutton, label, menubutton],
+ Ob3 = [Buttons, frame, label, entry, editor, listbox, scale, menubutton, menubar, menu],
+ Ob4 = [canvas, editor, listbox],
+ [{[Buttons, entry, scale, menubutton], enable, gen_enable, rw},
+ {[Buttons, label, entry, scale, menubutton, menu], fg, gen_fg, rw},
+ {[Buttons, label, entry, scale, menubutton, menu], bg, gen_bg, rw},
+ {Ob1, anchor, gen_anchor, rw},
+ {Ob1, height, gen_height, r},
+ {lists:delete(frame, Ob1), height, gen_height, w},
+ {Ob1, width, gen_width, r},
+ {lists:delete(frame, Ob1), width, gen_width, w},
+ {Ob1, pack_x, gen_pack_x, rw},
+ {Ob1, pack_y, gen_pack_y, rw},
+ {Ob1, pack_xy, gen_pack_xy, w},
+ {Ob1, x, gen_x, rw},
+ {Ob1, y, gen_y, rw},
+ {Ob1, raise, gen_raise, w},
+ {Ob1, lower, gen_lower, w},
+ {Ob2, align, gen_align, rw},
+ {Ob2, font, gen_font, rw},
+ {Ob2, justify, gen_justify, rw},
+ {Ob2, padx, gen_padx, rw},
+ {Ob2, pady, gen_pady, rw},
+ {Containers, default, gen_default, w},
+ {[AllPureTk, menu], relief, gen_relief, rw},
+ {[AllPureTk, menu], bw, gen_bw, rw},
+ {[Buttons, canvas, frame, label, entry, scale, menubutton, menu, menubar], setfocus, gen_setfocus, rw},
+ {Ob3, buttonpress, gen_buttonpress, rw},
+ {Ob3, buttonrelease, gen_buttonrelease, rw},
+ {Ob3, configure, gen_configure, rw},
+ {[Ob3, window], destroy, gen_destroy, rw},
+ {[Ob3, window], enter, gen_enter, rw},
+ {[Ob3, window], leave, gen_leave, rw},
+ {[Ob3, window], focus, gen_focus_ev, rw},
+ {[Ob3, window], keypress, gen_keypress, rw},
+ {[Ob3, window], keyrelease, gen_keyrelease, rw},
+ {Ob3, motion, gen_motion, rw},
+ %% events containing x, y are special
+ {[window], buttonpress, gen_buttonpress, r},
+ {[window], buttonrelease, gen_buttonrelease, r},
+ {[window], motion, gen_motion, r},
+ {All, font_wh, gen_font_wh, r},
+ {All, choose_font, gen_choose_font, r},
+ {All, data, gen_data, rw},
+ {All, children, gen_children, r},
+ {All, id, gen_id, r},
+ {All, parent, gen_parent, r},
+ {All, type, gen_type, r},
+ {All, beep, gen_beep, w},
+ {All, keep_opt, gen_keep_opt, w},
+ {All, flush, gen_flush, rw},
+ {AllPureTk, highlightbw, gen_highlightbw, rw},
+ {AllPureTk, highlightbg, gen_highlightbg, rw},
+ {AllPureTk, highlightfg, gen_highlightfg, rw},
+ {AllPureTk, cursor, gen_cursor, rw}, % bug
+ {[Buttons, label, menubutton], label, gen_label, rw},
+ {[Buttons, menubutton, menu], activebg, gen_activebg, rw},
+ {[Buttons, menubutton, menu], activefg, gen_activefg, rw},
+ {[entry], selectbg, gen_selectbg, rw},
+ {[entry], selectbw, gen_selectbw, rw},
+ {[entry], selectfg, gen_selectfg, rw},
+ {Ob4, activebg, gen_so_activebg, rw},
+ {Ob4, bc, gen_so_bc, rw},
+ {Ob4, bg, gen_so_bg, rw},
+ {Ob4, hscroll, gen_so_hscroll, r},
+ {Ob4, scrollbg, gen_so_scrollbg, rw},
+ {Ob4, scrollfg, gen_so_scrollfg, rw},
+ {Ob4, scrolls, gen_so_scrolls, w},
+ {Ob4, selectbg, gen_so_selectbg, rw},
+ {Ob4, selectbg, gen_so_selectbg, rw},
+ {Ob4, selectbw, gen_so_selectbw, rw},
+ {Ob4, selectbw, gen_so_selectbw, rw},
+ {Ob4, selectfg, gen_so_selectfg, rw},
+ {Ob4, selectfg, gen_so_selectfg, rw},
+ {Ob4, vscroll, gen_so_vscroll, r},
+ {CanvasObj, coords, gen_citem_coords, rw},
+ {CanvasObj, lower, gen_citem_lower, w},
+ {CanvasObj, raise, gen_citem_raise, w},
+ {CanvasObj, move, gen_citem_move, w},
+ {CanvasObj, setfocus, gen_citem_setfocus, rw},
+ {CanvasObj, buttonpress, gen_citem_buttonpress, w}, % should be rw
+ {CanvasObj, buttonrelease, gen_citem_buttonrelease, w},
+ {CanvasObj, enter, gen_citem_enter, w},
+ {CanvasObj, focus, gen_citem_setfocus, w},
+ {CanvasObj, keypress, gen_citem_keypress, w},
+ {CanvasObj, keyrelease, gen_citem_keyrelease, w},
+ {CanvasObj, leave, gen_citem_leave, w},
+ {CanvasObj, motion, gen_citem_motion, w},
+ {CanvasObj, buttonpress, gen_buttonpress, r},
+ {CanvasObj, buttonrelease, gen_buttonrelease, r},
+ {CanvasObj, configure, gen_configure, r},
+ {CanvasObj, destroy, gen_destroy, r},
+ {CanvasObj, enter, gen_enter, r},
+ {CanvasObj, leave, gen_leave, r},
+ {CanvasObj, focus, gen_focus_ev, r},
+ {CanvasObj, keypress, gen_keypress, r},
+ {CanvasObj, keyrelease, gen_keyrelease, r},
+ {CanvasObj, motion, gen_motion, r},
+ {[arc, oval, polygon, rectangle], fill, gen_citem_fill, rw}].
diff -Ndurp otp_src_19.0.5/lib/gs/src/gs_packer.erl otp_src_19.0.5-lib-gs/lib/gs/src/gs_packer.erl
--- otp_src_19.0.5/lib/gs/src/gs_packer.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gs_packer.erl 2016-08-25 16:37:44.561693414 +0300
@@ -27,15 +27,14 @@
-module(gs_packer).
-export([pack/2]).
-%-compile(export_all).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%
%%%% This is a simple packer that take a specification in the format
-%%%%
+%%%%
%%%% Spec -> [WidthSpec, WidthSpec....]
-%%%% WidthSpec -> {fixed,Size} | {stretch,Weight} |
-%%%% {stretch,Weight,Min} | {stretch,Weight,Min,Max}
+%%%% WidthSpec -> {fixed, Size} | {stretch, Weight} |
+%%%% {stretch, Weight, Min} | {stretch, Weight, Min, Max}
%%%%
%%%% and a given total size it produces a list of sizes of the
%%%% individual elements. Simple heuristics are used to make the code
@@ -76,30 +75,23 @@
%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-pack(Size, SpecSizes) when Size < 0 ->
- pack(0, SpecSizes);
+pack(Size, SpecSizes) when Size < 0 -> pack(0, SpecSizes);
pack(Size, SpecSizes) ->
- {Weights,_Stretched,Fixed,Min,Max} = get_size_info(SpecSizes),
+ {Weights, _Stretched, Fixed, Min, Max} = get_size_info(SpecSizes),
Left = Size - Fixed,
- Unit = if Weights == 0 -> 0; true -> Left / Weights end,
+ Unit = if
+ Weights == 0 -> 0;
+ true -> Left / Weights
+ end,
if
- Left < Min ->
- NewSpecs = cnvt_to_min(SpecSizes),
- pack(Size,NewSpecs);
- is_integer(Max), Max =/= 0, Left > Max ->
- NewSpecs = cnvt_to_max(SpecSizes),
- pack(Size,NewSpecs);
- true ->
- case remove_failure(SpecSizes, Unit) of
- {no,NewSpecs} ->
- distribute_space(NewSpecs,Unit);
- {yes,NewSpecs} ->
- pack(Size, NewSpecs)
- end
+ Left < Min -> pack(Size, cnvt_to_min(SpecSizes));
+ is_integer(Max), Max =/= 0, Left > Max -> pack(Size, cnvt_to_max(SpecSizes));
+ true -> case remove_failure(SpecSizes, Unit) of
+ {no, NewSpecs} -> distribute_space(NewSpecs, Unit);
+ {yes, NewSpecs} -> pack(Size, NewSpecs)
+ end
end.
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%
%%%% remove_failure(Specs, Unit)
@@ -110,7 +102,7 @@ pack(Size, SpecSizes) ->
%%%%
%%%% This is done with a simple heuristic. We pick the element that
%%%% has the largest diff from the required min or max, change this
-%%%% {stretch,W,Mi,Ma} to a {fixed,Mi} or {fixed,Ma} and redo the
+%%%% {stretch, W,Mi, Ma} to a {fixed, Mi} or {fixed, Ma} and redo the
%%%% whole process again.
%%%%
%%%% **** BUGS ****
@@ -121,49 +113,38 @@ pack(Size, SpecSizes) ->
remove_failure(Specs, Unit) ->
case remove_failure(Specs, Unit, 0) of
- {done,NewSpecs} ->
- {yes,NewSpecs};
- {_,_NewSpecs} ->
- {no,Specs} % NewSpecs == Specs but
- end. % we choose the old one
+ {done, NewSpecs} -> {yes, NewSpecs};
+ {_, _NewSpecs} -> {no, Specs} % NewSpecs == Specs but we choose the old one
+ end.
-remove_failure([], _Unit, MaxFailure) ->
- {MaxFailure,[]};
-remove_failure([{stretch,W,Mi} | Specs], Unit, MaxFailure) ->
- {MinMax,NewMaxFailure} = max_failure(MaxFailure, Mi-W*Unit, 0),
- case {MinMax,remove_failure(Specs, Unit, NewMaxFailure)} of
- {min,{NewMaxFailure,Rest}} ->
- {done,[{fixed,Mi} | Rest]};
- {_,{OtherMaxFailure, Rest}} ->
- {OtherMaxFailure,[{stretch,W,Mi} | Rest]}
+remove_failure([], _Unit, MaxFailure) -> {MaxFailure, []};
+remove_failure([{stretch, W, Mi}|Specs], Unit, MaxFailure) ->
+ {MinMax, NewMaxFailure} = max_failure(MaxFailure, Mi - W * Unit, 0),
+ case {MinMax, remove_failure(Specs, Unit, NewMaxFailure)} of
+ {min, {NewMaxFailure, Rest}} -> {done, [{fixed, Mi}|Rest]};
+ {_, {OtherMaxFailure, Rest}} -> {OtherMaxFailure, [{stretch, W, Mi}|Rest]}
end;
-remove_failure([{stretch,W,Mi,Ma} | Specs], Unit, MaxFailure) ->
- {MinMax,NewMaxFailure} = max_failure(MaxFailure, Mi-W*Unit, W*Unit-Ma),
- case {MinMax,remove_failure(Specs, Unit, NewMaxFailure)} of
- {min,{NewMaxFailure,Rest}} ->
- {done,[{fixed,Mi} | Rest]};
- {max,{NewMaxFailure,Rest}} ->
- {done,[{fixed,Ma} | Rest]};
- {_,{OtherMaxFailure, Rest}} ->
- {OtherMaxFailure,[{stretch,W,Mi,Ma} | Rest]}
+remove_failure([{stretch, W, Mi, Ma}|Specs], Unit, MaxFailure) ->
+ {MinMax, NewMaxFailure} = max_failure(MaxFailure, Mi - W * Unit, W * Unit - Ma),
+ case {MinMax, remove_failure(Specs, Unit, NewMaxFailure)} of
+ {min, {NewMaxFailure, Rest}} -> {done, [{fixed, Mi}|Rest]};
+ {max, {NewMaxFailure, Rest}} -> {done, [{fixed, Ma}|Rest]};
+ {_, {OtherMaxFailure, Rest}} -> {OtherMaxFailure, [{stretch, W, Mi, Ma}|Rest]}
end;
-remove_failure([Spec | Specs], Unit, MaxFailure) ->
- {NewMaxFailure,NewSpecs} = remove_failure(Specs, Unit, MaxFailure),
- {NewMaxFailure, [Spec | NewSpecs]}.
-
-max_failure(LastDiff, DMi, DMa)
- when DMi > LastDiff, DMi > DMa ->
- {min,DMi};
-max_failure(LastDiff, _DMi, DMa)
- when DMa > LastDiff ->
- {max,DMa};
-max_failure(MaxFailure, _DMi, _DMa) ->
- {other,MaxFailure}.
+remove_failure([Spec|Specs], Unit, MaxFailure) ->
+ {NewMaxFailure, NewSpecs} = remove_failure(Specs, Unit, MaxFailure),
+ {NewMaxFailure, [Spec|NewSpecs]}.
+max_failure(LastDiff, DMi, DMa) when DMi > LastDiff ->
+ if
+ DMi > DMa -> {min, DMi};
+ true -> {max, DMa}
+ end;
+max_failure(MaxFailure, _DMi, _DMa) -> {other, MaxFailure}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%
-%%%% distribute_space(Spec,Unit)
+%%%% distribute_space(Spec, Unit)
%%%%
%%%% We now know that we can distribute the space to the elements in
%%%% the list.
@@ -179,27 +160,23 @@ max_failure(MaxFailure, _DMi, _DMa) ->
%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+distribute_space(Specs, Unit) -> distribute_space(Specs, Unit, 0.0).
-distribute_space(Specs, Unit) ->
- distribute_space(Specs, Unit, 0.0).
-
-distribute_space([], _Unit, _Err) ->
- [];
-distribute_space([Spec | Specs], Unit, Err) ->
- distribute_space(Spec, Specs, Unit, Err).
+distribute_space([], _Unit, _Err) -> [];
+distribute_space([Spec|Specs], Unit, Err) -> distribute_space(Spec, Specs, Unit, Err).
-distribute_space({fixed,P}, Specs, Unit, Err) ->
- [P | distribute_space(Specs, Unit, Err)];
-distribute_space({stretch,Weight}, Specs, Unit, Err) ->
+distribute_space({fixed, P}, Specs, Unit, Err) ->
+ [P|distribute_space(Specs, Unit, Err)];
+distribute_space({stretch, Weight}, Specs, Unit, Err) ->
Size = Weight * Unit + Err,
Pixels = round(Size),
- NewErr = Size - Pixels,
- [Pixels | distribute_space(Specs, Unit, NewErr)];
-distribute_space({stretch,W,_Mi}, Specs, Unit, Err) ->
- distribute_space({stretch,W}, Specs, Unit, Err);
-distribute_space({stretch,W,_Mi,_Ma}, Specs, Unit, Err) ->
- distribute_space({stretch,W}, Specs, Unit, Err).
-
+ distribute_space({fixed, Pixels}, Specs, Unit, Size - Pixels);
+distribute_space(Arg, Specs, Unit, Err) ->
+ distribute_space({stretch, case Arg of
+ {stretch, W, _Mi} -> W;
+ {stretch, W, _Mi, _Ma} -> W
+ end},
+ Specs, Unit, Err).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%
@@ -221,34 +198,28 @@ distribute_space({stretch,W,_Mi,_Ma}, Sp
%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+cnvt_to_min([]) -> [];
+cnvt_to_min([Spec|Specs]) -> cnvt_to_min(Spec, Specs).
-cnvt_to_min([]) ->
- [];
-cnvt_to_min([Spec | Specs]) ->
- cnvt_to_min(Spec, Specs).
-
-cnvt_to_max([]) ->
- [];
-cnvt_to_max([Spec | Specs]) ->
- cnvt_to_max(Spec, Specs).
+cnvt_to_max([]) -> [];
+cnvt_to_max([Spec|Specs]) -> cnvt_to_max(Spec, Specs).
-cnvt_to_min({fixed,P}, Specs) ->
- [{stretch,P} | cnvt_to_min(Specs)];
-cnvt_to_min({stretch,_W}, Specs) ->
- [{fixed,0} | cnvt_to_min(Specs)];
-cnvt_to_min({stretch,_W,Mi}, Specs) ->
- [{stretch,Mi} | cnvt_to_min(Specs)];
-cnvt_to_min({stretch,_W,Mi,_Ma}, Specs) ->
- [{stretch,Mi} | cnvt_to_min(Specs)].
+cnvt_to_min({stretch, _W}, Specs) -> cnvt_to_min({fixed, 0}, Specs);
+cnvt_to_min(Arg, Specs) ->
+ [{stretch, case Arg of
+ {fixed, P} -> P;
+ {stretch, _W, Mi} -> Mi;
+ {stretch, _W, Mi, _Ma} -> Mi
+ end}|cnvt_to_min(Specs)].
-%% We know that there can only be {fixed,P} and {stretch,W,Mi,Ma}
+%% We know that there can only be {fixed, P} and {stretch, W,Mi, Ma}
%% in this list.
-cnvt_to_max({fixed,P}, Specs) ->
- [{stretch,P} | cnvt_to_max(Specs)];
-cnvt_to_max({stretch,_W,_Mi,Ma}, Specs) ->
- [{stretch,Ma} | cnvt_to_max(Specs)].
-
+cnvt_to_max(Arg, Specs) ->
+ [{stretch, case Arg of
+ {fixed, P} -> P;
+ {stretch, _W, _Mi, Ma} -> Ma
+ end}|cnvt_to_max(Specs)].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%
@@ -256,21 +227,21 @@ cnvt_to_max({stretch,_W,_Mi,Ma}, Specs)
%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-get_size_info(Specs) ->
- get_size_info(Specs, 0, 0, 0, 0, 0).
+get_size_info(Specs) -> get_size_info(Specs, 0, 0, 0, 0, 0).
get_size_info([], TotW, NumW, TotFixed, TotMin, TotMax) ->
{TotW, NumW, TotFixed, TotMin, TotMax};
-get_size_info([Spec | Specs], TotW, NumW, TotFixed, TotMin, TotMax) ->
+get_size_info([Spec|Specs], TotW, NumW, TotFixed, TotMin, TotMax) ->
get_size_info(Spec, TotW, NumW, TotFixed, TotMin, TotMax, Specs).
-
-get_size_info({fixed,P}, TotW, NumW, TotFixed, TotMin, TotMax, Specs) ->
- get_size_info(Specs, TotW, NumW, TotFixed+P, TotMin, TotMax);
-get_size_info({stretch,W}, TotW, NumW, TotFixed, TotMin, _TotMax, Specs) ->
- get_size_info(Specs, TotW+W, NumW+1, TotFixed, TotMin, infinity);
-get_size_info({stretch,W,Mi}, TotW, NumW, TotFixed, TotMin, _TotMax, Specs) ->
- get_size_info(Specs, TotW+W, NumW+1, TotFixed, TotMin+Mi, infinity);
-get_size_info({stretch,W,Mi,_Ma}, TotW, NumW, TotFixed, TotMin, infinity, Specs) ->
- get_size_info(Specs, TotW+W, NumW+1, TotFixed, TotMin+Mi, infinity);
-get_size_info({stretch,W,Mi,Ma}, TotW, NumW, TotFixed, TotMin, TotMax, Specs) ->
- get_size_info(Specs, TotW+W, NumW+1, TotFixed, TotMin+Mi, TotMax+Ma).
+
+get_size_info({fixed, P}, TotW, NumW, TotFixed, TotMin, TotMax, Specs) ->
+ get_size_info(Specs, TotW, NumW, TotFixed + P, TotMin, TotMax);
+get_size_info({stretch, W}, TotW, NumW, TotFixed, TotMin, _TotMax, Specs) ->
+ get_size_info(Specs, TotW + W, NumW + 1, TotFixed, TotMin, infinity);
+get_size_info({stretch, W, Mi}, TotW, NumW, TotFixed, TotMin, _TotMax, Specs) ->
+ get_size_info(Specs, TotW + W, NumW + 1, TotFixed, TotMin + Mi, infinity);
+get_size_info({stretch, W, Mi, Ma}, TotW, NumW, TotFixed, TotMin, TotMax, Specs) ->
+ get_size_info(Specs, TotW + W, NumW + 1, TotFixed, TotMin + Mi, if
+ TotMax =:= infinity -> infinity;
+ true -> TotMax + Ma
+ end).
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_arc.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_arc.erl
--- otp_src_19.0.5/lib/gs/src/gstk_arc.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_arc.erl 2016-08-25 16:37:44.561693414 +0300
@@ -24,14 +24,15 @@
%% ------------------------------------------------------------
-module(gstk_arc).
--compile([{nowarn_deprecated_function,{gs,creation_error,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, creation_error, 2}}]).
%%-----------------------------------------------------------------------------
%% ARC OPTIONS
%%
%% Attributes:
%% bw Int
-%% coords [{X1,Y1}, {X2,Y2}]
+%% coords [{X1, Y1}, {X2, Y2}]
%% data Data
%% extent Degrees
%% fg Color
@@ -63,8 +64,7 @@
%% type
%%
--export([create/3, config/3, read/3, delete/2, destroy/3, event/5,
- option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, destroy/3, event/5, option/5, read_option/5]).
-include("gstk.hrl").
@@ -84,18 +84,14 @@
%%
%% Return : [Gsid_of_new_widget | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-create(DB, GstkId, Opts) ->
- case gstk_canvas:pickout_coords(Opts, [],GstkId#gstkid.objtype,2) of
- {error, Error} ->
- gs:creation_error(GstkId,Error);
+create(DB, #gstkid{objtype = ObjType} = GstkId, Opts) ->
+ case gstk_canvas:pickout_coords(Opts, [], ObjType, 2) of
+ {error, Error} -> gs:creation_error(GstkId, Error);
{Coords, NewOpts} ->
- Ngstkid=gstk_canvas:upd_gstkid(DB, GstkId, Opts),
- #gstkid{widget=CanvasTkW}=Ngstkid,
- MCmd = [CanvasTkW, " create ar ", Coords],
- gstk_canvas:mk_cmd_and_call(NewOpts,Ngstkid,CanvasTkW,MCmd,DB)
+ #gstkid{widget = CanvasTkW} = Ngstkid = gstk_canvas:upd_gstkid(DB, GstkId, Opts),
+ gstk_canvas:mk_cmd_and_call(NewOpts, Ngstkid, CanvasTkW, [CanvasTkW, " create ar ", Coords], DB)
end.
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : config/3
%% Purpose : Configure a widget of the type defined in this module.
@@ -105,8 +101,7 @@ create(DB, GstkId, Opts) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
- gstk_canvas:item_config(DB, Gstkid, Opts).
+config(DB, Gstkid, Opts) -> gstk_canvas:item_config(DB, Gstkid, Opts).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -117,9 +112,7 @@ config(DB, Gstkid, Opts) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- Item = Gstkid#gstkid.widget_data,
- gstk_generic:read_option(DB,Gstkid,Opt,[gstk:to_ascii(Item)]).
+read(DB, #gstkid{widget_data = Item} = Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt, [gstk:to_ascii(Item)]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -130,9 +123,7 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy | {Parent, Objmod, Args}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
- gstk_canvas:item_delete_impl(DB,Gstkid).
-
+delete(DB, Gstkid) -> gstk_canvas:item_delete_impl(DB, Gstkid).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : destroy/3
@@ -143,12 +134,9 @@ delete(DB, Gstkid) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-destroy(_DB, Canvas, Item) ->
- gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-
+destroy(_DB, Canvas, Item) -> gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%%------------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -160,16 +148,18 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%% Canvas - The canvas tk-widget
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, _Gstkid, _Canvas, _DB, _AItem) ->
- case Option of
- {bw, Int} -> {s, [" -w ", gstk:to_ascii(Int)]};
- {extent, Degrees} -> {s, [" -e ", gstk:to_ascii(Degrees)]};
- {fg, Color} -> {s, [" -outline ", gstk:to_color(Color)]};
- {start, Degrees} -> {s, [" -start ", gstk:to_ascii(Degrees)]};
- {style, Style} -> {s, [" -sty ", gstk:to_ascii(Style)]};
- _ -> invalid_option
- end.
+option(Option, _Gstkid, _Canvas, _DB, _AItem) -> option(Option).
+option({fg, Color}) -> option_s([" -outline ", gstk:to_color(Color)]);
+option({bw, Int}) -> to_ascii(" -w ", Int);
+option({extent, Degrees}) -> to_ascii(" -e ", Degrees);
+option({start, Degrees}) -> to_ascii(" -start ", Degrees);
+option({style, Style}) -> to_ascii(" -sty ", Style);
+option(_Option) -> invalid_option.
+
+option_s(L) -> {s, L}.
+
+to_ascii(Str, Val) -> option_s([Str, gstk:to_ascii(Val)]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/5
@@ -178,15 +168,19 @@ option(Option, _Gstkid, _Canvas, _DB, _A
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
read_option(Option, Gstkid, Canvas, _DB, AItem) ->
- case Option of
- bw -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -w"]);
- extent -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -e"]);
- fg -> tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -outline"]);
- start -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -start"]);
- stipple -> tcl2erl:ret_stipple([Canvas, " itemcg ", AItem, " -sti"]);
- style -> tcl2erl:ret_atom([Canvas, " itemcg ", AItem, " -sty"]);
-
- _ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+ case read_option(Option, AItem, Canvas) of
+ invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+ O -> O
end.
+read_option(fg, AItem, Canvas) -> tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -outline"]);
+read_option(stipple, AItem, Canvas) -> tcl2erl:ret_stipple([Canvas, " itemcg ", AItem, " -sti"]);
+read_option(style, AItem, Canvas) -> tcl2erl:ret_atom([Canvas, " itemcg ", AItem, " -sty"]);
+read_option(bw, AItem, Canvas) -> ret_int(" -w", AItem, Canvas);
+read_option(extent, AItem, Canvas) -> ret_int(" -e", AItem, Canvas);
+read_option(start, AItem, Canvas) -> ret_int(" -start", AItem, Canvas);
+read_option(_Option, _AItem, _Canvas) -> invalid_option.
+
+ret_int(Str, AItem, Canvas) -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, Str]).
+
%% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_button.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_button.erl
--- otp_src_19.0.5/lib/gs/src/gstk_button.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_button.erl 2016-08-25 16:37:44.561693414 +0300
@@ -31,8 +31,8 @@
%% Attributes:
%% activebg Color
%% activefg Color
-%% align n,w,s,e,nw,se,ne,sw,center
-%% anchor n,w,s,e,nw,se,ne,sw,center
+%% align n, w,s, e,nw, se, ne, sw, center
+%% anchor n, w,s, e,nw, se, ne, sw, center
%% bg Color
%% bw Int
%% data Data
@@ -84,7 +84,7 @@
%% font ??????
%%
--export([create/3,config/3,read/3,delete/2,event/5,option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5]).
-include("gstk.hrl").
@@ -97,13 +97,12 @@
%% Return : [Gsid_of_new_widget | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
create(DB, GstkId, Opts) ->
- TkW = gstk_generic:mk_tkw_child(DB,GstkId),
- NGstkId=GstkId#gstkid{widget=TkW},
- PlacePreCmd = [";place ", TkW],
- case gstk_generic:make_command(Opts,NGstkId,TkW,"",PlacePreCmd,DB) of
- {error,Reason} -> {error,Reason};
+ TkW = gstk_generic:mk_tkw_child(DB, GstkId),
+ NGstkId = GstkId#gstkid{widget = TkW},
+ case gstk_generic:make_command(Opts, NGstkId, TkW, "", [";place ", TkW], DB) of
+ {error, _Reason} = E -> E;
Cmd when is_list(Cmd) ->
- gstk:exec(["button ", TkW," -rel raised -bo 2 ",Cmd]),
+ gstk:exec(["button ", TkW, " -rel raised -bo 2 ", Cmd]),
NGstkId
end.
@@ -116,10 +115,7 @@ create(DB, GstkId, Opts) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
- TkW = Gstkid#gstkid.widget,
- SimplePreCmd = [TkW, " conf"],
- gstk_generic:mk_cmd_and_exec(Opts,Gstkid,SimplePreCmd,DB).
+config(DB, #gstkid{widget = TkW} = Gstkid, Opts) -> gstk_generic:mk_cmd_and_exec(Opts, Gstkid, [TkW, " conf"], DB).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -130,8 +126,7 @@ config(DB, Gstkid, Opts) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- gstk_generic:read_option(DB, Gstkid, Opt).
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -142,12 +137,11 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
gstk_db:delete_widget(DB, Gstkid),
- Gstkid#gstkid.widget.
+ TkW.
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%%------------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -162,17 +156,30 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%%
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, TkW, DB,_) ->
- case Option of
- {bitmap, Bitmap} -> {s, [" -bi @", Bitmap]};
- {disabledfg, Color} -> {s, [" -disabledf ", gstk:to_color(Color)]};
- {underline, Int} -> {s, [" -un ", gstk:to_ascii(Int)]};
- {wraplength, Int} -> {s, [" -wr ", gstk:to_ascii(Int)]};
- invoke -> {c, [TkW, " i;"]};
- flash -> {c, [TkW, " f;"]};
- {click, On} -> cbind(DB, Gstkid, click, On);
- _ -> invalid_option
- end.
+option(Option, Gstkid, TkW, DB, _) -> option(Option, Gstkid, TkW, DB).
+
+option({click, On}, Gstkid, _TkW, DB) -> cbind(DB, Gstkid, click, On);
+option(Option, _Gstkid, TkW, _DB) -> option(Option, TkW).
+
+option(invoke, TkW) -> option_c(" i;", TkW);
+option(flash, TkW) -> option_c(" f;", TkW);
+option(Option, _TkW) -> option(Option).
+
+option({bitmap, Bitmap}) -> option_s(" -bi @", Bitmap);
+option({disabledfg, Color}) -> option_s(" -disabledf ", gstk:to_color(Color));
+option({underline, Int}) -> to_ascii(" -un ", Int);
+option({wraplength, Int}) -> to_ascii(" -wr ", Int);
+option(_Option) -> invalid_option.
+
+option_c(L) -> {c, L}.
+
+option_c(Str, TkW) -> option_c([TkW, Str]).
+
+option_s(L) -> {s, L}.
+
+option_s(Str, Val) -> option_s([Str, Val]).
+
+to_ascii(Str, Int) -> option_s(Str, gstk:to_ascii(Int)).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/4
@@ -184,17 +191,24 @@ option(Option, Gstkid, TkW, DB,_) ->
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,Gstkid, TkW,DB,_) ->
- case Option of
- disabledfg -> tcl2erl:ret_color([TkW, " cg -disabledf"]);
- underline -> tcl2erl:ret_int([TkW, " cg -un"]);
- wraplength -> tcl2erl:ret_int([TkW, " cg -wr"]);
+read_option(Option, Gstkid, TkW, DB, _) -> read_option(Option, Gstkid, TkW, DB).
- click -> gstk_db:is_inserted(DB, Gstkid, click);
+read_option(click, Gstkid, _TkW, DB) -> gstk_db:is_inserted(DB, Gstkid, click);
+read_option(Option, Gstkid, TkW, _DB) -> read_option(Option, Gstkid, TkW).
- _ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+read_option(Option, Gstkid, TkW) ->
+ case read_option(Option, TkW) of
+ invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+ O -> O
end.
+read_option(disabledfg, TkW) -> tcl2erl:ret_color([TkW, " cg -disabledf"]);
+read_option(underline, TkW) -> ret_int(" cg -un", TkW);
+read_option(wraplength, TkW) -> ret_int(" cg -wr", TkW);
+read_option(_Option, _TkW) -> invalid_option.
+
+ret_int(Str, TkW) -> tcl2erl:ret_int([TkW, Str]).
+
%%------------------------------------------------------------------------------
%% PRIMITIVES
%%------------------------------------------------------------------------------
@@ -202,20 +216,11 @@ read_option(Option,Gstkid, TkW,DB,_) ->
%%
%% Config bind
%%
-cbind(DB, Gstkid, Etype, On) ->
- TkW = Gstkid#gstkid.widget,
- Cmd = case On of
- {true, Edata} ->
- Eref = gstk_db:insert_event(DB, Gstkid, Etype, Edata),
- [" -command {erlsend ", Eref, " \\\"[", TkW, " cg -text]\\\"}"];
- true ->
- Eref = gstk_db:insert_event(DB, Gstkid, Etype, ""),
- [" -command {erlsend ", Eref, " \\\"[", TkW, " cg -text]\\\"}"];
- _Other ->
- gstk_db:delete_event(DB, Gstkid, Etype),
- " -command {}"
- end,
- {s, Cmd}.
+cbind(DB, Gstkid, Etype, true) -> cbind(DB, Gstkid, Etype, {true, ""});
+cbind(DB, #gstkid{widget = TkW} = Gstkid, Etype, {true, Edata}) ->
+ option_s([" -command {erlsend ", gstk_db:insert_event(DB, Gstkid, Etype, Edata), " \\\"[", TkW, " cg -text]\\\"}"]);
+cbind(DB, Gstkid, Etype, _On) ->
+ gstk_db:delete_event(DB, Gstkid, Etype),
+ option_s(" -command {}").
%% ----- Done -----
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_canvas.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_canvas.erl
--- otp_src_19.0.5/lib/gs/src/gstk_canvas.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_canvas.erl 2016-08-25 16:37:44.562693392 +0300
@@ -24,15 +24,15 @@
%% ------------------------------------------------------------
-module(gstk_canvas).
--compile([{nowarn_deprecated_function,{gs,pair,2}},
- {nowarn_deprecated_function,{gs,val,2}}]).
+-compile([{nowarn_deprecated_function, {gs, pair, 2}},
+ {nowarn_deprecated_function, {gs, val, 2}}]).
%%-----------------------------------------------------------------------------
%% CANVAS OPTIONS
%%
%% Attributes:
%% activebg Color
-%% anchor n,w,s,e,nw,se,ne,sw,center
+%% anchor n, w,s, e,nw, se, ne, sw, center
%% bc Color
%% bg Color
%% bw Wth
@@ -56,7 +56,7 @@
%%
%%
%% Commands:
-%% find {X, Y} => Item at pos X,Y or false
+%% find {X, Y} => Item at pos X, Y or false
%% setfocus Bool
%%
%% Events:
@@ -81,10 +81,16 @@
%% fg Color
%%
--export([create/3,config/3,read/3,delete/2,event/5,option/5,read_option/5]).
--export([make_command/5,make_command/6,pickout_coords/4, coords/1,
- item_config/3,mk_create_opts_for_child/4,
- upd_gstkid/3,item_delete_impl/2,mk_cmd_and_exec/6,mk_cmd_and_call/5]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5]).
+-export([make_command/5, make_command/6,
+ pickout_coords/4,
+ coords/1,
+ item_config/3,
+ mk_create_opts_for_child/4,
+ upd_gstkid/3,
+ item_delete_impl/2,
+ mk_cmd_and_exec/6,
+ mk_cmd_and_call/5]).
-include("gstk.hrl").
@@ -96,33 +102,26 @@
%% Return : [Gsid_of_new_widget | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
create(DB, Gstkid, Opts) ->
- MainW = gstk_generic:mk_tkw_child(DB,Gstkid),
- Canvas = lists:append(MainW,".z"),
+ MainW = gstk_generic:mk_tkw_child(DB, Gstkid),
+ Canvas = lists:append(MainW, ".z"),
{Vscroll, Hscroll, NewOpts} = gstk_generic:parse_scrolls(Opts),
- WidgetD = #so{main=MainW, object=Canvas,
- hscroll=Hscroll, vscroll=Vscroll},
- NGstkid=Gstkid#gstkid{widget=MainW, widget_data=WidgetD},
- MandatoryCmd = ["so_create canvas ", MainW],
- case gstk:call(MandatoryCmd) of
+ NGstkid = Gstkid#gstkid{widget = MainW,
+ widget_data = #so{main = MainW, object = Canvas, hscroll = Hscroll, vscroll = Vscroll}},
+ case gstk:call(NGstkid) of
{result, _} ->
- SimplePreCmd = [MainW, " conf"],
- PlacePreCmd = [";place ", MainW],
- gstk_db:insert_opt(DB,Gstkid,gs:pair(scrollregion,Opts)),
- case gstk_generic:make_command(NewOpts, NGstkid, MainW,
- SimplePreCmd, PlacePreCmd, DB,Canvas) of
- {error,Reason} -> {error,Reason};
+ gstk_db:insert_opt(DB, Gstkid, gs:pair(scrollregion, Opts)),
+ case gstk_generic:make_command(NewOpts, NGstkid, MainW, [MainW, " conf"], [";place ", MainW], DB, Canvas) of
+ {error, _Reason} = E -> E;
Cmd when is_list(Cmd) ->
gstk:exec(Cmd),
- gstk:exec([MainW,".sy conf -rel sunken -bo 2;",
- MainW,".pad.sx conf -rel sunken -bo 2;"]),
+ gstk:exec([MainW, ".sy conf -rel sunken -bo 2;", MainW, ".pad.sx conf -rel sunken -bo 2;"]),
NGstkid
end;
- Bad_Result ->
- {bad_result, Bad_Result}
+ Bad_Result -> {bad_result, Bad_Result}
end.
-mk_create_opts_for_child(DB,Cgstkid, Pgstkid, Opts) ->
- gstk_generic:mk_create_opts_for_child(DB,Cgstkid,Pgstkid,Opts).
+mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts) ->
+ gstk_generic:mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : config/3
@@ -133,15 +132,9 @@ mk_create_opts_for_child(DB,Cgstkid, Pgs
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Options) ->
- SO = Gstkid#gstkid.widget_data,
- MainW = Gstkid#gstkid.widget,
- Canvas = SO#so.object,
- NewOpts = gstk_generic:parse_scrolls(Gstkid, Options),
- SimplePreCmd = [MainW, " conf"],
- PlacePreCmd = [";place ", MainW],
- gstk_generic:mk_cmd_and_exec(NewOpts, Gstkid, MainW,
- SimplePreCmd, PlacePreCmd, DB,Canvas).
+config(DB, #gstkid{widget_data = #so{object = O}, widget = MainW} = Gstkid, Options) ->
+ gstk_generic:mk_cmd_and_exec(gstk_generic:parse_scrolls(Gstkid, Options),
+ Gstkid, MainW, [MainW, " conf"], [";place ", MainW], DB, O).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -152,10 +145,7 @@ config(DB, Gstkid, Options) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- SO = Gstkid#gstkid.widget_data,
- gstk_generic:read_option(DB, Gstkid, Opt,SO#so.object).
-
+read(DB, #gstkid{widget_data = #so{object = O}} = Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt, O).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : delete/2
@@ -165,13 +155,11 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = W} = Gstkid) ->
gstk_db:delete_widget(DB, Gstkid),
- Gstkid#gstkid.widget.
-
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+ W.
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%%-----------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -187,50 +175,37 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%%
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option,Gstkid,_MainW,DB,Canvas) ->
- case Option of
- {scrollregion, {X1, Y1, X2, Y2}} ->
- gstk_db:insert_opt(DB,Gstkid,Option),
- {c, [Canvas, " conf -scrollr {",
- gstk:to_ascii(X1), " ", gstk:to_ascii(Y1), " ",
- gstk:to_ascii(X2), " ", gstk:to_ascii(Y2),"}"]};
- {yscrollpos, Y} ->
- {_,Ymin,_,Ymax} = gstk_db:opt(DB,Gstkid,scrollregion),
- K = 1/(Ymax-Ymin),
- M = -K*Ymin,
- PercentOffViewTop = K*Y+M,
- {c, [Canvas," yvi mo ",gstk:to_ascii(PercentOffViewTop)]};
- {xscrollpos, X} ->
- {Xmin,_,Xmax,_} = gstk_db:opt(DB,Gstkid,scrollregion),
- K = 1/(Xmax-Xmin),
- M = -K*Xmin,
- PercentOffViewLeft = K*X+M,
- {c, [Canvas," xvi mo ",gstk:to_ascii(PercentOffViewLeft)]};
- {buttonpress, On} -> bind(DB, Gstkid, Canvas, buttonpress, On);
- {buttonrelease, On} -> bind(DB, Gstkid, Canvas, buttonrelease, On);
- {configure, On} -> bind(DB, Gstkid, Canvas, configure, On);
- {destroy, On} -> bind(DB, Gstkid, Canvas, destroy, On);
- {enter, On} -> bind(DB, Gstkid, Canvas, enter, On);
- {focus, On} -> bind(DB, Gstkid, Canvas, focus, On);
- {keypress, On} -> bind(DB, Gstkid, Canvas, keypress, On);
- {keyrelease, On} -> bind(DB, Gstkid, Canvas, keyrelease, On);
- {leave, On} -> bind(DB, Gstkid, Canvas, leave, On);
- {motion, On} -> bind(DB, Gstkid, Canvas, motion, On);
+option(Option, Gstkid, _MainW, DB, Canvas) -> option(Option, Gstkid, Canvas, DB).
- {secret_hack_gridit, GridGstkid} ->
- CRef = gstk_db:insert_event(DB, GridGstkid, click, []),
- ClickCmd = [Canvas, " bind all <ButtonRelease-1> {erlsend ", CRef,
- " [",Canvas, " find withtag current]};"],
- DRef = gstk_db:insert_event(DB, GridGstkid, doubleclick, []),
- DclickCmd = [Canvas," bind all <Double-ButtonRelease-1> {erlsend ",
- DRef," [",Canvas, " find withtag current]}"],
- %% bind all at once for preformance reasons.
- {c, [ClickCmd,DclickCmd]};
- {secret_forwarded_grid_event, {Event,On},GridGstkid} ->
- bind(DB,GridGstkid,Canvas,Event,On);
- _ -> invalid_option
- end.
+option({scrollregion, {X1, Y1, X2, Y2}} = Option, Gstkid, Canvas, DB) ->
+ gstk_db:insert_opt(DB, Gstkid, Option),
+ option_c([Canvas, " conf -scrollr {",
+ gstk:to_ascii(X1), " ", gstk:to_ascii(Y1), " ", gstk:to_ascii(X2), " ", gstk:to_ascii(Y2), "}"]);
+option({xscrollpos, X}, Gstkid, Canvas, DB) ->
+ {Xmin, _, Xmax, _} = gstk_db:opt(DB, Gstkid, scrollregion),
+ option_c([Canvas, " xvi mo ", gstk:to_ascii(1 / (Xmax - Xmin) * (X - Xmin))]);
+option({yscrollpos, Y}, Gstkid, Canvas, DB) ->
+ {_, Ymin, _, Ymax} = gstk_db:opt(DB, Gstkid, scrollregion),
+ option_c([Canvas, " yvi mo ", gstk:to_ascii(1 / (Ymax - Ymin) * (Y - Ymin))]);
+option({secret_hack_gridit, GridGstkid}, _Gstkid, Canvas, DB) ->
+ %% bind all at once for preformance reasons.
+ option_c([[Canvas, " bind all <ButtonRelease-1> {erlsend ",
+ gstk_db:insert_event(DB, GridGstkid, click, []), " [", Canvas, " find withtag current]};"],
+ [Canvas, " bind all <Double-ButtonRelease-1> {erlsend ",
+ gstk_db:insert_event(DB, GridGstkid, doubleclick, []), " [", Canvas, " find withtag current]}"]]);
+option({secret_forwarded_grid_event, {Event, On}, GridGstkid}, _Gstkid, Canvas, DB) ->
+ bind(DB, GridGstkid, Canvas, Event, On);
+option({O, On}, Gstkid, Canvas, DB) when O =:= buttonpress; O =:= buttonrelease; O =:= motion;
+ O =:= configure;
+ O =:= destroy;
+ O =:= enter;
+ O =:= focus; O =:= leave;
+ O =:= keypress; O =:= keyrelease ->
+ bind(DB, Gstkid, Canvas, O, On);
+option(_Option, _Gstkid, _Canvas, _DB) -> invalid_option.
+
+option_c(L) -> {c, L}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/5
@@ -238,57 +213,44 @@ option(Option,Gstkid,_MainW,DB,Canvas) -
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,Gstkid,_MainW,DB,Canvas) ->
- case Option of
- scrollregion -> gstk_db:opt(DB,Gstkid,scrollregion);
- {hit, {X,Y}} ->
- hit(DB,Canvas,X,Y,X,Y);
- {hit, [{X1,Y1},{X2,Y2}]} ->
- hit(DB,Canvas,X1,Y1,X2,Y2);
- % {% hidden above, % of total area that is visible + % hidden above}
- yscrollpos ->
- {PercentOffViewTop,_} = tcl2erl:ret_tuple([Canvas," yvi"]),
- {_,Ymin,_,Ymax} = gstk_db:opt(DB,Gstkid,scrollregion),
- K = 1/(Ymax-Ymin),
- M = -K*Ymin,
- _Y = round((PercentOffViewTop - M)/K);
- xscrollpos ->
- {PercentOffViewLeft,_} = tcl2erl:ret_tuple([Canvas," xvi"]),
- {Xmin,_,Xmax,_} = gstk_db:opt(DB,Gstkid,scrollregion),
- K = 1/(Xmax-Xmin),
- M = -K*Xmin,
- _X = round((PercentOffViewLeft-M)/K);
- buttonpress -> gstk_db:is_inserted(DB, Gstkid, buttonpress);
- buttonrelease -> gstk_db:is_inserted(DB, Gstkid, buttonrelease);
- configure -> gstk_db:is_inserted(DB, Gstkid, configure);
- destroy -> gstk_db:is_inserted(DB, Gstkid, destroy);
- enter -> gstk_db:is_inserted(DB, Gstkid, enter);
- focus -> gstk_db:is_inserted(DB, Gstkid, focus);
- keypress -> gstk_db:is_inserted(DB, Gstkid, keypress);
- keyrelease -> gstk_db:is_inserted(DB, Gstkid, keyrelease);
- leave -> gstk_db:is_inserted(DB, Gstkid, leave);
- motion -> gstk_db:is_inserted(DB, Gstkid, motion);
+read_option(Option, Gstkid, _MainW, DB, Canvas) -> read_option(DB, Gstkid, Option, Canvas).
- _ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
- end.
+% {% hidden above, % of total area that is visible + % hidden above}
+read_option(DB, Gstkid, xscrollpos, Canvas) ->
+ {PercentOffViewLeft, _} = tcl2erl:ret_tuple([Canvas, " xvi"]),
+ {Xmin, _, Xmax, _} = gstk_db:opt(DB, Gstkid, scrollregion),
+ K = 1 / (Xmax - Xmin),
+ _X = round((PercentOffViewLeft + K * Xmin) / K);
+read_option(DB, Gstkid, yscrollpos, Canvas) ->
+ {PercentOffViewTop, _} = tcl2erl:ret_tuple([Canvas, " yvi"]),
+ {_, Ymin, _, Ymax} = gstk_db:opt(DB, Gstkid, scrollregion),
+ K = 1 / (Ymax - Ymin),
+ _Y = round((PercentOffViewTop + K * Ymin) / K);
+read_option(DB, _Gstkid, {hit, {X, Y}}, Canvas) -> hit(DB, Canvas, X, Y, X, Y);
+read_option(DB, _Gstkid, {hit, [{X1, Y1}, {X2, Y2}]}, Canvas) -> hit(DB, Canvas, X1, Y1, X2, Y2);
+read_option(DB, Gstkid, Option, _Canvas) -> read_option(DB, Gstkid, Option).
-hit(DB,Canvas,X1,Y1,X2,Y2) ->
- Ax1 = gstk:to_ascii(X1),
- Ay1 = gstk:to_ascii(Y1),
- Ax2 = gstk:to_ascii(X2),
- Ay2 = gstk:to_ascii(Y2),
- case tcl2erl:ret_list([Canvas," find overlapping ",
- Ax1,$ ,Ay1,$ ,Ax2,$ ,Ay2]) of
+read_option(DB, Gstkid, scrollregion) -> gstk_db:opt(DB, Gstkid, scrollregion);
+read_option(DB, Gstkid, Option) when Option =:= buttonpress; Option =:= buttonrelease; Option =:= motion;
+ Option =:= configure;
+ Option =:= destroy;
+ Option =:= enter;
+ Option =:= focus; Option =:= leave;
+ Option =:= keypress; Option =:= keyrelease ->
+ gstk_db:is_inserted(DB, Gstkid, Option);
+read_option(_DB, Gstkid, Option) -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}.
+
+hit(DB, Canvas, X1, Y1, X2, Y2) ->
+ case tcl2erl:ret_list([Canvas, " find overlapping "|lists:join($ ,
+ lists:map(fun gstk:to_ascii/1, [X1, Y1, X2, Y2]))]) of
Items when is_list(Items) ->
- [{_,Node}] = ets:lookup(DB,frontend_node),
- fix_ids(Items,DB,Canvas,Node);
- Other ->
- {bad_result, Other}
+ [{_, Node}] = ets:lookup(DB, frontend_node),
+ fix_ids(Items, DB, Canvas, Node);
+ Other -> {bad_result, Other}
end.
-fix_ids([Item|Items],DB,Canvas,Node) ->
- [{gstk_db:lookup_item(DB,Canvas,Item),Node}|fix_ids(Items,DB,Canvas,Node)];
-fix_ids([],_,_,_) -> [].
+fix_ids(Items, DB, Canvas, Node) when is_list(Items) ->
+ lists:foldr(fun(Item, A) -> [{gstk_db:lookup_item(DB, Canvas, Item), Node}|A] end, [], Items).
%%-----------------------------------------------------------------------------
%% PRIMITIVES
@@ -307,15 +269,11 @@ bind(DB, Gstkid, TkW, Etype, On) ->
Cmd -> {c, Cmd}
end.
-bind(DB, Gstkid, TkW, Etype, On, WS) ->
- case On of
- true -> ebind(DB, Gstkid, TkW, Etype, WS, "");
- false -> eunbind(DB, Gstkid, TkW, Etype, WS, "");
- {true, Edata} -> ebind(DB, Gstkid, TkW, Etype, WS, Edata);
- {false, Edata} -> eunbind(DB, Gstkid, TkW, Etype, WS, Edata);
- _ -> invalid_option
- end.
-
+bind(DB, Gstkid, TkW, Etype, false, WS) -> eunbind(DB, Gstkid, TkW, Etype, WS);
+bind(DB, Gstkid, TkW, Etype, {true, Edata}, WS) -> ebind(DB, Gstkid, TkW, Etype, WS, Edata);
+bind(DB, Gstkid, TkW, Etype, true, WS) -> bind(DB, Gstkid, TkW, Etype, {true, ""}, WS);
+bind(DB, Gstkid, TkW, Etype, {false, _Edata}, WS) -> bind(DB, Gstkid, TkW, Etype, false, WS);
+bind(_DB, _Gstkid, _TkW, _Etype, _On, _WS) -> invalid_option.
%%
%% Event bind on
@@ -325,49 +283,31 @@ bind(DB, Gstkid, TkW, Etype, On, WS) ->
%% WS = Widget suffix for complex widgets
%%
ebind(DB, Gstkid, TkW, Etype, WS, Edata) ->
- Eref = gstk_db:insert_event(DB, Gstkid, Etype, Edata),
- P = ["bind ", TkW, WS],
- Cmd = case Etype of
- motion -> [P, " <Motion> {erlsend ", Eref, " [",
- TkW, " canvasx %x] [", TkW, " canvasy %y] %x %y}"];
- keypress ->
- [P, " <Key> {erlsend ", Eref," %K %N 0 0 [",
- TkW, " canvasx %x] [", TkW, " canvasy %y]};",
- P, " <Shift-Key> {erlsend ", Eref, " %K %N 1 0 [",
- TkW, " canvasx %x] [", TkW, " canvasy %y]};",
- P, " <Control-Key> {erlsend ", Eref, " %K %N 0 1 [",
- TkW, " canvasx %x] [", TkW, " canvasy %y]};",
- P, " <Control-Shift-Key> {erlsend ", Eref," %K %N 1 1 [",
- TkW, " canvasx %x] [", TkW, " canvasy %y]}"];
- keyrelease ->
- [P, " <KeyRelease> {erlsend ", Eref," %K %N 0 0 [",
- TkW, " canvasx %x] [", TkW, " canvasy %y]};",
- P, " <Shift-KeyRelease> {erlsend ", Eref, " %K %N 1 0 [",
- TkW, " canvasx %x] [", TkW, " canvasy %y]};",
- P, " <Control-KeyRelease> {erlsend ", Eref, " %K %N 0 1 [",
- TkW, " canvasx %x] [", TkW, " canvasy %y]};",
- P," <Control-Shift-KeyRelease> {erlsend ",Eref," %K %N 1 1[",
- TkW, " canvasx %x] [", TkW, " canvasy %y]}"];
- buttonpress ->
- [P, " <Button> {erlsend ", Eref, " %b [",
- TkW, " canvasx %x] [", TkW, " canvasy %y] %x %y}"];
- buttonrelease ->
- [P, " <ButtonRelease> {erlsend ", Eref, " %b [",
- TkW, " canvasx %x] [", TkW, " canvasy %y] %x %y}"];
- leave -> [P, " <Leave> {erlsend ", Eref, "}"];
- enter -> [P, " <Enter> {erlsend ", Eref, "}"];
- destroy ->
- [P, " <Destroy> {if {\"%W\"==\"", [TkW, WS],
- "\"} {erlsend ", Eref, "}}"];
- focus ->
- [P, " <FocusIn> {erlsend ", Eref, " true};" ,
- P, " <FocusOut> {erlsend ", Eref, " false}"];
- configure ->
- [P, " <Configure> {if {\"%W\"==\"", [TkW, WS],
- "\"} {erlsend ", Eref, " %w %h %x %y}}"]
- end,
- Cmd.
-
+ ebind(gstk_db:insert_event(DB, Gstkid, Etype, Edata), ["bind ", TkW, WS], TkW, Etype, WS).
+
+ebind(Eref, P, _TkW, leave, _WS) -> [P, " <Leave> {erlsend ", Eref, "}"];
+ebind(Eref, P, _TkW, enter, _WS) -> [P, " <Enter> {erlsend ", Eref, "}"];
+ebind(Eref, P, TkW, destroy, WS) -> [P, " <Destroy> {if {\"%W\"==\"", [TkW, WS], "\"} {erlsend ", Eref, "}}"];
+ebind(Eref, P, TkW, configure, WS) ->
+ [P, " <Configure> {if {\"%W\"==\"", [TkW, WS], "\"} {erlsend ", Eref, " %w %h %x %y}}"];
+ebind(Eref, P, TkW, motion, _WS) ->
+ [P, " <Motion> {erlsend ", Eref, " [", TkW, " canvasx %x] [", TkW, " canvasy %y] %x %y}"];
+ebind(Eref, P, TkW, buttonpress, _WS) ->
+ [P, " <Button> {erlsend ", Eref, " %b [", TkW, " canvasx %x] [", TkW, " canvasy %y] %x %y}"];
+ebind(Eref, P, TkW, buttonrelease, _WS) ->
+ [P, " <ButtonRelease> {erlsend ", Eref, " %b [", TkW, " canvasx %x] [", TkW, " canvasy %y] %x %y}"];
+ebind(Eref, P, _TkW, focus, _WS) ->
+ [P, " <FocusIn> {erlsend ", Eref, " true};" , P, " <FocusOut> {erlsend ", Eref, " false}"];
+ebind(Eref, P, TkW, keypress, _WS) ->
+ [P, " <Key> {erlsend ", Eref, " %K %N 0 0 [", TkW, " canvasx %x] [", TkW, " canvasy %y]};",
+ P, " <Shift-Key> {erlsend ", Eref, " %K %N 1 0 [", TkW, " canvasx %x] [", TkW, " canvasy %y]};",
+ P, " <Control-Key> {erlsend ", Eref, " %K %N 0 1 [", TkW, " canvasx %x] [", TkW, " canvasy %y]};",
+ P, " <Control-Shift-Key> {erlsend ", Eref, " %K %N 1 1 [", TkW, " canvasx %x] [", TkW, " canvasy %y]}"];
+ebind(Eref, P, TkW, keyrelease, _WS) ->
+ [P, " <KeyRelease> {erlsend ", Eref, " %K %N 0 0 [", TkW, " canvasx %x] [", TkW, " canvasy %y]};",
+ P, " <Shift-KeyRelease> {erlsend ", Eref, " %K %N 1 0 [", TkW, " canvasx %x] [", TkW, " canvasy %y]};",
+ P, " <Control-KeyRelease> {erlsend ", Eref, " %K %N 0 1 [", TkW, " canvasx %x] [", TkW, " canvasy %y]};",
+ P, " <Control-Shift-KeyRelease> {erlsend ", Eref, " %K %N 1 1[", TkW, " canvasx %x] [", TkW, " canvasy %y]}"].
%%
%% Unbind event
@@ -377,39 +317,22 @@ ebind(DB, Gstkid, TkW, Etype, WS, Edata)
%%
%% WS = Widget suffix for complex widgets
%%
-eunbind(DB, Gstkid, TkW, Etype, WS, _Edata) ->
+eunbind(DB, Gstkid, TkW, Etype, WS) ->
gstk_db:delete_event(DB, Gstkid, Etype),
- P = ["bind ", TkW, WS],
- Cmd = case Etype of
- motion ->
- [P, " <Motion> {}"];
- keypress ->
- [P, " <KeyRelease> {};",
- P, " <Shift-KeyRelease> {};",
- P, " <Control-KeyRelease> {};",
- P, " <Control-Shift-KeyRelease> {}"];
- keyrelease ->
- [P, " <KeyRelease> {};",
- P, " <Shift-KeyRelease> {};",
- P, " <Control-KeyRelease> {};",
- P, " <Control-Shift-KeyRelease> {}"];
- buttonpress ->
- [P, " <ButtonPress> {}"];
- buttonrelease ->
- [P, " <ButtonRelease> {}"];
- leave ->
- [P, " <Leave> {}"];
- enter ->
- [P, " <Enter> {}"];
- destroy ->
- [P, " <Destroy> {}"];
- focus ->
- [P, " <FocusIn> {};",
- P, " <FocusOut> {}"];
- configure ->
- [P, " <Configure> {}"]
- end,
- Cmd.
+ eunbind(Etype, ["bind ", TkW, WS]).
+
+eunbind(motion, P) -> [P, " <Motion> {}"];
+eunbind(buttonpress, P) -> [P, " <ButtonPress> {}"];
+eunbind(buttonrelease, P) -> [P, " <ButtonRelease> {}"];
+eunbind(leave, P) -> [P, " <Leave> {}"];
+eunbind(enter, P) -> [P, " <Enter> {}"];
+eunbind(destroy, P) -> [P, " <Destroy> {}"];
+eunbind(configure, P) -> [P, " <Configure> {}"];
+eunbind(focus, P) -> [P, " <FocusIn> {};", P, " <FocusOut> {}"];
+eunbind(keypress, P) -> [P, " <Key> {};", P, " <Shift-Key> {};", P, " <Control-Key> {};", P, " <Control-Shift-Key> {}"];
+eunbind(keyrelease, P) ->
+ [P, " <KeyRelease> {};", P, " <Shift-KeyRelease> {};",
+ P, " <Control-KeyRelease> {};", P, " <Control-Shift-KeyRelease> {}"].
%%======================================================================
%% Item library
@@ -417,25 +340,20 @@ eunbind(DB, Gstkid, TkW, Etype, WS, _Eda
mk_cmd_and_exec(Options, Gstkid, Canvas, AItem, SCmd, DB) ->
case make_command(Options, Gstkid, Canvas, AItem, SCmd, DB) of
- {error,Reason} -> {error,Reason};
- Cmd when is_list(Cmd) ->
- gstk:exec(Cmd)
+ {error, _Reason} = E -> E;
+ Cmd when is_list(Cmd) -> gstk:exec(Cmd)
end.
-mk_cmd_and_call(Opts,Gstkid, CanvasTkW, MCmd, DB) ->
- case make_command(Opts,Gstkid, CanvasTkW, MCmd, DB) of
- {error,Reason} -> {error,Reason};
- Cmd when is_list(Cmd) ->
- case tcl2erl:ret_int(Cmd) of
- Item when is_integer(Item) ->
- G2 = gstk_db:lookup_gstkid(DB,Gstkid#gstkid.id), % buu, not nice
- NewGstkid = G2#gstkid{widget_data=Item},
- NewGstkid;
- Bad_result ->
- {error,Bad_result}
- end
+mk_cmd_and_call(Opts, Gstkid, CanvasTkW, MCmd, DB) ->
+ case make_command(Opts, Gstkid, CanvasTkW, MCmd, DB) of
+ {error, _Reason} = E -> E;
+ Cmd when is_list(Cmd) -> case tcl2erl:ret_int(Cmd) of
+ Item when is_integer(Item) ->
+ G2 = gstk_db:lookup_gstkid(DB, Gstkid#gstkid.id), % buu, not nice
+ G2#gstkid{widget_data = Item};
+ Bad_result -> {error, Bad_result}
+ end
end.
-
%%----------------------------------------------------------------------
%% MCmd = Mandatory command
@@ -447,70 +365,49 @@ mk_cmd_and_call(Opts,Gstkid, CanvasTkW,
%% Comment: no placer options (we don't have to consider all permutations)
%%----------------------------------------------------------------------
make_command(Options, Gstkid, Canvas, AItem, SCmd, DB) ->
- case gstk_generic:out_opts(Options,Gstkid,Canvas,DB,AItem, [],[],[]) of
+ case gstk_generic:out_opts(Options, Gstkid, Canvas, DB, AItem, [], [], []) of
{[], [], []} -> [];
{Si, [], []} -> [SCmd, Si];
{[], [], Co} -> Co;
{Si, [], Co} -> [SCmd, Si, $;, Co];
- {error,Reason} -> {error,Reason}
+ {error, _Reason} = E -> E
end.
make_command(Options, Gstkid, Canvas, MCmd, DB) ->
- case gstk_generic:out_opts(Options,Gstkid,Canvas,DB,"$w",[],[],[]) of
+ case gstk_generic:out_opts(Options, Gstkid, Canvas, DB, "$w", [], [], []) of
{[], [], []} -> MCmd;
{Si, [], []} -> [MCmd, Si];
- {[], [], Co} -> ["set w [", MCmd, "];", Co, "set d $w"];
- {Si, [], Co} -> ["set w [", MCmd, Si, "];", Co, "set d $w"];
- {error,Reason} -> {error,Reason}
+ {Si, [], Co} -> ["set w [", MCmd] ++ Si ++ ["];", Co, "set d $w"];
+ {error, _Reason} = E -> E
end.
-item_config(DB, Gstkid, Opts) ->
- #gstkid{widget=Canvas,widget_data=Item}=Gstkid,
+item_config(DB, #gstkid{widget = Canvas, widget_data = Item} = Gstkid, Opts) ->
AItem = gstk:to_ascii(Item),
- SCmd = [Canvas, " itemconf ", AItem],
- case make_command(Opts, Gstkid, Canvas, AItem, SCmd, DB) of
- {error,Reason} -> {error,Reason};
- Cmd when is_list(Cmd) ->
- gstk:exec(Cmd)
+ case make_command(Opts, Gstkid, Canvas, AItem, [Canvas, " itemconf ", AItem], DB) of
+ {error, _Reason} = E -> E;
+ Cmd when is_list(Cmd) -> gstk:exec(Cmd)
end.
-pickout_coords([{coords,Coords} | Rest], Opts, ObjType, NbrOfCoords)
- when length(Coords) == NbrOfCoords ->
+pickout_coords([], _Opts, ObjType, NbrOfCoords) ->
+ {error, lists:flatten(io_lib:format("A ~w must have ~w coordinates", [ObjType, NbrOfCoords]))};
+pickout_coords([{coords, Coords}|Rest], Opts, ObjType, NbrOfCoords) when length(Coords) =:= NbrOfCoords ->
case coords(Coords) of
- invalid ->
- {error, io_lib:format("A ~w must have ~w coordinates",
- [ObjType,NbrOfCoords])};
- RealCoords ->
- {RealCoords, lists:append(Rest, Opts)}
+ invalid -> pickout_coords([], Opts, ObjType, NbrOfCoords);
+ RealCoords -> {RealCoords, lists:append(Rest, Opts)}
end;
-pickout_coords([Opt | Rest], Opts, ObjType, NbrOfCoords) ->
- pickout_coords(Rest, [Opt|Opts], ObjType, NbrOfCoords);
-pickout_coords([], _Opts, ObjType, NbrOfCoords) ->
- {error, io_lib:format("A ~w must have ~w coordinates",
- [ObjType,NbrOfCoords])}.
+pickout_coords([Opt|Rest], Opts, ObjType, NbrOfCoords) -> pickout_coords(Rest, [Opt|Opts], ObjType, NbrOfCoords).
-coords([{X,Y} | R]) when is_number(X),is_number(Y) ->
- [gstk:to_ascii(X), " ", gstk:to_ascii(Y), " ", coords(R)];
-coords([_]) -> %% not a pair
- invalid;
-coords([]) ->
- [].
+coords([{X, Y}|R]) when is_number(X), is_number(Y) -> [gstk:to_ascii(X), " ", gstk:to_ascii(Y), " ", coords(R)];
+coords([_]) -> invalid; %% not a pair
+coords([]) -> [].
-item_delete_impl(DB,Gstkid) ->
+item_delete_impl(DB, #gstkid{widget = Canvas, widget_data = Item, parent = P, id = ID, objtype = Type} = Gstkid) ->
gstk_db:delete_widget(DB, Gstkid),
- #gstkid{widget=Canvas,widget_data=Item,parent=P,id=ID,objtype=Type}=Gstkid,
- {P,ID,gstk_widgets:type2mod(Type), [Canvas, Item]}.
-
-
-upd_gstkid(DB, Gstkid, Opts) ->
- #gstkid{parent=Parent,owner=Owner}=Gstkid,
- Pgstkid = gstk_db:lookup_gstkid(DB, Parent, Owner),
- SO = Pgstkid#gstkid.widget_data,
- CanvasTkW = SO#so.object,
- gstk_db:insert_opt(DB,Gstkid,{coords,gs:val(coords,Opts)}),
- gstk_db:update_widget(DB,Gstkid#gstkid{widget=CanvasTkW,widget_data=no_item}).
+ {P, ID, gstk_widgets:type2mod(Type), [Canvas, Item]}.
+upd_gstkid(DB, #gstkid{parent = Parent, owner = Owner} = Gstkid, Opts) ->
+ #gstkid{widget_data = SO} = gstk_db:lookup_gstkid(DB, Parent, Owner),
+ gstk_db:insert_opt(DB, Gstkid, {coords, gs:val(coords, Opts)}),
+ gstk_db:update_widget(DB, Gstkid#gstkid{widget = SO#so.object, widget_data = no_item}).
%%% ----- Done -----
-
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_checkbutton.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_checkbutton.erl
--- otp_src_19.0.5/lib/gs/src/gstk_checkbutton.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_checkbutton.erl 2016-08-25 16:37:44.562693392 +0300
@@ -31,8 +31,8 @@
%% Attributes:
%% activebg Color
%% activefg Color
-%% align n,w,s,e,nw,se,ne,sw,center
-%% anchor n,w,s,e,nw,se,ne,sw,center
+%% align n, w,s, e,nw, se, ne, sw, center
+%% anchor n, w,s, e,nw, se, ne, sw, center
%% bg Color
%% bw Int
%% data Data
@@ -88,7 +88,7 @@
%% font ??????
%%
--export([create/3,config/3,read/3,delete/2,event/5,option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5]).
-include("gstk.hrl").
@@ -100,15 +100,14 @@
%% Purpose : Create a widget of the type defined in this module.
%% Return : [Gsid_of_new_widget | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-create(DB, GstkId, Opts) ->
- TkW = gstk_generic:mk_tkw_child(DB,GstkId),
- {G, GID, _NOpts} = fix_group(Opts, DB, GstkId#gstkid.owner),
- NGstkId=GstkId#gstkid{widget=TkW,widget_data={G, GID}},
- PlacePreCmd = [";place ", TkW],
- case gstk_generic:make_command(Opts,NGstkId,TkW,"",PlacePreCmd,DB) of
- {error,Reason} -> {error,Reason};
+create(DB, #gstkid{owner = Owner} = GstkId, Opts) ->
+ TkW = gstk_generic:mk_tkw_child(DB, GstkId),
+ {G, GID, _NOpts} = fix_group(Opts, DB, Owner),
+ NGstkId = GstkId#gstkid{widget = TkW, widget_data = {G, GID}},
+ case gstk_generic:make_command(Opts, NGstkId, TkW, "", [";place ", TkW], DB) of
+ {error, _Reason} = E -> E;
Cmd when is_list(Cmd) ->
- gstk:exec(["checkbutton ", TkW," -bo 2 -indi true ",Cmd]),
+ gstk:exec(["checkbutton ", TkW, " -bo 2 -indi true ", Cmd]),
NGstkId
end.
@@ -121,12 +120,9 @@ create(DB, GstkId, Opts) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
- TkW = Gstkid#gstkid.widget,
- {NOpts, NGstkid} = fix_group(Opts, DB, Gstkid#gstkid.owner, Gstkid),
- SimplePreCmd = [TkW, " conf"],
- PlacePreCmd = [";place ", TkW],
- gstk_generic:mk_cmd_and_exec(NOpts,NGstkid,TkW,SimplePreCmd,PlacePreCmd,DB).
+config(DB, #gstkid{widget = TkW, owner = Owner} = Gstkid, Opts) ->
+ {NOpts, NGstkid} = fix_group(Opts, DB, Owner, Gstkid),
+ gstk_generic:mk_cmd_and_exec(NOpts, NGstkid, TkW, [TkW, " conf"], [";place ", TkW], DB).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -137,9 +133,7 @@ config(DB, Gstkid, Opts) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- gstk_generic:read_option(DB, Gstkid, Opt).
-
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : delete/2
@@ -149,12 +143,11 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW, widget_data = Data} = Gstkid) ->
gstk_db:delete_widget(DB, Gstkid),
- {_, Gid} = Gstkid#gstkid.widget_data,
+ {_, Gid} = Data,
gstk_db:delete_bgrp(DB, Gid),
- Gstkid#gstkid.widget.
-
+ TkW.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : event/5
@@ -167,22 +160,9 @@ delete(DB, Gstkid) ->
%%
%% Return : true
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-event(DB, Gstkid, Etype, Edata, Args) ->
- Arg2 = case Etype of
- click ->
- [Text, Bool | Rest] = Args,
- RBool = case Bool of
- 1 -> true;
- _Other2 -> false
- end,
- {G, _Gid} = Gstkid#gstkid.widget_data,
- [Text, G, RBool | Rest];
- _Other3 ->
- Args
- end,
- gstk_generic:event(DB, Gstkid, Etype, Edata, Arg2).
-
-
+event(DB, #gstkid{widget_data = {G, _Gid}} = Gstkid, click, Edata, [Text, Bool|Rest]) ->
+ gstk_generic:event(DB, Gstkid, click, Edata, [Text, G, Bool =:= 1| Rest]);
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%%------------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -197,22 +177,32 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%%
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, TkW, DB,_) ->
- case Option of
- {disabledfg, Color} -> {s, [" -disabledforegr ", gstk:to_color(Color)]};
- {group, Group} -> {s, [" -var ", gstk:to_ascii(Group)]};
- {selectbg, Color} -> {s, [" -selectc ", gstk:to_color(Color)]};
- {underline, Int} -> {s, [" -un ", gstk:to_ascii(Int)]};
- {wraplength, Int} -> {s, [" -wr ", gstk:to_ascii(Int)]};
+option(Option, Gstkid, TkW, DB, _) -> option(Option, Gstkid, TkW, DB).
- flash -> {c, [TkW, " f;"]};
- invoke -> {c, [TkW, " i;"]};
- toggle -> {c, [TkW, " to;"]};
- {select, true} -> {c, [TkW, " se;"]};
- {select, false} -> {c, [TkW, " de;"]};
- {click, On} -> cbind(DB, Gstkid, click, On);
- _ -> invalid_option
- end.
+option({click, On}, Gstkid, _TkW, DB) -> cbind(DB, Gstkid, click, On);
+option(Option, _Gstkid, TkW, _DB) -> option(Option, TkW).
+
+option(flash, TkW) -> option_c(" f;", TkW);
+option(invoke, TkW) -> option_c(" i;", TkW);
+option(toggle, TkW) -> option_c(" to;", TkW);
+option({select, true}, TkW) -> option_c(" se;", TkW);
+option({select, false}, TkW) -> option_c(" de;", TkW);
+option(Option, _TkW) -> option(Option).
+
+option({disabledfg, Color}) -> to_color(" -disabledforegr ", Color);
+option({selectbg, Color}) -> to_color(" -selectc ", Color);
+option({group, Group}) -> to_ascii(" -var ", Group);
+option({underline, Int}) -> to_ascii(" -un ", Int);
+option({wraplength, Int}) -> to_ascii(" -wr ", Int);
+option(_Option) -> invalid_option.
+
+option_c(Str, TkW) -> {c, [TkW, Str]}.
+
+to_color(Str, Color) -> option_s(Str, gstk:to_color(Color)).
+
+to_ascii(Str, Val) -> option_s(Str, gstk:to_ascii(Val)).
+
+option_s(Str, Val) -> {s, [Str, Val]}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/3
@@ -224,21 +214,30 @@ option(Option, Gstkid, TkW, DB,_) ->
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,Gstkid, TkW,DB,_) ->
- case Option of
- disabledfg -> tcl2erl:ret_color([TkW," cg -disabledforegr"]);
- group -> {G, _} = Gstkid#gstkid.widget_data, G;
- selectbg -> tcl2erl:ret_color([TkW," cg -selectc"]);
- groupid -> {_, Gid} = Gstkid#gstkid.widget_data, Gid;
- underline -> tcl2erl:ret_int([TkW," cg -un"]);
- wraplength -> tcl2erl:ret_int([TkW," cg -wr"]);
- select -> tcl2erl:ret_bool(["set x [", TkW,
- " cg -va];global $x;set $x"]);
-
- click -> gstk_db:is_inserted(DB, Gstkid, click);
- _ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+read_option(Option, Gstkid, TkW, DB, _) -> read_option(Option, Gstkid, TkW, DB).
+
+read_option(click, Gstkid, _TkW, DB) -> gstk_db:is_inserted(DB, Gstkid, click);
+read_option(Option, Gstkid, TkW, _DB) -> read_option(Option, Gstkid, TkW).
+
+read_option(group, #gstkid{widget_data = {G, _}}, _TkW) -> G;
+read_option(groupid, #gstkid{widget_data = {_, G}}, _TkW) -> G;
+read_option(Option, Gstkid, TkW) ->
+ case read_option(Option, TkW) of
+ invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+ O -> O
end.
+read_option(disabledfg, TkW) -> ret_color(" cg -disabledforegr", TkW);
+read_option(selectbg, TkW) -> ret_color(" cg -selectc", TkW);
+read_option(underline, TkW) -> ret_int(" cg -un", TkW);
+read_option(wraplength, TkW) -> ret_int(" cg -wr", TkW);
+read_option(select, TkW) -> tcl2erl:ret_bool(["set x [", TkW, " cg -va];global $x;set $x"]);
+read_option(_Option, _TkW) -> invalid_option.
+
+ret_color(Str, TkW) -> tcl2erl:ret_color([TkW, Str]).
+
+ret_int(Str, TkW) -> tcl2erl:ret_int([TkW, Str]).
+
%%------------------------------------------------------------------------------
%% PRIMITIVES
%%------------------------------------------------------------------------------
@@ -246,75 +245,48 @@ read_option(Option,Gstkid, TkW,DB,_) ->
%% create version
fix_group(Opts, DB, Owner) ->
{G, GID, NOpts} = fg(Opts, erlNIL, erlNIL, []),
- NG = case G of
- erlNIL ->
- Vref = gstk_db:counter(DB, variable),
- list_to_atom(lists:flatten(["cb", gstk:to_ascii(Vref)]));
- Other1 -> Other1
+ NG = if
+ G =:= erlNIL -> list_to_atom(lists:flatten(["cb", gstk:to_ascii(gstk_db:counter(DB, variable))]));
+ true -> G
end,
- RGID = case GID of
- erlNIL -> {cbgrp, NG, Owner};
- Other2 -> Other2
+ RGID = if
+ GID =:= erlNIL -> {cbgrp, NG, Owner};
+ true -> GID
end,
- RG = gstk_db:insert_bgrp(DB, RGID),
- {NG, RGID, [{group, RG} | NOpts]}.
-
+ {NG, RGID, [{group, gstk_db:insert_bgrp(DB, RGID)}|NOpts]}.
+
%% config version
-fix_group(Opts, DB, Owner, Gstkid) ->
- {RG, RGID} = Gstkid#gstkid.widget_data,
- {G, GID, NOpts} = fg(Opts, RG, RGID, []),
- case {G, GID} of
- {RG, RGID} ->
- {NOpts, Gstkid};
- {NG, RGID} ->
- NGID = {cbgrp, NG, Owner},
- gstk_db:delete_bgrp(DB, RGID),
- NRG = gstk_db:insert_bgrp(DB, NGID),
- NGstkid = Gstkid#gstkid{widget_data={NG,NGID}},
- gstk_db:insert_widget(DB, NGstkid),
- {[{group, NRG} | NOpts], NGstkid};
- {_, NGID} when NGID =/= RGID ->
+fix_group(Opts, DB, Owner, #gstkid{widget_data = {RG, RGID}} = Gstkid) ->
+ case fg(Opts, RG, RGID, []) of
+ {RG, RGID, NOpts} -> {NOpts, Gstkid};
+ {NG, N, NOpts} ->
+ NGID = if
+ N =:= RGID -> {cbgrp, NG, Owner};
+ true -> N
+ end,
gstk_db:delete_bgrp(DB, RGID),
NRG = gstk_db:insert_bgrp(DB, NGID),
- NGstkid = Gstkid#gstkid{widget_data={RG,NGID}},
+ NGstkid = Gstkid#gstkid{widget_data = {RG, NGID}},
gstk_db:insert_widget(DB, NGstkid),
- {[{group, NRG} | NOpts], NGstkid}
+ {[{group, NRG}|NOpts], NGstkid}
end.
-
-
-fg([{group, G} | Opts], _, GID, Nopts) ->
- fg(Opts, G, GID, Nopts);
-
-fg([{groupid, GID} | Opts], G, _, Nopts) ->
- fg(Opts, G, GID, Nopts);
-
-fg([Opt | Opts], G, GID, Nopts) ->
- fg(Opts, G, GID, [Opt | Nopts]);
-
-fg([], Group, GID, Opts) ->
- {Group, GID, Opts}.
-
+fg([{group, G}|Opts], _, GID, Nopts) -> fg(Opts, G, GID, Nopts);
+fg([{groupid, GID}|Opts], G, _, Nopts) -> fg(Opts, G, GID, Nopts);
+fg([Opt|Opts], G, GID, Nopts) -> fg(Opts, G, GID, [Opt|Nopts]);
+fg([], Group, GID, Opts) -> {Group, GID, Opts}.
%%
%% Config bind
%%
-cbind(DB, Gstkid, Etype, On) ->
- TkW = Gstkid#gstkid.widget,
- Cmd = case On of
- {true, Edata} ->
- Eref = gstk_db:insert_event(DB, Gstkid, Etype, Edata),
- [" -command {erlsend ", Eref, " \\\"[", TkW,
- " cg -text]\\\" \[expr \$[", TkW, " cg -va]\]}"];
- true ->
- Eref = gstk_db:insert_event(DB, Gstkid, Etype, ""),
- [" -command {erlsend ", Eref, " \\\"[", TkW,
- " cg -text]\\\" \[expr \$[", TkW, " cg -va]\]}"];
- _Other ->
+cbind(DB, Gstkid, Etype, true) -> cbind(DB, Gstkid, Etype, {true, ""});
+cbind(DB, #gstkid{widget = TkW} = Gstkid, Etype, On) ->
+ {s, case On of
+ {true, Edata} -> [" -command {erlsend ", gstk_db:insert_event(DB, Gstkid, Etype, Edata),
+ " \\\"[", TkW, " cg -text]\\\" \[expr \$[", TkW, " cg -va]\]}"];
+ _Other ->
gstk_db:delete_event(DB, Gstkid, Etype),
" -command {}"
- end,
- {s, Cmd}.
+ end}.
%% ----- Done -----
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_db.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_db.erl
--- otp_src_19.0.5/lib/gs/src/gstk_db.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_db.erl 2016-08-25 16:37:44.562693392 +0300
@@ -51,8 +51,7 @@
is_inserted/3,
lookup_kids/2,
insert_def/3,
- opt/4,
- opt/3,
+ opt/4, opt/3,
insert_opt/3,
default_container_opts/3,
default_opts/3,
@@ -61,40 +60,30 @@
-include("gstk.hrl").
-
%% ------------------------------------------------------------
%% INITIALIZATION
%% ------------------------------------------------------------
init(_Opts) ->
- put(events,ets:new(gstk_db, [public, set])),
- put(kids,ets:new(gstk_db, [public, bag])),
- put(defaults,ets:new(gstk_db, [public, bag])),
- put(deleted,ets:new(gstk_db, [public, bag])),
- put(options,ets:new(gstk_db, [public, set])),
- ets:new(gstk_db, [public, set]).
+ lists:foreach(fun({K, T}) -> put(K, new(T)) end,
+ [{events, set}, {kids, bag}, {defaults, bag}, {deleted, bags}, {options, set}]),
+ new(set).
+
+new(T) -> ets:new(gstk_db, [public, T]).
%% -----------------------------------------------------------------
%% PRIMITIVE DB INTERFACE
%% -----------------------------------------------------------------
-insert(DB, Key, Value) ->
- ets:insert(DB, {Key, Value}).
-
+insert(DB, Key, Value) -> ets:insert(DB, {Key, Value}).
lookup(DB, Key) ->
- Result =
- case ets:lookup(DB, Key) of
- [{Key, Value}] -> Value;
- _ -> undefined
- end,
- Result.
-
-
-delete(DB, Key) ->
- ets:delete(DB, Key).
-
+ case ets:lookup(DB, Key) of
+ [{Key, Value}] -> Value;
+ _ -> undefined
+ end.
+delete(DB, Key) -> ets:delete(DB, Key).
%% -----------------------------------------------------------------
%% NOT SO PRIMITIVE DB INTERFACE
@@ -103,42 +92,33 @@ delete(DB, Key) ->
%% -----------------------------------------------------------------
%% HANDLE EVENTS
%% -----------------------------------------------------------------
-insert_event(DB, Gstkid, Etype, Edata) ->
- ID = Gstkid#gstkid.id,
- Rdata =
- case Edata of
- [] -> opt(DB,ID,data);
- _Other1 -> Edata
- end,
+insert_event(DB, #gstkid{id = ID}, Etype, Edata) ->
+ Rdata = if
+ Edata =:= [] -> opt(DB, ID, data);
+ true -> Edata
+ end,
Events = lookup_events(DB, ID),
- case lists:keysearch(Etype, 2, Events) of
- {value, {Etag, _, _}} ->
- NewEvents =
- lists:keyreplace(Etype, 2, Events, {Etag, Etype, Rdata}),
- ets:insert(get(events), {{events, ID}, NewEvents}),
- [$#, gstk:to_ascii(ID), " ", Etag];
- _Other2 ->
- Etag = etag(Etype),
- NewEvents = [{Etag, Etype, Rdata} | Events],
- ets:insert(get(events), {{events, ID}, NewEvents}),
- [$#, gstk:to_ascii(ID), " ", Etag]
- end.
+ {Etag, Event} = case lists:keyfind(Etype, 2, Events) of
+ false ->
+ E = etag(Etype),
+ {E, [{E, Etype, Rdata}|Events]};
+ {E, _, _} -> {E, lists:keyreplace(Etype, 2, Events, {E, Etype, Rdata})}
+ end,
+ ets:insert(get(events), {{events, ID}, Event}),
+ [$#, gstk:to_ascii(ID), " ", Etag].
-etag(Etype) ->
- case Etype of
- click -> "c";
- doubleclick -> "dc";
- configure -> "co";
- enter -> "e";
- leave -> "l";
- motion -> "m";
- buttonpress -> "bp";
- buttonrelease -> "br";
- focus -> "f";
- destroy -> "d";
- keypress -> "kp";
- keyrelease -> "kr"
- end.
+etag(click) -> "c";
+etag(doubleclick) -> "dc";
+etag(configure) -> "co";
+etag(enter) -> "e";
+etag(leave) -> "l";
+etag(motion) -> "m";
+etag(buttonpress) -> "bp";
+etag(buttonrelease) -> "br";
+etag(focus) -> "f";
+etag(destroy) -> "d";
+etag(keypress) -> "kp";
+etag(keyrelease) -> "kr".
lookup_events(_DB, ID) ->
case lookup(get(events), {events, ID}) of
@@ -147,258 +127,209 @@ lookup_events(_DB, ID) ->
end.
lookup_event(DB, ID, Etag) ->
- case lists:keysearch(Etag, 1, lookup_events(DB, ID)) of
- {value, {Etag, Etype, Edata}} ->
- {Etype, Edata};
- _Other ->
- nonexisting_event
+ case lists:keyfind(Etag, 1, lookup_events(DB, ID)) of
+ false -> nonexisting_event;
+ {_Etag, Etype, Edata} -> {Etype, Edata}
end.
-delete_event(DB, Gstkid, Etype) ->
- ID = Gstkid#gstkid.id,
- NewEvents = lists:keydelete(Etype, 2, lookup_events(DB, ID)),
- ets:insert(get(events), {{events, ID}, NewEvents}).
+delete_event(DB, #gstkid{id = ID}, Etype) ->
+ ets:insert(get(events), {{events, ID}, lists:keydelete(Etype, 2, lookup_events(DB, ID))}).
%% -----------------------------------------------------------------
%% HANDLE BUTTON GROUPS
%% -----------------------------------------------------------------
insert_bgrp(DB, Key) ->
- case ets:lookup(DB, Key) of
- [] ->
- {_Bgrp, RG, _Owner} = Key,
- insert(DB, Key, {0, RG}),
- RG;
- [{_, {Counter, RG}}] ->
- insert(DB, Key, {Counter+1, RG}),
- RG
- end.
-
+ {_, RG} = BGRP = case ets:lookup(DB, Key) of
+ [] ->
+ {_Bgrp, Rg, _Owner} = Key,
+ {0, Rg};
+ [{_, {Counter, Rg}}] -> {Counter + 1, Rg}
+ end,
+ insert(DB, Key, BGRP),
+ RG.
delete_bgrp(DB, Key) ->
case ets:lookup(DB, Key) of
- [] ->
- true;
- [{_, {0, _RG}}] ->
- delete(DB, Key),
- true;
- [{_, {Counter, RG}}] ->
- insert(DB, Key, {Counter-1, RG}),
- true
- end.
-
+ [] -> [];
+ [{_, {0, _RG}}] -> delete(DB, Key);
+ [{_, {Counter, RG}}] -> insert(DB, Key, {Counter - 1, RG})
+ end,
+ true.
%% -----------------------------------------------------------------
%% insert things
-update_widget(DB, Gstkid) ->
- ID = Gstkid#gstkid.id,
+update_widget(DB, #gstkid{id = ID} = Gstkid) ->
insert(DB, ID, Gstkid),
Gstkid.
-insert_gs(DB,Gstkid) ->
- update_widget(DB,Gstkid).
+insert_gs(DB, Gstkid) -> update_widget(DB, Gstkid).
-insert_widget(DB, Gstkid) ->
- ID = Gstkid#gstkid.id,
- insert_kid(DB, Gstkid#gstkid.parent, ID),
+insert_widget(DB, #gstkid{id = ID, parent = Parent} = Gstkid) ->
+ insert_kid(DB, Parent, ID),
insert(DB, ID, Gstkid),
Gstkid.
-insert_kid(_DB, Parent, Kid) ->
- ets:insert(get(kids), {{kids, Parent},Kid}).
+insert_kid(_DB, Parent, Kid) -> ets:insert(get(kids), {{kids, Parent}, Kid}).
-delete_kid(_DB, Parent, Kid) ->
- ets:match_delete(get(kids), {{kids, Parent},Kid}).
+delete_kid(_DB, Parent, Kid) -> ets:match_delete(get(kids), {{kids, Parent}, Kid}).
-lookup_kids(_DB, Parent) ->
- ril(ets:match(get(kids), {{kids, Parent},'$1'})).
+lookup_kids(_DB, Parent) -> ril(ets:match(get(kids), {{kids, Parent}, '$1'})).
%%----------------------------------------------------------------------
-%% Options are stored as {{Id,Opt},Val}
+%% Options are stored as {{Id, Opt}, Val}
%%----------------------------------------------------------------------
-insert_opt(_DB,Id,{default,ObjType,Opt}) ->
- insert_def(Id,ObjType,Opt);
-insert_opt(_DB,#gstkid{id=Id},{Key,Val}) ->
- ets:insert(get(options),{{Id,Key},Val});
-insert_opt(_DB,Id,{Key,Val}) ->
- ets:insert(get(options),{{Id,Key},Val}).
+insert_opt(_DB, Id, Data) -> insert_opt(Id, Data).
-insert_opts(_DB,_Id,[]) -> done;
-insert_opts(DB,Id,[Opt|Opts]) ->
- insert_opt(DB,Id,Opt),
- insert_opts(DB,Id,Opts).
+insert_opt(Id, {default, ObjType, Opt}) -> insert_def(Id, ObjType, Opt);
+insert_opt(#gstkid{id = Id}, Data) -> insert_opt(Id, Data);
+insert_opt(Id, {Key, Val}) -> ets:insert(get(options), {{Id, Key}, Val}).
-insert_def(#gstkid{id=ID},ObjType,{Key,Val}) ->
- insert_def(ID,ObjType,{Key,Val});
-insert_def(ID,ObjType,{Key,Val}) ->
+insert_opts(DB, Id, Opts) when is_list(Opts) ->
+ lists:foreach(fun(Opt) -> insert_opt(DB, Id, Opt) end, Opts),
+ done.
+
+insert_def(#gstkid{id = ID}, ObjType, Data) -> insert_def(ID, ObjType, Data);
+insert_def(ID, ObjType, {Key, _} = Data) ->
Def = get(defaults),
- ets:match_delete(Def,{{ID,ObjType},{Key,'_'}}),
- ets:insert(Def,{{ID,ObjType},{Key,Val}}).
+ K = {ID, ObjType},
+ ets:match_delete(Def, {K, {Key, '_'}}),
+ ets:insert(Def, {K, Data}).
-lookup_def(ID,ObjType,Key) ->
- case ets:match(get(defaults),{{ID,ObjType},{Key,'$1'}}) of
+lookup_def(ID, ObjType, Key) ->
+ case ets:match(get(defaults), {{ID, ObjType}, {Key, '$1'}}) of
[] -> false;
- [[Val]] -> {value,Val}
+ [[Val]] -> {value, Val}
end.
-opt(DB,#gstkid{id=Id},Opt) -> opt(DB,Id,Opt);
-opt(_DB,Id,Opt) ->
- [{_, Value}] = ets:lookup(get(options), {Id,Opt}),
+opt(_DB, Id, Opt) -> opt(Opt, Id).
+
+opt(Opt, #gstkid{id = Id}) -> opt(Opt, Id);
+opt(Opt, Id) ->
+ [{_, Value}] = ets:lookup(get(options), {Id, Opt}),
Value.
-opt_or_not(DB,#gstkid{id=Id},Opt) -> opt_or_not(DB,Id,Opt);
-opt_or_not(_DB,Id,Opt) ->
- case ets:lookup(get(options), {Id,Opt}) of
+opt_or_not(_DB, Id, Opt) -> opt_or_not(Opt, Id).
+
+opt_or_not(Opt, #gstkid{id = Id}) -> opt_or_not(Opt, Id);
+opt_or_not(Opt, Id) ->
+ case ets:lookup(get(options), {Id, Opt}) of
[{_, Value}] -> {value, Value};
_ -> false
end.
-opt(DB,#gstkid{id=Id},Opt,ElseVal) -> opt(DB,Id,Opt,ElseVal);
-opt(_DB,Id,Opt,ElseVal) ->
- case ets:lookup(get(options), {Id,Opt}) of
- [{_, Value}] ->
- Value;
+opt(_DB, Id, Opt, ElseVal) -> opt4(ElseVal, Id, Opt).
+
+opt4(ElseVal, #gstkid{id = Id}, Opt) -> opt4(ElseVal, Id, Opt);
+opt4(ElseVal, Id, Opt) ->
+ case ets:lookup(get(options), {Id, Opt}) of
+ [{_, Value}] -> Value;
_ -> ElseVal
end.
%%----------------------------------------------------------------------
-%% Returns: list of {Key,Val}
+%% Returns: list of {Key, Val}
%%----------------------------------------------------------------------
-default_container_opts(_DB,Id,ChildType) ->
- L = ets:match(get(defaults),{{Id,'$1'},'$2'}),
- lists:sort(fix_def_for_container(L,ChildType)).
+default_container_opts(_DB, Id, ChildType) ->
+ lists:sort(fix_def_for_container(ets:match(get(defaults), {{Id, '$1'}, '$2'}), ChildType)).
-default_opts(_DB,Id,ChildType) ->
- L1 = ets:lookup(get(defaults),{Id,ChildType}),
- L2 = ets:lookup(get(defaults),{Id,all}),
- lists:sort(fix_def(L1,L2)).
+default_opts(_DB, Id, ChildType) ->
+ D = get(defaults),
+ lists:sort(fix_def(ets:lookup(D, {Id, ChildType}), ets:lookup(D, {Id, all}))).
-fix_def([{_,Opt}|Opts],Opts2) ->
- [Opt|fix_def(Opts,Opts2)];
-fix_def([],[]) -> [];
-fix_def([],Opts) ->
- fix_def(Opts,[]).
+fix_def([{_, Opt}|Opts], Opts2) -> [Opt|fix_def(Opts, Opts2)];
+fix_def([], []) -> [];
+fix_def([], Opts) -> fix_def(Opts, []).
%%----------------------------------------------------------------------
-%% Purpose: Extracs {default,ObjType,DefsultOpt} for the ChildType
+%% Purpose: Extracs {default, ObjType, DefsultOpt} for the ChildType
%% and keeps default options since it is a container object.
%% Returns: list of options
%%----------------------------------------------------------------------
-fix_def_for_container([[all,{Key,Val}]|Opts],ChildType) ->
- [{{default,all,Key},Val},{Key,Val}
- |fix_def_for_container(Opts,ChildType)];
-fix_def_for_container([[ChildType,{Key,Val}]|Opts],ChildType) ->
- [{{default,ChildType,Key},Val},{Key,Val}
- |fix_def_for_container(Opts,ChildType)];
-fix_def_for_container([[ChildType2,{Key,Val}]|Opts],_ChildType) ->
- [{{default,ChildType2,Key},Val}|fix_def_for_container(Opts,ChildType2)];
-fix_def_for_container([],_) -> [].
+fix_def_for_container(Defs, ChildType) ->
+ lists:foldr(fun([C, {Key, Val}], A) when C =/= all; C =/= ChildType -> [{{default, C, Key}, Val}|A];
+ ([C, {Key, Val} = Data], A) -> [{{default, C, Key}, Val}, Data|A]
+ end, [], Defs).
%% -----------------------------------------------------------------
%% lookup things
-lookup_gstkid(DB, Name, Owner) when is_atom(Name) ->
- ID = lookup(DB, {Owner, Name}),
- lookup(DB, ID);
-
-lookup_gstkid(DB, ID, _Owner) ->
- lookup(DB, ID).
-
-
-lookup_gstkid(_DB, Name) when is_atom(Name) ->
- exit({'must use owner',Name});
-
-lookup_gstkid(DB, ID) ->
- lookup(DB, ID).
+lookup_gstkid(DB, Name, Owner) when is_atom(Name) -> lookup(DB, lookup(DB, {Owner, Name}));
+lookup_gstkid(DB, ID, _Owner) -> lookup(DB, ID).
+lookup_gstkid(_DB, Name) when is_atom(Name) -> exit({'must use owner', Name});
+lookup_gstkid(DB, ID) -> lookup(DB, ID).
-lookup_ids(DB, Pid) ->
- ril(ets:match(DB, {'$1', {gstkid,'_','_','_',Pid,'_','_'}})).
+lookup_ids(DB, Pid) -> ril(ets:match(DB, {'$1', {gstkid, '_', '_', '_', Pid, '_', '_'}})).
lookup_item(DB, TkW, Item) ->
- % [[Id]] = ets:match(DB, {'$1', {gstkid,'_',TkW, Item,'_','_','_'}}),
- % Id.
%% OTP-4167 Gif images gstkids are stored differently from other objects
- case ets:match(DB, {'$1', {gstkid,'_',TkW, Item,'_','_','_'}}) of
- [[Id]] ->
- Id;
- [] ->
- Pattern = {'$1', {gstkid,'_',TkW, {'_',Item},'_','_',image}},
- [[Id]] = ets:match(DB, Pattern),
- Id
- end.
-
+ [[Id]] = case ets:match(DB, {'$1', {gstkid, '_', TkW, Item, '_', '_', '_'}}) of
+ [] -> ets:match(DB, {'$1', {gstkid, '_', TkW, {'_', Item}, '_', '_', image}});
+ ID -> ID
+ end,
+ Id.
%% -----------------------------------------------------------------
%% counters
counter(DB, Key) ->
- Result =
- case ets:lookup(DB, Key) of
- [{Key, Value}] -> Value+1;
- _ -> 0
- end,
+ Result = case ets:lookup(DB, Key) of
+ [{Key, Value}] -> Value + 1;
+ _ -> 0
+ end,
ets:insert(DB, {Key, Result}),
Result.
-
%% -----------------------------------------------------------------
%% delete things
-delete_widgets(DB, [ID | Rest]) ->
- delete_widget(DB, ID),
- delete_widgets(DB, Rest);
-delete_widgets(_, []) ->
+delete_widgets(DB, IDs) when is_list(IDs) ->
+ lists:foreach(fun(ID) -> delete_widget(DB, ID) end, IDs),
true.
-
-delete_widget(DB, #gstkid{id = ID}) ->
- delete_widget(DB, ID);
+delete_widget(DB, #gstkid{id = ID}) -> delete_widget(DB, ID);
delete_widget(DB, ID) ->
delete_widgets(DB, lookup_kids(DB, ID)),
delete_id(DB, ID).
-delete_gstkid(DB,Gstkid) ->
- delete_id(DB,Gstkid).
+delete_gstkid(DB, Gstkid) -> delete_id(DB, Gstkid).
delete_id(DB, ID) ->
- case lookup_gstkid(DB, ID) of
- undefined ->
- true;
- _Gstkid ->
- gstk:worker_do({match_delete,[{get(options),[{{ID,'_'},'_'}]},
- {get(defaults),[{{ID,'_'},'_'}]}]}),
- ets:insert(get(deleted),{deleted,ID}),
- delete(DB, ID)
- end,
+ lookup_gstkid(DB, ID) =:= undefined orelse begin
+ gstk:worker_do({match_delete,
+ [{get(options), [{{ID, '_'}, '_'}]},
+ {get(defaults), [{{ID, '_'}, '_'}]}]}),
+ ets:insert(get(deleted), {deleted, ID}),
+ delete(DB, ID)
+ end,
ets:delete(get(kids), {kids, ID}),
delete(get(events), {events, ID}),
true.
-get_deleted(_DB) ->
+get_deleted(_DB) -> get_deleted().
+
+get_deleted() ->
Dd = get(deleted),
- R=fix_deleted(ets:lookup(Dd,deleted)),
- ets:delete(Dd,deleted),
+ R = fix_deleted(ets:lookup(Dd, deleted)),
+ ets:delete(Dd, deleted),
R.
-fix_deleted([{_,Id}|Dd]) ->
- [Id | fix_deleted(Dd)];
-fix_deleted([]) -> [].
+fix_deleted(Db) ->
+ {_, Ids} = lists:unzip(Db),
+ Ids.
%% -----------------------------------------------------------------
%% odd stuff
%% check if an event is in the database, used by read_option
-is_inserted(DB, #gstkid{id = ID}, What) ->
- is_inserted(DB, ID, What);
-is_inserted(_DB, ID, What) ->
+is_inserted(_DB, ID, What) -> is_inserted(ID, What).
+
+is_inserted(#gstkid{id = ID}, What) -> is_inserted(ID, What);
+is_inserted(ID, What) ->
case lookup(get(events), {events, ID}) of
undefined -> false;
- Events ->
- case lists:keysearch(What, 2, Events) of
- {value, _} -> true;
- _Other -> false
- end
+ Events -> lists:keyfind(What, 2, Events) =/= false
end.
%% -----------------------------------------------------------------
@@ -406,8 +337,4 @@ is_inserted(_DB, ID, What) ->
%% -----------------------------------------------------------------
%% remove irritating lists
-ril([[Foo] | Rest]) -> [Foo | ril(Rest)];
-ril([]) -> [].
-
-
-
+ril(L) -> lists:map(fun([Foo]) -> Foo end, L).
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_editor.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_editor.erl
--- otp_src_19.0.5/lib/gs/src/gstk_editor.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_editor.erl 2016-08-25 16:37:44.562693392 +0300
@@ -24,16 +24,17 @@
%% ------------------------------------------------------------
-module(gstk_editor).
--compile([{nowarn_deprecated_function,{gs,assq,2}},
- {nowarn_deprecated_function,{gs,error,2}},
- {nowarn_deprecated_function,{gs,val,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, assq, 2}},
+ {nowarn_deprecated_function, {gs, error, 2}},
+ {nowarn_deprecated_function, {gs, val, 2}}]).
%%------------------------------------------------------------------------------
%% CANVAS OPTIONS
%%
%% Attributes:
%% activebg Color
-%% anchor n,w,s,e,nw,se,ne,sw,center
+%% anchor n, w,s, e,nw, se, ne, sw, center
%% bc Color
%% bg Color
%% bw Wth
@@ -47,7 +48,7 @@
%% hscroll Bool | top | bottom
%% insertbg Color
%% insertbw Wth
-%% insertpos {Row,Col}|'end' (Row: 1..Max, Col: 0..Max)
+%% insertpos {Row, Col}|'end' (Row: 1..Max, Col: 0..Max)
%% justify left|right|center
%% padx Int (Pixels)
%% pady Int (Pixels)
@@ -70,7 +71,7 @@
%% enable Bool
%% file String
%% get {FromIdx, ToIdx} => Text
-%% insert {Index, Text}Index = [insert,{Row,lineend},end,{Row,Col}]
+%% insert {Index, Text}Index = [insert, {Row, lineend}, end, {Row, Col}]
%% setfocus Bool
%%
%% Events:
@@ -97,7 +98,7 @@
% .t index end -> MaxRows.cols
% .t yview moveto (Row-1)/MaxRows
--export([create/3, config/3, read/3, delete/2,event/5,option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5]).
-include("gstk.hrl").
@@ -109,33 +110,22 @@
%% Purpose : Create a widget of the type defined in this module.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
create(DB, Gstkid, Opts) ->
- MainW = gstk_generic:mk_tkw_child(DB,Gstkid),
- Editor = lists:append(MainW,".z"),
+ MainW = gstk_generic:mk_tkw_child(DB, Gstkid),
+ Editor = lists:append(MainW, ".z"),
{Vscroll, Hscroll, NewOpts} = gstk_generic:parse_scrolls(Opts),
- WidgetD = #so{main=MainW, object=Editor,
- hscroll=Hscroll, vscroll=Vscroll,misc=[{1,white}]},
- NGstkid=Gstkid#gstkid{widget=MainW, widget_data=WidgetD},
- gstk_db:insert_widget(DB,NGstkid),
- MandatoryCmd = ["so_create text ", MainW],
- case gstk:call(MandatoryCmd) of
- {result, _} ->
- SimplePreCmd = [MainW, " conf"],
- PlacePreCmd = [";place ", MainW],
- case gstk_generic:make_command(NewOpts, NGstkid, MainW, SimplePreCmd,
- PlacePreCmd, DB,Editor) of
- {error,Reason} -> {error,Reason};
- Cmd ->
- gstk:exec(Cmd),
- gstk:exec(
- [Editor," conf -bo 2 -relief sunken -highlightth 2;",
- MainW,".sy conf -rel sunken -bo 2;",
- MainW,".pad.sx conf -rel sunken -bo 2;",
- Editor, " tag co c1 -for white;"]),
- ok
- end
+ NGstkid = Gstkid#gstkid{widget = MainW, widget_data = #so{main = MainW, object = Editor,
+ hscroll = Hscroll, vscroll = Vscroll,
+ misc = [{1, white}]}},
+ gstk_db:insert_widget(DB, NGstkid),
+ {result, _} = gstk:call(["so_create text ", MainW]),
+ case gstk_generic:make_command(NewOpts, NGstkid, MainW, [MainW, " conf"], [";place ", MainW], DB, Editor) of
+ {error, _Reason} = E -> E;
+ Cmd -> lists:foreach(fun gstk:exec/1, [Cmd, [Editor, " conf -bo 2 -relief sunken -highlightth 2;",
+ MainW, ".sy conf -rel sunken -bo 2;",
+ MainW, ".pad.sx conf -rel sunken -bo 2;",
+ Editor, " tag co c1 -for white;"]])
end.
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : config/3
%% Purpose : Configure a widget of the type defined in this module.
@@ -145,20 +135,12 @@ create(DB, Gstkid, Opts) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Options) ->
- SO = Gstkid#gstkid.widget_data,
- MainW = Gstkid#gstkid.widget,
- Editor = SO#so.object,
- NewOpts =
- case {gs:assq(vscroll,Options),gs:assq(hscroll,Options)} of
- {false,false} -> Options;
- _ -> gstk_generic:parse_scrolls(Gstkid, Options)
- end,
- SimplePreCmd = [MainW, " conf"],
- PlacePreCmd = [";place ", MainW],
- gstk_generic:mk_cmd_and_exec(NewOpts, Gstkid, MainW, SimplePreCmd,
- PlacePreCmd, DB, Editor).
-
+config(DB, #gstkid{widget = MainW, widget_data = #so{object = Object}} = Gstkid, Options) ->
+ gstk_generic:mk_cmd_and_exec(case [gs:assq(E, Options) || E <- [vscroll, hscroll]] of
+ [false, false] -> Options;
+ _ -> gstk_generic:parse_scrolls(Gstkid, Options)
+ end,
+ Gstkid, MainW, [MainW, " conf"], [";place ", MainW], DB, Object).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -169,10 +151,7 @@ config(DB, Gstkid, Options) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- SO = Gstkid#gstkid.widget_data,
- gstk_generic:read_option(DB, Gstkid, Opt,SO#so.object).
-
+read(DB, #gstkid{widget_data = #so{object = Object}} = Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt, Object).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : delete/2
@@ -182,13 +161,11 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
gstk_db:delete_widget(DB, Gstkid),
- Gstkid#gstkid.widget.
-
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+ TkW.
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%%-----------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -204,70 +181,66 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%%
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, _MainW, DB, Editor) ->
- case Option of
- {font,Font} when is_tuple(Font) ->
- gstk_db:insert_opt(DB,Gstkid,Option),
- {c, [Editor, " conf -font ", gstk_font:choose_ascii(DB,Font)]};
- {font_style, {{Start,End},Font}} -> % should be only style
- {Tag,Ngstkid} = get_style_tag(DB,Editor,Font,Gstkid),
- gstk_db:update_widget(DB,Ngstkid),
- {c, Ngstkid, [Editor, " tag ad ", Tag, " ", p_index(Start), " ",
- p_index(End)]};
- {fg, {{Start,End},Color}} ->
- {Tag,Ngstkid} = get_color_tag(Editor,Color,Gstkid),
- gstk_db:update_widget(DB,Ngstkid),
- {c, Ngstkid, [Editor, " tag ad ", Tag, " ", p_index(Start), " ",
- p_index(End)]};
- {padx, Pad} -> {c, [Editor," conf -padx ",gstk:to_ascii(Pad)]};
- {pady, Pad} -> {c, [Editor," conf -pady ",gstk:to_ascii(Pad)]};
- {selection, {From, To}} ->
- {c, [Editor," tag ad sel ",p_index(From)," ", p_index(To)]};
- {vscrollpos, Row} ->
- {MaxRow,_Col} = ret_ed_index([Editor," ind end"]),
- {c, [Editor, " yv mo ",gstk:to_ascii(Row/MaxRow)]};
- {wrap, How} ->
- {c, [Editor, " conf -wrap ", gstk:to_ascii(How)]};
- {fg, Color} ->
- {c, [Editor, " conf -fg ", gstk:to_color(Color)]};
- {insertbw, Wth} ->
- {c, [Editor, " conf -insertbo ", gstk:to_ascii(Wth)]};
- {insertbg, Color} ->
- {c, [Editor, " conf -insertba ", gstk:to_color(Color)]};
- {insertpos, Index} ->
- {c, [Editor, " m s insert ", p_index(Index)]};
- {insert, {Index, Text}} ->
- {c, [Editor, " ins ", p_index(Index), " ", gstk:to_ascii(Text)]};
- {del, {From, To}} ->
- {c, [Editor, " del ", p_index(From), " ", p_index(To)]};
- {overwrite, {Index, Text}} ->
- AI = p_index(Index),
- Len = gstk:to_ascii(lists:flatlength(Text)),
- {c, [Editor, " del ",AI," \"",AI,"+",Len,"c\";",
- Editor, " ins ",AI," ", gstk:to_ascii(Text)]};
- clear -> {c, [Editor, " delete 1.0 end"]};
- {load, File} ->
- F2 = re:replace(File, [92,92], "/", [global,{return,list}]),
- case gstk:call(["ed_load ", Editor, " ", gstk:to_ascii(F2)]) of
- {result, _} -> none;
- {bad_result,Re} ->
- {error,{no_such_file,editor,load,F2,Re}}
- end;
- {save, File} ->
- F2 = re:replace(File, [92,92], "/", [global,{return,list}]),
- case gstk:call(["ed_save ",Editor," ",gstk:to_ascii(F2)]) of
- {result, _} -> none;
- {bad_result,Re} ->
- {error,{no_such_file,editor,save,F2,Re}}
- end;
- {enable, true} -> {c, [Editor, " conf -state normal"]};
- {enable, false} -> {c, [Editor, " conf -state disabled"]};
-
- {setfocus, true} -> {c, ["focus ", Editor]};
- {setfocus, false} -> {c, ["focus ."]};
- _ -> invalid_option
+option(Option, Gstkid, _MainW, DB, Editor) -> option(Option, Gstkid, Editor, DB).
+
+option({font, Font} = Option, Gstkid, Editor, DB) when is_tuple(Font) ->
+ gstk_db:insert_opt(DB, Gstkid, Option),
+ option_c(" conf -font ", gstk_font:choose_ascii(DB, Font), Editor);
+option({font_style, {{Start, End}, Font}}, Gstkid, Editor, DB) ->
+ option_tag(Start, End, Editor, DB, get_style_tag(Editor, Font, Gstkid, DB));
+option({fg, {{Start, End}, Color}}, Gstkid, Editor, DB) ->
+ option_tag(Start, End, Editor, DB, get_color_tag(Editor, Color, Gstkid));
+option(Option, _Gstkid, Editor, _DB) -> option(Option, Editor).
+
+option(clear, Editor) -> option_c(" delete 1.0 end", Editor);
+option({setfocus, true}, Editor) -> option_c(["focus ", Editor]);
+option({enable, false}, Editor) -> option_c(" conf -state disabled", Editor);
+option({padx, Pad}, Editor) -> to_ascii(" conf -padx ", Editor, Pad);
+option({pady, Pad}, Editor) -> to_ascii(" conf -pady ", Editor, Pad);
+option({wrap, How}, Editor) -> to_ascii(" conf -wrap ", Editor, How);
+option({insertbw, Wth}, Editor) -> to_ascii(" conf -insertbo ", Editor, Wth);
+option({insertbg, Color}, Editor) -> to_color(" conf -insertba ", Editor, Color);
+option({insertpos, Index}, Editor) -> option_c(" m s insert ", Editor, p_index(Index));
+option({load, File}, Editor) -> option_file("ed_load ", Editor, File, load);
+option({save, File}, Editor) -> option_file("ed_save ", Editor, File, save);
+option({insert, {Index, Text}}, Editor) -> option_index(" ins ", Editor, gstk:to_ascii(Text), Index);
+option({del, {From, To}}, Editor) -> option_range(" del ", Editor, From, To);
+option({vscrollpos, Row}, Editor) -> to_ascii(" yv mo ", Editor, Row / ret_ed_index(Editor, " ind end"));
+option({selection, {From, To}}, Editor) -> option_range(" tag ad sel ", Editor, From, To);
+option({overwrite, {Index, Text}}, Editor) ->
+ AI = p_index(Index),
+ option_c([Editor, " del ", AI, " \"", AI, "+", gstk:to_ascii(lists:flatlength(Text)), "c\";",
+ Editor, " ins ", AI, " ", gstk:to_ascii(Text)]);
+option({fg, Color}, Editor) -> to_color(" conf -fg ", Editor, Color);
+option(Option, _Editor) -> option(Option).
+
+option({setfocus, false}) -> option_c(["focus ."]);
+option(_Option) -> invalid_option.
+
+option_c(Str, Editor) -> option_c([Editor, Str]).
+
+option_c(Str, Editor, Val) -> option_c([Editor, Str, Val]).
+
+option_c(L) -> {c, L}.
+
+option_range(Str, Editor, From, To) -> option_index(Str, Editor, From, p_index(To)).
+
+option_index(Str, Editor, Val, Index) -> option_c([Editor, Str, p_index(Index), " ", Val]).
+
+option_tag(Start, End, Editor, DB, {Tag, Ngstkid}) ->
+ gstk_db:update_widget(DB, Ngstkid),
+ {c, Ngstkid, [Editor, " tag ad ", Tag, " ", p_index(Start), " ", p_index(End)]}.
+
+option_file(Cmd, Editor, File, C) ->
+ F = re:replace(File, [92, 92], "/", [global, {return, list}]),
+ case gstk:call([Cmd, Editor, " ", gstk:to_ascii(F)]) of
+ {result, _} -> none;
+ {bad_result, Re} -> {error, {no_such_file, editor, C, F, Re}}
end.
+to_ascii(Str, Editor, Val) -> option_c(Str, Editor, gstk:to_ascii(Val)).
+
+to_color(Str, Editor, Color) -> option_c(Str, Editor, gstk:to_color(Color)).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/5
@@ -275,75 +248,79 @@ option(Option, Gstkid, _MainW, DB, Edito
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,GstkId,_MainW,DB,Editor) ->
- case Option of
- font -> gstk_db:opt(DB,GstkId,font,undefined);
- padx -> tcl2erl:ret_atom([Editor," cg -padx"]);
- pady -> tcl2erl:ret_atom([Editor," cg -pady"]);
- enable -> tcl2erl:ret_enable([Editor," cg -st"]);
- fg -> tcl2erl:ret_color([Editor," cg -fg"]);
- {fg, Pos} ->
- L=tcl2erl:ret_list([Editor," tag nam ", p_index(Pos)]),
- SO = GstkId#gstkid.widget_data,
- case last_tag_val(undefined, $c, L, SO#so.misc) of
- undefined -> tcl2erl:ret_color([Editor," cg -fg"]);
- Color -> Color
- end;
- {font_style, Pos} ->
- L=tcl2erl:ret_list([Editor," tag nam ", p_index(Pos)]),
- SO = GstkId#gstkid.widget_data,
- case last_tag_val(undefined, $f, L, SO#so.misc) of
- undefined -> 'my style? nyi';
- Style -> Style
- end;
- selection -> ret_ed_indexes([Editor," tag ne sel 1.0"]);
- char_height -> tcl2erl:ret_int([Editor, " cg -he"]);
- char_width -> tcl2erl:ret_int([Editor, " cg -wi"]);
- insertbg -> tcl2erl:ret_color([Editor," cg -insertba"]);
- insertbw -> tcl2erl:ret_int([Editor," cg -insertbo"]);
- insertpos -> ret_ed_index([Editor, " ind insert"]);
- setfocus -> tcl2erl:ret_focus(Editor, "focus");
- wrap -> tcl2erl:ret_atom([Editor," cg -wrap"]);
- size -> {MaxRow,_Col} = ret_ed_index([Editor," ind end"]),
- MaxRow-1;
- vscrollpos ->
- {MaxRow,_Col} = ret_ed_index([Editor," ind end"]),
- [Top,_Bot] = tcl2erl:ret_list([Editor," yvi"]),
- round(Top*(MaxRow-1))+1;
- {get, {From, To}} ->
- tcl2erl:ret_str([Editor, " get ", p_index(From), " ", p_index(To)]);
- _ -> {bad_result, {GstkId#gstkid.objtype, invalid_option, Option}}
- end.
+read_option(Option, GstkId, _MainW, DB, Editor) -> read_option(Option, GstkId, Editor, DB).
+
+read_option(padx, _GstkId, Editor, _DB) -> ret_atom(Editor, " cg -padx");
+read_option(pady, _GstkId, Editor, _DB) -> ret_atom(Editor, " cg -pady");
+read_option(enable, _GstkId, Editor, _DB) -> tcl2erl:ret_enable([Editor, " cg -st"]);
+read_option(char_height, _GstkId, Editor, _DB) -> ret_int(Editor, " cg -he");
+read_option(char_width, _GstkId, Editor, _DB) -> ret_int(Editor, " cg -wi");
+read_option(insertbg, _GstkId, Editor, _DB) -> ret_color(Editor, " cg -insertba");
+read_option(insertbw, _GstkId, Editor, _DB) -> ret_int(Editor, " cg -insertbo");
+read_option(selection, _GstkId, Editor, _DB) -> ret_ed_indexes([Editor, " tag ne sel 1.0"]);
+read_option(insertpos, _GstkId, Editor, _DB) -> ret_ed_index(Editor, " ind insert");
+read_option(setfocus, _GstkId, Editor, _DB) -> tcl2erl:ret_focus(Editor, "focus");
+read_option(wrap, _GstkId, Editor, _DB) -> ret_atom(Editor, " cg -wrap");
+read_option(fg, _GstkId, Editor, _DB) -> ret_color(Editor, " cg -fg");
+read_option(size, _GstkId, Editor, _DB) -> ret_ed_index(Editor, " ind end") - 1;
+read_option(vscrollpos, _GstkId, Editor, _DB) ->
+ [Top, _Bot] = tcl2erl:ret_list([Editor, " yvi"]),
+ round(Top * (ret_ed_index(Editor, " ind end") - 1)) + 1;
+read_option({get, {From, To}}, _GstkId, Editor, _DB) ->
+ tcl2erl:ret_str([Editor, " get ", p_index(From), " ", p_index(To)]);
+read_option(font, GstkId, _Editor, DB) -> gstk_db:opt(DB, GstkId, font, undefined);
+read_option({fg, Pos}, #gstkid{widget_data = #so{misc = Misc}}, Editor, _DB) ->
+ case ret_pos(Pos, $c, Editor, Misc) of
+ undefined -> ret_color(Editor, " cg -fg");
+ Color -> Color
+ end;
+read_option({font_style, Pos}, #gstkid{widget_data = #so{misc = Misc}}, Editor, _DB) ->
+ case ret_pos(Pos, $f, Editor, Misc) of
+ undefined -> 'my style? nyi';
+ Style -> Style
+ end;
+read_option(Option, #gstkid{objtype = ObjType}, _Editor, _DB) -> {bad_result, {ObjType, invalid_option, Option}}.
+ret_atom(Editor, Str) -> tcl2erl:ret_atom([Editor, Str]).
+
+ret_color(Editor, Str) -> tcl2erl:ret_color([Editor, Str]).
+
+ret_int(Editor, Str) -> tcl2erl:ret_int([Editor, Str]).
+
+ret_ed_index(Editor, Str) ->
+ {MaxRow, _Col} = ret_ed_index([Editor, Str]),
+ MaxRow - 1.
+
+ret_pos(Pos, C, Editor, Misc) -> last_tag_val(undefined, C, tcl2erl:ret_list([Editor, " tag nam ", p_index(Pos)]), Misc).
%%------------------------------------------------------------------------------
%% PRIMITIVES
%%------------------------------------------------------------------------------
-p_index({Line, lineend}) -> [$",gstk:to_ascii(Line), ".1 lineend",$"];
+p_index({Line, lineend}) -> [$", gstk:to_ascii(Line), ".1 lineend", $"];
p_index({Line, Char}) -> [gstk:to_ascii(Line), $., gstk:to_ascii(Char)];
-p_index(insert) -> "insert";
-p_index('end') -> "end";
-p_index(Idx) -> gs:error("bad index in editor: ~w~n",[Idx]),0.
+p_index(insert) -> "insert";
+p_index('end') -> "end";
+p_index(Idx) ->
+ gs:error("bad index in editor: ~w~n", [Idx]),
+ 0.
ret_ed_index(Cmd) ->
case gstk:call(Cmd) of
- {result, Val} ->
- case io_lib:fread("~d.~d", Val) of
- {ok, [Row,Col], []} -> {Row, Col};
- Other -> {bad_result, Other}
- end;
+ {result, Val} -> case io_lib:fread("~d.~d", Val) of
+ {ok, [Row, Col], []} -> {Row, Col};
+ Other -> {bad_result, Other}
+ end;
Bad_result -> Bad_result
end.
ret_ed_indexes(Cmd) ->
case gstk:call(Cmd) of
{result, ""} -> undefined;
- {result, Val} ->
- case io_lib:fread("~d.~d ~d.~d", Val) of
- {ok, [Row1,Col1,Row2,Col2], []} -> {{Row1, Col1}, {Row2,Col2}};
- Other -> {bad_result, Other}
- end;
+ {result, Val} -> case io_lib:fread("~d.~d ~d.~d", Val) of
+ {ok, [Row1, Col1, Row2, Col2], []} -> {{Row1, Col1}, {Row2, Col2}};
+ Other -> {bad_result, Other}
+ end;
Bad_result -> Bad_result
end.
@@ -352,49 +329,26 @@ ret_ed_indexes(Cmd) ->
%% Returns: {Tag text(), NewGstkId}
%%----------------------------------------------------------------------
%% The misc field of the so record is a list of {ColorNo, Color|Font|...}
-get_color_tag(Editor,Color,Gstkid) ->
- SO = Gstkid#gstkid.widget_data,
- Tags = SO#so.misc,
- case lists:keysearch(Color, 2, Tags) of
-% {value, {No, _}} -> {["c",gstk:to_ascii(No)], Gstkid};
-% false -> % don't reuse tags, priority order spoils that
- _Any ->
- {No,_} = lists:max(Tags),
- N=No+1,
- SO2 = SO#so{misc=[{N,Color}|Tags]},
- TagStr=["c",gstk:to_ascii(N)],
- gstk:exec([Editor," tag co ",TagStr," -for ", gstk:to_color(Color)]),
- {TagStr,Gstkid#gstkid{widget_data=SO2}}
- end.
+get_color_tag(Editor, Color, Gstkid) -> get_tag(Editor, Color, Gstkid, [" -for ", gstk:to_color(Color)]).
-get_style_tag(DB,Editor,Style,Gstkid) ->
- SO = Gstkid#gstkid.widget_data,
- Tags = SO#so.misc,
- case lists:keysearch(Style, 2, Tags) of
-% {value, {No, _}} -> {["f",gstk:to_ascii(No)], Gstkid};
-% false -> % don't reuse tags, priority order spoils that
- _Any ->
- {No,_} = lists:max(Tags),
- N=No+1,
- SO2 = SO#so{misc=[{N,Style}|Tags]},
- TagStr=["f",gstk:to_ascii(N)],
- gstk:exec([Editor," tag co ",TagStr," -font ",
- gstk_font:choose_ascii(DB,Style)]), % should be style only
- {TagStr,Gstkid#gstkid{widget_data=SO2}}
- end.
+get_style_tag(Editor, Style, Gstkid, DB) ->
+ get_tag(Editor, Style, Gstkid, [" -font ", gstk_font:choose_ascii(DB, Style)]).
+
+get_tag(Editor, Type, #gstkid{widget_data = #so{misc = Tags} = SO} = Gstkid, L) ->
+ N = lists:max(proplists:get_keys(Tags)) + 1,
+ TagStr = ["c", gstk:to_ascii(N)],
+ gstk:exec([Editor, " tag co ", TagStr|L]),
+ {TagStr, Gstkid#gstkid{widget_data = SO#so{misc = [{N, Type}|Tags]}}}.
%%----------------------------------------------------------------------
%% Purpose: Given a list of tags for a char, return its visible color
%% (that is that last color tag in the list).
%%----------------------------------------------------------------------
last_tag_val(TagVal, _Chr, [], _TagDict) -> TagVal;
-last_tag_val(TagVal, Chr, [Tag|Ts],TagDict) ->
- case atom_to_list(Tag) of
- [Chr|ANo] ->
- No = list_to_integer(ANo),
- last_tag_val(gs:val(No, TagDict),Chr,Ts,TagDict);
- _NoAcolor ->
- last_tag_val(TagVal,Chr, Ts,TagDict)
- end.
-
+last_tag_val(TagVal, Chr, [Tag|Ts], TagDict) ->
+ last_tag_val(case atom_to_list(Tag) of
+ [Chr|No] -> gs:val(list_to_integer(No), TagDict);
+ _NoAcolor -> TagVal
+ end, Chr, Ts, TagDict).
+
%%% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_entry.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_entry.erl
--- otp_src_19.0.5/lib/gs/src/gstk_entry.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_entry.erl 2016-08-25 16:37:44.562693392 +0300
@@ -24,13 +24,14 @@
%% ------------------------------------------------------------
-module(gstk_entry).
--compile([{nowarn_deprecated_function,{gs,error,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, error, 2}}]).
%%------------------------------------------------------------------------------
%% ENTRY OPTIONS
%%
%% Attributes:
-%% anchor n,w,s,e,nw,se,ne,sw,center
+%% anchor n, w,s, e,nw, se, ne, sw, center
%% bg Color
%% bw Int
%% data Data
@@ -56,7 +57,7 @@
%% Commands:
%% delete Index | {From, To}
%% enable Bool
-%% insert {index,String}
+%% insert {index, String}
%% select {From, To} | clear
%% setfocus Bool
%%
@@ -89,7 +90,7 @@
%% state ??????
%%
--export([create/3,config/3,read/3,delete/2,event/5,option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5]).
-include("gstk.hrl").
@@ -101,19 +102,16 @@
%% Purpose : Create a widget of the type defined in this module.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
create(DB, GstkId, Opts) ->
- TkW = gstk_generic:mk_tkw_child(DB,GstkId),
- PlacePreCmd = [";place ", TkW],
- Ngstkid = GstkId#gstkid{widget=TkW},
- case gstk_generic:make_command(Opts,Ngstkid,TkW,"", PlacePreCmd,DB) of
- {error,Reason} -> {error,Reason};
+ TkW = gstk_generic:mk_tkw_child(DB, GstkId),
+ Ngstkid = GstkId#gstkid{widget = TkW},
+ case gstk_generic:make_command(Opts, Ngstkid, TkW, "", [";place ", TkW], DB) of
+ {error, _Reason} = E -> E;
Cmd when is_list(Cmd) ->
- case gstk:call(["entry ", TkW,Cmd]) of
+ case gstk:call(["entry ", TkW, Cmd]) of
{result, _} ->
- gstk:exec(
- [TkW," conf -bo 2 -relief sunken -highlightth 2;"]),
+ gstk:exec([TkW, " conf -bo 2 -relief sunken -highlightth 2;"]),
Ngstkid;
- Bad_Result ->
- {error, Bad_Result}
+ Bad_Result -> {error, Bad_Result}
end
end.
@@ -127,11 +125,8 @@ create(DB, GstkId, Opts) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
- TkW = Gstkid#gstkid.widget,
- SimplePreCmd = [TkW, " conf"],
- PlacePreCmd = [";place ", TkW],
- gstk_generic:mk_cmd_and_exec(Opts,Gstkid,TkW,SimplePreCmd,PlacePreCmd,DB).
+config(DB, #gstkid{widget = TkW} = Gstkid, Opts) ->
+ gstk_generic:mk_cmd_and_exec(Opts, Gstkid, TkW, [TkW, " conf"], [";place ", TkW], DB).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -142,8 +137,7 @@ config(DB, Gstkid, Opts) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- gstk_generic:read_option(DB, Gstkid, Opt).
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -154,14 +148,11 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
gstk_db:delete_widget(DB, Gstkid),
- Gstkid#gstkid.widget.
-
-
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+ TkW.
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%%------------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -176,29 +167,38 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%%
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, TkW, DB,_) ->
- case Option of
- {font, Font} ->
- gstk_db:insert_opt(DB,Gstkid,Option),
- {s, [" -font ", gstk_font:choose_ascii(DB,Font)]};
- {insertbg, Color} -> {s, [" -insertba ", gstk:to_color(Color)]};
- {insertbw, Width} -> {s, [" -insertbo ", gstk:to_ascii(Width)]};
- {justify, How} -> {s, [" -ju ", gstk:to_ascii(How)]};
- {text, Str} ->
- {c, [TkW," del 0 end; ",TkW," ins 0 ", gstk:to_ascii(Str)]};
- {xselection, Bool} -> {s, [" -exportse ", gstk:to_ascii(Bool)]};
+option(Option, Gstkid, TkW, DB, _) -> option(Option, Gstkid, TkW, DB).
- {delete, {From, To}} ->
- {c, [TkW, " del ", p_index(From), $ , p_index(To)]};
- {delete, Index} -> {c, [TkW, " de ", p_index(Index)]};
- {insert, {Idx, Str}} ->
- {c, [TkW, " ins ", gstk:to_ascii(Idx),$ , gstk:to_ascii(Str)]};
- {select, clear} -> {c, [TkW, " sel clear"]};
- {select, {From, To}} ->
- {c, [TkW, " sel range ", p_index(From), $ , p_index(To)]};
- _ -> invalid_option
-
- end.
+option({font, Font} = Option, Gstkid, _TkW, DB) ->
+ gstk_db:insert_opt(DB, Gstkid, Option),
+ option_s(gstk_font:choose_ascii(DB, Font), " -font ");
+option(Option, _Gstkid, TkW, _DB) -> option(Option, TkW).
+
+option({select, clear}, TkW) -> option_c([TkW, " sel clear"]);
+option({text, Str}, TkW) -> option_c([TkW, " del 0 end; ", TkW, " ins 0 ", gstk:to_ascii(Str)]);
+option({delete, {From, To}}, TkW) -> option_range(" del ", TkW, From, To);
+option({delete, Index}, TkW) -> option_c([TkW, " de ", p_index(Index)]);
+option({select, {From, To}}, TkW) -> option_range(" sel range ", TkW, From, To);
+option({insert, {Idx, Str}}, TkW) -> option_c(" ins ", TkW, gstk:to_ascii(Idx), gstk:to_ascii(Str));
+option(Option, _TkW) -> option(Option).
+
+option({insertbg, Color}) -> option_s(gstk:to_color(Color), " -insertba ");
+option({insertbw, Width}) -> to_ascii(Width, " -insertbo ");
+option({justify, How}) -> to_ascii(How, " -ju ");
+option({xselection, Bool}) -> to_ascii(Bool, " -exportse ");
+option(_Option) -> invalid_option.
+
+option_c(L) -> {c, L}.
+
+option_c(Str, TkW, Val1, Val2) -> option_c([TkW, Str, Val1, $ , Val2]).
+
+option_range(Str, TkW, From, To) -> option_c(Str, TkW, p_index(From), p_index(To)).
+
+option_s(L) -> {s, L}.
+
+option_s(Val, Str) -> option_s([Str, Val]).
+
+to_ascii(Val, Str) -> option_s(gstk:to_ascii(Val), Str).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/5
@@ -210,25 +210,27 @@ option(Option, Gstkid, TkW, DB,_) ->
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,Gstkid,TkW,DB,_) ->
- case Option of
- insertbg -> tcl2erl:ret_color([TkW," cg -insertba"]);
- insertbw -> tcl2erl:ret_int([TkW," cg -insertbo"]);
- font -> gstk_db:opt(DB,Gstkid,font,undefined);
- justify -> tcl2erl:ret_atom([TkW," cg -jus"]);
- text -> tcl2erl:ret_str([TkW," get"]);
- xselection -> tcl2erl:ret_bool([TkW," cg -exports"]);
- {index, Idx} -> tcl2erl:ret_int([TkW, "cg ind ", p_index(Idx)]);
- _ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
- end.
+read_option(font, Gstkid, _TkW, DB, _) -> read_option(font, Gstkid, _TkW, DB).
+
+read_option(font, Gstkid, _TkW, DB) -> gstk_db:opt(DB, Gstkid, font, undefined);
+read_option(Option, Gstkid, TkW, _DB) -> read_option(Option, Gstkid, TkW).
+
+read_option(insertbg, _Gstkid, TkW) -> tcl2erl:ret_color([TkW, " cg -insertba"]);
+read_option(insertbw, _Gstkid, TkW) -> tcl2erl:ret_int([TkW, " cg -insertbo"]);
+read_option(justify, _Gstkid, TkW) -> tcl2erl:ret_atom([TkW, " cg -jus"]);
+read_option(text, _Gstkid, TkW) -> tcl2erl:ret_str([TkW, " get"]);
+read_option(xselection, _Gstkid, TkW) -> tcl2erl:ret_bool([TkW, " cg -exports"]);
+read_option({index, Idx}, _Gstkid, TkW) -> tcl2erl:ret_int([TkW, "cg ind ", p_index(Idx)]);
+read_option(Option, #gstkid{objtype = ObjType}, _TkW) -> {bad_result, {ObjType, invalid_option, Option}}.
%%------------------------------------------------------------------------------
%% PRIMITIVES
%%------------------------------------------------------------------------------
p_index(Index) when is_integer(Index) -> gstk:to_ascii(Index);
p_index(insert) -> "insert";
-p_index(last) -> "end";
-p_index(Idx) -> gs:error("Bad index in entry: ~w~n",[Idx]),0.
-
+p_index(last) -> "end";
+p_index(Idx) ->
+ gs:error("Bad index in entry: ~w~n", [Idx]),
+ 0.
%%% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk.erl
--- otp_src_19.0.5/lib/gs/src/gstk.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk.erl 2016-08-25 16:37:44.562693392 +0300
@@ -21,8 +21,9 @@
%%
-module(gstk).
--compile([{nowarn_deprecated_function,{gs,assq,2}},
- {nowarn_deprecated_function,{gs,creation_error,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, assq, 2}},
+ {nowarn_deprecated_function, {gs, creation_error, 2}}]).
-export([start_link/4,
stop/1,
@@ -48,142 +49,116 @@
-include("gstk.hrl").
-start_link(GsId,FrontendNode,Owner,Options) ->
- case gs:assq(node,Options) of
+start_link(GsId, FrontendNode, Owner, Options) ->
+ case gs:assq(node, Options) of
false ->
- Gstk = spawn_link(gstk, init,[{GsId, FrontendNode, Owner, Options}]),
+ Gstk = spawn_link(gstk, init, [{GsId, FrontendNode, Owner, Options}]),
receive
- {ok, _PortHandler} ->
- {ok, Gstk};
- {error, Reason} ->
- {error, Reason}
+ {ok, _PortHandler} -> {ok, Gstk};
+ {error, _Reason} = E -> E
end;
- {value, Node} ->
- rpc:call(Node,gen_server,start_link,[gstk, {Owner,Options},[]])
+ {value, Node} -> rpc:call(Node, gen_server, start_link, [gstk, {Owner, Options}, []])
end.
-stop(BackendServ) ->
- request(BackendServ,stop).
-
-create(BackendServ,Args) ->
- request(BackendServ,{create,Args}).
-
-config(BackendServ,Args) ->
- request(BackendServ,{config,Args}).
-
-read(BackendServ,Args) ->
- request(BackendServ,{read,Args}).
+stop(BackendServ) -> request(BackendServ, stop).
-destroy(BackendServ,Args) ->
- request(BackendServ,{destroy,Args}).
+-define(REQUEST(N), N(BackendServ, Args) -> request(BackendServ, {N, Args})).
-pid_died(BackendServ,Pid) ->
- request(BackendServ,{pid_died,Pid}).
+?REQUEST(create).
+?REQUEST(config).
+?REQUEST(read).
+?REQUEST(destroy).
+?REQUEST(pid_died).
-call(Cmd) ->
- %%io:format("Call:~p~n",[Cmd]),
- gstk_port_handler:call(get(port_handler),Cmd).
+call(Cmd) -> gstk_port_handler:call(get(port_handler), Cmd).
-exec(Cmd) ->
- gstk_port_handler:exec(Cmd).
+exec(Cmd) -> gstk_port_handler:exec(Cmd).
make_extern_id(IntId, DB) ->
- [{_,Node}] = ets:lookup(DB,frontend_node),
- {IntId,Node}.
+ [{_, Node}] = ets:lookup(DB, frontend_node),
+ {IntId, Node}.
-event(BackendServ,Event) ->
- BackendServ!{event,Event}.
+event(BackendServ, Event) -> BackendServ ! {event, Event}.
%% -----------------------------------------------------------------------------
-request(Who,Msg) ->
- Who ! {self(),Msg},
+request(Who, Msg) ->
+ Who ! {self(), Msg},
receive
- {gstk_reply,R} -> R;
- {'EXIT',Who,Reason} ->
- self() ! {'EXIT',Who,Reason},
- {error,Reason}
+ {gstk_reply, R} -> R;
+ {'EXIT', Who, Reason} = E ->
+ self() ! E,
+ {error, Reason}
end.
-
--record(state,{db,frontendnode,port_handler}).
+-record(state, {db, frontendnode, port_handler}).
%% ------------------------------------------------------------
%% Initialize
%%
-init({GsId,FrontendNode,Owner,Opts}) ->
- put(gs_frontend,Owner),
+init({GsId, FrontendNode, Owner, Opts}) ->
+ put(gs_frontend, Owner),
case gstk_port_handler:start_link(self()) of
- {error, Reason} ->
- FrontendNode ! {error, Reason},
+ {error, _Reason} = E ->
+ FrontendNode ! E,
exit(normal);
- {ok, PortHandler} ->
- FrontendNode ! {ok, PortHandler},
- put(port_handler,PortHandler),
- {ok,Port} = gstk_port_handler:ping(PortHandler),
- put(port,Port),
+ {ok, PortHandler} = R ->
+ FrontendNode ! R,
+ put(port_handler, PortHandler),
+ {ok, Port} = gstk_port_handler:ping(PortHandler),
+ put(port, Port),
exec("wm withdraw ."),
DB = gstk_db:init(Opts),
- ets:insert(DB,{frontend_node,FrontendNode}),
- put(worker,spawn_link(gstk,worker_init,[0])),
- Gstkid = #gstkid{id=GsId,widget="",owner=Owner,objtype=gs},
- gstk_db:insert_gs(DB,Gstkid),
+ ets:insert(DB, {frontend_node, FrontendNode}),
+ put(worker, spawn_link(gstk, worker_init, [0])),
+ Gstkid = #gstkid{id = GsId, widget="", owner = Owner, objtype = gs},
+ gstk_db:insert_gs(DB, Gstkid),
gstk_font:init(),
- loop(#state{db=DB,frontendnode=FrontendNode})
+ loop(#state{db = DB, frontendnode = FrontendNode})
end.
loop(State) ->
receive
- X ->
- case (doit(X,State)) of
- done -> loop(State);
- stop -> bye
- end
+ X -> case (doit(X, State)) of
+ done -> loop(State);
+ stop -> bye
+ end
end.
-reply(To,Msg) ->
- To ! {gstk_reply,Msg},
+reply(To, Msg) ->
+ To ! {gstk_reply, Msg},
done.
-doit({From,{config, {Id, Opts}}},#state{db=DB}) ->
- reply(From,config_impl(DB,Id,Opts));
-doit({From,{create, Args}}, #state{db=DB}) ->
- reply(From,create_impl(DB,Args));
-doit({From,{read,{Id,Opt}}},#state{db=DB}) ->
- reply(From,read_impl(DB,Id,Opt));
-doit({From,{pid_died, Pid}}, #state{db=DB}) ->
+doit({From, {config, {Id, Opts}}}, #state{db = DB}) -> reply(From, config_impl(DB, Id, Opts));
+doit({From, {create, Args}}, #state{db = DB}) -> reply(From, create_impl(DB, Args));
+doit({From, {read, {Id, Opt}}}, #state{db = DB}) -> reply(From, read_impl(DB, Id, Opt));
+doit({From, {pid_died, Pid}}, #state{db = DB}) ->
pid_died_impl(DB, Pid),
- reply(From,gstk_db:get_deleted(DB));
-doit({From,{destroy, Id}}, #state{db=DB}) ->
- destroy_impl(DB, gstk_db:lookup_gstkid(DB,Id)),
- reply(From,gstk_db:get_deleted(DB));
-
-doit({From,dump_db},State) ->
- io:format("gstk_db:~p~n",[lists:sort(ets:tab2list(State#state.db))]),
- io:format("events:~p~n",[lists:sort(ets:tab2list(get(events)))]),
- io:format("options:~p~n",[lists:sort(ets:tab2list(get(options)))]),
- io:format("defaults:~p~n",[lists:sort(ets:tab2list(get(defaults)))]),
- io:format("kids:~p~n",[lists:sort(ets:tab2list(get(kids)))]),
- reply(From,State);
-
-doit({From,stop},_State) ->
+ reply(From, gstk_db:get_deleted(DB));
+doit({From, {destroy, Id}}, #state{db = DB}) ->
+ destroy_impl(DB, gstk_db:lookup_gstkid(DB, Id)),
+ reply(From, gstk_db:get_deleted(DB));
+doit({From, dump_db}, #state{db = DB} = State) ->
+ io:format("gstk_db:~p~n", [lists:sort(ets:tab2list(DB))]),
+ lists:foreach(fun(E) -> io:format("~s:~p~n", [E, lists:sort(ets:tab2list(get(E)))]) end,
+ [events, options, defaults, kids]),
+ reply(From, State);
+doit({From, stop}, _State) ->
gstk_port_handler:stop(get(port_handler)),
- exit(get(worker),kill),
- reply(From,stopped),
+ exit(get(worker), kill),
+ reply(From, stopped),
stop;
-
-doit({event,{Id, Etag, Args}},#state{db=DB}) ->
+doit({event, {Id, Etag, Args}}, #state{db = DB}) ->
case gstk_db:lookup_event(DB, Id, Etag) of
- {Etype, Edata} ->
- Gstkid = gstk_db:lookup_gstkid(DB, Id),
- apply(gstk_widgets:objmod(Gstkid),event,[DB,Gstkid,Etype,Edata,Args]);
- _ -> true
- end,
- done.
-
+ {Etype, Edata} ->
+ Gstkid = gstk_db:lookup_gstkid(DB, Id),
+ apply(gstk_widgets:objmod(Gstkid), event, [DB, Gstkid, Etype, Edata, Args]),
+ done;
+ _ -> done
+ end.
%%----------------------------------------------------------------------
-%% Implementation of create,config,read,destroy
+%% Implementation of create, config, read, destroy
%% Comment: In the gstk process there is not concept call 'name', only
%% pure oids. Names are stripped of by 'gs' and this simplifies
%% gstk a lot.
@@ -194,132 +169,105 @@ doit({event,{Id, Etag, Args}},#state{db=
%% necessary) exists.
%%----------------------------------------------------------------------
-
create_impl(DB, {Owner, {Objtype, Id, Parent, Opts}}) ->
- Pgstkid = gstk_db:lookup_gstkid(DB, Parent),
- GstkId=#gstkid{id=Id,owner=Owner,parent=Parent,objtype=Objtype},
- gstk_db:insert_opt(DB,Id,{data,[]}),
- RealOpts=apply(gstk_widgets:objmod(Pgstkid),
- mk_create_opts_for_child,[DB,GstkId,Pgstkid,Opts]),
+ gstk_db:insert_opt(DB, Id, {data, []}),
case gstk_widgets:type2mod(Objtype) of
- {error,Reason} -> {error,Reason};
+ {error, _Reason} = E -> E;
ObjMod ->
- case apply(ObjMod, create, [DB, GstkId, RealOpts]) of
- {bad_result, BR} ->
- gstk_db:delete_gstkid(DB,GstkId),
- gs:creation_error(GstkId,{bad_result, BR});
- Ngstkid when is_record(Ngstkid,gstkid) ->
- gstk_db:insert_widget(DB, Ngstkid),
- ok;
- {error,Reason} -> {error,Reason};
- ok -> ok
- end
+ Pgstkid = gstk_db:lookup_gstkid(DB, Parent),
+ GstkId = #gstkid{id = Id, owner = Owner, parent = Parent, objtype = Objtype},
+ case apply(ObjMod, create,
+ [DB, GstkId, apply(gstk_widgets:objmod(Pgstkid), mk_create_opts_for_child,
+ [DB, GstkId, Pgstkid, Opts])]) of
+ {bad_result, _} = BR ->
+ gstk_db:delete_gstkid(DB, GstkId),
+ gs:creation_error(GstkId, BR);
+ #gstkid{} = Ngstkid ->
+ gstk_db:insert_widget(DB, Ngstkid),
+ ok;
+ {error, _Reason} = E -> E;
+ ok -> ok
+ end
end.
-config_impl(DB,Id,Opts) ->
- Gstkid = gstk_db:lookup_gstkid(DB, Id),
+config_impl(DB, Id, Opts) ->
+ Gstkid = gstk_db:lookup_gstkid(DB, Id),
case apply(gstk_widgets:objmod(Gstkid), config, [DB, Gstkid, Opts]) of
ok -> ok;
- {bad_result,R} -> {error,R};
- {error,Reason} -> {error,Reason};
- Q -> {error,Q}
+ {bad_result, R} -> {error, R};
+ {error, _Reason} = E -> E;
+ R -> {error, R}
end.
-
-read_impl(DB,Id,Opt) ->
- Gstkid = gstk_db:lookup_gstkid(DB, Id),
+read_impl(DB, Id, Opt) ->
+ Gstkid = gstk_db:lookup_gstkid(DB, Id),
case apply(gstk_widgets:objmod(Gstkid), read, [DB, Gstkid, Opt]) of
- {bad_result,R} -> {error,R};
- {error,R} -> {error,R};
- Res -> Res
+ {bad_result, R} -> {error, R};
+ R -> R
end.
-
-
%%-----------------------------------------------------------------------------
%% DESTROYING A WIDGET
%%-----------------------------------------------------------------------------
destroy_impl(DB, Gstkid) ->
- worker_do({delay_is,50}),
- Widget = delete_only_this_widget(DB,Gstkid),
- destroy_widgets([Widget], DB),
- worker_do({delay_is,5}),
+ worker_do({delay_is, 50}),
+ destroy_widgets([delete_only_this_widget(DB, Gstkid)], DB),
+ worker_do({delay_is, 5}),
true.
-delete_only_this_widget(DB,Gstkid) ->
- #gstkid{id=ID,objtype=OT,parent=P} = Gstkid,
+delete_only_this_widget(DB, #gstkid{id = ID, objtype = OT, parent = P} = Gstkid) ->
delete_widgets(gstk_db:lookup_kids(DB, ID), DB),
Widget = apply(gstk_widgets:type2mod(OT), delete, [DB, Gstkid]),
gstk_db:delete_kid(DB, P, ID),
Widget.
-
pid_died_impl(DB, Pid) ->
case lists:sort(gstk_db:lookup_ids(DB, Pid)) of
- [ID | IDs] ->
- Gstkid = gstk_db:lookup_gstkid(DB, ID),
- destroy_impl(DB, Gstkid),
- Tops = get_tops(IDs, DB),
- destroy_widgets(Tops, DB);
- _ ->
- true
+ [ID|IDs] ->
+ destroy_impl(DB, gstk_db:lookup_gstkid(DB, ID)),
+ destroy_widgets(get_tops(IDs, DB), DB);
+ _ -> true
end.
-
-get_tops([ID | IDs], DB) ->
+get_tops([ID|IDs], DB) ->
case gstk_db:lookup_gstkid(DB, ID) of
- undefined ->
- get_tops(IDs, DB);
- Gstkid ->
- Parent = Gstkid#gstkid.parent,
- case lists:member(Parent, IDs) of
- true ->
- delete_widgets([ID], DB),
- get_tops(IDs, DB);
- false ->
- Widget = delete_only_this_widget(DB,Gstkid),
- [Widget | get_tops(IDs, DB)]
- end
+ undefined -> get_tops(IDs, DB);
+ #gstkid{parent = Parent} = Gstkid -> case lists:member(Parent, IDs) of
+ true ->
+ delete_widgets([ID], DB),
+ get_tops(IDs, DB);
+ false -> [delete_only_this_widget(DB, Gstkid)|get_tops(IDs, DB)]
+ end
end;
get_tops([], _DB) -> [].
-
-delete_widgets([ID | Rest], DB) ->
+delete_widgets([ID|Rest], DB) ->
delete_widgets(gstk_db:lookup_kids(DB, ID), DB),
case gstk_db:lookup_gstkid(DB, ID) of
- undefined ->
- delete_widgets(Rest, DB);
+ undefined -> delete_widgets(Rest, DB);
Gstkid ->
apply(gstk_widgets:objmod(Gstkid), delete, [DB, Gstkid]),
delete_widgets(Rest, DB)
end;
delete_widgets([], _) -> true.
-
-
destroy_widgets(Widgets, DB) ->
case destroy_wids(Widgets, DB) of
- [] -> true;
+ [] -> true;
Destroys -> exec(["destroy ", Destroys])
end.
-
-destroy_wids([{Parent, ID, Objmod, Args} | Rest], DB) ->
+destroy_wids([{Parent, ID, Objmod, Args}|Rest], DB) ->
gstk_db:delete_kid(DB, Parent, ID),
- apply(Objmod, destroy, [DB | Args]),
+ apply(Objmod, destroy, [DB|Args]),
destroy_wids(Rest, DB);
-
-destroy_wids([W | Rest], DB) ->
- [W, " "| destroy_wids(Rest, DB)];
-
+destroy_wids([W|Rest], DB) -> [W, " "|destroy_wids(Rest, DB)];
destroy_wids([], _DB) -> [].
-
%% ----- The Color Model -----
-to_color({R,G,B}) ->
- [$#,dec2hex(2,R),dec2hex(2,G),dec2hex(2,B)];
+to_color({R, G, B}) -> [$#, dec2hex(2, R), dec2hex(2, G), dec2hex(2, B)];
to_color(Color) when is_atom(Color) -> atom_to_list(Color).
%% ------------------------------------------------------------
@@ -327,63 +275,54 @@ to_color(Color) when is_atom(Color) -> a
%% M is number of digits we want
%% N is the decimal to be converted
-dec2hex(M,N) -> dec2hex(M,N,[]).
-
-dec2hex(0,_N,Ack) -> Ack;
-dec2hex(M,N,Ack) -> dec2hex(M-1,N bsr 4,[d2h(N band 15)|Ack]).
+dec2hex(M, N) -> dec2hex(M, N, []).
-d2h(N) when N<10 -> N+$0;
-d2h(N) -> N+$a-10.
+dec2hex(0, _N, Ack) -> Ack;
+dec2hex(M, N, Ack) -> dec2hex(M - 1, N bsr 4, [d2h(N band 2#1111)|Ack]).
+d2h(N) ->
+ N + if
+ N < 10 -> $0;
+ true -> $a - 10
+ end.
%% ----- Value to String -----
-to_ascii(V) when is_list(V) -> [$",to_ascii(V,[],[]),$"]; %% it's a string
+to_ascii(V) when is_list(V) -> [$", to_ascii(V, [], []), $"]; %% it's a string
to_ascii(V) when is_integer(V) -> integer_to_list(V);
-to_ascii(V) when is_float(V) -> float_to_list(V);
-to_ascii(V) when is_atom(V) -> to_ascii( atom_to_list(V));
-to_ascii(V) when is_tuple(V) -> to_ascii(lists:flatten(io_lib:format("~w",[V])));
-to_ascii(V) when is_pid(V) -> pid_to_list(V).
+to_ascii(V) when is_float(V) -> float_to_list(V);
+to_ascii(V) when is_atom(V) -> to_ascii(atom_to_list(V));
+to_ascii(V) when is_tuple(V) -> to_ascii(lists:flatten(io_lib:format("~w", [V])));
+to_ascii(V) when is_pid(V) -> pid_to_list(V).
- % FIXME: Currently we accept newlines in strings and handle this at
- % the Tcl side. Is this the best way or should we translate to "\n"
- % here?
-to_ascii([$[|R], Y, X) -> to_ascii(R, Y, [$[, $\\ | X]);
- to_ascii([$]|R], Y, X) -> to_ascii(R, Y, [$], $\\ | X]);
-to_ascii([${|R], Y, X) -> to_ascii(R, Y, [${, $\\ | X]);
- to_ascii([$}|R], Y, X) -> to_ascii(R, Y, [$}, $\\ | X]);
-to_ascii([$"|R], Y, X) -> to_ascii(R, Y, [$", $\\ | X]);
-to_ascii([$$|R], Y, X) -> to_ascii(R, Y, [$$, $\\ | X]);
-to_ascii([$\\|R], Y, X) -> to_ascii(R, Y, [$\\, $\\ | X]);
+% FIXME: Currently we accept newlines in strings and handle this at
+% the Tcl side. Is this the best way or should we translate to "\n"
+% here?
to_ascii([C|R], Y, X) when is_list(C) -> to_ascii(C, [R|Y], X);
+to_ascii([C|R], Y, X) when C =:= $[; C =:= $]; C =:= ${; C =:= $}; C =:= $"; C =:= $$; C =:= $\\ ->
+ to_ascii(R, Y, [C, $\\|X]);
to_ascii([C|R], Y, X) -> to_ascii(R, Y, [C|X]);
to_ascii([], [Y1|Y], X) -> to_ascii(Y1, Y, X);
to_ascii([], [], X) -> lists:reverse(X).
-worker_do(Msg) ->
- get(worker) ! Msg.
+worker_do(Msg) -> get(worker) ! Msg.
-worker_init(Delay) ->
- receive
- {delay_is,D} ->
- worker_init(D);
- {match_delete,DBExprs} ->
- worker_match(DBExprs),
- if Delay > 0 ->
- receive
- {delay_is,D} ->
- worker_init(D)
- after Delay ->
- worker_init(Delay)
- end;
- true ->
- worker_init(Delay)
- end
- end.
+worker_init(Delay) when Delay > 0 ->
+ worker_init(receive
+ {delay_is, D} -> D;
+ {match_delete, DBExprs} ->
+ worker_match(DBExprs),
+ if
+ Delay > 0 -> receive
+ {delay_is, D} -> D
+ after Delay -> Delay
+ end;
+ true -> Delay
+ end
+ end).
-worker_match([{DB,[Expr|Exprs]}|DbExprs]) ->
- ets:match_delete(DB,Expr),
- worker_match([{DB,Exprs}|DbExprs]);
-worker_match([{_DB,[]}|DbExprs]) ->
- worker_match(DbExprs);
+worker_match([{DB, [Expr|Exprs]}|DbExprs]) ->
+ ets:match_delete(DB, Expr),
+ worker_match([{DB, Exprs}|DbExprs]);
+worker_match([{_DB, []}|DbExprs]) -> worker_match(DbExprs);
worker_match([]) -> done.
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_font.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_font.erl
--- otp_src_19.0.5/lib/gs/src/gstk_font.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_font.erl 2016-08-25 16:37:44.563693370 +0300
@@ -14,7 +14,7 @@
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
-%%
+%%
%% %CopyrightEnd%
%%
@@ -41,16 +41,14 @@
%-compile(export_all).
--export([init/0,choose_ascii/2,choose/2,width_height/3]).
-
+-export([init/0, choose_ascii/2, choose/2, width_height/3]).
-ifndef(NEW_WIDTH_HEIGHT).
init() ->
%% hack. the only way to find the size of a text seems to be to put
%% it into a label in an unmappen window (DummyFontWindow)
gstk:exec("toplevel .dfw;wm withdraw .dfw;" %deiconify
- "label .dfw.l -text dummyinittxt -padx 0 -pady 0 -borderwidth 0;"
- "pack .dfw.l").
+ "label .dfw.l -text dummyinittxt -padx 0 -pady 0 -borderwidth 0;pack .dfw.l").
-else.
init() -> true.
-endif.
@@ -61,116 +59,81 @@ init() -> true.
%%----------------------------------------------------------------------
-ifndef(NEW_WIDTH_HEIGHT).
width_height(_DB, FontSpec, Txt) ->
- FontSpecStr = tk_font_spec(norm_font_spec(FontSpec)),
- case gstk:call([".dfw.l co -font {", FontSpecStr,"}",
- " -text ", gstk:to_ascii(Txt)]) of
- {result, _} ->
- Width = tcl2erl:ret_int("update idletasks;winfo w .dfw.l"),
- Height = tcl2erl:ret_int("winfo h .dfw.l"),
-% io:format("width_height(~p,~p) =>\n~p\n\n",[FontSpec,Txt,{Width,Height}]),
- {Width,Height};
- _Bad_Result ->
-% io:format("width_height(~p,~p) =>\nundefined\n\n",[FontSpec,Txt]),
- undefined
+ case gstk:call([".dfw.l co -font {", tk_font_spec(norm_font_spec(FontSpec)), "}", " -text ", gstk:to_ascii(Txt)]) of
+ {result, _} -> {tcl2erl:ret_int("update idletasks;winfo w .dfw.l"), tcl2erl:ret_int("winfo h .dfw.l")};
+ _Bad_Result -> undefined
end.
-else.
%% This code should work but does't. Tk gives incorrect
%% values if asking to fast or something /kent
-width_height(DB, FontSpec, Txt) when tuple(FontSpec) ->
- NormFontSpec = norm_font_spec(FontSpec),
+width_height(DB, FontSpec, Txt) when is_tuple(FontSpec) ->
+ {Family, _, Size} = NormFontSpec = norm_font_spec(FontSpec),
FontSpecStr = tk_font_spec(NormFontSpec),
- {Family,_,Size} = NormFontSpec,
- LineHeight =
- case cached_line_height(DB, {Family,Size}) of
- undefined ->
- LineH = tcl2erl:ret_int(
- ["font metrics {",FontSpecStr,"} -linespace"]),
- cache_line_height(DB, {Family,Size}, LineH),
- LineH;
- LineH ->
- LineH
- end,
- EscapedText = gstk:to_ascii(Txt),
- Width = tcl2erl:ret_int(
- ["font measure {",FontSpecStr,"} ",EscapedText]),
- Height = LineHeight * line_count(Txt),
- {Width,Height};
-
-width_height(_DB, FontSpec, Txt) when list(FontSpec) ->
- EscapedText = gstk:to_ascii(Txt),
- Width =
- tcl2erl:ret_int(["font measure {",FontSpec,"} ",EscapedText]),
- LineHeight =
- tcl2erl:ret_int(["font metrics {",FontSpec,"} -linespace"]),
- Height = LineHeight * line_count(Txt),
- {Width,Height}.
+ {tcl2erl:ret_int(["font measure {", FontSpecStr, "} ", gstk:to_ascii(Txt)]),
+ case cached_line_height(DB, {Family, Size}) of
+ undefined ->
+ LineH = tcl2erl:ret_int(["font metrics {", FontSpecStr, "} -linespace"]),
+ cache_line_height(DB, {Family, Size}, LineH),
+ LineH;
+ LineH -> LineH
+ end * line_count(Txt)};
+width_height(_DB, FontSpec, Txt) when is_list(FontSpec) ->
+ {tcl2erl:ret_int(["font measure {", FontSpec, "} ", gstk:to_ascii(Txt)]),
+ tcl2erl:ret_int(["font metrics {", FontSpec, "} -linespace"]) * line_count(Txt)}.
-cached_line_height(DB,FontSpec) ->
- gstk_db:lookup(DB, {cached_line_height,FontSpec}).
+cached_line_height(DB, FontSpec) -> gstk_db:lookup(DB, {cached_line_height, FontSpec}).
-cache_line_height(DB,FontSpec,Size) ->
- gstk_db:insert(DB, {cached_line_height,FontSpec}, Size).
+cache_line_height(DB, FontSpec, Size) -> gstk_db:insert(DB, {cached_line_height, FontSpec}, Size).
-line_count(Line) ->
- line_count(Line, 1).
+line_count(Line) -> line_count(Line, 1).
-line_count([H | T], Count) ->
- Count + line_count(H, 0) + line_count(T, 0);
+line_count([H|T], Count) -> Count + line_count(H, 0) + line_count(T, 0);
line_count($\n, Count) -> Count + 1;
-line_count(Char, Count) when integer(Char) -> Count;
+line_count(Char, Count) when is_integer(Char) -> Count;
line_count([], Count) -> Count.
-endif.
-
-% "expr [font metrics ",FSpec," -linespace] * \
-% [regsub -all \\n ",Txt," {} ignore]"
+
+% "expr [font metrics ", FSpec, " -linespace] * \
+% [regsub -all \\n ", Txt, " {} ignore]"
%%----------------------------------------------------------------------
%% Returns: Font specification string in Tk format
%%
-%% The input is {Family,Size} or {Family,Style,Size} where Family and
+%% The input is {Family, Size} or {Family, Style, Size} where Family and
%% Style are atoms ?! FIXME true???
%%----------------------------------------------------------------------
choose_ascii(DB, Font) ->
- {Fam,Styl,Siz} = choose(DB, Font),
- {variable,V} =gstk_db:lookup(DB,{font,Fam,Styl,Siz}),
-% io:format("choose_ascii(~p) =>\n~p\n\n",[Font,V]),
+ {Fam, Styl, Siz} = choose(DB, Font),
+ {variable, V} = gstk_db:lookup(DB, {font, Fam, Styl, Siz}),
V.
-%% DB contains: {font,Fam,Style,Size} -> {replaced_by,{font,Fam,Style,Size}} or
+%% DB contains: {font, Fam, Style, Size} -> {replaced_by, {font, Fam, Style, Size}} or
%% {variable, TkVariableStrInclDollar}
%% ###########################################################################
%%
%% We create a new font name on the other side and store the name in the
%% database. We reorder the options so that they have a predefined order.
-%%
+%%
%% ###########################################################################
-choose(DB, FontSpec) ->
- choose_font(DB, norm_font_spec(FontSpec)).
+choose(DB, FontSpec) -> choose_font(DB, norm_font_spec(FontSpec)).
-choose_font(DB, {Fam,Styl,Siz}) ->
+choose_font(DB, {Fam, Styl, Siz}) ->
Fam0 = map_family(Fam),
- case gstk_db:lookup(DB,{font,Fam0,Styl,Siz}) of
- {variable,_OwnFontName} -> true;
- undefined ->
- N = gstk_db:counter(DB,font), % FIXME: Can use "font create"
- % without name to get unique name
- NewName=["f",gstk:to_ascii(N)],
-% io:format("~s\n\n",
-% [lists:flatten(["font create ",NewName," ",
-% tk_font_spec({Fam0,Styl,Siz})])]),
- gstk:exec(["font create ",NewName," ",
- tk_font_spec({Fam0,Styl,Siz})]),
+ FSS = {Fam0, Styl, Siz},
+ FFSS = {font, Fam0, Styl, Siz},
+ case gstk_db:lookup(DB, FFSS) of
+ {variable, _OwnFontName} -> FSS;
+ undefined ->
+ % FIXME: Can use "font create" without name to get unique name
+ NewName = ["f", gstk:to_ascii(gstk_db:counter(DB, font))],
+ gstk:exec(["font create ", NewName, " ", tk_font_spec(FSS)]),
%% should us variable syntax gs(f1) instead
%% have to recompile erlcall to define this global gs var
- V2 = {variable,NewName},
- gstk_db:insert(DB,{font,Fam0,Styl,Siz},V2),
- true
- end,
-% io:format("choose(~p,~p,~p) =>\n~p\n\n",[Fam,Styl,Siz,{Fam0,Styl,Siz}]),
- {Fam0,Styl,Siz}.
-
+ gstk_db:insert(DB, FFSS, {variable, NewName}),
+ FSS
+ end.
%% ----- The Font Model -----
@@ -196,60 +159,35 @@ choose_font(DB, {Fam,Styl,Siz}) ->
%% scaled "tk scaling", we can display a 9 and 10 point helvetica
%% but "font actual {helvetica 9}" will return 10 points....
-map_family(new_century_schoolbook) ->
- times;
-map_family(Fam) ->
- Fam.
+map_family(new_century_schoolbook) -> times;
+map_family(Fam) -> Fam.
% Normalize so can make the coding easier and compare font
% specifications stored in database with new ones. We ignore invalid
% entries in the list.
-norm_font_spec({Family,Size}) ->
- {Family,[],Size};
-norm_font_spec({Family,Style,Size}) ->
- {Family,norm_style(Style),Size}.
+norm_font_spec({Family, Size}) -> {Family, [], Size};
+norm_font_spec({Family, Style, Size}) -> {Family, norm_style(Style), Size}.
-norm_style(bold) ->
- [bold];
-norm_style(italic) ->
- [italic];
-norm_style([italic]) ->
- [italic];
-norm_style([bold]) ->
- [bold];
-norm_style([bold,italic] = Style) ->
- Style;
-norm_style([italic,bold]) ->
- [bold,italic];
-norm_style(List) when is_list(List) -> % not well formed list, ignore garbage
- case {lists:member(bold, List),lists:member(italic, List)} of
- {true,true} ->
- [bold,italic];
- {true,_} ->
- [bold];
- {_,true} ->
- [italic];
- _ ->
- [] % ignore garbage
+norm_style([italic, bold]) -> [bold, italic];
+norm_style(Style) when Style =:= italic; Style =:= bold -> [Style];
+norm_style(Style) when Style =:= [italic]; Style =:= [bold]; Style =:= [bold, italic] -> Style;
+norm_style([_|_] = List) -> % not well formed list, ignore garbage
+ Italic = lists:member(italic, List),
+ case lists:member(bold, List) of
+ true when Italic -> [bold, italic];
+ true -> [bold];
+ _ when Italic -> [italic];
+ _ -> [] % ignore garbage
end;
-norm_style(_Any) -> % ignore garbage
- [].
-
+norm_style(_Any) -> []. % ignore garbage
% Create a tcl string from a normalized font specification
% The style list is normalized.
-tk_font_spec({Fam,Style,Size}) ->
- ["-family ",gstk:to_ascii(Fam),
- " -size ",gstk:to_ascii(-Size),
- tk_font_spec_style(Style)].
+tk_font_spec({Fam, Style, Size}) ->
+ ["-family ", gstk:to_ascii(Fam), " -size ", gstk:to_ascii(-Size), tk_font_spec_style(Style)].
-tk_font_spec_style([]) ->
- "";
-tk_font_spec_style([bold]) ->
- " -weight bold";
-tk_font_spec_style([italic]) ->
- " -slant italic";
-tk_font_spec_style([bold,italic]) ->
- " -weight bold -slant italic".
+tk_font_spec_style([]) -> "";
+tk_font_spec_style([bold|T]) -> " -weight bold" ++ tk_font_spec_style(T);
+tk_font_spec_style([italic]) -> " -slant italic".
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_frame.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_frame.erl
--- otp_src_19.0.5/lib/gs/src/gstk_frame.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_frame.erl 2016-08-25 16:37:44.563693370 +0300
@@ -29,7 +29,7 @@
%% FRAME OPTIONS
%%
%% Attributes:
-%% anchor n,w,s,e,nw,se,ne,sw,center
+%% anchor n, w,s, e,nw, se, ne, sw, center
%% bg Color
%% bw Int
%% data Data
@@ -65,8 +65,7 @@
%% type
%%
--export([create/3,config/3,read/3,delete/2,event/5,option/5,read_option/5,
- mk_create_opts_for_child/4]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5, mk_create_opts_for_child/4]).
-include("gstk.hrl").
@@ -78,19 +77,17 @@
%% Purpose : Create a widget of the type defined in this module.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
create(DB, GstkId, Opts) ->
- TkW = gstk_generic:mk_tkw_child(DB,GstkId),
- NGstkid=GstkId#gstkid{widget=TkW},
- PlacePreCmd = [";place ", TkW],
- case gstk_generic:make_command(Opts, NGstkid, TkW, "", PlacePreCmd, DB) of
- {error,Reason} -> {error,Reason};
+ TkW = gstk_generic:mk_tkw_child(DB, GstkId),
+ NGstkid = GstkId#gstkid{widget = TkW},
+ case gstk_generic:make_command(Opts, NGstkid, TkW, "", [";place ", TkW], DB) of
+ {error, _Reason} = E -> E;
Cmd when is_list(Cmd) ->
- gstk:exec(["frame ", TkW,
- " -relief raised -bo 0",Cmd]),
+ gstk:exec(["frame ", TkW, " -relief raised -bo 0", Cmd]),
NGstkid
end.
-mk_create_opts_for_child(DB,Cgstkid, Pgstkid, Opts) ->
- gstk_generic:mk_create_opts_for_child(DB,Cgstkid,Pgstkid,Opts).
+mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts) ->
+ gstk_generic:mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : config/3
@@ -101,27 +98,17 @@ mk_create_opts_for_child(DB,Cgstkid, Pgs
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
- TkW = Gstkid#gstkid.widget,
- SimplePreCmd = [TkW, " conf"],
- PlacePreCmd = [";place ", TkW],
- Opts2 = atomic_width_height(false,false,Opts),
- gstk_generic:mk_cmd_and_exec(Opts2,Gstkid,TkW,SimplePreCmd,PlacePreCmd,DB).
+config(DB, #gstkid{widget = TkW} = Gstkid, Opts) ->
+ gstk_generic:mk_cmd_and_exec(atomic_width_height(false, false, Opts),
+ Gstkid, TkW, [TkW, " conf"], [";place ", TkW], DB).
-atomic_width_height(false,false,[]) ->
- [];
-atomic_width_height(false,Width,[]) ->
- [{width,Width}];
-atomic_width_height(Height,false,[]) ->
- [{height,Height}];
-atomic_width_height(H,W,[]) ->
- [{width_height,{W,H}}];
-atomic_width_height(_,W,[{height,H}|Opts]) ->
- atomic_width_height(H,W,Opts);
-atomic_width_height(H,_,[{width,W}|Opts]) ->
- atomic_width_height(H,W,Opts);
-atomic_width_height(H,W,[Opt|Opts]) ->
- [Opt|atomic_width_height(H,W,Opts)].
+atomic_width_height(false, false, []) -> [];
+atomic_width_height(false, Width, []) -> [{width, Width}];
+atomic_width_height(Height, false, []) -> [{height, Height}];
+atomic_width_height(H, W, []) -> [{width_height, {W, H}}];
+atomic_width_height(_, W, [{height, H}|Opts]) -> atomic_width_height(H, W, Opts);
+atomic_width_height(H, _, [{width, W}|Opts]) -> atomic_width_height(H, W, Opts);
+atomic_width_height(H, W, [Opt|Opts]) -> [Opt|atomic_width_height(H, W, Opts)].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -132,9 +119,7 @@ atomic_width_height(H,W,[Opt|Opts]) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- gstk_generic:read_option(DB, Gstkid, Opt).
-
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : delete/2
@@ -144,13 +129,11 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
gstk_db:delete_widget(DB, Gstkid),
- Gstkid#gstkid.widget.
-
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+ TkW.
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%%-----------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -165,103 +148,82 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%%
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, _TkW, DB,_) ->
- case Option of
- {bg, Color} -> {s, [" -bg ", gstk:to_color(Color)]};
- {packer_x, _Pack} ->
- gstk_db:insert_opt(DB,Gstkid,Option),
- none;
- {packer_y, _Pack} ->
- gstk_db:insert_opt(DB,Gstkid,Option),
- none;
- {width, W} ->
- execute_pack_cmds(DB,xpack(W,DB,Gstkid)),
- {s,[" -wi ", gstk:to_ascii(W)]};
- {height, H} ->
- execute_pack_cmds(DB,ypack(H,DB,Gstkid)),
- {s,[" -he ", gstk:to_ascii(H)]};
- {width_height,{W,H}} ->
- execute_pack_cmds(DB, merge_pack_cmds(xpack(W,DB,Gstkid),
- ypack(H,DB,Gstkid))),
- {s,[" -he ", gstk:to_ascii(H)," -wi ", gstk:to_ascii(W)]};
- _ -> invalid_option
- end.
+option(Option, Gstkid, _TkW, DB, _) -> option(Option, Gstkid, DB).
-xpack(W,DB,Gstkid) ->
- gstk_db:insert_opt(DB,Gstkid,{width,W}),
- case gstk_db:opt_or_not(DB,Gstkid,packer_x) of
- {value,Pack} when is_list(Pack) ->
- ColSiz = gs_packer:pack(W,Pack),
- pack_children(pack_x,x,width,DB,
- gstk_db:lookup_kids(DB,Gstkid#gstkid.id),
- ColSiz);
- _Else -> []
- end.
+option({width, W}, Gstkid, DB) ->
+ execute_pack_cmds(DB, xpack(W, DB, Gstkid)),
+ to_ascii(" -wi ", W);
+option({height, H}, Gstkid, DB) ->
+ execute_pack_cmds(DB, ypack(H, DB, Gstkid)),
+ to_ascii(" -he ", H);
+option({width_height, {W, H}}, Gstkid, DB) ->
+ execute_pack_cmds(DB, merge_pack_cmds(xpack(W, DB, Gstkid), ypack(H, DB, Gstkid))),
+ option_s([" -he ", gstk:to_ascii(H), " -wi ", gstk:to_ascii(W)]);
+option({Packer, _Pack} = Option, Gstkid, DB) when Packer =:= packer_x; Packer =:= packer_y ->
+ gstk_db:insert_opt(DB, Gstkid, Option),
+ none;
+option(Option, _Gstkid, _DB) -> option(Option).
-ypack(H,DB,Gstkid) ->
- gstk_db:insert_opt(DB,Gstkid,{height,H}),
- case gstk_db:opt_or_not(DB,Gstkid,packer_y) of
- {value,Pack} when is_list(Pack) ->
- ColSiz = gs_packer:pack(H,Pack),
- pack_children(pack_y,y,height,DB,
- gstk_db:lookup_kids(DB,Gstkid#gstkid.id),
- ColSiz);
+option({bg, Color}) -> option_s(" -bg ", gstk:to_color(Color));
+option(_Option) -> invalid_option.
+
+option_s(L) -> {s, L}.
+
+option_s(Str, Val) -> option_s([Str, Val]).
+
+to_ascii(Str, Val) -> option_s(Str, gstk:to_ascii(Val)).
+
+xpack(W, DB, Gstkid) -> pack(W, DB, Gstkid, width, pack_x, packer_x, x).
+
+ypack(H, DB, Gstkid) -> pack(H, DB, Gstkid, height, pack_y, packer_y, y).
+
+pack(V, DB, Gstkid, Type, Pack, Packer, C) ->
+ gstk_db:insert_opt(DB, Gstkid, {Type, V}),
+ case gstk_db:opt_or_not(DB, Gstkid, Packer) of
+ {value, Pack} when is_list(Pack) -> pack_children(Pack, C, Type, DB,
+ gstk_db:lookup_kids(DB, Gstkid#gstkid.id),
+ gs_packer:pack(V, Pack));
_Else -> []
end.
-merge_pack_cmds([{Id,Opts1}|Cmds1],[{Id,Opts2}|Cmds2]) ->
- [{Id,Opts1++Opts2}|merge_pack_cmds(Cmds1,Cmds2)];
-merge_pack_cmds(L1,L2) ->
- L1++L2.
+merge_pack_cmds([{Id, Opts1}|Cmds1], [{Id, Opts2}|Cmds2]) -> [{Id, Opts1 ++ Opts2}|merge_pack_cmds(Cmds1, Cmds2)];
+merge_pack_cmds(L1, L2) -> L1 ++ L2.
-execute_pack_cmds(DB,[{Id,Opts}|Cmds]) ->
- gstk:config_impl(DB,Id,Opts),
- execute_pack_cmds(DB,Cmds);
-execute_pack_cmds(_,[]) ->
- ok.
+execute_pack_cmds(DB, [{Id, Opts}|Cmds]) ->
+ gstk:config_impl(DB, Id, Opts),
+ execute_pack_cmds(DB, Cmds);
+execute_pack_cmds(_, []) -> ok.
%%----------------------------------------------------------------------
-%% Returns: list of {Id,Opts} to be executed (or merged with other first)
+%% Returns: list of {Id, Opts} to be executed (or merged with other first)
%%----------------------------------------------------------------------
-pack_children(PackOpt,PosOpt,SizOpt,DB,Kids,Sizes) ->
- Schildren = keep_packed(Kids,PackOpt,DB),
- pack_children2(PackOpt,PosOpt,SizOpt,Schildren,Sizes).
+pack_children(PackOpt, PosOpt, SizOpt, DB, Kids, Sizes) ->
+ pack_children(PackOpt, PosOpt, SizOpt, keep_packed(Kids, PackOpt, DB), Sizes).
-pack_children2(PackOpt,PosOpt,SizOpt,[{StartStop,Id}|Childs],Sizes) ->
- [pack_child(Id,StartStop,SizOpt,PosOpt,Sizes)
- | pack_children2(PackOpt,PosOpt,SizOpt,Childs,Sizes)];
-pack_children2(_,_,_,[],_) ->
- [].
+pack_children(PackOpt, PosOpt, SizOpt, [{StartStop, Id}|Childs], Sizes) ->
+ [pack_child(Id, StartStop, SizOpt, PosOpt, Sizes)|pack_children(PackOpt, PosOpt, SizOpt, Childs, Sizes)];
+pack_children(_, _, _, [], _) -> [].
-pack_child(Id,{StartPos,StopPos},SizOpt,PosOpt,Sizes) ->
- {Pos,Size} = find_pos(StartPos,StopPos,1,0,0,Sizes),
- {Id,[{PosOpt,Pos},{SizOpt,Size}]}.
+pack_child(Id, {StartPos, StopPos}, SizOpt, PosOpt, Sizes) ->
+ {Pos, Size} = find_pos(StartPos, StopPos, 1, 0, 0, Sizes),
+ {Id, [{PosOpt, Pos}, {SizOpt, Size}]}.
%%----------------------------------------------------------------------
-%% Returns: {PixelPos,PixelSize}
+%% Returns: {PixelPos, PixelSize}
%%----------------------------------------------------------------------
-find_pos(_StartPos,Pos,Pos,AccPixelPos,AccPixelSize,[Size|_]) ->
- {AccPixelPos,Size+AccPixelSize};
-find_pos(StartPos,StopPos,Pos,AccPixelPos,0,[Size|Sizes])
- when Pos < StartPos ->
- find_pos(StartPos,StopPos,Pos+1,Size+AccPixelPos,0,Sizes);
-find_pos(_StartPos,StopPos,Pos,AccPixelPos,AccPixelSize,[Size|Sizes])
- when Pos < StopPos ->
- find_pos(Pos,StopPos,Pos+1,AccPixelPos,Size+AccPixelSize,Sizes).
-
-
+find_pos(_StartPos, Pos, Pos, AccPixelPos, AccPixelSize, [Size|_]) -> {AccPixelPos, Size + AccPixelSize};
+find_pos(StartPos, StopPos, Pos, AccPixelPos, 0, [Size|Sizes]) when Pos < StartPos ->
+ find_pos(StartPos, StopPos, Pos + 1, Size + AccPixelPos, 0, Sizes);
+find_pos(_StartPos, StopPos, Pos, AccPixelPos, AccPixelSize, [Size|Sizes]) when Pos < StopPos ->
+ find_pos(Pos, StopPos, Pos + 1, AccPixelPos, Size + AccPixelSize, Sizes).
-keep_packed([Id|Ids],PackOpt,DB) ->
- case gstk:read_impl(DB,Id,PackOpt) of
- undefined ->
- keep_packed(Ids,PackOpt,DB);
- StartStop ->
- [{StartStop,Id} | keep_packed(Ids,PackOpt,DB)]
+keep_packed([Id|Ids], PackOpt, DB) ->
+ KP = keep_packed(Ids, PackOpt, DB),
+ case gstk:read_impl(DB, Id, PackOpt) of
+ undefined -> KP;
+ StartStop -> [{StartStop, Id}|KP]
end;
-keep_packed([],_,_) ->
- [].
-
-
+keep_packed([], _, _) -> [].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/3
@@ -273,10 +235,9 @@ keep_packed([],_,_) ->
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,Gstkid,TkW,_DB,_) ->
- case Option of
- bg -> tcl2erl:ret_color([TkW," cg -bg"]);
- _ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
- end.
+read_option(Option, Gstkid, TkW, _DB, _) -> read_option(Option, Gstkid, TkW).
+
+read_option(bg, _Gstkid, TkW) -> tcl2erl:ret_color([TkW, " cg -bg"]);
+read_option(Option, #gstkid{objtype = ObjType}, _TkW) -> {bad_result, {ObjType, invalid_option, Option}}.
%% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_generic.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_generic.erl
--- otp_src_19.0.5/lib/gs/src/gstk_generic.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_generic.erl 2016-08-25 16:38:24.704337433 +0300
@@ -21,72 +21,45 @@
%%
-module(gstk_generic).
--compile([{nowarn_deprecated_function,{gs,assq,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, assq, 2}}]).
-export([out_opts/8,
read_option/5,
mk_tkw_child/2,
- merge_default_options/3,
- merge_default_options/2,
+ merge_default_options/2, merge_default_options/3,
opts_for_child/3,
- mk_cmd_and_exec/4,
- mk_cmd_and_exec/5,
- mk_cmd_and_exec/6,
- mk_cmd_and_exec/7,
- make_command/5,
- make_command/6,
- make_command/7,
+ mk_cmd_and_exec/4, mk_cmd_and_exec/5, mk_cmd_and_exec/6, mk_cmd_and_exec/7,
+ make_command/5, make_command/6, make_command/7,
read_option/4,
handle_external_opt_call/9,
handle_external_read/1,
- gen_anchor/9,
- gen_anchor/5,
- gen_height/9,
- gen_height/5,
- gen_width/9,
- gen_width/5,
- gen_x/9,
- gen_x/5,
- gen_y/9,
- gen_y/5,
- gen_raise/9,
- gen_raise/5,
- gen_lower/9,
- gen_lower/5,
- gen_enable/9,
- gen_enable/5,
- gen_align/9,
- gen_align/5,
- gen_justify/9,
- gen_justify/5,
- gen_padx/9,
- gen_padx/5,
- gen_pady/9,
- gen_pady/5,
- gen_font/9,
- gen_font/5,
- gen_label/9,
- gen_label/5,
- gen_activebg/9,
- gen_activebg/5,
- gen_activefg/9,
- gen_activefg/5,
+ gen_anchor/9, gen_anchor/5,
+ gen_height/9, gen_height/5,
+ gen_width/9, gen_width/5,
+ gen_x/9, gen_x/5,
+ gen_y/9, gen_y/5,
+ gen_raise/9, gen_raise/5,
+ gen_lower/9, gen_lower/5,
+ gen_enable/9, gen_enable/5,
+ gen_align/9, gen_align/5,
+ gen_justify/9, gen_justify/5,
+ gen_padx/9, gen_padx/5,
+ gen_pady/9, gen_pady/5,
+ gen_font/9, gen_font/5,
+ gen_label/9, gen_label/5,
+ gen_activebg/9, gen_activebg/5,
+ gen_activefg/9, gen_activefg/5,
gen_default/9,
- gen_relief/9,
- gen_relief/5,
- gen_bw/9,
- gen_bw/5,
+ gen_relief/9, gen_relief/5,
+ gen_bw/9, gen_bw/5,
gen_font_wh/5,
gen_choose_font/5,
- gen_data/9,
- gen_data/5,
- gen_pack_x/9,
- gen_pack_x/5,
- gen_pack_y/9,
- gen_pack_y/5,
+ gen_data/9, gen_data/5,
+ gen_pack_x/9, gen_pack_x/5,
+ gen_pack_y/9, gen_pack_y/5,
gen_pack_xy/9,
- gen_flush/9,
- gen_flush/5,
+ gen_flush/9, gen_flush/5,
gen_keep_opt/9,
gen_children/5,
make_extern_id/2,
@@ -94,78 +67,47 @@
gen_parent/5,
gen_type/5,
gen_beep/9,
- gen_setfocus/9,
- gen_setfocus/5,
- gen_buttonpress/9,
- gen_buttonpress/5,
- gen_buttonrelease/9,
- gen_buttonrelease/5,
- gen_configure/9,
- gen_configure/5,
- gen_destroy/9,
- gen_destroy/5,
- gen_enter/9,
- gen_enter/5,
- gen_focus_ev/9,
- gen_focus_ev/5,
- gen_keypress/9,
- gen_keypress/5,
- gen_keyrelease/9,
- gen_keyrelease/5,
- gen_leave/9,
- gen_leave/5,
- gen_motion/9,
- gen_motion/5,
- gen_highlightbw/9,
- gen_highlightbw/5,
- gen_highlightbg/9,
- gen_highlightbg/5,
- gen_highlightfg/9,
- gen_highlightfg/5,
- gen_selectbw/9,
- gen_selectbw/5,
- gen_selectfg/9,
- gen_selectfg/5,
- gen_selectbg/9,
- gen_selectbg/5,
- gen_fg/9,
- gen_fg/5,
- gen_bg/9,
- gen_bg/5,
- gen_so_activebg/9,
- gen_so_activebg/5,
- gen_so_bc/9,
- gen_so_bc/5,
- gen_so_scrollfg/9,
- gen_so_scrollfg/5,
- gen_so_scrollbg/9,
- gen_so_scrollbg/5,
+ gen_setfocus/9, gen_setfocus/5,
+ gen_buttonpress/9, gen_buttonpress/5,
+ gen_buttonrelease/9, gen_buttonrelease/5,
+ gen_configure/9, gen_configure/5,
+ gen_destroy/9, gen_destroy/5,
+ gen_enter/9, gen_enter/5,
+ gen_focus_ev/9, gen_focus_ev/5,
+ gen_keypress/9, gen_keypress/5,
+ gen_keyrelease/9, gen_keyrelease/5,
+ gen_leave/9, gen_leave/5,
+ gen_motion/9, gen_motion/5,
+ gen_highlightbw/9, gen_highlightbw/5,
+ gen_highlightbg/9, gen_highlightbg/5,
+ gen_highlightfg/9, gen_highlightfg/5,
+ gen_selectbw/9, gen_selectbw/5,
+ gen_selectfg/9, gen_selectfg/5,
+ gen_selectbg/9, gen_selectbg/5,
+ gen_fg/9, gen_fg/5,
+ gen_bg/9, gen_bg/5,
+ gen_so_activebg/9, gen_so_activebg/5,
+ gen_so_bc/9, gen_so_bc/5,
+ gen_so_scrollfg/9, gen_so_scrollfg/5,
+ gen_so_scrollbg/9, gen_so_scrollbg/5,
obj/1,
- gen_so_bg/9,
- gen_so_bg/5,
- gen_so_selectbw/9,
- gen_so_selectbw/5,
- gen_so_selectfg/9,
- gen_so_selectfg/5,
- gen_so_selectbg/9,
- gen_so_selectbg/5,
+ gen_so_bg/9, gen_so_bg/5,
+ gen_so_selectbw/9, gen_so_selectbw/5,
+ gen_so_selectfg/9, gen_so_selectfg/5,
+ gen_so_selectbg/9, gen_so_selectbg/5,
gen_so_scrolls/9,
gen_so_hscroll/5,
gen_so_vscroll/5,
cursors/0,
- gen_cursor/9,
- gen_cursor/5,
- gen_citem_coords/9,
- gen_citem_coords/5,
- gen_citem_fill/9,
- gen_citem_fill/5,
+ gen_cursor/9, gen_cursor/5,
+ gen_citem_coords/9, gen_citem_coords/5,
+ gen_citem_fill/9, gen_citem_fill/5,
gen_citem_lower/9,
gen_citem_raise/9,
gen_citem_move/9,
move_coords/3,
add_to_coords/3,
- gen_citem_setfocus/9,
- gen_citem_setfocus/5,
+ gen_citem_setfocus/9, gen_citem_setfocus/5,
gen_citem_buttonpress/9,
gen_citem_buttonrelease/9,
gen_citem_enter/9,
@@ -174,11 +116,8 @@
gen_citem_leave/9,
gen_citem_motion/9,
scrolls_vh/3,
- parse_scrolls/1,
- parse_scrolls/2,
- parse_scrolls/4,
- bind/5,
- bind/6,
+ parse_scrolls/1, parse_scrolls/2, parse_scrolls/4,
+ bind/5, bind/6,
ebind/6,
eunbind/6,
item_bind/6,
@@ -195,12 +134,9 @@
%%----------------------------------------------------------------------
%% Returns: a new unique TkWidget (string())
%%----------------------------------------------------------------------
-mk_tkw_child(DB,#gstkid{parent=P,objtype=Ot}) ->
- Pgstkid = gstk_db:lookup_gstkid(DB, P),
- PW = Pgstkid#gstkid.widget,
- Oref = gstk_db:counter(DB, Ot),
- PF = gstk_widgets:suffix(Ot),
- _TkW = lists:concat([PW, PF, Oref]).
+mk_tkw_child(DB, #gstkid{parent = P, objtype = Ot}) ->
+ #gstkid{widget = PW} = gstk_db:lookup_gstkid(DB, P),
+ _TkW = lists:concat([PW, gstk_widgets:suffix(Ot), gstk_db:counter(DB, Ot)]).
%%----------------------------------------------------------------------
%% Purpose: Merges options. Opts have higher priority than BuiltIn
@@ -209,53 +145,39 @@ mk_tkw_child(DB,#gstkid{parent=P,objtype
%%----------------------------------------------------------------------
merge_default_options(ParOpts, BuildInOpts, Opts) ->
%% parents options first
- Tmp=merge_default_options(ParOpts, lists:sort(Opts)),
- merge_default_options(BuildInOpts,Tmp).
-
-merge_default_options([Def|Ds],[Opt|Os])
- when element(1,Def) < element(1,Opt) ->
- [Def | merge_default_options(Ds,[Opt|Os])];
+ merge_default_options(BuildInOpts, merge_default_options(ParOpts, lists:sort(Opts))).
-merge_default_options([Def|Ds],[Opt|Os])
- when element(1,Def) > element(1,Opt) ->
- [Opt | merge_default_options([Def|Ds],Os)];
+merge_default_options([Def|Ds], [Opt|Os]) when element(1, Def) < element(1, Opt) ->
+ [Def|merge_default_options(Ds, [Opt|Os])];
+merge_default_options([Def|Ds], [Opt|Os]) when element(1, Def) == element(1, Opt) ->
+ [Opt|merge_default_options(Ds, Os)];
+merge_default_options([Def|Ds], [Opt|Os]) when tuple_size(Def) >= 1, tuple_size(Opt) >= 1 ->
+ [Opt|merge_default_options([Def|Ds], Os)];
+merge_default_options(Defs, [Opt|Os]) -> [Opt|merge_default_options(Defs, Os)];
+merge_default_options([], Opts) -> Opts;
+merge_default_options(Defs, []) -> Defs.
-merge_default_options([Def|Ds],[Opt|Os])
- when element(1,Def) == element(1,Opt) ->
- [Opt | merge_default_options(Ds,Os)];
+opts_for_child(DB, Childtype, ParId) ->
+ case gs_widgets:container(Childtype) of
+ true -> gstk_db:default_container_opts(DB, ParId, Childtype);
+ false -> gstk_db:default_opts(DB, ParId, Childtype)
+ end.
-merge_default_options(Defs,[Opt|Os]) ->
- [Opt | merge_default_options(Defs,Os)];
+mk_create_opts_for_child(DB, #gstkid{objtype = ChildType}, #gstkid{id = Id}, Opts) ->
+ merge_default_options(opts_for_child(DB, ChildType, Id), gs_widgets:default_options(ChildType), Opts).
-merge_default_options([],Opts) -> Opts;
-merge_default_options(Defs,[]) -> Defs.
+mk_cmd_and_exec(Opts, #gstkid{widget = TkW} = Gstkid, Scmd, DB) ->
+ mk_cmd_and_exec(Opts, Gstkid, TkW, Scmd, [";place ", TkW], DB).
-opts_for_child(DB,Childtype,ParId) ->
- case gs_widgets:container(Childtype) of
- true ->
- gstk_db:default_container_opts(DB,ParId,Childtype);
- false ->
- gstk_db:default_opts(DB,ParId,Childtype)
- end.
+mk_cmd_and_exec(Opts, #gstkid{widget = TkW} = Gstkid, Scmd, Pcmd, DB) ->
+ mk_cmd_and_exec(Opts, Gstkid, TkW, Scmd, Pcmd, DB).
-mk_create_opts_for_child(DB,#gstkid{objtype=ChildType}, Pgstkid, Opts) ->
- merge_default_options(
- opts_for_child(DB,ChildType,Pgstkid#gstkid.id),
- gs_widgets:default_options(ChildType),
- Opts).
+mk_cmd_and_exec(Options, Gstkid, TkW, SCmd, PCmd, DB) -> mk_cmd_and_exec(Options, Gstkid, TkW, SCmd, PCmd, DB, dummy).
-mk_cmd_and_exec(Opts,Gstkid,Scmd,DB) ->
- TkW = Gstkid#gstkid.widget,
- mk_cmd_and_exec(Opts,Gstkid,TkW,Scmd,[";place ", TkW],DB,dummy).
-mk_cmd_and_exec(Opts,Gstkid,Scmd,Pcmd,DB) ->
- mk_cmd_and_exec(Opts,Gstkid,Gstkid#gstkid.widget,Scmd,Pcmd,DB,dummy).
-mk_cmd_and_exec(Options, Gstkid, TkW, SCmd, PCmd, DB) ->
- mk_cmd_and_exec(Options, Gstkid, TkW, SCmd, PCmd, DB,dummy).
-mk_cmd_and_exec(Options, Gstkid, TkW, SCmd, PCmd, DB,ExtraArg) ->
- case gstk_generic:make_command(Options,Gstkid,TkW,SCmd,PCmd,DB,ExtraArg) of
- {error,Reason} -> {error,Reason};
- Cmd when is_list(Cmd) ->
- gstk:exec(Cmd)
+mk_cmd_and_exec(Options, Gstkid, TkW, SCmd, PCmd, DB, ExtraArg) ->
+ case gstk_generic:make_command(Options, Gstkid, TkW, SCmd, PCmd, DB, ExtraArg) of
+ {error, _Reason} = E -> E;
+ Cmd when is_list(Cmd) -> gstk:exec(Cmd)
end.
%%----------------------------------------------------------------------
@@ -265,628 +187,554 @@ mk_cmd_and_exec(Options, Gstkid, TkW, SC
%% Comment: If some function changes the gstkid,
%% it's responsible for storing it in the DB.
%%----------------------------------------------------------------------
-make_command(Opts,Gstkid,Scmd,DB) ->
- TkW = Gstkid#gstkid.widget,
- make_command(Opts,Gstkid,TkW,Scmd,[";place ", TkW],DB,dummy).
-make_command(Opts,Gstkid,Scmd,Pcmd,DB) ->
- make_command(Opts,Gstkid,Gstkid#gstkid.widget,Scmd,Pcmd,DB,dummy).
-make_command(Options, Gstkid, TkW, SCmd, PCmd, DB) ->
- make_command(Options, Gstkid, TkW, SCmd, PCmd, DB,dummy).
-make_command(Options, Gstkid, TkW, SCmd, PCmd, DB,ExtraArg) ->
+make_command(Opts, #gstkid{widget = TkW} = Gstkid, Scmd, DB) ->
+ make_command(Opts, Gstkid, TkW, Scmd, [";place ", TkW], DB).
+
+make_command(Options, #gstkid{widget = TkW} = Gstkid, Scmd, Pcmd, DB) ->
+ make_command(Options, Gstkid, TkW, Scmd, Pcmd, DB).
+
+make_command(Options, Gstkid, TkW, SCmd, PCmd, DB) -> make_command(Options, Gstkid, TkW, SCmd, PCmd, DB, dummy).
+
+make_command(Options, Gstkid, TkW, SCmd, PCmd, DB, ExtraArg) ->
case out_opts(Options, Gstkid, TkW, DB, ExtraArg, [], [], []) of
{[], [], []} -> [];
- {Si, [], []} -> [SCmd, Si,$;];
- {[], Pl, []} -> [PCmd, Pl,$;];
- {[], [], Co} -> [$;,Co];
+ {Si, [], []} -> [SCmd, Si, $;];
+ {[], Pl, []} -> [PCmd, Pl, $;];
+ {[], [], Co} -> [$;, Co];
{[], Pl, Co} -> [PCmd, Pl, $;, Co];
{Si, [], Co} -> [SCmd, Si, $;, Co];
{Si, Pl, []} -> [SCmd, Si, PCmd, Pl, $;];
{Si, Pl, Co} -> [SCmd, Si, PCmd, Pl, $;, Co];
- {error,Reason} -> {error,Reason}
+ {error, _Reason} = E -> E
end.
-read_option(DB,Gstkid,Opt) ->
- read_option(DB,Gstkid,Gstkid#gstkid.widget,Opt,dummy).
-read_option(DB,Gstkid,Opt,ExtraArg) ->
- read_option(DB,Gstkid,Gstkid#gstkid.widget,Opt,ExtraArg).
+read_option(DB, Gstkid, Opt) -> read_option(DB, Gstkid, Opt, dummy).
+
+read_option(DB, #gstkid{widget = Widget} = Gstkid, Opt, ExtraArg) -> read_option(DB, Gstkid, Widget, Opt, ExtraArg).
%%----------------------------------------------------------------------
%% Args: Args is [Gstkid, TkW, DB, ExtraArg]
%% Comment: An optimization:don't reconstruct the arg list for apply each time.
%% This is the option-engine so we should optimize.
%%----------------------------------------------------------------------
-handle_external_opt_call([Opt|Options],Gstkid,TkW,DB,ExtraArg,ExtRes,S,P,C) ->
- case ExtRes of
- {s, Cmd} ->
- out_opts(Options,Gstkid, TkW,DB, ExtraArg, [Cmd|S], P, C);
- {p, Cmd} ->
- out_opts(Options, Gstkid,TkW,DB, ExtraArg, S, [Cmd|P], C);
- {c, Cmd} ->
- out_opts(Options, Gstkid,TkW,DB, ExtraArg,S, P, [Cmd,$;|C]);
- none ->
- out_opts(Options, Gstkid,TkW,DB,ExtraArg, S, P, C);
- % {s, NGstkid, Cmd} ->
- % out_opts(Options,NGstkid,TkW,DB,ExtraArg, [Cmd|S], P, C);
- % {p, NGstkid, Cmd} ->
- % out_opts(Options,NGstkid,TkW,DB,ExtraArg, S, [Cmd|P], C);
- {c, NGstkid, Cmd} ->
- out_opts(Options,NGstkid,TkW,DB, ExtraArg,S,P,[Cmd,$;|C]);
- {none, NGstkid} ->
- out_opts(Options,NGstkid,TkW,DB, ExtraArg, S, P, C);
- {sp,{Scmd,Pcmd}} ->
- out_opts(Options,Gstkid,TkW,DB,ExtraArg,[Scmd|S],[Pcmd|P],C);
- invalid_option ->
- {error,{invalid_option,Gstkid#gstkid.objtype,Opt}};
- break -> % a hack. it is possible to abort generic option handling at
- %% any time (without even inserting the gstkid inte to DB (for
- %% performance reasons)).
- {S, P, C}
- end.
+handle_external_opt_call([_Opt|Options], Gstkid, TkW, DB, ExtraArg, {s, Cmd}, S, P, C) ->
+ out_opts(Options, Gstkid, TkW, DB, ExtraArg, [Cmd|S], P, C);
+handle_external_opt_call([_Opt|Options], Gstkid, TkW, DB, ExtraArg, {p, Cmd}, S, P, C) ->
+ out_opts(Options, Gstkid, TkW, DB, ExtraArg, S, [Cmd|P], C);
+handle_external_opt_call([_Opt|Options], Gstkid, TkW, DB, ExtraArg, {c, Cmd}, S, P, C) ->
+ out_opts(Options, Gstkid, TkW, DB, ExtraArg, S, P, [Cmd, $;|C]);
+handle_external_opt_call([_Opt|Options], Gstkid, TkW, DB, ExtraArg, none, S, P, C) ->
+ out_opts(Options, Gstkid, TkW, DB, ExtraArg, S, P, C);
+handle_external_opt_call([_Opt|Options], _Gstkid, TkW, DB, ExtraArg, {c, NGstkid, Cmd}, S, P, C) ->
+ out_opts(Options, NGstkid, TkW, DB, ExtraArg, S, P, [Cmd, $;|C]);
+handle_external_opt_call([_Opt|Options], _Gstkid, TkW, DB, ExtraArg, {none, NGstkid}, S, P, C) ->
+ out_opts(Options, NGstkid, TkW, DB, ExtraArg, S, P, C);
+handle_external_opt_call([_Opt|Options], Gstkid, TkW, DB, ExtraArg, {sp, {Scmd, Pcmd}}, S, P, C) ->
+ out_opts(Options, Gstkid, TkW, DB, ExtraArg, [Scmd|S], [Pcmd|P], C);
+handle_external_opt_call([Opt|_Options], #gstkid{objtype = ObjType}, _TkW, _DB, _ExtraArg, invalid_option, _S, _P, _C) ->
+ {error, {invalid_option, ObjType, Opt}};
+%% a hack. it is possible to abort generic option handling at any time
+%% (without even inserting the gstkid inte to DB (for performance reasons)).
+handle_external_opt_call(_Options, _Gstkid, _TkW, _DB, _ExtraArg, break, S, P, C) -> {S, P, C}.
-handle_external_read(Res) ->
- %% We have removed dead code here that attempted to translate
- %% a bad return value from {bad_result,{A,B,C}} to {error,{A,B,C}}.
- %% Since the gs application is deprecated, we don't want to introduce
- %% a potential incompatibility; thus we have removed the dead code
- %% instead of correcting it.
- Res.
+%% We have removed dead code here that attempted to translate a bad return value from {bad_result, {A, B, C}}
+%% to {error, {A, B, C}}. Since the gs application is deprecated, we don't want to introduce a potential
+%% incompatibility; thus we have removed the dead code instead of correcting it.
+handle_external_read(Res) -> Res.
%%----------------------------------------------------------------------
%% Generic options
%%----------------------------------------------------------------------
-gen_anchor(How,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,[" -anc ", gstk:to_ascii(How)|P],C).
-gen_anchor(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_place(anchor, TkW).
+gen_anchor(How, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, [" -anc ", gstk:to_ascii(How)|P], C).
-gen_height(Height,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- gstk_db:insert_opt(DB,Gstkid,{height,Height}),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,
- [" -he ", gstk:to_ascii(Height)|P],C).
-gen_height(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:opt(DB,Gstkid,height).
+gen_anchor(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_place(anchor, TkW).
-gen_width(Width,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- gstk_db:insert_opt(DB,Gstkid,{width,Width}),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,
- [" -wi ", gstk:to_ascii(Width)|P],C).
-gen_width(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:opt(DB,Gstkid,width).
+gen_height(Height, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_xy(Height, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, height, " -he ").
-gen_x(X,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- gstk_db:insert_opt(DB,Gstkid,{x,X}),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,
- [" -x ", gstk:to_ascii(X)|P],C).
-gen_x(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:opt(DB,Gstkid,x).
+gen_height(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> gstk_db:opt(DB, Gstkid, height).
-gen_y(Y,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- gstk_db:insert_opt(DB,Gstkid,{y,Y}),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,
- [" -y ", gstk:to_ascii(Y)|P],C).
-gen_y(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:opt(DB,Gstkid,y).
+gen_width(Width, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_xy(Width, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, width, " -wi ").
-gen_raise(_,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,["raise ", TkW,$;|C]).
-gen_raise(_Opt,_Gstkid,_TkW,_DB,_ExtraArg) ->
- undefined.
+gen_width(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> gstk_db:opt(DB, Gstkid, width).
-gen_lower(_,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,["lower ", TkW,$;|C]).
-gen_lower(_Opt,_Gstkid,_TkW,_DB,_ExtraArg) ->
- undefined.
+gen_xy(Z, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, T, Str) ->
+ gstk_db:insert_opt(DB, Gstkid, {T, Z}),
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, [Str, gstk:to_ascii(Z)|P], C).
-gen_enable(true,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -st normal"|S],P,C);
-gen_enable(false,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -st disabled"|S],P,C).
-gen_enable(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_enable([TkW, " cg -st"]).
+gen_x(X, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) -> gen_xy(X, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, x, " -x ").
-gen_align(How,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -an ", gstk:to_ascii(How)|S],P,C).
-gen_align(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_atom([TkW, " cg -anch"]).
+gen_x(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> gstk_db:opt(DB, Gstkid, x).
-gen_justify(How,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -ju ", gstk:to_ascii(How)|S],P,C).
-gen_justify(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_atom([TkW, " cg -ju"]).
+gen_y(Y, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) -> gen_xy(Y, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, y, " -y ").
-gen_padx(Pad,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -padx ", gstk:to_ascii(Pad)|S],P,C).
-gen_padx(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_atom([TkW, " cg -padx"]).
+gen_y(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> gstk_db:opt(DB, Gstkid, y).
-gen_pady(Pad,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -pady ", gstk:to_ascii(Pad)|S],P,C).
-gen_pady(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_atom([TkW, " cg -pady"]).
+gen_2(Str, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, [Str, TkW, $;|C]).
+gen_raise(_, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_2("raise ", Opts, Gstkid, TkW, DB, ExtraArg, S, P, C).
-gen_font(Font,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- gstk_db:insert_opt(DB,Gstkid,{font,Font}),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,
- [" -font ", gstk_font:choose_ascii(DB,Font)|S],P,C).
-gen_font(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:opt(DB,Gstkid,font,undefined).
+gen_raise(_Opt, _Gstkid, _TkW, _DB, _ExtraArg) -> undefined.
-gen_label({text,Text},Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -text ", gstk:to_ascii(Text), " -bi {}"|S],P,C);
-gen_label({image,Img},Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- I2 = re:replace(Img, [92,92], "/", [global,{return,list}]),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -bi \"@", I2, "\" -text {}"|S],P,C).
-gen_label(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
+gen_lower(_, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_2("lower ", Opts, Gstkid, TkW, DB, ExtraArg, S, P, C).
+
+gen_lower(_Opt, _Gstkid, _TkW, _DB, _ExtraArg) -> undefined.
+
+gen_enable(Opt, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) when is_boolean(Opt) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [if
+ Opt -> " -st normal";
+ true -> " -st disabled"
+ end|S], P, C).
+
+gen_enable(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_enable([TkW, " cg -st"]).
+
+gen_align(How, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_pad(How, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -an ").
+
+gen_align(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> gen_pad(" cg -anch", TkW).
+
+gen_justify(How, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_pad(How, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -ju ").
+
+gen_justify(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> gen_pad(" cg -ju", TkW).
+
+gen_pad(Pad, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, Str) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [Str, gstk:to_ascii(Pad)|S], P, C).
+
+gen_pad(Str, TkW) -> tcl2erl:ret_atom([TkW, Str]).
+
+gen_padx(Pad, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_pad(Pad, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -padx ").
+
+gen_padx(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> gen_pad(" cg -padx", TkW).
+
+gen_pady(Pad, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_pad(Pad, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -pady ").
+
+gen_pady(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> gen_pad(" cg -pady", TkW).
+
+gen_font(Font, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gstk_db:insert_opt(DB, Gstkid, {font, Font}),
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [" -font ", gstk_font:choose_ascii(DB, Font)|S], P, C).
+
+gen_font(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> gstk_db:opt(DB, Gstkid, font, undefined).
+
+gen_label({text, Text}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [" -text ", gstk:to_ascii(Text), " -bi {}"|S], P, C);
+gen_label({image, Img}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg,
+ [" -bi \"@", re:replace(Img, [92, 92], "/", [global, {return, list}]), "\" -text {}"|S], P, C).
+
+gen_label(_Opt, _Gstkid, TkW, _DB, _ExtraArg) ->
case gstk:call([TkW, " cg -bit"]) of
- {result, [$@|Image]} -> {image,Image};
- _Nope ->
- case gstk:call([TkW, " cg -text"]) of
- {result, Txt} -> {text, Txt};
- Bad_Result -> Bad_Result
- end
+ {result, [$@|Image]} -> {image, Image};
+ _Nope -> case gstk:call([TkW, " cg -text"]) of
+ {result, Txt} -> {text, Txt};
+ Bad_Result -> Bad_Result
+ end
end.
-gen_activebg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -activeba ", gstk:to_color(Color)|S],P,C).
-gen_activebg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_color([TkW, " cg -activeba"]).
+gen_active(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, Str) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [Str, gstk:to_color(Color)|S], P, C).
-gen_activefg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -activef ", gstk:to_color(Color)|S],P,C).
-gen_activefg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_color([TkW, " cg -activef"]).
+gen_activebg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_active(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -activeba ").
+gen_activebg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, " cg -activeba"]).
-gen_default(Opt,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- case Opt of
- {all, {font, Font}} ->
- C2 = ["option a *",tl(TkW), % have to remove preceeding dot
- "*font ",gstk_font:choose_ascii(DB, Font)],
- gstk_db:insert_def(Gstkid,grid,{font,Font}),
- gstk_db:insert_def(Gstkid,text,{font,Font}),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]);
- {buttons, {font, Font}} ->
- C2 = ["option a *",tl(TkW), % have to remove preceeding dot
- ".Button.font ",gstk_font:choose_ascii(DB, Font)],
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]);
- {buttons,{Key,Val}} ->
- gstk_db:insert_def(Gstkid,button,{Key,Val}),
- gstk_db:insert_def(Gstkid,checkbutton,{Key,Val}),
- gstk_db:insert_def(Gstkid,radiobutton,{Key,Val}),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C);
- {ObjType, {Key,Val}} ->
- gstk_db:insert_def(Gstkid,ObjType,{Key,Val}),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C)
- end.
+gen_activefg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_active(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -activef ").
+gen_activefg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, " cg -activef"]).
-gen_relief(Relief,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -reli ",gstk:to_ascii(Relief)|S],P,C).
-gen_relief(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_atom([TkW, " cg -reli"]).
+gen_default_font(Font, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, Str) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P,
+ [["option a *", tl(TkW), % have to remove preceeding dot
+ Str, gstk_font:choose_ascii(DB, Font)], $;|C]).
-gen_bw(Wth,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -bd ", gstk:to_ascii(Wth)|S],P,C).
-gen_bw(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_int([TkW, " cg -bd"]).
+gen_default({all, {font, Font}}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ lists:foreach(fun(E) -> gstk_db:insert_def(Gstkid, E, {font, Font}) end, [grid, text]),
+ gen_default_font(Font, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, "*font ");
+gen_default({buttons, {font, Font}}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_default_font(Font, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, ".Button.font ");
+gen_default({buttons, {_Key, _Val} = KV}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ lists:foreach(fun(E) -> gstk_db:insert_def(Gstkid, E, KV) end, [button, checkbutton, radiobutton]),
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, C);
+gen_default({ObjType, {_Key, _Val} = KV}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gstk_db:insert_def(Gstkid, ObjType, KV),
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, C).
+gen_1(Val, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, Str) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [Str, gstk:to_ascii(Val)|S], P, C).
+gen_relief(Relief, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_1(Relief, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -reli ").
-gen_font_wh({font_wh,{Font, Txt}},_Gstkid,_TkW,DB,_) ->
- gstk_font:width_height(DB, gstk_font:choose(DB,Font), Txt).
+gen_relief(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_atom([TkW, " cg -reli"]).
-gen_choose_font({choose_font,Font},_Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_font:choose(DB,Font).
+gen_bw(Wth, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_1(Wth, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -bd ").
-gen_data(Data,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- gstk_db:insert_opt(DB,Gstkid,{data,Data}),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C).
-gen_data(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:opt(DB,Gstkid,data).
+gen_bw(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_int([TkW, " cg -bd"]).
-gen_pack_x({Start,Stop},Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- gstk_db:insert_opt(DB,Gstkid,{pack_x,{Start,Stop}}),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C);
-gen_pack_x(Col,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) when is_integer(Col) ->
- gstk_db:insert_opt(DB,Gstkid,{pack_x,{Col,Col}}),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C).
-gen_pack_x(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:opt(DB,Gstkid,pack_x, undefined).
+gen_font_wh({font_wh, {Font, Txt}}, _Gstkid, _TkW, DB, _) -> gstk_font:width_height(DB, gstk_font:choose(DB, Font), Txt).
-gen_pack_y({Start,Stop},Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- gstk_db:insert_opt(DB,Gstkid,{pack_y,{Start,Stop}}),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C);
-gen_pack_y(Row,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) when is_integer(Row) ->
- gstk_db:insert_opt(DB,Gstkid,{pack_y,{Row,Row}}),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C).
-gen_pack_y(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:opt(DB,Gstkid,pack_y, undefined).
+gen_choose_font({choose_font, Font}, _Gstkid, _TkW, DB, _ExtraArg) -> gstk_font:choose(DB, Font).
-gen_pack_xy({Col,Row},Opts,Gstkid,TkW,DB,ExtraArg,S,P,C)
- when is_integer(Col), is_integer(Row) ->
- gstk_db:insert_opt(DB,Gstkid,{pack_x,{Col,Col}}),
- gstk_db:insert_opt(DB,Gstkid,{pack_y,{Row,Row}}),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C);
-gen_pack_xy({Col,{StartRow,StopRow}},Opts,Gstkid,TkW,DB,ExtraArg,S,P,C)
- when is_integer(Col) ->
- gstk_db:insert_opt(DB,Gstkid,{pack_x,{Col,Col}}),
- gstk_db:insert_opt(DB,Gstkid,{pack_y,{StartRow,StopRow}}),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C);
-gen_pack_xy({{StartCol,StopCol},Row},Opts,Gstkid,TkW,DB,ExtraArg,S,P,C)
- when is_integer(Row) ->
- gstk_db:insert_opt(DB,Gstkid,{pack_x,{StartCol,StopCol}}),
- gstk_db:insert_opt(DB,Gstkid,{pack_y,{Row,Row}}),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C);
-gen_pack_xy({Col,Row},Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- gstk_db:insert_opt(DB,Gstkid,{pack_x,Col}),
- gstk_db:insert_opt(DB,Gstkid,{pack_y,Row}),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C).
+gen_data(Data, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gstk_db:insert_opt(DB, Gstkid, {data, Data}),
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, C).
+gen_data(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> gstk_db:opt(DB, Gstkid, data).
-gen_flush(_Opt,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- tcl2erl:ret_int(["update idletasks;expr 1+1"]),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C).
-gen_flush(_Opt,_Gstkid,_TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_int(["update idletasks;expr 1+1"]).
+gen_pack_x({_Start, _Stop} = SS, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gstk_db:insert_opt(DB, Gstkid, {pack_x, SS}),
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, C);
+gen_pack_x(Col, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) when is_integer(Col) ->
+ gen_pack_x({Col, Col}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C).
+
+gen_pack_x(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> gstk_db:opt(DB, Gstkid, pack_x, undefined).
+
+gen_pack_y({_Start, _Stop} = SS, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gstk_db:insert_opt(DB, Gstkid, {pack_y, SS}),
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, C);
+gen_pack_y(Row, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) when is_integer(Row) ->
+ gen_pack_y({Row, Row}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C).
+
+gen_pack_y(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> gstk_db:opt(DB, Gstkid, pack_y, undefined).
+
+gen_pack_xy({Col, Row}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) when is_integer(Col), is_integer(Row) ->
+ gen_pack_xy({Col, Col}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, {Row, Row});
+gen_pack_xy({Col, {_StartRow, _StopRow} = SS}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) when is_integer(Col) ->
+ gen_pack_xy({Col, Col}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, SS);
+gen_pack_xy({{_StartCol, _StopCol} = SS, Row}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) when is_integer(Row) ->
+ gen_pack_xy(SS, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, {Row, Row});
+gen_pack_xy({Col, Row}, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_pack_xy(Col, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, Row).
+
+gen_pack_xy(Col, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, Row) ->
+ gstk_db:insert_opt(DB, Gstkid, {pack_x, Col}),
+ gstk_db:insert_opt(DB, Gstkid, {pack_y, Row}),
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, C).
+
+gen_flush(_Opt, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_flush(),
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, C).
+
+gen_flush(_Opt, _Gstkid, _TkW, _DB, _ExtraArg) -> gen_flush().
+
+gen_flush() -> tcl2erl:ret_int(["update idletasks;expr 1+1"]).
% a hidden impl option.
-gen_keep_opt(Opt,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- gstk_db:insert_opt(DB,Gstkid,Opt),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,C).
+gen_keep_opt(Opt, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gstk_db:insert_opt(DB, Gstkid, Opt),
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, C).
-gen_children(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- make_extern_id(gstk_db:lookup_kids(DB, Gstkid#gstkid.id), DB).
+gen_children(_Opt, #gstkid{id = Id}, _TkW, DB, _ExtraArg) -> make_extern_id(gstk_db:lookup_kids(DB, Id), DB).
-make_extern_id([Id|Ids], DB) ->
- [gstk:make_extern_id(Id, DB) | make_extern_id(Ids, DB)];
-make_extern_id([], _) -> [].
+make_extern_id(Ids, DB) when is_list(Ids) -> lists:foldr(fun(Id, A) -> [gstk:make_extern_id(Id, DB)|A] end, [], Ids).
-gen_id(_Opt,#gstkid{id=Id},_TkW,DB,_ExtraArg) ->
- gstk:make_extern_id(Id, DB).
+gen_id(_Opt, #gstkid{id = Id}, _TkW, DB, _ExtraArg) -> gstk:make_extern_id(Id, DB).
-gen_parent(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk:make_extern_id(Gstkid#gstkid.parent, DB).
+gen_parent(_Opt, #gstkid{parent = Parent}, _TkW, DB, _ExtraArg) -> gstk:make_extern_id(Parent, DB).
-gen_type(_Opt,Gstkid,_TkW,_DB,_ExtraArg) ->
- Gstkid#gstkid.objtype.
+gen_type(_Opt, #gstkid{objtype = ObjType}, _TkW, _DB, _ExtraArg) -> ObjType.
-gen_beep(_,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,["bell;",$;|C]).
+gen_beep(_, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, ["bell;", $;|C]).
-gen_setfocus(true,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,["focus ", TkW,$;|C]);
-gen_setfocus(false,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,["focus .",$;|C]).
+gen_setfocus(true, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, ["focus ", TkW, $;|C]);
+gen_setfocus(false, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, ["focus .", $;|C]).
-gen_setfocus(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_focus(TkW, "focus").
+gen_setfocus(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_focus(TkW, "focus").
-gen_buttonpress(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- Cmd = bind(DB, Gstkid, TkW, buttonpress, On),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_buttonpress(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:is_inserted(DB, Gstkid, buttonpress).
+gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, T) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, [bind(DB, Gstkid, TkW, T, On), $;|C]).
-gen_buttonrelease(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- Cmd = bind(DB, Gstkid, TkW, buttonrelease, On),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_buttonrelease(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:is_inserted(DB,Gstkid,buttonrelease).
+is_inserted(DB, Gstkid, T) -> gstk_db:is_inserted(DB, Gstkid, T).
-gen_configure(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- Cmd = bind(DB, Gstkid, TkW, configure, On),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_configure(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:is_inserted(DB,Gstkid,configure).
+gen_buttonpress(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, buttonpress).
-gen_destroy(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- Cmd = bind(DB, Gstkid, TkW, destroy, On),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_destroy(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:is_inserted(DB,Gstkid,destroy).
+gen_buttonpress(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, buttonpress).
-gen_enter(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- Cmd = bind(DB, Gstkid, TkW, enter, On),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_enter(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:is_inserted(DB,Gstkid,enter).
+gen_buttonrelease(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, buttonrelease).
-gen_focus_ev(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- Cmd = bind(DB, Gstkid, TkW, focus, On),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_focus_ev(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:is_inserted(DB,Gstkid,focus).
+gen_buttonrelease(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, buttonrelease).
-gen_keypress(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- Cmd = bind(DB, Gstkid, TkW, keypress, On),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_keypress(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:is_inserted(DB,Gstkid,keypress).
+gen_configure(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, configure).
-gen_keyrelease(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- Cmd = bind(DB, Gstkid, TkW, keyrelease, On),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_keyrelease(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:is_inserted(DB,Gstkid,keyrelease).
+gen_configure(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, configure).
-gen_leave(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- Cmd = bind(DB, Gstkid, TkW, leave, On),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_leave(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:is_inserted(DB,Gstkid,leave).
+gen_destroy(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, destroy).
-gen_motion(On,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- Cmd = bind(DB, Gstkid, TkW, motion, On),
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[Cmd,$;|C]).
-gen_motion(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:is_inserted(DB,Gstkid,motion).
+gen_destroy(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, destroy).
-gen_highlightbw(Wth,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -highlightt ", gstk:to_ascii(Wth)|S],P,C).
-gen_highlightbw(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_int([TkW, " cg -highlightt"]).
+gen_enter(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, enter).
-gen_highlightbg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -highlightb ", gstk:to_color(Color)|S],P,C).
-gen_highlightbg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_color([TkW, " cg -highlightb"]).
+gen_enter(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, enter).
-gen_highlightfg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -highlightc ", gstk:to_color(Color)|S],P,C).
-gen_highlightfg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_color([TkW, " cg -highlightc"]).
+gen_focus_ev(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, focus).
+gen_focus_ev(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, focus).
-gen_selectbw(Width,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[TkW, " conf -selectbo ", gstk:to_ascii(Width),$;|C]).
-gen_selectbw(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_int([TkW," cg -selectbo"]).
+gen_keypress(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, keypress).
-gen_selectfg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[TkW, " conf -selectfo ", gstk:to_color(Color),$;|C]).
-gen_selectfg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_color([TkW," cg -selectfo"]).
+gen_keypress(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, keypress).
-gen_selectbg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[TkW, " conf -selectba ", gstk:to_color(Color),$;|C]).
-gen_selectbg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_color([TkW," cg -selectba"]).
+gen_keyrelease(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, keyrelease).
-gen_fg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -fg ", gstk:to_color(Color)|S],P,C).
-gen_fg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_color([TkW, " cg -fg"]).
+gen_keyrelease(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, keyrelease).
-gen_bg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -bg ", gstk:to_color(Color)|S],P,C).
-gen_bg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_color([TkW, " cg -bg"]).
+gen_leave(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, leave).
+
+gen_leave(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, leave).
+
+gen_motion(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_bind(On, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, motion).
+
+gen_motion(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> is_inserted(DB, Gstkid, motion).
+
+gen_highlightbw(Wth, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [" -highlightt ", gstk:to_ascii(Wth)|S], P, C).
+
+gen_highlightbw(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_int([TkW, " cg -highlightt"]).
+
+gen_highlight(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, Str) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [Str, gstk:to_color(Color)|S], P, C).
+
+gen_highlightbg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_highlight(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -highlightb ").
+
+gen_highlightbg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, " cg -highlightb"]).
+
+gen_highlightfg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_highlight(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " -highlightc ").
+
+gen_highlightfg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, " cg -highlightc"]).
+
+gen_selectbw(Width, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, [TkW, " conf -selectbo ", gstk:to_ascii(Width), $;|C]).
+
+gen_selectbw(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_int([TkW, " cg -selectbo"]).
+
+gen_selectfg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, [TkW, " conf -selectfo ", gstk:to_color(Color), $;|C]).
+
+gen_selectfg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, " cg -selectfo"]).
+
+gen_selectbg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, [TkW, " conf -selectba ", gstk:to_color(Color), $;|C]).
+
+gen_selectbg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, " cg -selectba"]).
+
+gen_fg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [" -fg ", gstk:to_color(Color)|S], P, C).
+gen_fg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, " cg -fg"]).
+
+gen_bg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [" -bg ", gstk:to_color(Color)|S], P, C).
+
+gen_bg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, " cg -bg"]).
%%----------------------------------------------------------------------
%% Generic functions for scrolled objects
%%----------------------------------------------------------------------
-gen_so_activebg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
+gen_so_activebg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
Col = gstk:to_color(Color),
- C2 = [TkW, ".sy conf -activeba ", Col,$;,
- TkW, ".pad.sx conf -activeba ", Col],
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]).
-gen_so_activebg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_color([TkW,".sy cg -activeba"]).
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P,
+ [[TkW, ".sy conf -activeba ", Col, $;, TkW, ".pad.sx conf -activeba ", Col], $;|C]).
-gen_so_bc(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- Col = gstk:to_color(Color),
- C2= [TkW, " conf -bg ", Col,$;,
- TkW, ".sy conf -highlightba ", Col,$;,
- TkW, ".pad.it conf -bg ", Col,$;,
- TkW, ".pad.sx conf -highlightba ", Col],
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]).
-gen_so_bc(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_color([TkW," cg -bg"]).
+gen_so_activebg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, ".sy cg -activeba"]).
-gen_so_scrollfg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
+gen_so_bc(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
Col = gstk:to_color(Color),
- C2=[TkW, ".sy conf -bg ", Col,$;,
- TkW, ".pad.sx conf -bg ", Col],
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]).
-gen_so_scrollfg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_color([TkW,".sy cg -bg"]).
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P,
+ [[TkW, " conf -bg ", Col, $;, TkW, ".sy conf -highlightba ", Col, $;,
+ TkW, ".pad.it conf -bg ", Col, $;, TkW, ".pad.sx conf -highlightba ", Col], $;|C]).
+gen_so_bc(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, " cg -bg"]).
-gen_so_scrollbg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
+gen_so_scroll(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, Str) ->
Col = gstk:to_color(Color),
- C2 = [TkW, ".sy conf -troughc ", Col, $;,
- TkW, ".pad.sx conf -troughc ", Col],
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]).
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P,
+ [[TkW, ".sy conf -" ++ Str, Col, $;, TkW, ".pad.sx conf -" ++ Str, Col], $;|C]).
-gen_so_scrollbg(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_color([TkW,".sy cg -troughc"]).
+gen_so_scrollfg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_so_scroll(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, "bg ").
-obj(#gstkid{widget_data=SO}) ->
- SO#so.object.
+gen_so_scrollfg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, ".sy cg -bg"]).
-gen_so_bg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- C2= [obj(Gstkid), " conf -bg ", gstk:to_color(Color)],
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]).
-gen_so_bg(_Opt,Gstkid,_TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_color([obj(Gstkid)," cg -bg"]).
+gen_so_scrollbg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ gen_so_scroll(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, "troughc ").
-gen_so_selectbw(Width,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- C2 = [obj(Gstkid), " conf -selectbo ", gstk:to_ascii(Width)],
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]).
-gen_so_selectbw(_Opt,Gstkid,_TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_int([obj(Gstkid)," cg -selectbo"]).
+gen_so_scrollbg(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([TkW, ".sy cg -troughc"]).
-gen_so_selectfg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- C2 = [obj(Gstkid), " conf -selectfo ", gstk:to_color(Color)],
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]).
-gen_so_selectfg(_Opt,Gstkid,_TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_color([obj(Gstkid)," cg -selectfo"]).
+obj(#gstkid{widget_data = #so{object = O}}) -> O.
-gen_so_selectbg(Color,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- C2 = [obj(Gstkid), " conf -selectba ", gstk:to_color(Color)],
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]).
-gen_so_selectbg(_Opt,Gstkid,_TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_color([obj(Gstkid)," cg -selectba"]).
+to_color(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, Str) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, [[obj(Gstkid), Str, gstk:to_color(Color)], $;|C]).
-gen_so_scrolls({Vscroll, Hscroll},Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- SO = Gstkid#gstkid.widget_data,
- NewSO = SO#so{hscroll=Hscroll, vscroll=Vscroll},
- C2 = scrolls_vh(TkW, Vscroll, Hscroll),
- Ngstkid = Gstkid#gstkid{widget_data=NewSO},
- gstk_db:update_widget(DB,Ngstkid),
- out_opts(Opts,Ngstkid,TkW,DB,ExtraArg,S,P,[C2,$;|C]).
+gen_so_bg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ to_color(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " conf -bg ").
+
+gen_so_bg(_Opt, Gstkid, _TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([obj(Gstkid), " cg -bg"]).
+
+gen_so_selectbw(Width, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, S, P, [[obj(Gstkid), " conf -selectbo ", gstk:to_ascii(Width)], $;|C]).
+
+gen_so_selectbw(_Opt, Gstkid, _TkW, _DB, _ExtraArg) -> tcl2erl:ret_int([obj(Gstkid), " cg -selectbo"]).
+
+gen_so_selectfg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ to_color(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " conf -selectfo ").
+
+gen_so_selectfg(_Opt, Gstkid, _TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([obj(Gstkid), " cg -selectfo"]).
+
+gen_so_selectbg(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ to_color(Color, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C, " conf -selectba ").
+
+gen_so_selectbg(_Opt, Gstkid, _TkW, _DB, _ExtraArg) -> tcl2erl:ret_color([obj(Gstkid), " cg -selectba"]).
+
+gen_so_scrolls({Vscroll, Hscroll}, Opts, #gstkid{widget_data = SO} = Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ Ngstkid = Gstkid#gstkid{widget_data = SO#so{hscroll = Hscroll, vscroll = Vscroll}},
+ gstk_db:update_widget(DB, Ngstkid),
+ out_opts(Opts, Ngstkid, TkW, DB, ExtraArg, S, P, [scrolls_vh(TkW, Vscroll, Hscroll), $;|C]).
% read-only
-gen_so_hscroll(_Opt,#gstkid{widget_data=SO},_TkW,_DB,_) ->
- SO#so.hscroll.
+gen_so_hscroll(_Opt, #gstkid{widget_data = #so{vscroll = Hscroll}}, _TkW, _DB, _) -> Hscroll.
% read-only
-gen_so_vscroll(_Opt,#gstkid{widget_data=SO},_TkW,_DB,_) ->
- SO#so.vscroll.
+gen_so_vscroll(_Opt, #gstkid{widget_data = #so{vscroll = Vscroll}}, _TkW, _DB, _) -> Vscroll.
-cursors() -> [{arrow,"top_left_arrow"},{busy,"watch"},{cross,"X_cursor"},
- {hand,"hand2"},{help,"question_arrow"},{resize,"fleur"},
- {text,"xterm"}].
+-define(CURSORS, [{arrow, "top_left_arrow"}, {busy, "watch"}, {cross, "X_cursor"}, {hand, "hand2"},
+ {help, "question_arrow"}, {resize, "fleur"}, {text, "xterm"}]).
-gen_cursor(parent,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -cur {}"|S],P,C);
-gen_cursor(Cur,Opts,Gstkid,TkW,DB,ExtraArg,S,P,C) ->
- case gs:assq(Cur,cursors()) of
+cursors() -> ?CURSORS.
+
+gen_cursor(parent, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [" -cur {}"|S], P, C);
+gen_cursor(Cur, Opts, Gstkid, TkW, DB, ExtraArg, S, P, C) ->
+ case gs:assq(Cur, ?CURSORS) of
{value, TxtCur} ->
- out_opts(Opts,Gstkid,TkW,DB,ExtraArg,[" -cur ",TxtCur|S],P,C);
- _ ->
- {error,{invalid_cursor,Gstkid#gstkid.objtype,Cur}}
+ out_opts(Opts, Gstkid, TkW, DB, ExtraArg, [" -cur ", TxtCur|S], P, C);
+ _ -> {error, {invalid_cursor, Gstkid#gstkid.objtype, Cur}}
end.
-gen_cursor(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- case tcl2erl:ret_str([TkW," cg -cur"]) of
+
+gen_cursor(_Opt, _Gstkid, TkW, _DB, _ExtraArg) ->
+ case tcl2erl:ret_str([TkW, " cg -cur"]) of
"" -> parent;
- Txt when is_list(Txt) ->
- case lists:keysearch(Txt,2,cursors()) of
- {value,{Cur,_}} -> Cur;
- _ -> {bad_result, read_cursor}
- end;
+ Txt when is_list(Txt) -> case lists:keyfind(Txt, 2, ?CURSORS) of
+ {Cur, _} -> Cur;
+ _ -> {bad_result, read_cursor}
+ end;
Bad_Result -> Bad_Result
end.
-gen_citem_coords(Coords,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
- gstk_db:insert_opt(DB,Gstkid,{coords,Coords}),
- out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
- [TkW, " coords ", AItem," ",gstk_canvas:coords(Coords),$;|C]).
-gen_citem_coords(_Opt,Gstkid,_TkW,DB,_ExtraArg) ->
- gstk_db:opt(DB,Gstkid, coords).
+gen_citem_coords(Coords, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+ gstk_db:insert_opt(DB, Gstkid, {coords, Coords}),
+ out_opts(Opts, Gstkid, TkW, DB, AItem, S, P, [TkW, " coords ", AItem, " ", gstk_canvas:coords(Coords), $;|C]).
-gen_citem_fill(none,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,AItem,[" -f {}"|S],P,C);
-gen_citem_fill(Color,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,AItem,[" -f ",gstk:to_color(Color)|S],P,C).
-gen_citem_fill(_Opt,_Gstkid,TkW,_DB,AItem) ->
- tcl2erl:ret_color([TkW, " itemcg ", AItem, " -f"]).
+gen_citem_coords(_Opt, Gstkid, _TkW, DB, _ExtraArg) -> gstk_db:opt(DB, Gstkid, coords).
-gen_citem_lower(_,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
- [TkW, " lower ", AItem,$;|C]).
+gen_citem_fill(none, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, AItem, [" -f {}"|S], P, C);
+gen_citem_fill(Color, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, AItem, [" -f ", gstk:to_color(Color)|S], P, C).
+gen_citem_fill(_Opt, _Gstkid, TkW, _DB, AItem) -> tcl2erl:ret_color([TkW, " itemcg ", AItem, " -f"]).
-gen_citem_raise(_,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
- [TkW, " raise ", AItem,$;|C]).
+gen_citem_lower(_, Opts, Gstkid, TkW, DB, AItem, S, P, C) -> gen_citem(" lower ", Opts, Gstkid, TkW, DB, AItem, S, P, C).
-gen_citem_move({Dx,Dy},Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
- NewCoords = move_coords(Dx,Dy,gstk_db:opt(DB,Gstkid,coords)),
- gstk_db:insert_opt(DB,Gstkid,NewCoords),
- out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
- [TkW, " move ", AItem, " ",
- gstk:to_ascii(Dx), " ", gstk:to_ascii(Dy),$;|C]).
+gen_citem_raise(_, Opts, Gstkid, TkW, DB, AItem, S, P, C) -> gen_citem(" raise ", Opts, Gstkid, TkW, DB, AItem, S, P, C).
-move_coords(Dx,Dy,Coords) ->
- Coords2 = add_to_coords(Dx,Dy, Coords),
- {coords,Coords2}.
+gen_citem(Str, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, AItem, S, P, [TkW, Str, AItem, $;|C]).
-add_to_coords(Dx,Dy,[{X,Y}|Coords]) ->
- [{X+Dx,Y+Dy}|add_to_coords(Dx,Dy,Coords)];
-add_to_coords(_,_,[]) -> [].
+gen_citem_move({Dx, Dy}, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+ gstk_db:insert_opt(DB, Gstkid, move_coords(Dx, Dy, gstk_db:opt(DB, Gstkid, coords))),
+ out_opts(Opts, Gstkid, TkW, DB, AItem, S, P,
+ [TkW, " move ", AItem, " ", gstk:to_ascii(Dx), " ", gstk:to_ascii(Dy), $;|C]).
+move_coords(Dx, Dy, Coords) -> {coords, add_to_coords(Dx, Dy, Coords)}.
-gen_citem_setfocus(true,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
- [TkW, " focus ", AItem,$;|C]);
-gen_citem_setfocus(false,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
- [TkW, " focus {}",$;|C]).
-gen_citem_setfocus(_Opt,_Gstkid,TkW,_DB,_ExtraArg) ->
- tcl2erl:ret_focus(gstk:to_ascii(bug_aitem),[TkW, " focus"]).
+add_to_coords(Dx, Dy, [{X, Y}|Coords]) -> [{X + Dx, Y + Dy}|add_to_coords(Dx, Dy, Coords)];
+add_to_coords(_, _, []) -> [].
-gen_citem_buttonpress(On,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
- [item_bind(DB, Gstkid, TkW, AItem,buttonpress, On),$;|C]).
-gen_citem_buttonrelease(On,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
- [item_bind(DB,Gstkid,TkW,AItem,buttonrelease, On),$;|C]).
-gen_citem_enter(On,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
- [item_bind(DB, Gstkid, TkW, AItem, enter, On),$;|C]).
+gen_citem_setfocus(true, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, AItem, S, P, [TkW, " focus ", AItem, $;|C]);
+gen_citem_setfocus(false, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+ out_opts(Opts, Gstkid, TkW, DB, AItem, S, P, [TkW, " focus {}", $;|C]).
+gen_citem_setfocus(_Opt, _Gstkid, TkW, _DB, _ExtraArg) -> tcl2erl:ret_focus(gstk:to_ascii(bug_aitem), [TkW, " focus"]).
-gen_citem_keypress(On,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
- [item_bind(DB, Gstkid, TkW, AItem, keypress, On),$;|C]).
-gen_citem_keyrelease(On,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
- [item_bind(DB, Gstkid, TkW, AItem, keyrelease, On),$;|C]).
+gen_citem_buttonpress(On, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+ gen_citem(On, Opts, Gstkid, TkW, DB, AItem, S, P, C, buttonpress).
-gen_citem_leave(On,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
- [item_bind(DB, Gstkid, TkW, AItem, leave, On),$;|C]).
-gen_citem_motion(On,Opts,Gstkid,TkW,DB,AItem,S,P,C) ->
- out_opts(Opts,Gstkid,TkW,DB,AItem,S,P,
- [item_bind(DB, Gstkid, TkW, AItem, motion, On),$;|C]).
+gen_citem_buttonrelease(On, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+ gen_citem(On, Opts, Gstkid, TkW, DB, AItem, S, P, C, buttonrelease).
+gen_citem_enter(On, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+ gen_citem(On, Opts, Gstkid, TkW, DB, AItem, S, P, C, enter).
-scrolls_vh(W, V, true) -> scrolls_vh(W, V, bottom);
-scrolls_vh(W, true, H) -> scrolls_vh(W, left, H);
-scrolls_vh(W, left, bottom) -> ["so_bottom_left ",W];
-scrolls_vh(W, left, top) -> ["so_top_left ",W];
-scrolls_vh(W, left, _) -> ["so_left ",W];
-scrolls_vh(W, right, bottom) -> ["so_bottom_right ",W];
-scrolls_vh(W, right, top) -> ["so_top_right ",W];
-scrolls_vh(W, right, _) -> ["so_right ",W];
-scrolls_vh(W, _, bottom) -> ["so_bottom ",W];
-scrolls_vh(W, _, top) -> ["so_top ",W];
-scrolls_vh(W, _, _) -> ["so_plain ",W].
+gen_citem_keypress(On, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+ gen_citem(On, Opts, Gstkid, TkW, DB, AItem, S, P, C, keypress).
+
+gen_citem_keyrelease(On, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+ gen_citem(On, Opts, Gstkid, TkW, DB, AItem, S, P, C, keyrelease).
+
+gen_citem_leave(On, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+ gen_citem(On, Opts, Gstkid, TkW, DB, AItem, S, P, C, leave).
+
+gen_citem_motion(On, Opts, Gstkid, TkW, DB, AItem, S, P, C) ->
+ gen_citem(On, Opts, Gstkid, TkW, DB, AItem, S, P, C, motion).
+
+gen_citem(On, Opts, Gstkid, TkW, DB, AItem, S, P, C, T) ->
+ out_opts(Opts, Gstkid, TkW, DB, AItem, S, P, [item_bind(DB, Gstkid, TkW, AItem, T, On), $;|C]).
+
+scrolls_vh(W, V, true) -> scrolls_vh(W, V, bottom);
+scrolls_vh(W, true, H) -> scrolls_vh(W, left, H);
+scrolls_vh(W, left, bottom) -> ["so_bottom_left ", W];
+scrolls_vh(W, left, top) -> ["so_top_left ", W];
+scrolls_vh(W, left, _) -> ["so_left ", W];
+scrolls_vh(W, right, bottom) -> ["so_bottom_right ", W];
+scrolls_vh(W, right, top) -> ["so_top_right ", W];
+scrolls_vh(W, right, _) -> ["so_right ", W];
+scrolls_vh(W, _, bottom) -> ["so_bottom ", W];
+scrolls_vh(W, _, top) -> ["so_top ", W];
+scrolls_vh(W, _, _) -> ["so_plain ", W].
%% create version
parse_scrolls(Opts) ->
{Vscroll, Hscroll, NewOpts} = parse_scrolls(Opts, false, false, []),
- {Vscroll, Hscroll, [{scrolls, {Vscroll, Hscroll}} | NewOpts]}.
+ {Vscroll, Hscroll, [{scrolls, {Vscroll, Hscroll}}|NewOpts]}.
%% config version
-parse_scrolls(Gstkid, Opts) ->
- SO = Gstkid#gstkid.widget_data,
- Vscroll = SO#so.vscroll,
- Hscroll = SO#so.hscroll,
+parse_scrolls(#gstkid{widget_data = #so{vscroll = Vscroll, hscroll = Hscroll}}, Opts) ->
case parse_scrolls(Opts, Vscroll, Hscroll, []) of
{Vscroll, Hscroll, Opts} -> Opts;
- {NewVscroll, NewHscroll, NewOpts} ->
- [{scrolls, {NewVscroll, NewHscroll}} | NewOpts]
+ {NewVscroll, NewHscroll, NewOpts} -> [{scrolls, {NewVscroll, NewHscroll}}|NewOpts]
end.
-
-parse_scrolls([Option | Rest], Vscroll, Hscroll, Opts) when is_tuple(Option) ->
- case element(1, Option) of
- vscroll ->
- parse_scrolls(Rest, element(2, Option), Hscroll, Opts);
- hscroll ->
- parse_scrolls(Rest, Vscroll, element(2, Option), Opts);
- _ ->
- parse_scrolls(Rest, Vscroll, Hscroll, [Option | Opts])
- end;
-
-parse_scrolls([Option | Rest], Vscroll, Hscroll, Opts) ->
- parse_scrolls(Rest, Vscroll, Hscroll, [Option | Opts]);
-
-parse_scrolls([], Vscroll, Hscroll, Opts) ->
- {Vscroll, Hscroll, Opts}.
-
+parse_scrolls([Option|Rest], _Vscroll, Hscroll, Opts) when element(1, Option) =:= vscroll ->
+ parse_scrolls(Rest, element(2, Option), Hscroll, Opts);
+parse_scrolls([Option|Rest], Vscroll, _Hscroll, Opts) when element(1, Option) =:= hscroll ->
+ parse_scrolls(Rest, Vscroll, element(2, Option), Opts);
+parse_scrolls([Option|Rest], Vscroll, Hscroll, Opts) -> parse_scrolls(Rest, Vscroll, Hscroll, [Option|Opts]);
+parse_scrolls([], Vscroll, Hscroll, Opts) -> {Vscroll, Hscroll, Opts}.
%%
%% Event bind main function
@@ -895,27 +743,13 @@ parse_scrolls([], Vscroll, Hscroll, Opts
%%
%% WS = Widget suffix for complex widgets
%%
-bind(DB, Gstkid, TkW, Etype, On) ->
- WD = Gstkid#gstkid.widget_data,
- TkW2 = if is_record(WD, so) ->
- WD#so.object;
- true -> TkW
- end,
- case bind(DB, Gstkid, TkW2, Etype, On, "") of
- invalid_option -> invalid_option;
- Cmd ->
- Cmd
- end.
-
-bind(DB, Gstkid, TkW, Etype, On, WS) ->
- case On of
- true -> ebind(DB, Gstkid, TkW, Etype, WS, "");
- false -> eunbind(DB, Gstkid, TkW, Etype, WS, "");
- {true, Edata} -> ebind(DB, Gstkid, TkW, Etype, WS, Edata);
- {false, Edata} -> eunbind(DB, Gstkid, TkW, Etype, WS, Edata);
- _ -> invalid_option
- end.
+bind(DB, #gstkid{widget_data = #so{object = TkW}} = Gstkid, _TkW, Etype, On) -> bind(DB, Gstkid, TkW, Etype, On, "");
+bind(DB, Gstkid, TkW, Etype, On) -> bind(DB, Gstkid, TkW, Etype, On, "").
+bind(DB, Gstkid, TkW, Etype, {true, Edata}, WS) -> ebind(DB, Gstkid, TkW, Etype, WS, Edata);
+bind(DB, Gstkid, TkW, Etype, {false, Edata}, WS) -> eunbind(DB, Gstkid, TkW, Etype, WS, Edata);
+bind(DB, Gstkid, TkW, Etype, On, WS) when is_boolean(On) -> bind(DB, Gstkid, TkW, Etype, {On, ""}, WS);
+bind(_DB, _Gstkid, _TkW, _Etype, _On, _WS) -> invalid_option.
%%
%% Event bind on
@@ -927,36 +761,24 @@ bind(DB, Gstkid, TkW, Etype, On, WS) ->
ebind(DB, Gstkid, TkW, Etype, WS, Edata) ->
Eref = gstk_db:insert_event(DB, Gstkid, Etype, Edata),
P = ["bind ", TkW, WS],
- Cmd = case Etype of
- motion -> [P, " <Motion> {erlsend ", Eref, " %x %y}"];
- keypress ->
- [P, " <KeyPress> {erlsend ", Eref," %K %N 0 0};",
- P, " <Shift-KeyPress> {erlsend ", Eref, " %K %N 1 0};",
- P, " <Control-KeyPress> {erlsend ", Eref, " %K %N 0 1};",
- P," <Control-Shift-KeyPress> {erlsend ", Eref," %K %N 1 1}"];
- keyrelease ->
- [P, " <KeyRelease> {erlsend ", Eref," %K %N 0 0};",
- P, " <Shift-KeyRelease> {erlsend ", Eref, " %K %N 1 0};",
- P, " <Control-KeyRelease> {erlsend ", Eref, " %K %N 0 1};",
- P," <Control-Shift-KeyRelease> {erlsend ",Eref," %K %N 1 1}"];
- buttonpress ->
- [P, " <ButtonPress> {erlsend ", Eref, " %b %x %y}"];
- buttonrelease ->
- [P, " <ButtonRelease> {erlsend ", Eref, " %b %x %y}"];
- leave -> [P, " <Leave> {erlsend ", Eref, "}"];
- enter -> [P, " <Enter> {erlsend ", Eref, "}"];
- destroy ->
- [P, " <Destroy> {if {\"%W\"==\"", [TkW, WS],
- "\"} {erlsend ", Eref, "}}"];
- focus ->
- [P, " <FocusIn> {erlsend ", Eref, " 1};" ,
- P, " <FocusOut> {erlsend ", Eref, " 0}"];
- configure ->
- [P, " <Configure> {if {\"%W\"==\"", [TkW, WS],
- "\"} {erlsend ", Eref, " %w %h %x %y}}"]
- end,
- Cmd.
-
+ case Etype of
+ motion -> [P, " <Motion> {erlsend ", Eref, " %x %y}"];
+ keypress -> [P, " <KeyPress> {erlsend ", Eref, " %K %N 0 0};",
+ P, " <Shift-KeyPress> {erlsend ", Eref, " %K %N 1 0};",
+ P, " <Control-KeyPress> {erlsend ", Eref, " %K %N 0 1};",
+ P, " <Control-Shift-KeyPress> {erlsend ", Eref, " %K %N 1 1}"];
+ keyrelease -> [P, " <KeyRelease> {erlsend ", Eref, " %K %N 0 0};",
+ P, " <Shift-KeyRelease> {erlsend ", Eref, " %K %N 1 0};",
+ P, " <Control-KeyRelease> {erlsend ", Eref, " %K %N 0 1};",
+ P, " <Control-Shift-KeyRelease> {erlsend ", Eref, " %K %N 1 1}"];
+ buttonpress -> [P, " <ButtonPress> {erlsend ", Eref, " %b %x %y}"];
+ buttonrelease -> [P, " <ButtonRelease> {erlsend ", Eref, " %b %x %y}"];
+ leave -> [P, " <Leave> {erlsend ", Eref, "}"];
+ enter -> [P, " <Enter> {erlsend ", Eref, "}"];
+ destroy -> [P, " <Destroy> {if {\"%W\"==\"", [TkW, WS], "\"} {erlsend ", Eref, "}}"];
+ focus -> [P, " <FocusIn> {erlsend ", Eref, " 1};" , P, " <FocusOut> {erlsend ", Eref, " 0}"];
+ configure -> [P, " <Configure> {if {\"%W\"==\"", [TkW, WS], "\"} {erlsend ", Eref, " %w %h %x %y}}"]
+ end.
%%
%% Unbind event
@@ -969,49 +791,29 @@ ebind(DB, Gstkid, TkW, Etype, WS, Edata)
eunbind(DB, Gstkid, TkW, Etype, WS, _Edata) ->
gstk_db:delete_event(DB, Gstkid, Etype),
P = ["bind ", TkW, WS],
- Cmd = case Etype of
- motion ->
- [P, " <Motion> {}"];
- keypress ->
- [P, " <KeyPress> {};",
- P, " <Shift-KeyPress> {};",
- P, " <Control-KeyPress> {};",
- P, " <Control-Shift-KeyPress> {}"];
- keyrelease ->
- [P, " <KeyRelease> {};",
- P, " <Shift-KeyRelease> {};",
- P, " <Control-KeyRelease> {};",
- P, " <Control-Shift-KeyRelease> {}"];
- buttonpress ->
- [P, " <ButtonPress> {}"];
- buttonrelease ->
- [P, " <ButtonRelease> {}"];
- leave ->
- [P, " <Leave> {}"];
- enter ->
- [P, " <Enter> {}"];
- destroy ->
- [P, " <Destroy> {}"];
- focus ->
- [P, " <FocusIn> {};",
- P, " <FocusOut> {}"];
- configure ->
- [P, " <Configure> {}"]
- end,
- Cmd.
-
+ case Etype of
+ motion -> [P, " <Motion> {}"];
+ keypress -> [P, " <KeyPress> {};", P, " <Shift-KeyPress> {};",
+ P, " <Control-KeyPress> {};", P, " <Control-Shift-KeyPress> {}"];
+ keyrelease -> [P, " <KeyRelease> {};", P, " <Shift-KeyRelease> {};",
+ P, " <Control-KeyRelease> {};", P, " <Control-Shift-KeyRelease> {}"];
+ buttonpress -> [P, " <ButtonPress> {}"];
+ buttonrelease -> [P, " <ButtonRelease> {}"];
+ leave -> [P, " <Leave> {}"];
+ enter -> [P, " <Enter> {}"];
+ destroy -> [P, " <Destroy> {}"];
+ focus -> [P, " <FocusIn> {};", P, " <FocusOut> {}"];
+ configure -> [P, " <Configure> {}"]
+ end.
%%
%% Event item bind main function
%%
%% Should return a list of tcl commands or invalid_option
%%
-item_bind(DB, Gstkid, Canvas, Item, Etype, On) ->
- case On of
- true -> item_ebind(DB, Gstkid, Canvas, Item, Etype, "");
- {true, Edata} -> item_ebind(DB, Gstkid, Canvas, Item, Etype, Edata);
- _Other -> item_eunbind(DB, Gstkid, Canvas, Item, Etype)
- end.
+item_bind(DB, Gstkid, Canvas, Item, Etype, {true, Edata}) -> item_ebind(DB, Gstkid, Canvas, Item, Etype, Edata);
+item_bind(DB, Gstkid, Canvas, Item, Etype, true) -> item_bind(DB, Gstkid, Canvas, Item, Etype, {true, ""});
+item_bind(DB, Gstkid, Canvas, Item, Etype, _On) -> item_eunbind(DB, Gstkid, Canvas, Item, Etype).
%%
%% Event bind on
@@ -1022,37 +824,31 @@ item_ebind(DB, Gstkid, Canvas, Item, Ety
Eref = gstk_db:insert_event(DB, Gstkid, Etype, Edata),
P = [Canvas, " bind ", Item],
case Etype of
- enter -> [P, " <Enter> {erlsend ", Eref, "}"];
- leave -> [P, " <Leave> {erlsend ", Eref, "}"];
- motion -> [P, " <Motion> {erlsend ", Eref, " [",
- Canvas, " canvasx %x] [", Canvas, " canvasy %y] %x %y}"];
- keypress ->
- [P, " <Key> {erlsend ", Eref," %K %N 0 0 [",
- Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
- P, " <Shift-Key> {erlsend ", Eref, " %K %N 1 0 [",
- Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
- P, " <Control-Key> {erlsend ", Eref, " %K %N 0 1 [",
- Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
- P, " <Control-Shift-Key> {erlsend ", Eref," %K %N 1 1 [",
- Canvas, " canvasx %x] [", Canvas, " canvasy %y]}"];
- keyrelease ->
- [P, " <KeyRelease> {erlsend ", Eref," %K %N 0 0 [",
- Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
- P, " <Shift-KeyRelease> {erlsend ", Eref, " %K %N 1 0 [",
- Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
- P, " <Control-KeyRelease> {erlsend ", Eref, " %K %N 0 1 [",
- Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
- P, " <Control-Shift-KeyRelease> {erlsend ", Eref," %K %N 1 1[",
- Canvas, " canvasx %x] [", Canvas, " canvasy %y]}"];
- buttonpress ->
- [P, " <Button> {erlsend ", Eref, " %b [",
- Canvas, " canvasx %x] [", Canvas, " canvasy %y] %x %y}"];
- buttonrelease ->
- [P, " <ButtonRelease> {erlsend ", Eref, " %b [",
- Canvas, " canvasx %x] [", Canvas, " canvasy %y] %x %y}"]
+ enter -> [P, " <Enter> {erlsend ", Eref, "}"];
+ leave -> [P, " <Leave> {erlsend ", Eref, "}"];
+ motion -> [P, " <Motion> {erlsend ", Eref, " [", Canvas, " canvasx %x] [", Canvas, " canvasy %y] %x %y}"];
+ keypress -> [P, " <Key> {erlsend ", Eref, " %K %N 0 0 [",
+ Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
+ P, " <Shift-Key> {erlsend ", Eref, " %K %N 1 0 [",
+ Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
+ P, " <Control-Key> {erlsend ", Eref, " %K %N 0 1 [",
+ Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
+ P, " <Control-Shift-Key> {erlsend ", Eref, " %K %N 1 1 [",
+ Canvas, " canvasx %x] [", Canvas, " canvasy %y]}"];
+ keyrelease -> [P, " <KeyRelease> {erlsend ", Eref, " %K %N 0 0 [",
+ Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
+ P, " <Shift-KeyRelease> {erlsend ", Eref, " %K %N 1 0 [",
+ Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
+ P, " <Control-KeyRelease> {erlsend ", Eref, " %K %N 0 1 [",
+ Canvas, " canvasx %x] [", Canvas, " canvasy %y]};",
+ P, " <Control-Shift-KeyRelease> {erlsend ", Eref, " %K %N 1 1[",
+ Canvas, " canvasx %x] [", Canvas, " canvasy %y]}"];
+ buttonpress -> [P, " <Button> {erlsend ", Eref, " %b [",
+ Canvas, " canvasx %x] [", Canvas, " canvasy %y] %x %y}"];
+ buttonrelease -> [P, " <ButtonRelease> {erlsend ", Eref, " %b [",
+ Canvas, " canvasx %x] [", Canvas, " canvasy %y] %x %y}"]
end.
-
%%
%% Unbind event
%%
@@ -1062,28 +858,17 @@ item_ebind(DB, Gstkid, Canvas, Item, Ety
item_eunbind(DB, Gstkid, Canvas, Item, Etype) ->
gstk_db:delete_event(DB, Gstkid, Etype),
P = [Canvas, " bind ", Item],
- Cmd = case Etype of
- enter -> [P, " <Enter> {}"];
- leave -> [P, " <Leave> {}"];
- motion -> [P, " <Motion> {}"];
- keypress ->
- [P, " <KeyPress> {};",
- P, " <Shift-KeyPress> {};",
- P, " <Control-KeyPress> {};",
- P, " <Control-Shift-KeyPress> {}"];
- keyrelease ->
- [P, " <KeyRelease> {};",
- P, " <Shift-KeyRelease> {};",
- P, " <Control-KeyRelease> {};",
- P, " <Control-Shift-KeyRelease> {}"];
- buttonpress -> [P, " <Button> {}"];
- buttonrelease -> [P, " <ButtonRelease> {}"]
- end,
- Cmd.
-
-
+ case Etype of
+ enter -> [P, " <Enter> {}"];
+ leave -> [P, " <Leave> {}"];
+ motion -> [P, " <Motion> {}"];
+ keypress -> [P, " <KeyPress> {};", P, " <Shift-KeyPress> {};",
+ P, " <Control-KeyPress> {};", P, " <Control-Shift-KeyPress> {}"];
+ keyrelease -> [P, " <KeyRelease> {};", P, " <Shift-KeyRelease> {};",
+ P, " <Control-KeyRelease> {};", P, " <Control-Shift-KeyRelease> {}"];
+ buttonpress -> [P, " <Button> {}"];
+ buttonrelease -> [P, " <ButtonRelease> {}"]
+ end.
-event(DB, Gstkid, Etype, _Edata, Args) ->
- #gstkid{owner=Ow,id=Id} = Gstkid,
- Data = gstk_db:opt(DB,Gstkid,data),
- gs_frontend:event(get(gs_frontend),Ow,{gs,Id,Etype,Data,Args}).
+event(DB, #gstkid{owner = Ow, id = Id} = Gstkid, Etype, _Edata, Args) ->
+ gs_frontend:event(get(gs_frontend), Ow, {gs, Id, Etype, gstk_db:opt(DB, Gstkid, data), Args}).
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_grid.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_grid.erl
--- otp_src_19.0.5/lib/gs/src/gstk_grid.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_grid.erl 2016-08-25 16:37:44.564693354 +0300
@@ -20,10 +20,10 @@
%%
-module(gstk_grid).
--compile([{nowarn_deprecated_function,{gs,val,2}}]).
--export([event/5,create/3,config/3,option/5,read/3,delete/2,destroy/2,
- mk_create_opts_for_child/4,read_option/5]).
+-compile([{nowarn_deprecated_function, {gs, val, 2}}]).
+
+-export([event/5, create/3, config/3, option/5, read/3, delete/2, destroy/2, mk_create_opts_for_child/4, read_option/5]).
-include("gstk.hrl").
@@ -42,243 +42,178 @@
%% bg Color
%%-----------------------------------------------------------------------------
--record(state,{canvas,ncols,max_range,cell_id, cell_pos,ids,db,tkcanvas}).
--record(item,{text_id,rect_id,line_id}).
+-record(state, {canvas, ncols, max_range, cell_id, cell_pos, ids, db, tkcanvas}).
+-record(item, {text_id, rect_id, line_id}).
%%======================================================================
%% Interfaces
%%======================================================================
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_gridline:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_gridline:event(DB, Gstkid, Etype, Edata, Args).
-create(DB, Gstkid, Options) ->
- WinParent=Gstkid#gstkid.parent,
- {OtherOpts,CanvasOpts} = parse_opts(Options,[],[]),
+create(DB, #gstkid{parent = WinParent} = Gstkid, Options) ->
+ {CanvasOpts, OtherOpts} = parse_opts(Options),
%% Why this (secret) hack? Performance reasons.
%% if we ".canvas bind all" once and for all, then we can
%% create lines twice as fast since we don't have to bind each line.
C = make_ref(),
- gstk:create_impl(DB,{a_grid, {canvas,C,WinParent,
- [{secret_hack_gridit, Gstkid}
- | CanvasOpts]}}),
- CanvasGstkid = gstk_db:lookup_gstkid(DB, C),
- Wid = CanvasGstkid#gstkid.widget,
- SO = CanvasGstkid#gstkid.widget_data,
- TkCanvas = SO#so.object,
- CI=ets:new(gstk_grid_cellid,[private,set]),
- CP=ets:new(gstk_grid_cellpos,[private,set]),
- IDs=ets:new(gstk_grid_id,[private,set]),
- S=#state{db=DB,ncols=length(gs:val(columnwidths,OtherOpts)),
- canvas=C,cell_id=CI,tkcanvas=TkCanvas,cell_pos=CP,ids=IDs},
- Ngstkid = Gstkid#gstkid{widget=Wid,widget_data=S},
- gstk_db:insert_opts(DB,Ngstkid,OtherOpts),
- gstk_db:insert_widget(DB,Ngstkid),
- gstk_generic:mk_cmd_and_exec(lists:keydelete(columnwidths,1,OtherOpts),
- Ngstkid, TkCanvas,"","", DB,nop).
+ gstk:create_impl(DB, {a_grid, {canvas, C, WinParent, [{secret_hack_gridit, Gstkid}|CanvasOpts]}}),
+ #gstkid{widget = Wid, widget_data = #so{object = TkCanvas}} = gstk_db:lookup_gstkid(DB, C),
+ Ngstkid = Gstkid#gstkid{widget = Wid, widget_data = #state{db = DB, ncols = length(gs:val(columnwidths, OtherOpts)),
+ canvas = C, tkcanvas = TkCanvas,
+ cell_id = ets:new(gstk_grid_cellid, [private, set]),
+ cell_pos = ets:new(gstk_grid_cellpos, [private, set]),
+ ids = ets:new(gstk_grid_id, [private, set])}},
+ gstk_db:insert_opts(DB, Ngstkid, OtherOpts),
+ gstk_db:insert_widget(DB, Ngstkid),
+ gstk_generic:mk_cmd_and_exec(lists:keydelete(columnwidths, 1 , OtherOpts), Ngstkid, TkCanvas, "", "", DB, nop).
-config(DB, Gstkid, Options) ->
- #gstkid{widget=TkW,widget_data=State}=Gstkid,
- {OtherOpts,CanvasOpts} = parse_opts(Options,[],[]),
- case gstk:config_impl(DB,State#state.canvas,CanvasOpts) of
- ok ->
- SimplePreCmd = "nyi?",
- PlacePreCmd = [";place ", TkW],
- gstk_generic:mk_cmd_and_exec(OtherOpts,Gstkid,TkW,
- SimplePreCmd,PlacePreCmd,DB,State);
+config(DB, #gstkid{widget = TkW, widget_data = #state{canvas = Canvas} = State} = Gstkid, Options) ->
+ {CanvasOpts, OtherOpts} = parse_opts(Options),
+ case gstk:config_impl(DB, Canvas, CanvasOpts) of
+ ok -> gstk_generic:mk_cmd_and_exec(OtherOpts, Gstkid, TkW, "nyi?", [";place ", TkW], DB, State);
Err -> Err
end.
-
-option(Option, Gstkid, _TkW, DB,State) ->
- case Option of
- {rows,{From,To}} ->
- Ngstkid = reconfig_rows(From,To,Gstkid),
- gstk_db:insert_opt(DB,Gstkid,Option),
- gstk_db:update_widget(DB,Ngstkid),
- {none,Ngstkid};
- {fg,_Color} ->
- reconfig_grid(DB,Option,State),
- gstk_db:insert_opt(DB,Gstkid,Option),
- none;
- {bg,_Color} ->
- reconfig_grid(DB,Option,State),
- gstk_db:insert_opt(DB,Gstkid,Option),
- none;
- {font,_Font} ->
- reconfig_grid(DB,Option,State),
- gstk_db:insert_opt(DB,Gstkid,Option),
- none;
- {columnwidths,ColWs} ->
- gstk_db:insert_opt(DB,Gstkid,Option),
- Rows = gstk_db:opt(DB,Gstkid,rows),
- CellHeight = gstk_db:opt(DB,Gstkid,cellheight),
- gstk:config_impl(DB,State#state.canvas,
- [calc_scrollregion(Rows,ColWs,CellHeight)]),
- %% Crash upon an error msg (so we know WHY)
- {result,_} = gstk:call(["resize_grid_cols ",State#state.tkcanvas,
- " [list ",asc_tcl_colw(ColWs),"]"]),
- none;
- {cellheight,_Height} ->
- gstk_db:insert_opt(DB,Gstkid,Option),
- none;
- _ ->
- invalid_option
- end.
+option(Option, Gstkid, _TkW, DB, State) -> option(DB, Gstkid, Option, State).
-reconfig_grid(_,_,nop) -> done;
-reconfig_grid(DB,Option,#state{tkcanvas=TkW,cell_pos=CP,
- ncols=Ncols,max_range={From,To}}) ->
- reconfig_grid(DB,TkW,Option,From,To,CP,Ncols).
-
-reconfig_grid(DB,TkW,Opt,Row,MaxRow,CellPos,Ncols) when Row =< MaxRow ->
- [{_,Item}] = ets:lookup(CellPos,{1,Row}),
- case Item#item.line_id of
- free -> empty_cell_config(DB,TkW,Row,1,Ncols,CellPos,Opt);
- GridLine ->
- gstk_gridline:config(DB,gstk_db:lookup_gstkid(DB,GridLine),
- [Opt])
+option(DB, Gstkid, {columnwidths, ColWs} = Option, #state{canvas = Canvas, tkcanvas = TkCanvas}) ->
+ gstk_db:insert_opt(DB, Gstkid, Option),
+ gstk:config_impl(DB, Canvas,
+ [calc_scrollregion(gstk_db:opt(DB, Gstkid, rows), ColWs, gstk_db:opt(DB, Gstkid, cellheight))]),
+ %% Crash upon an error msg (so we know WHY)
+ {result, _} = gstk:call(["resize_grid_cols ", TkCanvas, " [list ", asc_tcl_colw(ColWs), "]"]),
+ none;
+option(DB, Gstkid, {O, _Color} = Option, State) when O =:= fg; O =:= bg; O =:= font ->
+ reconfig_grid(DB, Option, State),
+ gstk_db:insert_opt(DB, Gstkid, Option),
+ none;
+option(DB, Gstkid, Option, _State) -> option(DB, Gstkid, Option).
+
+option(DB, Gstkid, {rows, {From, To}} = Option) ->
+ Ngstkid = reconfig_rows(From, To, Gstkid),
+ gstk_db:insert_opt(DB, Gstkid, Option),
+ gstk_db:update_widget(DB, Ngstkid),
+ {none, Ngstkid};
+option(DB, Gstkid, {cellheight, _Height} = Option) ->
+ gstk_db:insert_opt(DB, Gstkid, Option),
+ none;
+option(_DB, _Gstkid, _Option) -> invalid_option.
+
+reconfig_grid(_, _, nop) -> done;
+reconfig_grid(DB, Option, #state{tkcanvas = TkW, cell_pos = CP, ncols = Ncols, max_range = {From, To}}) ->
+ reconfig_grid(DB, TkW, Option, From, To, CP, Ncols).
+
+reconfig_grid(DB, TkW, Opt, Row, MaxRow, CellPos, Ncols) when Row =< MaxRow ->
+ case ets:lookup(CellPos, {1, Row}) of
+ [{_, #item{line_id = free}}] -> empty_cell_config(DB, TkW, Row, 1, Ncols, CellPos, Opt);
+ [{_, #item{line_id = GridLine}}] -> gstk_gridline:config(DB, gstk_db:lookup_gstkid(DB, GridLine), [Opt])
end,
- reconfig_grid(DB,TkW,Opt,Row+1,MaxRow,CellPos,Ncols);
-reconfig_grid(_,_,_,_,_,_,_) -> done.
+ reconfig_grid(DB, TkW, Opt, Row + 1, MaxRow, CellPos, Ncols);
+reconfig_grid(_, _, _, _, _, _, _) -> done.
%%----------------------------------------------------------------------
%% Purpose: Config an empty cell (i.e. has no gridline)
%%----------------------------------------------------------------------
-empty_cell_config(DB,TkW,Row,Col,Ncols,CellPos,Opt) when Col =< Ncols ->
- [{_,Item}] = ets:lookup(CellPos,{Col,Row}),
- empty_cell_config(DB,TkW,Item,Opt),
- empty_cell_config(DB,TkW,Row,Col+1,Ncols,CellPos,Opt);
-empty_cell_config(_,_,_,_,_,_,_) -> done.
+empty_cell_config(DB, TkW, Row, Col, Ncols, CellPos, Opt) when Col =< Ncols ->
+ [{_, Item}] = ets:lookup(CellPos, {Col, Row}),
+ empty_cell_config(DB, TkW, Item, Opt),
+ empty_cell_config(DB, TkW, Row, Col + 1, Ncols, CellPos, Opt);
+empty_cell_config(_, _, _, _, _, _, _) -> done.
-empty_cell_config(_,TkW,#item{rect_id=Rid},{bg,Color}) ->
- gstk:exec([TkW," itemconf ",gstk:to_ascii(Rid)," -f ",gstk:to_color(Color)]);
-empty_cell_config(_,TkW,#item{rect_id=Rid,text_id=Tid},{fg,Color}) ->
+empty_cell_config(_, TkW, #item{rect_id = Rid}, {bg, Color}) ->
+ gstk:exec([TkW, " itemconf ", gstk:to_ascii(Rid), " -f ", gstk:to_color(Color)]);
+empty_cell_config(_, TkW, #item{rect_id = Rid, text_id = Tid}, {fg, Color}) ->
Acolor = gstk:to_color(Color),
- Pre = [TkW," itemconf "],
- RectStr = [Pre, gstk:to_ascii(Rid)," -outline ",Acolor],
- TexdStr = [Pre, gstk:to_ascii(Tid)," -fi ",Acolor],
- gstk:exec([RectStr,$;,TexdStr]);
-empty_cell_config(DB,TkW,#item{text_id=Tid},{font,Font}) ->
- gstk:exec([TkW," itemconf ",gstk:to_ascii(Tid)," -font ",
- gstk_font:choose_ascii(DB,Font)]);
-empty_cell_config(_,_,_,_) -> done.
-
-
-
-reconfig_rows(From, To, Gstkid) ->
- #gstkid{widget_data=State,id=Id} = Gstkid,
- #state{tkcanvas=TkCanvas,cell_pos=CP,cell_id=CI,
- canvas=C,db=DB,max_range=Range}=State,
- NewRange =
- if Range == undefined ->
- mkgrid(DB,CP,CI,TkCanvas,Id,From,To),
- {From,To};
- true ->
- {Top,Bot} = Range,
- if
- From < Top -> % we need more rects above
- mkgrid(DB,CP,CI,TkCanvas,Id,From,Top-1);
- true -> true
- end,
- if
- To > Bot -> % we need more rects below
- mkgrid(DB,CP,CI,TkCanvas,Id,Bot+1,To);
- true -> true
- end,
- {lists:min([Top, From]), lists:max([Bot, To])}
- end,
- gstk:config_impl(DB,C,[calc_scrollregion({From,To},
- gstk_db:opt(DB,Id,columnwidths),
- gstk_db:opt(DB,Id,cellheight))]),
- S2 = State#state{max_range=NewRange},
- Gstkid#gstkid{widget_data=S2}.
+ Pre = [TkW, " itemconf "],
+ gstk:exec([[Pre, gstk:to_ascii(Rid), " -outline ", Acolor], $;, [Pre, gstk:to_ascii(Tid), " -fi ", Acolor]]);
+empty_cell_config(DB, TkW, #item{text_id = Tid}, {font, Font}) ->
+ gstk:exec([TkW, " itemconf ", gstk:to_ascii(Tid), " -font ", gstk_font:choose_ascii(DB, Font)]);
+empty_cell_config(_, _, _, _) -> done.
-read(DB,Gstkid,Opt) ->
- State = Gstkid#gstkid.widget_data,
- case lists:member(Opt,[x,y,width,height,hscroll,vscroll]) of
- true -> gstk:read_impl(DB,State#state.canvas,Opt);
- false ->
- gstk_generic:read_option(DB, Gstkid, Opt,State)
- end.
+reconfig_rows(From, To, #gstkid{widget_data = #state{tkcanvas = TkCanvas,
+ cell_pos = CP,
+ cell_id = CI,
+ canvas = C,
+ db = DB,
+ max_range = Range} = State,
+ id = Id} = Gstkid) ->
+ NewRange = if
+ Range =:= undefined ->
+ mkgrid(DB, CP, CI, TkCanvas, Id, From, To),
+ {From, To};
+ true ->
+ {Top, Bot} = Range,
+ % we need more rects above
+ From < Top andalso mkgrid(DB, CP, CI, TkCanvas, Id, From, Top - 1),
+ % we need more rects below
+ To > Bot andalso mkgrid(DB, CP, CI, TkCanvas, Id, Bot + 1, To),
+ {lists:min([Top, From]), lists:max([Bot, To])}
+ end,
+ gstk:config_impl(DB, C, [calc_scrollregion({From, To},
+ gstk_db:opt(DB, Id, columnwidths),
+ gstk_db:opt(DB, Id, cellheight))]),
+ Gstkid#gstkid{widget_data = State#state{max_range = NewRange}}.
-read_option(Option,Gstkid,_TkW,DB,State) ->
- case Option of
- {obj_at_row,Row} ->
- case ets:lookup(State#state.cell_pos,{1,Row}) of
- [{_pos,Item}] ->
- case Item#item.line_id of
- free -> undefined;
- GridLine ->
- gstk:make_extern_id(GridLine, DB)
- end;
- _ -> undefined
- end;
- Opt -> gstk_db:opt(DB,Gstkid#gstkid.id,Opt,undefined)
+read(DB, #gstkid{widget_data = State} = Gstkid, Opt) ->
+ case lists:member(Opt, [x, y, width, height, hscroll, vscroll]) of
+ true -> gstk:read_impl(DB, State#state.canvas, Opt);
+ _ -> gstk_generic:read_option(DB, Gstkid, Opt, State)
end.
+read_option({obj_at_row, Row}, _Gstkid, _TkW, DB, #state{cell_pos = Pos}) ->
+ case ets:lookup(Pos, {1, Row}) of
+ [{_Pos, #item{line_id = free}}] -> undefined;
+ [{_Pos, #item{line_id = GridLine}}] -> gstk:make_extern_id(GridLine, DB);
+ _ -> undefined
+ end;
+read_option(Option, #gstkid{id = Id}, _TkW, DB, _State) -> gstk_db:opt(DB, Id, Option, undefined).
%%----------------------------------------------------------------------
%% Is always called.
%% Clean-up my specific side-effect stuff.
%%----------------------------------------------------------------------
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget_data = #state{canvas = C, cell_pos = CP, cell_id = CIs, ids = IDs},
+ parent = Parent, id = Id} = Gstkid) ->
gstk_db:delete_widget(DB, Gstkid),
- State = Gstkid#gstkid.widget_data,
- #state{canvas=C,cell_pos=CP,cell_id=CIs, ids=IDs} = State,
- ets:delete(CP),
- ets:delete(CIs),
- ets:delete(IDs),
- {Gstkid#gstkid.parent, Gstkid#gstkid.id, gstk_grid, [C]}.
+ lists:foreach(fun ets:delete/1, [CP, CIs, IDs]),
+ {Parent, Id, gstk_grid, [C]}.
%%----------------------------------------------------------------------
%% Is called iff my parent is not also destroyed.
%%----------------------------------------------------------------------
-destroy(DB, Canvas) ->
- gstk:destroy_impl(DB,gstk_db:lookup_gstkid(DB,Canvas)).
+destroy(DB, Canvas) -> gstk:destroy_impl(DB, gstk_db:lookup_gstkid(DB, Canvas)).
-mk_create_opts_for_child(DB,Cgstkid, Pgstkid, Opts) ->
- gstk_generic:mk_create_opts_for_child(DB,Cgstkid,Pgstkid,Opts).
+mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts) ->
+ gstk_generic:mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts).
-mkgrid(DB,CellPos,CellIds,TkCanvas,Id,From,To) ->
- ColWs = gstk_db:opt(DB,Id,columnwidths),
- AscColW = ["[list ",asc_tcl_colw(ColWs),"]"],
- Font = gstk_font:choose_ascii(DB,gstk_db:opt(DB,Id,font)),
- Fg = gstk:to_color(gstk_db:opt(DB,Id,fg)),
- Bg = gstk:to_color(gstk_db:opt(DB,Id,bg)),
- Objs = tcl2erl:ret_list(["mkgrid ",TkCanvas," ",AscColW," ",
- gstk:to_ascii(From)," ",
- gstk:to_ascii(To)," ",
- gstk:to_ascii(gstk_db:opt(DB,Id,cellheight))," ",
- Font," ",Fg," ",Bg]),
- insert_objs(CellPos,CellIds,From,To,1,length(ColWs)+1,Objs).
+mkgrid(DB, CellPos, CellIds, TkCanvas, Id, From, To) ->
+ ColWs = gstk_db:opt(DB, Id, columnwidths),
+ insert_objs(CellPos, CellIds, From, To, 1, length(ColWs) + 1,
+ tcl2erl:ret_list(["mkgrid ", TkCanvas, " ", ["[list ", asc_tcl_colw(ColWs), "]"], " ",
+ gstk:to_ascii(From), " ", gstk:to_ascii(To), " ",
+ gstk:to_ascii(gstk_db:opt(DB, Id, cellheight)), " ",
+ gstk_font:choose_ascii(DB, gstk_db:opt(DB, Id, font)), " ",
+ gstk:to_color(gstk_db:opt(DB, Id, fg)), " ", gstk:to_color(gstk_db:opt(DB, Id, bg))])).
-insert_objs(_,_,_,_,_,_,[]) -> done;
-insert_objs(CP,CI,Row,T,MaxCol,MaxCol,Objs) ->
- insert_objs(CP,CI,Row+1,T,1,MaxCol,Objs);
-insert_objs(CellPos,CellIds,Row,To,Col,Ncols,[RectId,TextId|Objs]) ->
- ets:insert(CellPos,{{Col,Row},
- #item{text_id=TextId,rect_id=RectId,line_id=free}}),
- ets:insert(CellIds,{RectId,{Col,Row}}),
- ets:insert(CellIds,{TextId,{Col,Row}}),
- insert_objs(CellPos,CellIds,Row,To,Col+1,Ncols,Objs).
+insert_objs(_, _, _, _, _, _, []) -> done;
+insert_objs(CP, CI, Row, T, MaxCol, MaxCol, Objs) -> insert_objs(CP, CI, Row + 1, T, 1, MaxCol, Objs);
+insert_objs(CellPos, CellIds, Row, To, Col, Ncols, [RectId, TextId|Objs]) ->
+ CR = {Col, Row},
+ ets:insert(CellPos, {CR, #item{text_id = TextId, rect_id = RectId, line_id = free}}),
+ ets:insert(CellIds, {RectId, CR}),
+ ets:insert(CellIds, {TextId, CR}),
+ insert_objs(CellPos, CellIds, Row, To, Col + 1, Ncols, Objs).
asc_tcl_colw([]) -> "";
-asc_tcl_colw([Int|T]) -> [gstk:to_ascii(Int)," "|asc_tcl_colw(T)].
+asc_tcl_colw([Int|T]) -> [gstk:to_ascii(Int), " "|asc_tcl_colw(T)].
%%----------------------------------------------------------------------
%% Args: Cols list of column sizes (measured in n-chars)
%%----------------------------------------------------------------------
calc_scrollregion({From, To}, Cols, Height) ->
- {scrollregion, {0, ((From-1) * Height) + From,
- lists:sum(Cols)+length(Cols)+1, (To * Height)+ To+1}}.
-
-parse_opts([],OtherOpts,CanvasOpts) -> {OtherOpts,CanvasOpts};
-parse_opts([{Key,Val}|Opts],OtherOpts,CanvasOpts) ->
- case lists:member(Key,[x,y,width,height,vscroll,hscroll]) of
- true -> parse_opts(Opts,OtherOpts,[{Key,Val}|CanvasOpts]);
- false -> parse_opts(Opts,[{Key,Val}|OtherOpts],CanvasOpts)
- end;
-parse_opts([Opt|Opts],OtherOpts,CanvasOpts) ->
- parse_opts(Opts,[Opt|OtherOpts],CanvasOpts).
+ {scrollregion, {0, (From - 1) * Height + From, lists:sum(Cols) + length(Cols) + 1, To * Height + To + 1}}.
+parse_opts(Opts) -> lists:partition(fun({Key, _}) -> lists:member(Key, [x, y, width, height, vscroll, hscroll]);
+ (_) -> false
+ end, Opts).
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_gridline.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_gridline.erl
--- otp_src_19.0.5/lib/gs/src/gstk_gridline.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_gridline.erl 2016-08-25 16:37:44.564693354 +0300
@@ -20,15 +20,15 @@
%%
-module(gstk_gridline).
--compile([{nowarn_deprecated_function,{gs,val,2}},
- {nowarn_deprecated_function,{gs,val,3}}]).
--export([event/5,create/3,config/3,option/5,read/3,delete/2,destroy/3,
- read_option/5]).
+-compile([{nowarn_deprecated_function, {gs, val, 2}},
+ {nowarn_deprecated_function, {gs, val, 3}}]).
+
+-export([event/5, create/3, config/3, option/5, read/3, delete/2, destroy/3, read_option/5]).
-include("gstk.hrl").
--record(state,{canvas,ncols,max_range,cell_id, cell_pos,ids,db,tkcanvas}).
--record(item,{text_id,rect_id,line_id}).
+-record(state, {canvas, ncols, max_range, cell_id, cell_pos, ids, db, tkcanvas}).
+-record(item, {text_id, rect_id, line_id}).
%%-----------------------------------------------------------------------------
%% GRIDLINE OPTIONS
@@ -41,261 +41,216 @@
%%
%%-----------------------------------------------------------------------------
-create(DB, Gstkid, Options) ->
- Pgstkid = gstk_db:lookup_gstkid(DB,Gstkid#gstkid.parent),
- Id = Gstkid#gstkid.id,
- #gstkid{widget_data=State} = Pgstkid,
- #state{cell_pos=CP,tkcanvas=TkW,ncols=Ncols} = State,
- Row = gs:val(row,Options),
- case check_row(CP,Row) of
- {error,Reason} -> {error,Reason};
+create(DB, #gstkid{parent = Parent} = Gstkid, Options) ->
+ #gstkid{widget_data = #state{cell_pos = CP}} = Pgstkid = gstk_db:lookup_gstkid(DB, Parent),
+ Row = gs:val(row, Options),
+ case check_row(CP, Row) of
+ {error, _Reason} = E -> E;
ok ->
- Ngstkid = Gstkid#gstkid{widget=TkW},
- gstk_db:insert_opts(DB,Id,[{data,[]},{row,Row}]),
- update_cp_db(Ncols,Row,Id,CP),
- config_line(DB,Pgstkid,Ngstkid,Row,Options),
+ #gstkid{widget_data = #state{tkcanvas = TkW, ncols = Ncols}} = Pgstkid,
+ Ngstkid = Gstkid#gstkid{widget = TkW},
+ Id = Gstkid#gstkid.id,
+ gstk_db:insert_opts(DB, Id, [{data, []}, {row, Row}]),
+ update_cp_db(Ncols, Row, Id, CP),
+ config_line(DB, Pgstkid, Ngstkid, Row, Options),
Ngstkid
end.
%%----------------------------------------------------------------------
%% Returns: ok|false
%%----------------------------------------------------------------------
-check_row(_CellPos,undefined) ->
- {error,{gridline,{row,undefined}}};
-check_row(CellPos,Row) ->
- case ets:lookup(CellPos,{1,Row}) of
- [] ->
- {error,{gridline,row_outside_range,Row}};
- [{_,Item}] ->
- case Item#item.line_id of
- free -> ok;
- _ ->
- {error,{gridline,row_is_occupied,Row}}
- end
+check_row(_CellPos, undefined) -> {error, {gridline, {row, undefined}}};
+check_row(CellPos, Row) ->
+ case ets:lookup(CellPos, {1, Row}) of
+ [] -> {error, {gridline, row_outside_range, Row}};
+ [{_, #item{line_id = free}}] -> ok;
+ [{_, #item{}}] -> {error, {gridline, row_is_occupied, Row}}
end.
%%----------------------------------------------------------------------
%% s => text item
%% p => rect item
%%----------------------------------------------------------------------
-option(Option, _Gstkid, _TkW, DB,_) ->
- case Option of
- {{bg,_Item}, Color} -> {p,[" -f ", gstk:to_color(Color)]};
- {{text,_Item},Text} -> {s, [" -te ", gstk:to_ascii(Text)]};
- {{fg,_Item},Color} -> {sp,{[" -fi ", gstk:to_color(Color)],
- [" -outline ", gstk:to_color(Color)]}};
- {{font,_Item},Font} -> {s,[" -font ",gstk_font:choose_ascii(DB,Font)]};
- _ -> invalid_option
- end.
+option(Option, _Gstkid, _TkW, DB, _) -> option(Option, DB).
+
+option({{font, _Item}, Font}, DB) -> option_s(" -font ", gstk_font:choose_ascii(DB, Font));
+option(Option, _DB) -> option(Option).
+
+option({{bg, _Item}, Color}) -> {p, [" -f ", gstk:to_color(Color)]};
+option({{text, _Item}, Text}) -> option_s(" -te ", gstk:to_ascii(Text));
+option({{fg, _Item}, Color}) -> {sp, {[" -fi ", gstk:to_color(Color)], [" -outline ", gstk:to_color(Color)]}};
+option(_Option) -> invalid_option.
+
+option_s(L) -> {s, L}.
+
+option_s(Str, Val) -> option_s([Str, Val]).
%%----------------------------------------------------------------------
%% Is always called.
%% Clean-up my specific side-effect stuff.
%%----------------------------------------------------------------------
-delete(DB, Gstkid) ->
- Row = gstk_db:opt(DB,Gstkid,row),
- gstk_db:delete_widget(DB, Gstkid),
- {Gstkid#gstkid.parent, Gstkid#gstkid.id, gstk_gridline,[Gstkid, Row]}.
+delete(DB, #gstkid{parent = Parent, id = Id} = Gstkid) ->
+ Row = gstk_db:opt(DB, Gstkid, row),
+ gstk_db:delete_widget(DB, Gstkid),
+ {Parent, Id, gstk_gridline, [Gstkid, Row]}.
%%----------------------------------------------------------------------
%% Is called iff my parent is not also destroyed.
%%----------------------------------------------------------------------
-destroy(DB, Lgstkid, Row) ->
- Ggstkid = gstk_db:lookup_gstkid(DB,Lgstkid#gstkid.parent),
- #gstkid{widget_data=State} = Ggstkid,
- config_line(DB,Ggstkid,Lgstkid,Row,
- [{bg,gstk_db:opt(DB,Ggstkid,bg)},
- {fg,gstk_db:opt(DB,Ggstkid,fg)},{text,""}]),
- Ncols = State#state.ncols,
- update_cp_db(Ncols,Row,free,State#state.cell_pos).
-
+destroy(DB, #gstkid{parent = Parent} = Lgstkid, Row) ->
+ #gstkid{widget_data = #state{ncols = Ncols, cell_pos = CP}} = Ggstkid = gstk_db:lookup_gstkid(DB, Parent),
+ config_line(DB, Ggstkid, Lgstkid, Row,
+ [{bg, gstk_db:opt(DB, Ggstkid, bg)}, {fg, gstk_db:opt(DB, Ggstkid, fg)}, {text, ""}]),
+ update_cp_db(Ncols, Row, free, CP).
-config(DB, Gstkid, Opts) ->
- Pgstkid = gstk_db:lookup_gstkid(DB,Gstkid#gstkid.parent),
- case {gs:val(row,Opts,missing),gstk_db:opt(DB,Gstkid,row)} of
- {Row,Row} -> % stay here...
- config_line(DB,Pgstkid,Gstkid,Row,Opts);
- {missing,Row} -> % stay here...
- config_line(DB,Pgstkid,Gstkid,Row,Opts);
- {NewRow,OldRow} ->
- config_line(DB,Pgstkid,Gstkid,OldRow,Opts),
- Ngstkid = gstk_db:lookup_gstkid(DB,Gstkid#gstkid.id),
- case move_line(NewRow,OldRow,DB,Pgstkid#gstkid.widget_data,Ngstkid) of
- true ->
- gstk_db:insert_opt(DB,Ngstkid,{row,NewRow}),
+config(DB, #gstkid{parent = Parent} = Gstkid, Opts) ->
+ Pgstkid = gstk_db:lookup_gstkid(DB, Parent),
+ NewRow = gs:val(row, Opts, missing),
+ OldRow = gstk_db:opt(DB, Gstkid, row),
+ config_line(DB, Pgstkid, Gstkid, OldRow, Opts),
+ if
+ NewRow =:= OldRow; NewRow =:= missing -> ok;
+ true ->
+ Ngstkid = gstk_db:lookup_gstkid(DB, Gstkid#gstkid.id),
+ case move_line(NewRow, OldRow, DB, Pgstkid#gstkid.widget_data, Ngstkid) of
+ true ->
+ gstk_db:insert_opt(DB, Ngstkid, {row, NewRow}),
ok;
- {error,_Reason} -> ok
+ {error, _Reason} -> ok
end
- end,
- ok.
+ end.
%%----------------------------------------------------------------------
%% Returns: true|false depending on if operation succeeded
%%----------------------------------------------------------------------
-move_line(NewRow,OldRow,_DB,State,_Ngstkid) ->
- case ets:lookup(State#state.cell_pos,{1,NewRow}) of
- [] ->
- {error,{gridline,row_outside_grid,NewRow}};
- [{_,#item{line_id=Lid}}] when Lid =/= free->
- {error,{gridline,new_row_occupied,NewRow}};
- [{_,_NewItem}] ->
- #state{tkcanvas=TkW,ncols=Ncols,cell_pos=CP} = State,
- swap_lines(TkW,OldRow,NewRow,1,Ncols,CP),
+move_line(NewRow, OldRow, _DB, #state{cell_pos = CP} = State, _Ngstkid) ->
+ case ets:lookup(CP, {1, NewRow}) of
+ [] -> {error, {gridline, row_outside_grid, NewRow}};
+ [{_, #item{line_id = Lid}}] when Lid =/= free -> {error, {gridline, new_row_occupied, NewRow}};
+ [{_, _NewItem}] ->
+ #state{tkcanvas = TkW, ncols = Ncols} = State,
+ swap_lines(TkW, OldRow, NewRow, 1, Ncols, CP),
true
end.
%%----------------------------------------------------------------------
%% Purpose: swaps an empty newrow with a (oldrow) gridline
%%----------------------------------------------------------------------
-swap_lines(TkW,OldRow,NewRow,Col,MaxCol,CellPos) when Col =< MaxCol ->
- [{_,NewItem}] = ets:lookup(CellPos,{Col,NewRow}),
- [{_,OldItem}] = ets:lookup(CellPos,{Col,OldRow}),
- swap_cells(TkW,NewItem,OldItem),
- ets:insert(CellPos,{{Col,NewRow},OldItem}),
- ets:insert(CellPos,{{Col,OldRow},NewItem}),
- swap_lines(TkW,OldRow,NewRow,Col+1,MaxCol,CellPos);
-swap_lines(_,_,_,_,_,_) -> done.
+swap_lines(TkW, OldRow, NewRow, Col, MaxCol, CellPos) when Col =< MaxCol ->
+ CN = {Col, NewRow},
+ CO = {Col, OldRow},
+ [{_, NewItem}] = ets:lookup(CellPos, CN),
+ [{_, OldItem}] = ets:lookup(CellPos, CO),
+ swap_cells(TkW, NewItem, OldItem),
+ ets:insert(CellPos, {CN, OldItem}),
+ ets:insert(CellPos, {CO, NewItem}),
+ swap_lines(TkW, OldRow, NewRow, Col + 1, MaxCol, CellPos);
+swap_lines(_, _, _, _, _, _) -> done.
-swap_cells(TkW,#item{rect_id=NewRectId,text_id=NewTextId},
- #item{rect_id=OldRectId,text_id=OldTextId}) ->
+swap_cells(TkW, #item{rect_id = NewRectId, text_id = NewTextId}, #item{rect_id = OldRectId, text_id = OldTextId}) ->
Aorid = gstk:to_ascii(OldRectId),
Aotid = gstk:to_ascii(OldTextId),
Anrid = gstk:to_ascii(NewRectId),
Antid = gstk:to_ascii(NewTextId),
- Pre = [TkW," coords "],
- OldRectCoords = tcl2erl:ret_str([Pre,Aorid]),
- OldTextCoords = tcl2erl:ret_str([Pre,Aotid]),
- NewRectCoords = tcl2erl:ret_str([Pre,Anrid]),
- NewTextCoords = tcl2erl:ret_str([Pre,Antid]),
- gstk:exec([Pre,Aotid," ",NewTextCoords]),
- gstk:exec([Pre,Antid," ",OldTextCoords]),
- gstk:exec([Pre,Aorid," ",NewRectCoords]),
- gstk:exec([Pre,Anrid," ",OldRectCoords]).
+ Pre = [TkW, " coords "],
+ gstk:exec([Pre, Aotid, " ", tcl2erl:ret_str([Pre, Antid])]),
+ gstk:exec([Pre, Antid, " ", tcl2erl:ret_str([Pre, Aotid])]),
+ gstk:exec([Pre, Aorid, " ", tcl2erl:ret_str([Pre, Anrid])]),
+ gstk:exec([Pre, Anrid, " ", tcl2erl:ret_str([Pre, Aorid])]).
%%----------------------------------------------------------------------
-%% Pre: {row,Row} option is taken care of.
+%% Pre: {row, Row} option is taken care of.
%%----------------------------------------------------------------------
-config_line(DB,Pgstkid,Lgstkid,Row,Opts) ->
- #gstkid{widget_data=State, widget=TkW} = Pgstkid,
- #state{cell_pos=CP,ncols=Ncols} = State,
- Ropts = transform_opts(Opts,Ncols),
- RestOpts = config_gridline(DB,CP,Lgstkid,Ncols,Row,Ropts),
- gstk_generic:mk_cmd_and_exec(RestOpts,Lgstkid,TkW,"","",DB).
+config_line(DB, #gstkid{widget_data = #state{cell_pos = CP, ncols = Ncols}, widget = TkW}, Lgstkid, Row, Opts) ->
+ gstk_generic:mk_cmd_and_exec(config_gridline(DB, CP, Lgstkid, Ncols, Row, transform_opts(Opts, Ncols)),
+ Lgstkid, TkW, "", "", DB).
%%----------------------------------------------------------------------
%% Returns: non-processed options
%%----------------------------------------------------------------------
-config_gridline(_DB,_CP,_Gstkid,0,_Row,Opts) ->
- Opts;
-config_gridline(DB,CP,Gstkid,Col,Row,Opts) ->
- {ColOpts,OtherOpts} = opts_for_col(Col,Opts,[],[]),
- if
- ColOpts==[] -> done;
- true ->
- [{_pos,Item}] = ets:lookup(CP,{Col,Row}),
- TkW = Gstkid#gstkid.widget,
- TextPre = [TkW," itemconf ",gstk:to_ascii(Item#item.text_id)],
- RectPre = [$;,TkW," itemconf ",gstk:to_ascii(Item#item.rect_id)],
- case gstk_generic:make_command(ColOpts,Gstkid,TkW,
- TextPre,RectPre,DB) of
- [] -> ok;
- {error,_Reason} -> ok;
- Cmd -> gstk:exec(Cmd)
- end
- end,
- config_gridline(DB,CP,Gstkid,Col-1,Row,OtherOpts).
+config_gridline(_DB, _CP, _Gstkid, 0, _Row, Opts) -> Opts;
+config_gridline(DB, CP, Gstkid, Col, Row, Opts) ->
+ config_gridline(DB, CP, Gstkid, Col - 1, Row,
+ case opts_for_col(Col, Opts, [], []) of
+ {[], OtherOpts} -> OtherOpts;
+ {ColOpts, OtherOpts} ->
+ [{_pos, Item}] = ets:lookup(CP, {Col, Row}),
+ TkW = Gstkid#gstkid.widget,
+ case gstk_generic:make_command(ColOpts, Gstkid, TkW,
+ [TkW, " itemconf ", gstk:to_ascii(Item#item.text_id)],
+ [$;, TkW, " itemconf ", gstk:to_ascii(Item#item.rect_id)],
+ DB) of
+ {error, _Reason} -> ok;
+ Cmd -> Cmd =:= [] orelse gstk:exec(Cmd)
+ end,
+ OtherOpts
+ end).
-opts_for_col(Col,[{{Key,Col},Val}|Opts],ColOpts,RestOpts) ->
- opts_for_col(Col,Opts,[{{Key,Col},Val}|ColOpts],RestOpts);
-opts_for_col(Col,[Opt|Opts],ColOpts,RestOpts) ->
- opts_for_col(Col,Opts,ColOpts,[Opt|RestOpts]);
-opts_for_col(_Col,[],ColOpts,RestOpts) -> {ColOpts,RestOpts}.
+opts_for_col(Col, [{{_Key, _Col}, _Val} = V|Opts], ColOpts, RestOpts) -> opts_for_col(Col, Opts, [V|ColOpts], RestOpts);
+opts_for_col(Col, [Opt|Opts], ColOpts, RestOpts) -> opts_for_col(Col, Opts, ColOpts, [Opt|RestOpts]);
+opts_for_col(_Col, [], ColOpts, RestOpts) -> {ColOpts, RestOpts}.
%%----------------------------------------------------------------------
-%% {Key,{Col,Val}} becomes {{Key,Col},Val}
-%% {Key,Val} becomes {{Key,1},Val}...{{Key,Ncol},Val}
+%% {Key, {Col, Val}} becomes {{Key, Col}, Val}
+%% {Key, Val} becomes {{Key, 1}, Val}...{{Key, Ncol}, Val}
%%----------------------------------------------------------------------
transform_opts([], _Ncols) -> [];
-transform_opts([{{Key,Col},Val} | Opts],Ncols) ->
- [{{Key,Col},Val}|transform_opts(Opts,Ncols)];
-transform_opts([{Key,{Col,Val}}|Opts],Ncols) when is_integer(Col) ->
- [{{Key,Col},Val}|transform_opts(Opts,Ncols)];
-transform_opts([{Key,Val}|Opts],Ncols) ->
- case lists:member(Key,[fg,bg,text,font]) of
- true ->
- lists:append(expand_to_all_cols(Key,Val,Ncols),
- transform_opts(Opts,Ncols));
- false ->
- case lists:member(Key,[click,doubleclick,row]) of
- true ->
- [{keep_opt,{Key,Val}}|transform_opts(Opts,Ncols)];
- false ->
- [{Key,Val}|transform_opts(Opts,Ncols)]
- end
- end;
-transform_opts([Opt|Opts],Ncols) ->
- [Opt|transform_opts(Opts,Ncols)].
+transform_opts([{{_Key, _Col}, _Val} = V|Opts], Ncols) -> [V|transform_opts(Opts, Ncols)];
+transform_opts([{Key, {Col, Val}}|Opts], Ncols) when is_integer(Col) -> [{{Key, Col}, Val}|transform_opts(Opts, Ncols)];
+transform_opts([{Key, Val}|Opts], Ncols) when Key =:= fg; Key =:= bg; Key =:= text; Key =:= font ->
+ lists:append(expand_to_all_cols(Key, Val, Ncols), transform_opts(Opts, Ncols));
+transform_opts([{Key, Val}|Opts], Ncols) when Key =:= click; Key =:= doubleclick; Key =:= row ->
+ [{keep_opt, {Key, Val}}|transform_opts(Opts, Ncols)];
+transform_opts([Opt|Opts], Ncols) -> [Opt|transform_opts(Opts, Ncols)].
-expand_to_all_cols(Key,Val,1) ->
- [{{Key,1},Val}];
-expand_to_all_cols(Key,Val,Col) ->
- [{{Key,Col},Val}|expand_to_all_cols(Key,Val,Col-1)].
-
+expand_to_all_cols(Key, Val, 1) -> [{{Key, 1}, Val}];
+expand_to_all_cols(Key, Val, Col) -> [{{Key, Col}, Val}|expand_to_all_cols(Key, Val, Col - 1)].
-read(DB, Gstkid, Opt) ->
- Pgstkid = gstk_db:lookup_gstkid(DB,Gstkid#gstkid.parent),
- gstk_generic:read_option(DB, Gstkid, Opt,Pgstkid).
+read(DB, #gstkid{parent = Parent} = Gstkid, Opt) ->
+ gstk_generic:read_option(DB, Gstkid, Opt, gstk_db:lookup_gstkid(DB, Parent)).
-read_option({font,Column},Gstkid, _TkW,DB,Pgstkid) ->
- case gstk_db:opt_or_not(DB,Gstkid,{font,Column}) of
- false -> gstk_db:opt(DB,Pgstkid,font);
- {value,V} -> V
+read_option({font, _Column} = Option, Gstkid, _TkW, DB, Pgstkid) ->
+ case gstk_db:opt_or_not(DB, Gstkid, Option) of
+ false -> gstk_db:opt(DB, Pgstkid, font);
+ {value, V} -> V
end;
-read_option({Opt,Column},Gstkid, TkW,DB,#gstkid{widget_data=State}) ->
- Row = gstk_db:opt(DB,Gstkid,row),
- [{_pos,Item}] = ets:lookup(State#state.cell_pos,{Column,Row}),
- Rid = gstk:to_ascii(Item#item.rect_id),
- Tid = gstk:to_ascii(Item#item.text_id),
- Pre = [TkW," itemcg "],
- case Opt of
- bg -> tcl2erl:ret_color([Pre,Rid," -f"]);
- fg -> tcl2erl:ret_color([Pre,Tid," -fi"]);
- text -> tcl2erl:ret_str([Pre,Tid," -te"]);
- _ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, {Opt,Column}}}
+read_option({Opt, Column}, Gstkid, TkW, DB, #gstkid{widget_data = #state{cell_pos = CP}}) ->
+ [{_pos, #item{rect_id = RId, text_id = TId}}] = ets:lookup(CP, {Column, gstk_db:opt(DB, Gstkid, row)}),
+ Pre = [TkW, " itemcg "],
+ if
+ Opt =:= bg -> ret_color(Pre, RId, " -f");
+ Opt =:= fg -> ret_color(Pre, TId, " -fi");
+ Opt =:= text -> tcl2erl:ret_str([Pre, gstk:to_ascii(TId), " -te"]);
+ true -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, {Opt, Column}}}
end;
-read_option(Option,Gstkid,TkW,DB,Pgstkid) ->
- case lists:member(Option,[bg,fg,text]) of
- true -> read_option({Option,1},Gstkid,TkW,DB,Pgstkid);
- false -> gstk_db:opt(DB,Gstkid,Option,undefined)
- end.
+read_option(Option, Gstkid, TkW, DB, Pgstkid) when Option =:= bg; Option =:= fg; Option =:= text ->
+ read_option({Option, 1}, Gstkid, TkW, DB, Pgstkid);
+read_option(Option, Gstkid, _TkW, DB, _Pgstkid) -> gstk_db:opt(DB, Gstkid, Option, undefined).
-update_cp_db(0,_Row,_,_) -> ok;
-update_cp_db(Col,Row,ID,CP) ->
- [{_,Item}] = ets:lookup(CP,{Col,Row}),
- ets:insert(CP,{{Col,Row},Item#item{line_id = ID}}),
- update_cp_db(Col-1,Row,ID,CP).
+ret_color(Pre, Id, Str) -> tcl2erl:ret_color([Pre, gstk:to_ascii(Id), Str]).
+update_cp_db(0, _Row, _, _) -> ok;
+update_cp_db(Col, Row, ID, CP) ->
+ CR = {Col, Row},
+ [{_, Item}] = ets:lookup(CP, CR),
+ ets:insert(CP, {CR, Item#item{line_id = ID}}),
+ update_cp_db(Col - 1, Row, ID, CP).
-event(DB, GridGstkid, Etype, _Edata, [CanItem]) ->
- State = GridGstkid#gstkid.widget_data,
- #state{cell_pos=CP,cell_id=CIs,tkcanvas=TkW} = State,
- case ets:lookup(CIs,CanItem) of
- [{_id,{Col,Row}}] ->
- [{_pos,Item}] = ets:lookup(CP,{Col,Row}),
- case Item#item.line_id of
- free -> ok;
- Id ->
- Lgstkid = gstk_db:lookup_gstkid(DB,Id),
- case gstk_db:opt_or_not(DB,Lgstkid,Etype) of
- {value,true} ->
- Txt = read_option({text,Col},Lgstkid,TkW,
- DB,GridGstkid),
- gstk_generic:event(DB,Lgstkid,Etype,dummy,
- [Col,Row,Txt]);
+event(DB, #gstkid{widget_data = #state{cell_pos = CP, cell_id = CIs, tkcanvas = TkW}} = GridGstkid,
+ Etype, _Edata, [CanItem]) ->
+ case ets:lookup(CIs, CanItem) of
+ [{_id, {Col, Row} = CR}] ->
+ case ets:lookup(CP, CR) of
+ [{_pos, #item{line_id = free}}] -> ok;
+ [{_pos, #item{line_id = Id}}] ->
+ Lgstkid = gstk_db:lookup_gstkid(DB, Id),
+ case gstk_db:opt_or_not(DB, Lgstkid, Etype) of
+ {value, true} -> gstk_generic:event(DB, Lgstkid, Etype, dummy,
+ [Col, Row, read_option({text, Col},
+ Lgstkid, TkW, DB, GridGstkid)]);
_ -> ok
end
end;
_ -> ok
end;
-event(_DB, _Gstkid, _Etype, _Edata, _Args) ->
- ok.
+event(_DB, _Gstkid, _Etype, _Edata, _Args) -> ok.
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_gs.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_gs.erl
--- otp_src_19.0.5/lib/gs/src/gstk_gs.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_gs.erl 2016-08-25 16:37:44.564693354 +0300
@@ -35,20 +35,16 @@
%% The GS object implementation
%%----------------------------------------------------------------------
-mk_create_opts_for_child(DB,Cgstkid, Pgstkid, Opts) ->
- gstk_generic:mk_create_opts_for_child(DB,Cgstkid,Pgstkid,Opts).
+mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts) ->
+ gstk_generic:mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts).
config(DB, Gstkid, Opts) ->
- Cmd=gstk_generic:make_command(Opts,Gstkid,"",DB),
- gstk:exec(Cmd),
+ gstk:exec(gstk_generic:make_command(Opts, Gstkid, "", DB)),
ok.
-read(DB, Gstkid, Opt) ->
- gstk_generic:read_option(DB, Gstkid, Opt).
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
% No options of my own
-read_option(Option,Gstkid, _TkW,_DB,_) ->
- {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}.
+read_option(Option, #gstkid{objtype = ObjType}, _TkW, _DB, _) -> {bad_result, {ObjType, invalid_option, Option}}.
-option(_Option, _Gstkid, _TkW, _DB,_) ->
- invalid_option.
+option(_Option, _Gstkid, _TkW, _DB, _) -> invalid_option.
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk.hrl otp_src_19.0.5-lib-gs/lib/gs/src/gstk.hrl
--- otp_src_19.0.5/lib/gs/src/gstk.hrl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk.hrl 2016-08-25 16:37:44.564693354 +0300
@@ -21,9 +21,6 @@
%%
%% *NOTE*: if you change here, change ets:match in gstk_db too!
--record(gstkid, {id=undefined, widget, widget_data, owner, parent,
- objtype}).
+-record(gstkid, {id = undefined, widget, widget_data, owner, parent, objtype}).
-record(so, {main, object, hscroll, vscroll, misc}).
-
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_image.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_image.erl
--- otp_src_19.0.5/lib/gs/src/gstk_image.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_image.erl 2016-08-25 16:37:44.564693354 +0300
@@ -24,7 +24,8 @@
%% ------------------------------------------------------------
-module(gstk_image).
--compile([{nowarn_deprecated_function,{gs,pair,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, pair, 2}}]).
%%-----------------------------------------------------------------------------
%% BITMAP OPTIONS
@@ -33,12 +34,12 @@
%% anchor n|w|e|s|nw|sw|ne|se|center
%% bg Color
%% bitmap String
-%% coords [{X,Y}]
+%% coords [{X, Y}]
%% data Data
%% fg Color
%%
%% Attributes for gifs only:
-%% pix_val {{X,Y},Color}|{{{X1,Y1},{X2,Y2}},Color]
+%% pix_val {{X, Y}, Color}|{{{X1, Y1}, {X2, Y2}}, Color]
%% save String
%% refresh
%%
@@ -59,7 +60,7 @@
%% motion [Bool | {Bool, Data}]
%%
%% Read Options:
-%% pix_val {X,Y}
+%% pix_val {X, Y}
%% children
%% id
%% parent
@@ -68,8 +69,7 @@
%% Not Implemented:
%%
--export([create/3, config/3, read/3, delete/2, destroy/3, event/5,
- option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, destroy/3, event/5, option/5, read_option/5]).
-include("gstk.hrl").
@@ -91,69 +91,55 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
create(DB, Gstkid, Opts) ->
case pickout_type(Opts) of
- bitmap ->
- create(bitmap,DB, Gstkid, Opts);
- _gif -> %%Default gif
- create(gif,DB, Gstkid, Opts)
+ bitmap -> create(bitmap, DB, Gstkid, Opts);
+ _gif -> create(gif, DB, Gstkid, Opts) %%Default gif
end.
-create(gif,DB, Gstkid, Opts) ->
+create(gif, DB, Gstkid, Opts) ->
case pickout_coords(Opts, []) of
- {error, Error} ->
- {bad_result, Error};
- {Coords, NewOpts} ->
- CCmd = "image create photo",
- case tcl2erl:ret_atom(CCmd) of
- Photo_item when is_atom(Photo_item) ->
- #gstkid{parent=Parent,owner=Owner,id=Id}=Gstkid,
- Pgstkid = gstk_db:lookup_gstkid(DB, Parent, Owner),
- SO = Pgstkid#gstkid.widget_data,
- CanvasTkW = SO#so.object,
- Photo_item_s = atom_to_list(Photo_item),
- gstk_db:insert_opt(DB,Id,gs:pair(coords,Opts)),
- Ngstkid=Gstkid#gstkid{widget=CanvasTkW,
- widget_data={Photo_item_s,unknown}},
- gstk_db:update_widget(DB,Ngstkid),
- MCmd = [CanvasTkW," create image ",Coords," -image ",
- Photo_item_s," -anchor nw"],
- case gstk_canvas:make_command(NewOpts, Ngstkid,
- CanvasTkW, MCmd, DB) of
- {error,Reason} -> {error,Reason};
- Cmd when is_list(Cmd) ->
- case tcl2erl:ret_int(Cmd) of
- Item when is_integer(Item) ->
- %% buu, not nice
- G2 = gstk_db:lookup_gstkid(DB,Id),
- NewWidget = {Photo_item_s,Item},
- NewGstkid = G2#gstkid{widget_data=NewWidget},
- gstk_db:insert_widget(DB, NewGstkid),
- NewGstkid;
- Bad_result ->
- {error,Bad_result}
- end
- end;
- Bad_result ->
- {error,Bad_result}
- end
+ {error, Error} -> {bad_result, Error};
+ {Coords, NewOpts} -> case tcl2erl:ret_atom("image create photo") of
+ Photo_item when is_atom(Photo_item) ->
+ #gstkid{parent = Parent, owner = Owner, id = Id} = Gstkid,
+ Pgstkid = gstk_db:lookup_gstkid(DB, Parent, Owner),
+ #so{object = CanvasTkW} = Pgstkid#gstkid.widget_data,
+ Photo_item_s = atom_to_list(Photo_item),
+ gstk_db:insert_opt(DB, Id, gs:pair(coords, Opts)),
+ Ngstkid = Gstkid#gstkid{widget = CanvasTkW, widget_data = {Photo_item_s, unknown}},
+ gstk_db:update_widget(DB, Ngstkid),
+ case gstk_canvas:make_command(NewOpts, Ngstkid, CanvasTkW,
+ [CanvasTkW, " create image ", Coords, " -image ",
+ Photo_item_s, " -anchor nw"],
+ DB) of
+ {error, _Reason} = E -> E;
+ Cmd when is_list(Cmd) -> case tcl2erl:ret_int(Cmd) of
+ Item when is_integer(Item) ->
+ %% buu, not nice
+ G2 = gstk_db:lookup_gstkid(DB, Id),
+ NewGstkid =
+ G2#gstkid{widget_data =
+ {Photo_item_s, Item}},
+ gstk_db:insert_widget(DB, NewGstkid),
+ NewGstkid;
+ Bad_result -> {error, Bad_result}
+ end
+ end;
+ Bad_result -> {error, Bad_result}
+ end
end;
-create(bitmap,DB, Gstkid, Opts) ->
+create(bitmap, DB, Gstkid, Opts) ->
case pickout_coords(Opts, []) of
- {error, Error} ->
- {bad_result, Error};
+ {error, Error} -> {bad_result, Error};
{Coords, NewOpts} ->
- #gstkid{parent=Parent,owner=Owner,id=Id}=Gstkid,
- Pgstkid = gstk_db:lookup_gstkid(DB, Parent, Owner),
- SO = Pgstkid#gstkid.widget_data,
- CanvasTkW = SO#so.object,
- gstk_db:insert_opt(DB,Id,gs:pair(coords,Opts)),
- Ngstkid=Gstkid#gstkid{widget=CanvasTkW, widget_data=no_item},
- gstk_db:update_widget(DB,Ngstkid),
- MCmd = [CanvasTkW," create bi ", Coords],
- gstk_canvas:mk_cmd_and_call(NewOpts,Ngstkid, CanvasTkW, MCmd,DB)
+ #gstkid{parent = Parent, owner = Owner, id = Id} = Gstkid,
+ #gstkid{widget_data = #so{object = CanvasTkW}} = gstk_db:lookup_gstkid(DB, Parent, Owner),
+ gstk_db:insert_opt(DB, Id, gs:pair(coords, Opts)),
+ Ngstkid = Gstkid#gstkid{widget = CanvasTkW, widget_data=no_item},
+ gstk_db:update_widget(DB, Ngstkid),
+ gstk_canvas:mk_cmd_and_call(NewOpts, Ngstkid, CanvasTkW, [CanvasTkW, " create bi ", Coords], DB)
end.
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : config/3
%% Purpose : Configure a widget of the type defined in this module.
@@ -166,8 +152,7 @@ create(bitmap,DB, Gstkid, Opts) ->
config(DB, Gstkid, Opts) ->
{Canvas, Item} = get_widget(Gstkid),
AItem = gstk:to_ascii(Item),
- SCmd = [Canvas, " itemconf ", AItem],
- gstk_canvas:mk_cmd_and_exec(Opts, Gstkid, Canvas, AItem, SCmd, DB).
+ gstk_canvas:mk_cmd_and_exec(Opts, Gstkid, Canvas, AItem, [Canvas, " itemconf ", AItem], DB).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -180,7 +165,7 @@ config(DB, Gstkid, Opts) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
read(DB, Gstkid, Opt) ->
{_, Item} = get_widget(Gstkid),
- gstk_generic:read_option(DB,Gstkid,Opt,[gstk:to_ascii(Item)]).
+ gstk_generic:read_option(DB, Gstkid, Opt, [gstk:to_ascii(Item)]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : delete/2
@@ -190,9 +175,8 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy | {Parent, Objmod, Args}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{parent = P, id = ID} = Gstkid) ->
gstk_db:delete_widget(DB, Gstkid),
- #gstkid{parent=P,id=ID}=Gstkid,
{Canvas, Item} = get_widget(Gstkid),
{P, ID, gstk_image, [Canvas, Item]}.
@@ -205,12 +189,9 @@ delete(DB, Gstkid) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-destroy(_DB, Canvas, Item) ->
- gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-
+destroy(_DB, Canvas, Item) -> gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%%------------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -226,96 +207,82 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%%
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, _Canvas, _DB, _AItem) ->
- case Option of
- {bitmap, Bitmap} ->
- BF = re:replace(Bitmap, [92,92], "/", [global,{return,list}]),
- {s, [" -bi @", BF]};
- {load_gif, File} ->
- F2 = re:replace(File, [92,92], "/", [global,{return,list}]),
- {Photo_item, _item} = Gstkid#gstkid.widget_data,
- {c,[Photo_item, " configure -file ", gstk:to_ascii(F2)]};
- {pix_val, {Coords,Color}} ->
- {Photo_item, _item} = Gstkid#gstkid.widget_data,
- {c, [Photo_item, " put ", gstk:to_color(Color), " -to ",
- coords(Coords)]};
- {save_gif, Name} ->
- {Photo_item, _item} = Gstkid#gstkid.widget_data,
- {c, [Photo_item, " write ", gstk:to_ascii(Name)]};
- {fg, Color} -> {s, [" -fo ", gstk:to_color(Color)]};
- {bg, Color} -> {s, [" -ba ", gstk:to_color(Color)]};
- {anchor, How} -> {s, [" -anchor ", gstk:to_ascii(How)]};
- _ -> invalid_option
- end.
+option(Option, Gstkid, _Canvas, _DB, _AItem) -> option(Option, Gstkid).
+
+option({load_gif, File}, #gstkid{widget_data = {Photo_item, _item}}) ->
+ option_c([Photo_item, " configure -file ",
+ gstk:to_ascii(re:replace(File, [92, 92], "/", [global, {return, list}]))]);
+option({pix_val, {Coords, Color}}, #gstkid{widget_data = {Photo_item, _item}}) ->
+ option_c([Photo_item, " put ", gstk:to_color(Color), " -to ", coords(Coords)]);
+option({save_gif, Name}, #gstkid{widget_data = {Photo_item, _item}}) ->
+ option_c([Photo_item, " write ", gstk:to_ascii(Name)]);
+option(Option, _Gstkid) -> option(Option).
+
+option({bitmap, Bitmap}) -> option_s(" -bi @", re:replace(Bitmap, [92, 92], "/", [global, {return, list}]));
+option({fg, Color}) -> to_color(" -fo ", Color);
+option({bg, Color}) -> to_color(" -ba ", Color);
+option({anchor, How}) -> option_s(" -anchor ", gstk:to_ascii(How));
+option(_Option) -> invalid_option.
+
+option_c(L) -> {c, L}.
+
+option_s(L) -> {s, L}.
+
+option_s(Str, Val) -> option_s([Str, Val]).
+to_color(Str, Color) -> option_s(Str, gstk:to_color(Color)).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/5
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option, Gstkid, Canvas, _DB, AItem) ->
- case Option of
- anchor -> tcl2erl:ret_atom([Canvas," itemcget ",AItem," -anchor"]);
- bg -> tcl2erl:ret_color([Canvas, " itemcget ", AItem, " -ba"]);
- bitmap -> tcl2erl:ret_file([Canvas, " itemcget ", AItem, " -bi"]);
- fg -> tcl2erl:ret_color([Canvas, " itemcget ", AItem, " -fo"]);
- {pix_val,{X,Y}} ->
- {Photo_item, _item} = Gstkid#gstkid.widget_data,
- ret_photo_color([Photo_item," get ",coords({X,Y})]);
- _ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
- end.
+read_option(Option, Gstkid, Canvas, _DB, AItem) -> read_option(Option, Gstkid, Canvas, AItem).
-ret_photo_color(Cmd) ->
- case gstk:call(Cmd) of
- {result,Str} ->
- {ok, [R,G,B],[]} = io_lib:fread("~d ~d ~d", Str),
- {R,G,B};
+read_option({pix_val, {_, _} = XY}, #gstkid{widget_data = {Photo_item, _item}}, _Canvas, _AItem) ->
+ case gstk:call([Photo_item, " get ", coords(XY)]) of
+ {result, Str} ->
+ {ok, [R, G, B], []} = io_lib:fread("~d ~d ~d", Str),
+ {R, G, B};
Bad_result -> Bad_result
+ end;
+read_option(Option, Gstkid, Canvas, AItem) ->
+ case read_option(Option, AItem, Canvas) of
+ invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+ O -> O
end.
+read_option(anchor, AItem, Canvas) -> tcl2erl:ret_atom([Canvas, " itemcget ", AItem, " -anchor"]);
+read_option(bitmap, AItem, Canvas) -> tcl2erl:ret_file([Canvas, " itemcget ", AItem, " -bi"]);
+read_option(bg, AItem, Canvas) -> ret_color(" -ba", AItem, Canvas);
+read_option(fg, AItem, Canvas) -> ret_color(" -fo", AItem, Canvas);
+read_option(_Option, _AItem, _Canvas) -> invalid_option.
+
+ret_color(Str, AItem, Canvas) -> tcl2erl:ret_color([Canvas, " itemcget ", AItem, Str]).
%%------------------------------------------------------------------------------
%% PRIMITIVES
%%------------------------------------------------------------------------------
-get_widget(#gstkid{widget=Canvas,widget_data={_Photo_item,Item}}) ->
- {Canvas,Item};
-get_widget(#gstkid{widget=Canvas,widget_data=Item}) ->
- {Canvas,Item}.
+get_widget(#gstkid{widget = Canvas, widget_data ={_Photo_item, Item}}) -> {Canvas, Item};
+get_widget(#gstkid{widget = Canvas, widget_data = Item}) -> {Canvas, Item}.
-pickout_coords([{coords,Coords} | Rest], Opts) when length(Coords) == 1 ->
+pickout_coords([{coords, [_] = Coords}|Rest], Opts) ->
case coords(Coords) of
- invalid ->
- {error, "An image must have two coordinates"};
- RealCoords ->
- {RealCoords, lists:append(Rest, Opts)}
+ invalid -> {error, "An image must have two coordinates"};
+ RealCoords -> {RealCoords, lists:append(Rest, Opts)}
end;
-pickout_coords([Opt | Rest], Opts) ->
- pickout_coords(Rest, [Opt|Opts]);
-pickout_coords([], _Opts) ->
- {error, "An image must have two coordinates"}.
-
-coords({X,Y}) when is_number(X),is_number(Y) ->
- [gstk:to_ascii(X), " ", gstk:to_ascii(Y), " "];
-coords([{X,Y} | R]) when is_number(X),is_number(Y) ->
- [gstk:to_ascii(X), " ", gstk:to_ascii(Y), " ", coords(R)];
-coords({{X1,Y1},{X2,Y2}}) when is_number(X1),is_number(Y1),is_number(X2),is_number(Y2) ->
- [gstk:to_ascii(X1), " ", gstk:to_ascii(Y1)," ",
- gstk:to_ascii(X2), " ", gstk:to_ascii(Y2)];
-coords([_]) -> %% not a pair
- invalid;
-coords([]) ->
- [].
+pickout_coords([Opt|Rest], Opts) -> pickout_coords(Rest, [Opt|Opts]);
+pickout_coords([], _Opts) -> {error, "An image must have two coordinates"}.
+coords({X, Y}) when is_number(X), is_number(Y) -> [gstk:to_ascii(X), " ", gstk:to_ascii(Y), " "];
+coords([{X, Y}|R]) when is_number(X), is_number(Y) -> [gstk:to_ascii(X), " ", gstk:to_ascii(Y), " ", coords(R)];
+coords({{X1, Y1}, {X2, Y2}}) when is_number(X1), is_number(Y1), is_number(X2), is_number(Y2) ->
+ [gstk:to_ascii(X1), " ", gstk:to_ascii(Y1), " ", gstk:to_ascii(X2), " ", gstk:to_ascii(Y2)];
+coords([_]) -> invalid; %% not a pair
+coords([]) -> [].
-pickout_type([{bitmap,_Str}|_Options]) ->
- bitmap;
-pickout_type([{gif,_Str}|_Options]) ->
- gif;
-pickout_type([]) ->
- none;
-pickout_type([_|Tail]) ->
- pickout_type(Tail).
+pickout_type([{Pic, _Str}|_Options]) when Pic =:= bitmap; Pic =:= gif -> bitmap;
+pickout_type([]) -> none;
+pickout_type([_|Tail]) -> pickout_type(Tail).
%% ----- Done -----
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_label.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_label.erl
--- otp_src_19.0.5/lib/gs/src/gstk_label.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_label.erl 2016-08-25 16:37:44.564693354 +0300
@@ -28,8 +28,8 @@
%% LABEL OPTIONS
%%
%% Attributes:
-%% align n,w,s,e,nw,se,ne,sw,center
-%% anchor n,w,s,e,nw,se,ne,sw,center
+%% align n, w,s, e,nw, se, ne, sw, center
+%% anchor n, w,s, e,nw, se, ne, sw, center
%% bg Color
%% bw Int
%% data Data
@@ -76,7 +76,7 @@
%% focus ?????? (-takefocus)
%%
--export([create/3,config/3,read/3,delete/2,event/5,option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5]).
-include("gstk.hrl").
@@ -88,13 +88,12 @@
%% Purpose : Create a widget of the type defined in this module.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
create(DB, GstkId, Opts) ->
- TkW = gstk_generic:mk_tkw_child(DB,GstkId),
- PlacePreCmd = [";place ", TkW],
- Ngstkid = GstkId#gstkid{widget=TkW},
- case gstk_generic:make_command(Opts,Ngstkid,TkW,"",PlacePreCmd,DB) of
- {error,Reason} -> {error,Reason};
+ TkW = gstk_generic:mk_tkw_child(DB, GstkId),
+ Ngstkid = GstkId#gstkid{widget = TkW},
+ case gstk_generic:make_command(Opts, Ngstkid, TkW, "", [";place ", TkW], DB) of
+ {error, _Reason} = E -> E;
Cmd when is_list(Cmd) ->
- gstk:exec(["label ", TkW,Cmd]),
+ gstk:exec(["label ", TkW, Cmd]),
Ngstkid
end.
@@ -107,11 +106,8 @@ create(DB, GstkId, Opts) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
- TkW = Gstkid#gstkid.widget,
- SimplePreCmd = [TkW, " conf"],
- PlacePreCmd = [";place ", TkW],
- gstk_generic:mk_cmd_and_exec(Opts,Gstkid,TkW,SimplePreCmd,PlacePreCmd,DB).
+config(DB, #gstkid{widget = TkW} = Gstkid, Opts) ->
+ gstk_generic:mk_cmd_and_exec(Opts, Gstkid, TkW, [TkW, " conf"], [";place ", TkW], DB).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -122,8 +118,7 @@ config(DB, Gstkid, Opts) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- gstk_generic:read_option(DB, Gstkid, Opt).
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -134,13 +129,11 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
gstk_db:delete_widget(DB, Gstkid),
- Gstkid#gstkid.widget.
-
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+ TkW.
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%%-----------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -155,12 +148,13 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%%
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, _Gstkid, _TkW, _DB,_) ->
- case Option of
- {underline, Int} -> {s, [" -und ", gstk:to_ascii(Int)]};
- {wraplength, Int} -> {s, [" -wra ", gstk:to_ascii(Int)]};
- _ -> invalid_option
- end.
+option(Option, _Gstkid, _TkW, _DB, _) -> option(Option).
+
+option({underline, Int}) -> to_ascii(" -und ", Int);
+option({wraplength, Int}) -> to_ascii(" -wra ", Int);
+option(_Option) -> invalid_option.
+
+to_ascii(Str, Int) -> {s, [Str, gstk:to_ascii(Int)]}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/4
@@ -172,12 +166,16 @@ option(Option, _Gstkid, _TkW, _DB,_) ->
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,Gstkid,TkW,_DB,_) ->
- case Option of
- underline -> tcl2erl:ret_int([TkW," cg -und"]);
- wraplength -> tcl2erl:ret_int([TkW," cg -wra"]);
- _ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+read_option(Option, Gstkid, TkW, _DB, _) ->
+ case read_option(Option, TkW) of
+ invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+ O -> O
end.
-%%% ----- Done -----
+read_option(underline, TkW) -> ret_int(" cg -und", TkW);
+read_option(wraplength, TkW) -> ret_int(" cg -wra", TkW);
+read_option(_Option, _TkW) -> invalid_option.
+
+ret_int(Str, TkW) -> tcl2erl:ret_int([TkW, Str]).
+%%% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_line.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_line.erl
--- otp_src_19.0.5/lib/gs/src/gstk_line.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_line.erl 2016-08-25 16:37:44.565693335 +0300
@@ -25,14 +25,13 @@
-module(gstk_line).
-
%%-----------------------------------------------------------------------------
%% LINE OPTIONS
%%
%% Attributes:
%% arrow none | first | last | both
%% capstyle butt | projecting | round
-%% coords [{X1,Y1}, {X2,Y2} | {Xn,Yn}]
+%% coords [{X1, Y1}, {X2, Y2} | {Xn, Yn}]
%% data Data
%% fg Color
%% joinstyle miter | bevel | round
@@ -66,8 +65,7 @@
%% Not Implemented:
%%
--export([create/3, config/3, read/3, delete/2, destroy/3, event/5,
- option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, destroy/3, event/5, option/5, read_option/5]).
-include("gstk.hrl").
@@ -80,23 +78,18 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
create(DB, Gstkid, Opts) ->
case pickout_coords(Opts, []) of
- {error, Error} ->
- {bad_result, Error};
+ {error, Error} -> {bad_result, Error};
{Coords, NewOpts} ->
- Ngstkid=gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
- #gstkid{widget=CanvasTkW}=Ngstkid,
- MCmd = [CanvasTkW, " create li ", Coords],
- gstk_canvas:mk_cmd_and_call(NewOpts,Ngstkid, CanvasTkW, MCmd, DB)
+ #gstkid{widget = CanvasTkW} = Ngstkid = gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
+ gstk_canvas:mk_cmd_and_call(NewOpts, Ngstkid, CanvasTkW, [CanvasTkW, " create li ", Coords], DB)
end.
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : config/3
%% Purpose : Configure a widget of the type defined in this module.
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
- gstk_canvas:item_config(DB, Gstkid, Opts).
+config(DB, Gstkid, Opts) -> gstk_canvas:item_config(DB, Gstkid, Opts).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -107,9 +100,7 @@ config(DB, Gstkid, Opts) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- Item = Gstkid#gstkid.widget_data,
- gstk_generic:read_option(DB,Gstkid,Opt,[gstk:to_ascii(Item)]).
+read(DB, #gstkid{widget_data = Item} = Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt, [gstk:to_ascii(Item)]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : delete/2
@@ -119,8 +110,7 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy | {Parent, Objmod, Args}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
- gstk_canvas:item_delete_impl(DB,Gstkid).
+delete(DB, Gstkid) -> gstk_canvas:item_delete_impl(DB, Gstkid).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : destroy/3
@@ -131,12 +121,9 @@ delete(DB, Gstkid) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-destroy(_DB, Canvas, Item) ->
- gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-
+destroy(_DB, Canvas, Item) -> gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%%-----------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -152,19 +139,22 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%%
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, _Gstkid, _Canvas, _DB, _AItem) ->
- case Option of
- {arrow, Where} -> {s, [" -arrow ", gstk:to_ascii(Where)]};
- {capstyle, Style} -> {s, [" -ca ", gstk:to_ascii(Style)]};
- {fg, Color} -> {s, [" -f ", gstk:to_color(Color)]};
- {joinstyle, Style} -> {s, [" -jo ", gstk:to_ascii(Style)]};
- {smooth, Bool} -> {s, [" -sm ", gstk:to_ascii(Bool)]};
- {splinesteps, Int} -> {s, [" -sp ", gstk:to_ascii(Int)]};
- {width, Int} -> {s, [" -w ", gstk:to_ascii(Int)]};
+option(Option, _Gstkid, _Canvas, _DB, _AItem) -> option(Option).
- _ -> invalid_option
- end.
+option({fg, Color}) -> option_s(" -f ", gstk:to_color(Color));
+option({arrow, Where}) -> to_ascii(" -arrow ", Where);
+option({capstyle, Style}) -> to_ascii(" -ca ", Style);
+option({joinstyle, Style}) -> to_ascii(" -jo ", Style);
+option({smooth, Bool}) -> to_ascii(" -sm ", Bool);
+option({splinesteps, Int}) -> to_ascii(" -sp ", Int);
+option({width, Int}) -> to_ascii(" -w ", Int);
+option(_Option) -> invalid_option.
+
+option_s(L) -> {s, L}.
+option_s(Str, Val) -> option_s([Str, Val]).
+
+to_ascii(Str, Val) -> option_s(Str, gstk:to_ascii(Val)).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/5
@@ -174,30 +164,31 @@ option(Option, _Gstkid, _Canvas, _DB, _A
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
read_option(Option, Gstkid, Canvas, _DB, AItem) ->
- case Option of
- arrow -> tcl2erl:ret_atom([Canvas, " itemcg ",AItem, " -arrow"]);
- capstyle -> tcl2erl:ret_atom([Canvas, " itemcg ", AItem, " -ca"]);
- fg -> tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -f"]);
- joinstyle -> tcl2erl:ret_atom([Canvas, " itemcg ", AItem, " -jo"]);
- smooth -> tcl2erl:ret_bool([Canvas, " itemcg ", AItem, " -sm"]);
- splinesteps -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -sp"]);
- stipple ->
- tcl2erl:ret_stipple([Canvas," itemcg ",AItem," -stipple"]);
- width -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -w"]);
- _ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+ case read_option(Option, AItem, Canvas) of
+ invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+ O -> O
end.
-pickout_coords([{coords,Coords} | Rest], Opts) when length(Coords) >= 2 ->
+read_option(arrow, AItem, Canvas) -> ret_atom(" -arrow", AItem, Canvas);
+read_option(capstyle, AItem, Canvas) -> ret_atom(" -ca", AItem, Canvas);
+read_option(joinstyle, AItem, Canvas) -> ret_atom(" -jo", AItem, Canvas);
+read_option(fg, AItem, Canvas) -> tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -f"]);
+read_option(smooth, AItem, Canvas) -> tcl2erl:ret_bool([Canvas, " itemcg ", AItem, " -sm"]);
+read_option(splinesteps, AItem, Canvas) -> ret_int(" -sp", AItem, Canvas);
+read_option(width, AItem, Canvas) -> ret_int(" -w", AItem, Canvas);
+read_option(stipple, AItem, Canvas) -> tcl2erl:ret_stipple([Canvas, " itemcg ", AItem, " -stipple"]);
+read_option(_Option, _AItem, _Canvas) -> invalid_option.
+
+ret_atom(Str, AItem, Canvas) -> tcl2erl:ret_atom([Canvas, " itemcg ", AItem, Str]).
+
+ret_int(Str, AItem, Canvas) -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, Str]).
+
+pickout_coords([], _Opts) -> {error, "A line must have at least four coordinates"};
+pickout_coords([{coords, [_,_|_] = Coords}|Rest], Opts) ->
case gstk_canvas:coords(Coords) of
- invalid ->
- {error, "A line must have at least four coordinates"};
- RealCoords ->
- {RealCoords, lists:append(Rest, Opts)}
+ invalid -> pickout_coords([], Opts);
+ RealCoords -> {RealCoords, lists:append(Rest, Opts)}
end;
-pickout_coords([Opt | Rest], Opts) ->
- pickout_coords(Rest, [Opt|Opts]);
-pickout_coords([], _Opts) ->
- {error, "A line must have at least four coordinates"}.
+pickout_coords([Opt|Rest], Opts) -> pickout_coords(Rest, [Opt|Opts]).
%% ----- Done -----
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_listbox.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_listbox.erl
--- otp_src_19.0.5/lib/gs/src/gstk_listbox.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_listbox.erl 2016-08-25 16:37:44.565693335 +0300
@@ -30,7 +30,7 @@
%%
%% Attributes:
%% activebg Color
-%% anchor n,w,s,e,nw,se,ne,sw,center
+%% anchor n, w,s, e,nw, se, ne, sw, center
%% bc Color
%% bg Color
%% bw Wth
@@ -63,7 +63,7 @@
%% del Index | {FromIdx, ToIdx}
%% get Index
%% see Index
-%% selection => [Idx1,Idx2,Idx3...]
+%% selection => [Idx1, Idx2, Idx3...]
%% setfocus Bool
%% size Int
%%
@@ -88,8 +88,7 @@
%% type
%%
--export([create/3,config/3,read/3,delete/2,event/5,wid_event/5,option/5,
- read_option/5]).
+-export([create/3, config/3, read/3, delete/2, event/5, wid_event/5, option/5, read_option/5]).
-include("gstk.hrl").
@@ -101,32 +100,25 @@
%% Purpose : Create a widget of the type defined in this module.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
create(DB, GstkId, Opts) ->
- MainW = gstk_generic:mk_tkw_child(DB,GstkId),
- Listbox = lists:append(MainW,".z"),
- {Vscroll, Hscroll, NewOpts} = gstk_generic:parse_scrolls(Opts),
- WidgetD = #so{main=MainW, object=Listbox,
- hscroll=Hscroll, vscroll=Vscroll},
- Gstkid=GstkId#gstkid{widget=MainW, widget_data=WidgetD},
- MandatoryCmd = ["so_create listbox ", MainW],
- case gstk:call(MandatoryCmd) of
+ MainW = gstk_generic:mk_tkw_child(DB, GstkId),
+ case gstk:call(["so_create listbox ", MainW]) of
{result, _} ->
- SimplePreCmd = [MainW, " conf"],
- PlacePreCmd = [";place ", MainW],
- case gstk_generic:make_command(NewOpts, Gstkid, MainW,SimplePreCmd,
- PlacePreCmd, DB,Listbox) of
- {error,Reason} -> {error,Reason};
+ Listbox = lists:append(MainW, ".z"),
+ {Vscroll, Hscroll, NewOpts} = gstk_generic:parse_scrolls(Opts),
+ Gstkid = GstkId#gstkid{widget = MainW, widget_data = #so{main = MainW, object = Listbox,
+ hscroll = Hscroll, vscroll = Vscroll}},
+ case gstk_generic:make_command(NewOpts, Gstkid, MainW, [MainW, " conf"], [";place ", MainW], DB, Listbox) of
+ {error, _Reason} = E -> E;
Cmd when is_list(Cmd) ->
gstk:exec(Cmd),
- gstk:exec([MainW,".sy conf -rel sunken -bo 2;",
- MainW,".pad.sx conf -rel sunken -bo 2;",Listbox,
- " conf -bo 2 -relief sunken -highlightth 2 -expo 0;"]),
+ gstk:exec([MainW, ".sy conf -rel sunken -bo 2;",
+ MainW, ".pad.sx conf -rel sunken -bo 2;",
+ Listbox, " conf -bo 2 -relief sunken -highlightth 2 -expo 0;"]),
Gstkid
end;
- Bad_Result ->
- {error, Bad_Result}
+ Bad_Result -> {error, Bad_Result}
end.
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : config/3
%% Purpose : Configure a widget of the type defined in this module.
@@ -136,15 +128,9 @@ create(DB, GstkId, Opts) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Options) ->
- SO = Gstkid#gstkid.widget_data,
- MainW = Gstkid#gstkid.widget,
- Listbox = SO#so.object,
- NewOpts = gstk_generic:parse_scrolls(Gstkid, Options),
- SimplePreCmd = [MainW, " conf"],
- PlacePreCmd = [";place ", MainW],
- gstk_generic:mk_cmd_and_exec(NewOpts, Gstkid, MainW,
- SimplePreCmd, PlacePreCmd, DB,Listbox).
+config(DB, #gstkid{widget_data = #so{object = Listbox}, widget = MainW} = Gstkid, Options) ->
+ gstk_generic:mk_cmd_and_exec(gstk_generic:parse_scrolls(Gstkid, Options), Gstkid, MainW,
+ [MainW, " conf"], [";place ", MainW], DB, Listbox).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -155,10 +141,7 @@ config(DB, Gstkid, Options) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- SO = Gstkid#gstkid.widget_data,
- gstk_generic:read_option(DB, Gstkid, Opt,SO#so.object).
-
+read(DB, #gstkid{widget_data = #so{object = TkW}} = Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt, TkW).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : delete/2
@@ -168,9 +151,9 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
gstk_db:delete_widget(DB, Gstkid),
- Gstkid#gstkid.widget.
+ TkW.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : event/5
@@ -183,24 +166,17 @@ delete(DB, Gstkid) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-event(DB, Gstkid, click, Edata, Args) ->
- wid_event(DB, Gstkid, click, Edata, Args);
-event(DB, Gstkid, doubleclick, Edata, Args) ->
- wid_event(DB, Gstkid, doubleclick, Edata, Args);
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
-
+event(DB, Gstkid, Etype, Edata, Args) when Etype =:= click; Etype =:= doubleclick ->
+ wid_event(DB, Gstkid, Etype, Edata, Args);
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%% widget specific events
-wid_event(DB, Gstkid, Etype, Edata, _Args) ->
- SO = Gstkid#gstkid.widget_data,
- TkW = SO#so.object,
- CurIdx = tcl2erl:ret_int([TkW," index active;"]),
- CurTxt = tcl2erl:ret_str([TkW," get active;"]),
- CurSel = tcl2erl:ret_list([TkW," curselection;"]),
- Arg2 = [CurIdx,CurTxt,lists:member(CurIdx,CurSel)],
- gstk_generic:event(DB, Gstkid, Etype, Edata, Arg2).
-
+wid_event(DB, #gstkid{widget_data = #so{object = TkW}}= Gstkid, Etype, Edata, _Args) ->
+ CurIdx = tcl2erl:ret_int([TkW, " index active;"]),
+ gstk_generic:event(DB, Gstkid, Etype, Edata,
+ [CurIdx,
+ tcl2erl:ret_str([TkW, " get active;"]),
+ lists:member(CurIdx, tcl2erl:ret_list([TkW, " curselection;"]))]).
%%-----------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -216,52 +192,48 @@ wid_event(DB, Gstkid, Etype, Edata, _Arg
%%
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, MainW,DB, Listbox) ->
- case Option of
- {items, Items} when is_list(Items) ->
- {c, [Listbox," del 0 end ;", Listbox," ins 0 ",item_list(Items)]};
- {selection, {From, To}} when is_integer(From),is_integer(To) ->
- {c,[Listbox," sel set ",gstk:to_ascii(From)," " ,gstk:to_ascii(To)]};
- {font, Font} when is_tuple(Font) ->
- gstk_db:insert_opt(DB,Gstkid,Option),
- {c, [Listbox," conf -font ",gstk_font:choose_ascii(DB,Font)]};
- {selection, clear} ->
- {c, [Listbox," sel clear 0 end"]};
- {selection, Idx} when is_integer(Idx) ->
- {c, [Listbox, " select set ", gstk:to_ascii(Idx)]};
- {selectmode, Mode} ->
- {c, [Listbox, " conf -selectm ", gstk:to_ascii(Mode)]};
- {xselection, Bool} ->
- {c, [Listbox, " conf -exportse ", gstk:to_ascii(Bool)]};
- {fg, Color} ->
- {c, [Listbox, " conf -fg ", gstk:to_color(Color)]};
-
- {del, {From, To}} ->
- {c, [Listbox, " del ", integer_to_list(From), " ",
- integer_to_list(To)]};
- {del, Idx} ->
- {c, [Listbox, " del ", integer_to_list(Idx)]};
- clear -> {c, [Listbox," del 0 end"]};
- {add, {Idx, Str}} ->
- {c, [Listbox, " ins ", integer_to_list(Idx), " ",
- gstk:to_ascii(Str)]};
- {add, Str} ->
- {c, [Listbox," ins end ",gstk:to_ascii(Str)]};
- {change, {Idx, Str}} ->
- {c, [Listbox, " del ", integer_to_list(Idx), $;,
- Listbox, " ins ", integer_to_list(Idx), " " ,
- gstk:to_ascii(Str)]};
- {see, Idx} ->
- {c, [Listbox," see ",gstk:to_ascii(Idx)]};
-
- {setfocus, true} -> {c, ["focus ", MainW]};
- {setfocus, false} -> {c, ["focus ."]};
-
- {click, On} -> cbind(DB, Gstkid, Listbox, click, On);
- {doubleclick, On} -> cbind(DB, Gstkid, Listbox, doubleclick, On);
- _ -> invalid_option
- end.
+option({font, Font} = Option, Gstkid, _MainW, DB, Listbox) when is_tuple(Font) ->
+ gstk_db:insert_opt(DB, Gstkid, Option),
+ option_c([Listbox, " conf -font ", gstk_font:choose_ascii(DB, Font)]);
+option({click, On}, Gstkid, _MainW, DB, Listbox) -> cbind(DB, Gstkid, Listbox, click, On);
+option({doubleclick, On}, Gstkid, _MainW, DB, Listbox) -> cbind(DB, Gstkid, Listbox, doubleclick, On);
+option(Option, _Gstkid, MainW, _DB, Listbox) -> option(Option, Listbox, MainW).
+option({setfocus, true}, _Listbox, MainW) -> option_c(["focus ", MainW]);
+option(Option, Listbox, _MainW) -> option(Option, Listbox).
+
+option(clear, Listbox) -> option_c(" del 0 end", Listbox);
+option({items, Items}, Listbox) when is_list(Items) ->
+ option_c([Listbox, " del 0 end ;", Listbox, " ins 0 ", item_list(Items)]);
+option({selection, clear}, Listbox) -> option_c(" sel clear 0 end", Listbox);
+option({selection, {From, To}}, Listbox) when is_integer(From), is_integer(To) ->
+ option_c(" sel set ", Listbox, gstk:to_ascii(From), gstk:to_ascii(To));
+option({selection, Idx}, Listbox) when is_integer(Idx) -> to_ascii(" select set ", Listbox, Idx);
+option({selectmode, Mode}, Listbox) -> to_ascii(" conf -selectm ", Listbox, Mode);
+option({xselection, Bool}, Listbox) -> to_ascii(" conf -exportse ", Listbox, Bool);
+option({fg, Color}, Listbox) -> option_c(" conf -fg ", Listbox, gstk:to_color(Color));
+option({see, Idx}, Listbox) -> to_ascii(" see ", Listbox, Idx);
+option({add, {Idx, Str}}, Listbox) -> option_c(" ins ", Listbox, integer_to_list(Idx), gstk:to_ascii(Str));
+option({add, Str}, Listbox) -> to_ascii(" ins end ", Listbox, Str);
+option({del, {From, To}}, Listbox) -> option_c(" del ", Listbox, integer_to_list(From), integer_to_list(To));
+option({del, Idx}, Listbox) -> option_c(" del ", Listbox, integer_to_list(Idx));
+option({change, {Idx, Str}}, Listbox) ->
+ option_c([Listbox, " del ", integer_to_list(Idx), $;, Listbox, " ins ", integer_to_list(Idx), " ",
+ gstk:to_ascii(Str)]);
+option(Option, _Listbox) -> option(Option).
+
+option({setfocus, false}) -> option_c(["focus ."]);
+option(_Option) -> invalid_option.
+
+option_c(L) -> {c, L}.
+
+option_c(Str, Listbox) -> option_c([Listbox, Str]).
+
+option_c(Str, Listbox, Val) -> option_c([Listbox, Str, Val]).
+
+option_c(Str, Listbox, A, B) -> option_c([Listbox, Str, A, " ", B]).
+
+to_ascii(Str, Listbox, Val) -> option_c(Str, Listbox, gstk:to_ascii(Val)).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/3
@@ -273,52 +245,49 @@ option(Option, Gstkid, MainW,DB, Listbox
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,GstkId,_MainW,DB,Listbox) ->
- case Option of
- fg -> tcl2erl:ret_color([Listbox," cg -fg"]);
- font -> gstk_db:opt(DB,GstkId,font,undefined);
- selection -> tcl2erl:ret_list([Listbox, " curselection"]);
- setfocus -> tcl2erl:ret_focus(Listbox, "focus");
+read_option(Option, GstkId, _MainW, DB, Listbox) -> read_option(Option, GstkId, Listbox, DB).
- items -> tcl2erl:ret_str_list([Listbox, " get 0 end"]);
- selectmode -> tcl2erl:ret_atom([Listbox, " cg -selectmode"]);
- size -> tcl2erl:ret_int([Listbox, " size"]);
- xselection -> tcl2erl:ret_bool([Listbox, " cg -exportsel"]);
- {get, Idx} -> tcl2erl:ret_str([Listbox, " get ",gstk:to_ascii(Idx)]);
- click -> gstk_db:is_inserted(DB, GstkId, click);
- doubleclick -> gstk_db:is_inserted(DB, GstkId, doubleclick);
-
- _ -> {bad_result, {GstkId#gstkid.objtype, invalid_option, Option}}
+read_option(font, GstkId, _Listbox, DB) -> gstk_db:opt(DB, GstkId, font, undefined);
+read_option(click, GstkId, _Listbox, DB) -> gstk_db:is_inserted(DB, GstkId, click);
+read_option(doubleclick, GstkId, _Listbox, DB) -> gstk_db:is_inserted(DB, GstkId, doubleclick);
+read_option(Option, GstkId, Listbox, _DB) -> read_option(Option, GstkId, Listbox).
+
+read_option(Option, GstkId, Listbox) ->
+ case read_option(Option, Listbox) of
+ invalid_option -> {bad_result, {GstkId#gstkid.objtype, invalid_option, Option}};
+ O -> O
end.
+read_option(fg, Listbox) -> tcl2erl:ret_color([Listbox, " cg -fg"]);
+read_option(items, Listbox) -> tcl2erl:ret_str_list([Listbox, " get 0 end"]);
+read_option(setfocus, Listbox) -> tcl2erl:ret_focus(Listbox, "focus");
+read_option(selection, Listbox) -> tcl2erl:ret_list([Listbox, " curselection"]);
+read_option(selectmode, Listbox) -> tcl2erl:ret_atom([Listbox, " cg -selectmode"]);
+read_option(size, Listbox) -> tcl2erl:ret_int([Listbox, " size"]);
+read_option(xselection, Listbox) -> tcl2erl:ret_bool([Listbox, " cg -exportsel"]);
+read_option({get, Idx}, Listbox) -> tcl2erl:ret_str([Listbox, " get ", gstk:to_ascii(Idx)]);
+read_option(_Option, _Listbox) -> invalid_option.
%%-----------------------------------------------------------------------------
%% PRIMITIVES
%%-----------------------------------------------------------------------------
-item_list([H|T]) ->
- [gstk:to_ascii(H),$ |item_list(T)];
-item_list([]) ->
- [].
+item_list(L) -> lists:foldr(fun(E, A) -> [gstk:to_ascii(E), $ |A] end, [], L).
cbind(DB, Gstkid, Listbox, Etype, {true, Edata}) ->
- Button = case Etype of
- click -> " <ButtonRelease-1> ";
- doubleclick -> " <Double-ButtonRelease-1> "
- end,
- Eref = gstk_db:insert_event(DB, Gstkid, Etype, Edata),
- {c, ["bind " ,Listbox, Button, "{erlsend ", Eref," }"]};
-
-cbind(DB, Gstkid, Listbox, Etype, true) ->
- cbind(DB, Gstkid, Listbox, Etype, {true, []});
+ {c, ["bind " , Listbox,
+ if
+ Etype =:= click -> " <ButtonRelease-1> ";
+ Etype =:= doubleclick -> " <Double-ButtonRelease-1> "
+ end,
+ "{erlsend ", gstk_db:insert_event(DB, Gstkid, Etype, Edata), " }"]};
-cbind(DB, Gstkid, Listbox, Etype, _On) ->
- Button = case Etype of
- click -> " <Button-1> {}";
- doubleclick -> " <Double-Button-1> {}"
- end,
+cbind(DB, Gstkid, Listbox, Etype, true) -> cbind(DB, Gstkid, Listbox, Etype, {true, []});
+cbind(DB, Gstkid, Listbox, Etype, _On) ->
gstk_db:delete_event(DB, Gstkid, Etype),
- {c, ["bind ",Listbox, Button]}.
-
+ {c, ["bind ", Listbox, if
+ Etype =:= click -> " <Button-1> {}";
+ Etype =:= doubleclick -> " <Double-Button-1> {}"
+ end]}.
%%% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_menubar.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_menubar.erl
--- otp_src_19.0.5/lib/gs/src/gstk_menubar.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_menubar.erl 2016-08-25 16:37:44.565693335 +0300
@@ -63,8 +63,7 @@
%% align How
%%
--export([create/3,config/3,read/3,delete/2,event/5,option/5,read_option/5,
- mk_create_opts_for_child/4]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5, mk_create_opts_for_child/4]).
-include("gstk.hrl").
@@ -76,14 +75,12 @@
%% Purpose : Create a widget of the type defined in this module.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
create(DB, GstkId, Opts) ->
- TkW = gstk_generic:mk_tkw_child(DB,GstkId),
- MPreCmd = ["frame ", TkW],
- PlaceCmd = [";place ", TkW],
- Ngstkid = GstkId#gstkid{widget=TkW},
- case gstk_generic:make_command(Opts, Ngstkid,TkW, MPreCmd, PlaceCmd, DB) of
- {error,Reason} -> {error,Reason};
+ TkW = gstk_generic:mk_tkw_child(DB, GstkId),
+ Ngstkid = GstkId#gstkid{widget = TkW},
+ case gstk_generic:make_command(Opts, Ngstkid, TkW, ["frame ", TkW], [";place ", TkW], DB) of
+ {error, _Reason} = E -> E;
Cmd when is_list(Cmd) ->
- gstk:exec([Cmd,";pack ", TkW, " -side top -fill x;"]),
+ gstk:exec([Cmd, ";pack ", TkW, " -side top -fill x;"]),
Ngstkid
end.
@@ -96,11 +93,8 @@ create(DB, GstkId, Opts) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
- TkW = Gstkid#gstkid.widget,
- SimplePreCmd = [TkW, " conf"],
- PlacePreCmd = ["place ", TkW],
- gstk_generic:mk_cmd_and_exec(Opts,Gstkid,TkW,SimplePreCmd,PlacePreCmd,DB).
+config(DB, #gstkid{widget = TkW} = Gstkid, Opts) ->
+ gstk_generic:mk_cmd_and_exec(Opts, Gstkid, TkW, [TkW, " conf"], ["place ", TkW], DB).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -108,9 +102,7 @@ config(DB, Gstkid, Opts) ->
%% Args : Opt - An option to read
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- gstk_generic:read_option(DB, Gstkid, Opt).
-
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : delete/2
@@ -120,24 +112,16 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
gstk_db:delete_widget(DB, Gstkid),
- Gstkid#gstkid.widget.
-
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+ TkW.
-mk_create_opts_for_child(DB,Cgstkid, Pgstkid, Opts)
-when Cgstkid#gstkid.objtype==menubutton ->
- case gstk_db:lookup_def(Pgstkid,menubutton,bg) of
- false ->
- MbarTkW=Pgstkid#gstkid.widget,
- Color=tcl2erl:ret_color([MbarTkW," cg -bg"]),
- gstk_db:insert_def(Pgstkid,menubutton,{bg,Color});
- _ -> done
- end,
- gstk_generic:mk_create_opts_for_child(DB,Cgstkid,Pgstkid,Opts).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+mk_create_opts_for_child(DB, #gstkid{objtype = menubutton} = Cgstkid, Pgstkid, Opts) ->
+ gstk_db:lookup_def(Pgstkid, menubutton, bg) orelse
+ gstk_db:insert_def(Pgstkid, menubutton, {bg, tcl2erl:ret_color([Pgstkid#gstkid.widget, " cg -bg"])}),
+ gstk_generic:mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts).
%%-----------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -149,13 +133,13 @@ when Cgstkid#gstkid.objtype==menubutton
%% TkW - The tk-widget
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option,_Gstkid,_TkW,_DB,_) ->
- case Option of
- {bg, Color} -> {s, [" -bg ", gstk:to_color(Color)]};
- {height, Height} -> {s, [" -height ", gstk:to_ascii(Height)]};
- _ -> invalid_option
- end.
+option(Option, _Gstkid, _TkW, _DB, _) -> option(Option).
+
+option({bg, Color}) -> option_s([" -bg ", gstk:to_color(Color)]);
+option({height, Height}) -> option_s([" -height ", gstk:to_ascii(Height)]);
+option(_Option) -> invalid_option.
+option_s(L) -> {s, L}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/5
@@ -163,14 +147,16 @@ option(Option,_Gstkid,_TkW,_DB,_) ->
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,GstkId,TkW,_DB,_) ->
- case Option of
- bg -> tcl2erl:ret_color([TkW," cg -bg"]);
- height -> tcl2erl:ret_int(["update idletasks;winfo he ",TkW]);
- _ -> {bad_result, {GstkId#gstkid.objtype, invalid_option, Option}}
+read_option(Option, GstkId, TkW, _DB, _) -> read_option(Option, GstkId, TkW).
+
+read_option(Option, GstkId, TkW) ->
+ case read_option(Option, TkW) of
+ invalid_option -> {bad_result, {GstkId#gstkid.objtype, invalid_option, Option}};
+ O -> O
end.
+read_option(bg, TkW) -> tcl2erl:ret_color([TkW, " cg -bg"]);
+read_option(height, TkW) -> tcl2erl:ret_int(["update idletasks;winfo he ", TkW]);
+read_option(_Option, _TkW) -> invalid_option.
%% ----- Done -----
-
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_menubutton.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_menubutton.erl
--- otp_src_19.0.5/lib/gs/src/gstk_menubutton.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_menubutton.erl 2016-08-25 16:37:44.565693335 +0300
@@ -31,8 +31,8 @@
%% Attributes:
%% activebg Color
%% activefg Color
-%% align n,w,s,e,nw,se,ne,sw,center
-%% anchor n,w,s,e,nw,se,ne,sw,center
+%% align n, w,s, e,nw, se, ne, sw, center
+%% anchor n, w,s, e,nw, se, ne, sw, center
%% bg Color
%% bw Int
%% data Data
@@ -85,8 +85,7 @@
%% focus ?????? (-takefocus)
%%
--export([create/3,config/3,read/3,delete/2,event/5,option/5,read_option/5,
- mk_create_opts_for_child/4]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5, mk_create_opts_for_child/4]).
-include("gstk.hrl").
@@ -98,18 +97,17 @@
%% Purpose : Create a widget of the type defined in this module.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
create(DB, GstkId, Opts) ->
- TkW = gstk_generic:mk_tkw_child(DB,GstkId),
- NGstkId=GstkId#gstkid{widget=TkW},
- PlacePreCmd = [";place ", TkW],
- case gstk_generic:make_command(Opts, NGstkId, TkW, "", PlacePreCmd, DB) of
- {error,Reason} -> {error,Reason};
+ TkW = gstk_generic:mk_tkw_child(DB, GstkId),
+ NGstkId = GstkId#gstkid{widget = TkW},
+ case gstk_generic:make_command(Opts, NGstkId, TkW, "", [";place ", TkW], DB) of
+ {error, _Reason} = E -> E;
Cmd when is_list(Cmd) ->
- gstk:exec(["menubutton ", TkW," -padx 4 -pady 3",Cmd]),
+ gstk:exec(["menubutton ", TkW, " -padx 4 -pady 3", Cmd]),
NGstkId
end.
-mk_create_opts_for_child(DB,Cgstkid, Pgstkid, Opts) ->
- gstk_generic:mk_create_opts_for_child(DB,Cgstkid,Pgstkid,Opts).
+mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts) ->
+ gstk_generic:mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : config/3
@@ -120,11 +118,8 @@ mk_create_opts_for_child(DB,Cgstkid, Pgs
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
- TkW = Gstkid#gstkid.widget,
- SimplePreCmd = [TkW, " conf"],
- PlacePreCmd = [";place ", TkW],
- gstk_generic:mk_cmd_and_exec(Opts,Gstkid,TkW,SimplePreCmd,PlacePreCmd,DB).
+config(DB, #gstkid{widget = TkW} = Gstkid, Opts) ->
+ gstk_generic:mk_cmd_and_exec(Opts, Gstkid, TkW, [TkW, " conf"], [";place ", TkW], DB).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -135,8 +130,7 @@ config(DB, Gstkid, Opts) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- gstk_generic:read_option(DB, Gstkid, Opt).
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -147,12 +141,11 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
gstk_db:delete_widget(DB, Gstkid),
- Gstkid#gstkid.widget.
+ TkW.
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%%-----------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -167,20 +160,23 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%%
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, TkW, DB,_) ->
- case Option of
- {anchor, How} -> fix_anchor(How, Gstkid, TkW, DB);
- {disabledfg, Color} -> {s, [" -disabledf ", gstk:to_color(Color)]};
- {height, Height} -> {s, [" -he ", gstk:to_ascii(Height)]};
- {side, Side} -> fix_side(Side, Gstkid, TkW, DB);
- {underline, Int} -> {s, [" -und ", gstk:to_ascii(Int)]};
- {width, Width} -> {s, [" -wi ", gstk:to_ascii(Width)]};
- {wraplength, Int} -> {s, [" -wr ", gstk:to_ascii(Int)]};
- {x, X} -> fix_placement(x, X, Gstkid, TkW, DB);
- {y, Y} -> fix_placement(y, Y, Gstkid, TkW, DB);
- _ -> invalid_option
- end.
+option(Option, Gstkid, TkW, DB, _) -> option(Option, Gstkid, TkW, DB).
+
+option({anchor, How}, Gstkid, TkW, DB) -> fix_anchor(How, Gstkid, TkW, DB);
+option({side, Side}, Gstkid, TkW, DB) -> fix_side(Side, Gstkid, TkW, DB);
+option({T, V}, Gstkid, TkW, DB) when T =:= x; T =:= y -> fix_placement(T, V, Gstkid, TkW, DB);
+option(Option, _Gstkid, _TkW, _DB) -> option(Option).
+
+option({disabledfg, Color}) -> option_s([" -disabledf ", gstk:to_color(Color)]);
+option({height, Height}) -> option_s(" -he ", Height);
+option({width, Width}) -> option_s(" -wi ", Width);
+option({underline, Int}) -> option_s(" -und ", Int);
+option({wraplength, Int}) -> option_s(" -wr ", Int);
+option(_Option) -> invalid_option.
+
+option_s(Str, Val) -> option_s([Str, gstk:to_ascii(Val)]).
+option_s(L) -> {s, L}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/3
@@ -192,47 +188,45 @@ option(Option, Gstkid, TkW, DB,_) ->
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,GstkId,TkW,_DB,_) ->
- case Option of
- anchor -> tcl2erl:ret_place(anchor, TkW);
- disabledfg -> tcl2erl:ret_color([TkW," cg -disabledfo"]);
- height -> tcl2erl:ret_int([TkW," cg -he"]);
- side -> tcl2erl:ret_pack(side, TkW);
- underline -> tcl2erl:ret_int([TkW," cg -underl"]);
- width -> tcl2erl:ret_int([TkW," cg -wi"]);
- wraplength -> tcl2erl:ret_int([TkW," cg -wr"]);
- x -> tcl2erl:ret_place(x, TkW);
- y -> tcl2erl:ret_place(y, TkW);
- _ -> {error,{invalid_option,Option, GstkId#gstkid.objtype}}
+read_option(Option, GstkId, TkW, _DB, _) -> read_option(Option, GstkId, TkW).
+
+read_option(Option, GstkId, TkW) ->
+ case read_option(Option, TkW) of
+ invalid_option -> {error, {invalid_option, Option, GstkId#gstkid.objtype}};
+ O -> O
end.
+read_option(disabledfg, TkW) -> tcl2erl:ret_color([TkW, " cg -disabledfo"]);
+read_option(height, TkW) -> ret_int(" cg -he", TkW);
+read_option(width, TkW) -> ret_int(" cg -wi", TkW);
+read_option(underline, TkW) -> ret_int(" cg -underl", TkW);
+read_option(wraplength, TkW) -> ret_int(" cg -wr", TkW);
+read_option(side, TkW) -> tcl2erl:ret_pack(side, TkW);
+read_option(T, TkW) when T =:= anchor; T =:= x; T =:= y -> tcl2erl:ret_place(T, TkW);
+read_option(_Option, _TkW) -> invalid_option.
+
+ret_int(Str, TkW) -> tcl2erl:ret_int([TkW, Str]).
+
%%-----------------------------------------------------------------------------
%% PRIMITIVES
%%-----------------------------------------------------------------------------
-fix_placement(Attr, Value, Gstkid, _TkW, DB) ->
- Pgstkid = gstk_db:lookup_gstkid(DB, Gstkid#gstkid.parent),
- case Pgstkid#gstkid.objtype of
- menubar -> invalid_option;
- _ -> {p, [" -", atom_to_list(Attr), " ", gstk:to_ascii(Value)]}
+fix_placement(Attr, Value, #gstkid{parent = Parent}, _TkW, DB) ->
+ case gstk_db:lookup_gstkid(DB, Parent) of
+ #gstkid{objtype = menubar} -> invalid_option;
+ _ -> {p, [" -", atom_to_list(Attr), " ", gstk:to_ascii(Value)]}
end.
-
-fix_anchor(How, Gstkid, TkW, DB) ->
- Pgstkid = gstk_db:lookup_gstkid(DB, Gstkid#gstkid.parent),
- case Pgstkid#gstkid.objtype of
- menubar -> {c, ["pack ", TkW, " -an ", gstk:to_ascii(How)]};
- _ -> {p, [" -anch ", gstk:to_ascii(How)]}
+fix_anchor(How, #gstkid{parent = Parent}, TkW, DB) ->
+ case gstk_db:lookup_gstkid(DB, Parent) of
+ #gstkid{objtype = menubar} -> {c, ["pack ", TkW, " -an ", gstk:to_ascii(How)]};
+ _ -> {p, [" -anch ", gstk:to_ascii(How)]}
end.
-
-fix_side(Side, Gstkid, TkW, DB) ->
- Pgstkid = gstk_db:lookup_gstkid(DB, Gstkid#gstkid.parent),
- case Pgstkid#gstkid.objtype of
- menubar -> {c, ["pack ", TkW, " -fill y -si ", gstk:to_ascii(Side)]};
- _ -> none
+fix_side(Side, #gstkid{parent = Parent}, TkW, DB) ->
+ case gstk_db:lookup_gstkid(DB, Parent) of
+ #gstkid{objtype = menubar} -> {c, ["pack ", TkW, " -fill y -si ", gstk:to_ascii(Side)]};
+ _ -> none
end.
-
%% ----- Done -----
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_menu.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_menu.erl
--- otp_src_19.0.5/lib/gs/src/gstk_menu.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_menu.erl 2016-08-25 16:37:44.565693335 +0300
@@ -24,7 +24,8 @@
%%------------------------------------------------------------------------------
-module(gstk_menu).
--compile([{nowarn_deprecated_function,{gs,error,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, error, 2}}]).
%%------------------------------------------------------------------------------
%% MENU OPTIONS
@@ -63,10 +64,10 @@
%% type
%%
%% Not Implemented:
-%% post {X,Y}
+%% post {X, Y}
%% unpost
-%% align n,w,s,e,nw,se,ne,sw,center
-%% anchor n,w,s,e,nw,se,ne,sw,center
+%% align n, w,s, e,nw, se, ne, sw, center
+%% anchor n, w,s, e,nw, se, ne, sw, center
%% cursor ??????
%% focus ?????? (-takefocus)
%% height Int
@@ -76,9 +77,8 @@
%% y Int (valid only for popup menus)
%%
--export([create/3, config/3, read/3, delete/2, event/5,option/5,read_option/5]).
--export([delete_menuitem/3, insert_menuitem/4, lookup_menuitem_pos/3,
- mk_create_opts_for_child/4]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5]).
+-export([delete_menuitem/3, insert_menuitem/4, lookup_menuitem_pos/3, mk_create_opts_for_child/4]).
-include("gstk.hrl").
@@ -89,50 +89,34 @@
%% Function : create/3
%% Purpose : Create a widget of the type defined in this module.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-create(DB, GstkId, Opts) ->
- #gstkid{parent=Parent,owner=Owner,objtype=Objtype}=GstkId,
- Pgstkid = gstk_db:lookup_gstkid(DB, Parent, Owner),
- Oref = gstk_db:counter(DB, Objtype),
- PF = gstk_widgets:suffix(Objtype),
- case Pgstkid#gstkid.objtype of
- menuitem ->
- PMenu = Pgstkid#gstkid.parent,
- PMgstkid = gstk_db:lookup_gstkid(DB, PMenu, Owner),
- PMW = PMgstkid#gstkid.widget,
- Index = gstk_menu:lookup_menuitem_pos(DB, PMgstkid, Pgstkid#gstkid.id),
- TkW = lists:concat([PMW, PF, Oref]),
- Gstkid=GstkId#gstkid{widget=TkW, widget_data=[]},
- MPreCmd = ["menu ", TkW, " -tearoff 0 -relief raised -bo 2"],
- MPostCmd = [$;,PMW," entryco ",gstk:to_ascii(Index)," -menu ",TkW],
- case gstk_generic:make_command(Opts, Gstkid, TkW, "", "", DB) of
- {error,Reason} -> {error,Reason};
- Cmd when is_list(Cmd) ->
- gstk:exec([MPreCmd,Cmd,MPostCmd]),
- Gstkid
- end;
- OtherParent ->
- true = lists:member(OtherParent,
- %% grid+canvas har skumma coord system
- [menubutton,window,frame]),
- PW = Pgstkid#gstkid.widget,
- TkW = lists:concat([PW, PF, Oref]),
- Gstkid=GstkId#gstkid{widget=TkW, widget_data=[]},
- MPreCmd = ["menu ", TkW, " -tearoff 0 -relief raised -bo 2 "],
- MPostCmd = if OtherParent == menubutton ->
- [$;, PW, " conf -menu ", TkW];
- true -> []
- end,
- case gstk_generic:make_command(Opts, Gstkid, TkW, "","", DB) of
- {error,Reason} -> {error,Reason};
- Cmd when is_list(Cmd) ->
- gstk:exec([MPreCmd,Cmd,MPostCmd]),
- Gstkid
- end
+create(DB, #gstkid{parent = Parent, owner = Owner, objtype = Objtype} = GstkId, Opts) ->
+ {PMW, MPostCmd} = case gstk_db:lookup_gstkid(DB, Parent, Owner) of
+ #gstkid{objtype = menuitem, parent = P, id = Id} ->
+ PMgstkid = #gstkid{widget = PW} = gstk_db:lookup_gstkid(DB, P, Owner),
+ {PW, [" entryco ", gstk:to_ascii(gstk_menu:lookup_menuitem_pos(DB, PMgstkid, Id)), " -menu "]};
+ #gstkid{objtype = OtherParent, widget = PW} ->
+ true = lists:member(OtherParent,
+ %% grid+canvas har skumma coord system
+ [menubutton, window, frame]),
+ {PW, if
+ OtherParent =:= menubutton -> [" conf -menu "];
+ true -> []
+ end}
+ end,
+ TkW = lists:concat([PMW, gstk_widgets:suffix(Objtype), gstk_db:counter(DB, Objtype)]),
+ Gstkid = GstkId#gstkid{widget = TkW, widget_data = []},
+ case gstk_generic:make_command(Opts, Gstkid, TkW, "", "", DB) of
+ {error, _Reason} = E -> E;
+ Cmd when is_list(Cmd) ->
+ gstk:exec([["menu ", TkW, " -tearoff 0 -relief raised -bo 2 "], Cmd, if
+ MPostCmd =:= [] -> [];
+ true -> [$;, PMW|MPostCmd] ++ [TkW]
+ end]),
+ Gstkid
end.
-mk_create_opts_for_child(DB,Cgstkid, Pgstkid, Opts) ->
- gstk_generic:mk_create_opts_for_child(DB,Cgstkid,Pgstkid,Opts).
-
+mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts) ->
+ gstk_generic:mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : config/3
@@ -143,10 +127,8 @@ mk_create_opts_for_child(DB,Cgstkid, Pgs
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
- TkW = Gstkid#gstkid.widget,
- PreCmd = [TkW, " conf"],
- gstk_generic:mk_cmd_and_exec(Opts, Gstkid, TkW, PreCmd, "", DB).
+config(DB, #gstkid{widget = TkW} = Gstkid, Opts) ->
+ gstk_generic:mk_cmd_and_exec(Opts, Gstkid, TkW, [TkW, " conf"], "", DB).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -157,9 +139,7 @@ config(DB, Gstkid, Opts) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- gstk_generic:read_option(DB, Gstkid, Opt).
-
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : delete/2
@@ -169,12 +149,11 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
gstk_db:delete_widget(DB, Gstkid),
- Gstkid#gstkid.widget.
+ TkW.
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%%------------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -189,15 +168,21 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%%
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, TkW, DB,_) ->
- case Option of
- {activebw, Int} -> {s, [" -activebo ", gstk:to_ascii(Int)]};
- {disabledfg, Color} -> {s, [" -disabledf ", gstk:to_color(Color)]};
- {selectcolor, Color} -> {s, [" -selectc ", gstk:to_color(Color)]};
- {post_at, {X,Y}} -> post_at(X,Y,Gstkid,TkW,DB);
- _ -> invalid_option
- end.
+option(Option, Gstkid, TkW, DB, _) -> option(Option, Gstkid, TkW, DB).
+option({post_at, {X, Y}}, Gstkid, TkW, DB) -> post_at(X, Y, Gstkid, TkW, DB);
+option(Option, _Gstkid, _TkW, _DB) -> option(Option).
+
+option({activebw, Int}) -> option_s(" -activebo ", gstk:to_ascii(Int));
+option({disabledfg, Color}) -> to_color(" -disabledf ", Color);
+option({selectcolor, Color}) -> to_color(" -selectc ", Color);
+option(_Option) -> invalid_option.
+
+to_color(Str, Color) -> option_s(Str, gstk:to_color(Color)).
+
+option_s(L) -> {s, L}.
+
+option_s(Str, Val) -> option_s([Str, Val]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/5
@@ -209,21 +194,26 @@ option(Option, Gstkid, TkW, DB,_) ->
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option, Gstkid, TkW, _DB, _AItem) ->
- case Option of
- activebw -> tcl2erl:ret_int([TkW," cg -activebo"]);
- disabledfg -> tcl2erl:ret_color([TkW," cg -disabledfo"]);
- selectcolor -> tcl2erl:ret_color([TkW," cg -selectc"]);
- _ -> {error,{invalid_option,Option, Gstkid#gstkid.objtype}}
+read_option(Option, Gstkid, TkW, _DB, _AItem) -> read_option(Option, Gstkid, TkW).
+
+read_option(Option, Gstkid, TkW) ->
+ case read_option(Option, TkW) of
+ invalid_option -> {error, {invalid_option, Option, Gstkid#gstkid.objtype}};
+ O -> O
end.
-post_at(X,Y,Gstkid,TkW,DB) ->
- Pgstkid = gstk_db:lookup_gstkid(DB, Gstkid#gstkid.parent),
- PtkW = Pgstkid#gstkid.widget,
- RootX = tcl2erl:ret_int(["winfo rootx ",PtkW]),
- RootY = tcl2erl:ret_int(["winfo rooty ",PtkW]),
- {c,[" tk_popup ",TkW," ",gstk:to_ascii(RootX+X)," ",gstk:to_ascii(RootY+Y)]}.
+read_option(activebw, TkW) -> tcl2erl:ret_int([TkW, " cg -activebo"]);
+read_option(disabledfg, TkW) -> ret_color(" cg -disabledfo", TkW);
+read_option(selectcolor, TkW) -> ret_color(" cg -selectc", TkW);
+read_option(_Option, _TkW) -> invalid_option.
+ret_color(Str, TkW) -> tcl2erl:ret_color([TkW, Str]).
+
+post_at(X, Y, #gstkid{parent = Parent}, TkW, DB) ->
+ #gstkid{widget = PtkW} = gstk_db:lookup_gstkid(DB, Parent),
+ {c, [" tk_popup ", TkW,
+ " ", gstk:to_ascii(tcl2erl:ret_int(["winfo rootx ", PtkW]) + X),
+ " ", gstk:to_ascii(tcl2erl:ret_int(["winfo rooty ", PtkW]) + Y)]}.
%%-----------------------------------------------------------------------------
%% PRIMITIVES
@@ -233,36 +223,25 @@ post_at(X,Y,Gstkid,TkW,DB) ->
%% Tk menuitems are numbered from 0, thus we have to recalc the position.
%%----------------------------------------------------------------------
insert_menuitem(DB, MenuId, ItemId, Pos) ->
- Mgstkid = gstk_db:lookup_gstkid(DB, MenuId),
- Items = Mgstkid#gstkid.widget_data,
- NewItems = insert_at(ItemId, Pos+1, Items),
- gstk_db:update_widget(DB, Mgstkid#gstkid{widget_data=NewItems}).
-
+ Mgstkid = #gstkid{widget_data = Items} = gstk_db:lookup_gstkid(DB, MenuId),
+ gstk_db:update_widget(DB, Mgstkid#gstkid{widget_data = insert_at(ItemId, Pos + 1, Items)}).
delete_menuitem(DB, MenuId, ItemId) ->
- Mgstkid = gstk_db:lookup_gstkid(DB, MenuId),
- Items = Mgstkid#gstkid.widget_data,
- NewItems = lists:delete(ItemId, Items),
- gstk_db:insert_widget(DB, Mgstkid#gstkid{widget_data=NewItems}).
-
+ Mgstkid = #gstkid{widget_data = Items} = gstk_db:lookup_gstkid(DB, MenuId),
+ gstk_db:insert_widget(DB, Mgstkid#gstkid{widget_data = lists:delete(ItemId, Items)}).
-lookup_menuitem_pos(_DB, Mgstkid, ItemId) ->
- Items = Mgstkid#gstkid.widget_data,
- find_pos(ItemId, Items) - 1.
+lookup_menuitem_pos(_DB, #gstkid{widget_data = Items}, ItemId) -> find_pos(ItemId, Items) - 1.
%%----------------------------------------------------------------------
%% Generic list processing
%%----------------------------------------------------------------------
-find_pos(ItemId, Items) ->
- find_pos(ItemId, Items, 1).
+find_pos(ItemId, Items) -> find_pos(ItemId, Items, 1).
find_pos(_ItemId, [], _N) -> gs:error("Couldn't find item in menu~n", []);
find_pos(ItemId, [ItemId|_Items], N) -> N;
-find_pos(ItemId, [_|Items], N) ->
- find_pos(ItemId, Items, N + 1).
+find_pos(ItemId, [_|Items], N) -> find_pos(ItemId, Items, N + 1).
-insert_at(Elem, 1, L) -> [Elem | L];
-insert_at(Elem, N, [H|T]) ->
- [H|insert_at(Elem, N-1, T)].
+insert_at(Elem, 1, L) -> [Elem|L];
+insert_at(Elem, N, [H|T]) -> [H|insert_at(Elem, N - 1, T)].
%% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_menuitem.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_menuitem.erl
--- otp_src_19.0.5/lib/gs/src/gstk_menuitem.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_menuitem.erl 2016-08-25 16:37:44.565693335 +0300
@@ -24,7 +24,8 @@
%% ------------------------------------------------------------
-module(gstk_menuitem).
--compile([{nowarn_deprecated_function,{gs,error,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, error, 2}}]).
%%-----------------------------------------------------------------------------
%% MENUITEM OPTIONS
@@ -66,8 +67,7 @@
%% read menu on cascades
%%
--export([create/3, config/3, read/3, delete/2, destroy/3, event/5,
- option/5,read_option/5,mk_create_opts_for_child/4]).
+-export([create/3, config/3, read/3, delete/2, destroy/3, event/5, option/5, read_option/5, mk_create_opts_for_child/4]).
-include("gstk.hrl").
%%-----------------------------------------------------------------------------
@@ -77,55 +77,42 @@
%% Function : create/3
%% Purpose : Create a widget of the type defined in this module.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-create(DB, GstkId, Opts) ->
- #gstkid{parent=Parent,owner=Owner,id=Id}=GstkId,
- Pgstkid = gstk_db:lookup_gstkid(DB, Parent),
- TkMenu = Pgstkid#gstkid.widget,
- Widget = "",
+-define(Widget, "").
+create(DB, #gstkid{parent = Parent, owner = Owner, id = Id} = GstkId, Opts) ->
+ #gstkid{widget = TkMenu} = gstk_db:lookup_gstkid(DB, Parent),
{Index, Type, Options} = parse_opts(Opts, TkMenu),
PreCmd = [TkMenu, " insert ", gstk:to_ascii(Index)],
- InsertArgs = [DB, Parent,Id, Index],
+ InsertArgs = [DB, Parent, Id, Index],
case Type of
check ->
{G, GID, NOpts} = fix_group(Options, DB, Owner),
- TypeCmd = " ch",
- Ngstkid=GstkId#gstkid{widget=Widget,widget_data={Type, G, GID}},
- GenArgs = [NOpts,Ngstkid,TkMenu,"","",DB,{Type,Index}],
- CallArgs = [PreCmd,TypeCmd],
- mk_it(GenArgs,CallArgs,InsertArgs,Ngstkid);
+ Ngstkid = GstkId#gstkid{widget = ?Widget, widget_data = {Type, G, GID}},
+ mk_it([NOpts, Ngstkid, TkMenu, "", "", DB, {Type, Index}], [PreCmd, " ch"], InsertArgs, Ngstkid);
radio ->
{G, GID, V, NOpts} = fix_group_and_value(Options, DB, Owner),
- Ngstkid=GstkId#gstkid{widget=Widget, widget_data={Type,G,GID,V}},
- TypeCmd = " ra",
- GenArgs = [NOpts,Ngstkid,TkMenu,"", "",DB,{Type,Index}],
- CallArgs = [PreCmd,TypeCmd],
- mk_it(GenArgs,CallArgs,InsertArgs,Ngstkid);
+ Ngstkid = GstkId#gstkid{widget = ?Widget, widget_data = {Type, G, GID, V}},
+ mk_it([NOpts, Ngstkid, TkMenu, "", "", DB, {Type, Index}], [PreCmd, " ra"], InsertArgs, Ngstkid);
_ ->
- Ngstkid=GstkId#gstkid{widget=Widget, widget_data=Type},
- TypeCmd = case Type of
- normal -> " co";
- separator -> " se";
- cascade -> " ca"
- end,
- GenArgs = [Options,Ngstkid,TkMenu,"","",DB,{Type,Index}],
- CallArgs = [PreCmd,TypeCmd],
- mk_it(GenArgs,CallArgs,InsertArgs,Ngstkid)
+ Ngstkid = GstkId#gstkid{widget = ?Widget, widget_data = Type},
+ mk_it([Options, Ngstkid, TkMenu, "", "", DB, {Type, Index}],
+ [PreCmd, proplists:get_value(Type, [{normal, " co"}, {separator, " se"}, {cascade, " ca"}])],
+ InsertArgs,
+ Ngstkid)
end.
-mk_it(GenArgs,CallArgs,InsertArgs,Ngstkid) ->
- case apply(gstk_generic,make_command,GenArgs) of
- {error,Reason} -> {error,Reason};
- Cmd when is_list(Cmd) ->
- case apply(gstk,call,[[CallArgs|Cmd]]) of
- {result,_} ->
- apply(gstk_menu,insert_menuitem,InsertArgs),
- Ngstkid;
- Bad_Result -> {error,Bad_Result}
- end
+mk_it(GenArgs, CallArgs, InsertArgs, Ngstkid) ->
+ case apply(gstk_generic, make_command, GenArgs) of
+ {error, _Reason} = Bad_Result -> Bad_Result;
+ Cmd when is_list(Cmd) -> case apply(gstk, call, [[CallArgs|Cmd]]) of
+ {result, _} ->
+ apply(gstk_menu, insert_menuitem, InsertArgs),
+ Ngstkid;
+ Bad_Result -> {error, Bad_Result}
+ end
end.
-mk_create_opts_for_child(DB,Cgstkid, Pgstkid, Opts) ->
- gstk_generic:mk_create_opts_for_child(DB,Cgstkid,Pgstkid,Opts).
+mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts) ->
+ gstk_generic:mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : config/3
@@ -141,31 +128,16 @@ mk_create_opts_for_child(DB,Cgstkid, Pgs
% entry in the middle of the meny, don't the entrys after that one
% renumber?
-config(DB, Gstkid, Options) ->
- Parent = Gstkid#gstkid.parent,
- Pgstkid = gstk_db:lookup_gstkid(DB, Parent),
- TkMenu = Pgstkid#gstkid.widget,
- case Gstkid#gstkid.widget_data of
- {Type, _, _, _} ->
- Owner = Gstkid#gstkid.owner,
- {NOpts, NGstkid} = fix_group_and_value(Options, DB, Owner, Gstkid),
- Index = gstk_menu:lookup_menuitem_pos(DB, Pgstkid, NGstkid#gstkid.id),
- PreCmd = [TkMenu, " entryco ", gstk:to_ascii(Index)],
- gstk_generic:mk_cmd_and_exec(NOpts,NGstkid,TkMenu,PreCmd,"",DB,
- {Type,Index});
- {Type, _, _} ->
- Owner = Gstkid#gstkid.owner,
- {NOpts, NGstkid} = fix_group(Options, DB, Owner, Gstkid),
- Index = gstk_menu:lookup_menuitem_pos(DB, Pgstkid, NGstkid#gstkid.id),
- PreCmd = [TkMenu, " entryco ", gstk:to_ascii(Index)],
- gstk_generic:mk_cmd_and_exec(NOpts,NGstkid,TkMenu,PreCmd,"",DB,
- {Type,Index});
- Type ->
- Index = gstk_menu:lookup_menuitem_pos(DB, Pgstkid, Gstkid#gstkid.id),
- PreCmd = [TkMenu, " entryco ", gstk:to_ascii(Index)],
- gstk_generic:mk_cmd_and_exec(Options,Gstkid,TkMenu,PreCmd,"",
- DB, {Type,Index})
- end.
+config(DB, #gstkid{id = Id, widget = TkMenu, parent = Parent} = Gstkid, Options) ->
+ Index = gstk:to_ascii(gstk_menu:lookup_menuitem_pos(DB, gstk_db:lookup_gstkid(DB, Parent), Id)),
+ {{NOpts, NGstkid}, Type} = get_config(DB, Gstkid, Options),
+ gstk_generic:mk_cmd_and_exec(NOpts, NGstkid, TkMenu, [TkMenu, " entryco ", Index], "", DB, {Type, Index}).
+
+get_config(DB, #gstkid{owner = Owner, widget_data = {Type, _, _, _}} = Gstkid, Options) ->
+ {fix_group_and_value(Options, DB, Owner, Gstkid), Type};
+get_config(DB, #gstkid{owner = Owner, widget_data = {Type, _, _}} = Gstkid, Options) ->
+ {fix_group(Options, DB, Owner, Gstkid), Type};
+get_config(_DB, #gstkid{widget_data = Type} = Gstkid, Options) -> {{Options, Gstkid}, Type}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -176,9 +148,7 @@ config(DB, Gstkid, Options) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- gstk_generic:read_option(DB, Gstkid, Opt).
-
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : delete/2
@@ -188,16 +158,14 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
- Parent = Gstkid#gstkid.parent,
- Id = Gstkid#gstkid.id,
+delete(DB, #gstkid{parent = Parent, id = Id, widget_data = D} = Gstkid) ->
gstk_db:delete_widget(DB, Gstkid),
- case Gstkid#gstkid.widget_data of
- {radio, _, Gid, _} -> gstk_db:delete_bgrp(DB, Gid);
- {check, _, Gid} -> gstk_db:delete_bgrp(DB, Gid);
- _Other -> true
- end,
- {Parent, Id, gstk_menuitem, [Id, Parent]}.
+ delete_bgrp(DB, D),
+ {Parent, Id, gstk_menuitem, [Id, Parent]}.
+
+delete_bgrp(DB, {radio, _, Gid, _}) -> gstk_db:delete_bgrp(DB, Gid);
+delete_bgrp(DB, {check, _, Gid}) -> gstk_db:delete_bgrp(DB, Gid);
+delete_bgrp(_DB, _D) -> true.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : destroy/3
@@ -207,13 +175,10 @@ delete(DB, Gstkid) ->
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
destroy(DB, Id, Parent) ->
- Pgstkid = gstk_db:lookup_gstkid(DB, Parent),
- PW = Pgstkid#gstkid.widget,
- Idx = gstk_menu:lookup_menuitem_pos(DB, Pgstkid, Id),
+ Idx = gstk_menu:lookup_menuitem_pos(DB, #gstkid{widget = PW} = gstk_db:lookup_gstkid(DB, Parent), Id),
gstk_menu:delete_menuitem(DB, Parent, Id),
gstk:exec([PW, " delete ", gstk:to_ascii(Idx)]).
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : event/5
%% Purpose : Construct the event and send it to the owner of the widget
@@ -223,25 +188,13 @@ destroy(DB, Id, Parent) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-event(DB, Gstkid, Etype, Edata, Args) ->
- Arg2 =
- case Gstkid#gstkid.widget_data of
- {radio, G, _GID, V} ->
- [_Grp, Text, Idx | Args1] = Args,
- [Text, Idx, G, V | Args1];
- {check, G, _Gid} ->
- [Bool, Text, Idx | Args1] = Args,
- RBool = case Bool of
- 0 -> false;
- 1 -> true
- end,
- [Text, Idx, G, RBool | Args1];
- _Other2 ->
- Args
- end,
- gstk_generic:event(DB, Gstkid, Etype, Edata, Arg2).
-
-
+event(DB, #gstkid{widget_data = {radio, G, _GID, V}} = Gstkid, Etype, Edata, [_Grp, Text, Idx|Args]) ->
+ gstk_generic:event(DB, Gstkid, Etype, Edata, [Text, Idx, G, V|Args]);
+event(DB, #gstkid{widget_data = {check, G, _Gid}} = Gstkid, Etype, Edata, [0, Text, Idx|Args]) ->
+ gstk_generic:event(DB, Gstkid, Etype, Edata, [Text, Idx, G, false|Args]);
+event(DB, #gstkid{widget_data = {check, G, _Gid}} = Gstkid, Etype, Edata, [1, Text, Idx|Args]) ->
+ gstk_generic:event(DB, Gstkid, Etype, Edata, [Text, Idx, G, true|Args]);
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%%-----------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -253,64 +206,59 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%% TkW - The tk-widget
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option({click,true}, _Gstkid, _TkW, _DB, {separator,_Index}) ->
- none; % workaround to be able to have {click,true} as default.
-option(_Option, _Gstkid, _TkW, _DB, {separator,_Index}) ->
- invalid_option;
+% workaround to be able to have {click, true} as default.
+option({click, On}, Gstkid, TkW, DB, {Kind, Index}) -> cbind(On, Gstkid, TkW, Index, Kind, DB);
+option({menu, {Menu, _RestOfExternalId}}, _Gstkid, _TkW, DB, {cascade, _Index}) ->
+ #gstkid{widget = MenuW} = gstk_db:lookup_gstkid(DB, Menu),
+ option_s(" -menu ", MenuW);
+option({font, Font} = Option, Gstkid, _TkW, DB, {_Kind, _Index}) when is_tuple(Font) ->
+ gstk_db:insert_opt(DB, Gstkid, Option),
+ option_s(" -font ", gstk_font:choose_ascii(DB, Font));
+option(Option, _Gstkid, TkW, _DB, KI) -> option(Option, KI, TkW).
-option({menu,{Menu,_RestOfExternalId}}, _Gstkid, _TkW, DB, {cascade,_Index}) ->
- Mgstkid = gstk_db:lookup_gstkid(DB, Menu),
- MenuW = Mgstkid#gstkid.widget,
- {s, [" -menu ", MenuW]};
+option({click, true}, {separator, _Index}, _TkW) -> none;
+option(_Option, {separator, _Index}, _TkW) -> invalid_option;
+option({select, false}, {check, Index}, TkW) ->
+ option_c(["set x [", TkW, " entrycg ", gstk:to_ascii(Index), " -var];global $x;set $x 0"]);
+option({select, true}, {check, Index}, TkW) ->
+ option_c(["set x [", TkW, " entrycg ", gstk:to_ascii(Index), " -var];global $x;set $x 1"]);
+option({value, Val}, {radio, _Index}, _TkW) ->
+ option_s(" -val ", gstk:to_ascii(Val));
+option({select, false}, {radio, Index}, TkW) ->
+ option_c(["set x [", TkW, " entrycg ", gstk:to_ascii(Index), " -var];global $x;set $x {}"]);
+option({select, true}, {radio, Index}, TkW) ->
+ option_c(["set x [", TkW, " entrycg ", gstk:to_ascii(Index), " -var]; set y [", TkW, " entrycg ", gstk:to_ascii(Index), " -val]; global $x; set $x $y"]);
+option(activate, {_Kind, Index}, TkW) -> option_c([TkW, " act ", gstk:to_ascii(Index)]);
+option(invoke, {_Kind, Index}, TkW) -> option_c([TkW, " inv ", gstk:to_ascii(Index)]);
+option(Option, KI, _TkW) -> option(Option, KI).
-option({select,false}, _Gstkid, TkW, _DB, {check,Index}) ->
- {c, ["set x [", TkW, " entrycg ", gstk:to_ascii(Index),
- " -var];global $x;set $x 0"]};
-option({select,true}, _Gstkid, TkW, _DB, {check,Index}) ->
- {c, ["set x [", TkW, " entrycg ", gstk:to_ascii(Index),
- " -var];global $x;set $x 1"]};
+option(Option, {Kind, _Index}) when Kind =:= radio; Kind =:= check ->
+ case Option of
+ {group, Group} -> option_s(" -var ", gstk:to_ascii(Group));
+ {selectbg, Col} -> option_s(" -selectc ", gstk:to_color(Col));
+ _ -> option(Option)
+ end;
+option(Option, _KI) -> option(Option).
-option({value,Val}, _Gstkid, _TkW, _DB, {radio,_Index}) ->
- {s, [" -val ", gstk:to_ascii(Val)]};
-option({select,false}, _Gstkid, TkW, _DB, {radio,Index}) ->
- {c, ["set x [", TkW, " entrycg ", gstk:to_ascii(Index),
- " -var];global $x;set $x {}"]};
-option({select,true}, _Gstkid, TkW, _DB, {radio,Index}) ->
- {c, ["set x [", TkW, " entrycg ", gstk:to_ascii(Index),
- " -var]; set y [", TkW, " entrycg ", gstk:to_ascii(Index),
- " -val]; global $x; set $x $y"]};
+option({accelerator, Acc}) -> option_s(" -acc ", gstk:to_ascii(Acc));
+option({label, {image, Img}}) -> option_s([" -bitm @", Img, " -lab {}"]);
+% FIXME: insert -command here.....
+% FIXME: how to get value from image entry???
+option({label, {text, Text}}) -> option_s([" -lab ", gstk:to_ascii(Text), " -bitm {}"]);
+option({underline, Int}) -> option_s(" -underl ", gstk:to_ascii(Int));
+option({activebg, Color}) -> option_s(" -activeba ", gstk:to_color(Color));
+option({activefg, Color}) -> option_s(" -activefo ", gstk:to_color(Color));
+option({bg, Color}) -> option_s(" -backg ", gstk:to_color(Color));
+option({enable, true}) -> option_s(" -st normal");
+option({enable, false}) -> option_s(" -st disabled");
+option({fg, Color}) -> option_s(" -foreg ", gstk:to_color(Color));
+option(_Option) -> invalid_option.
-option(Option, Gstkid, TkW, DB, {Kind,Index}) ->
- case Option of
- activate -> {c, [TkW, " act ", gstk:to_ascii(Index)]};
- invoke -> {c, [TkW, " inv ", gstk:to_ascii(Index)]};
- {accelerator, Acc} -> {s, [" -acc ", gstk:to_ascii(Acc)]};
- {click, On} -> cbind(On, Gstkid, TkW, Index, Kind, DB);
- {font, Font} when is_tuple(Font) ->
- gstk_db:insert_opt(DB,Gstkid,Option),
- {s, [" -font ", gstk_font:choose_ascii(DB,Font)]};
- {label, {image,Img}} -> {s, [" -bitm @", Img, " -lab {}"]};
- % FIXME: insert -command here.....
- % FIXME: how to get value from image entry???
- {label, {text,Text}} -> {s, [" -lab ",gstk:to_ascii(Text)," -bitm {}"]};
- {underline, Int} -> {s, [" -underl ", gstk:to_ascii(Int)]};
- {activebg, Color} -> {s, [" -activeba ", gstk:to_color(Color)]};
- {activefg, Color} -> {s, [" -activefo ", gstk:to_color(Color)]};
- {bg, Color} -> {s, [" -backg ", gstk:to_color(Color)]};
- {enable, true} -> {s, " -st normal"};
- {enable, false} -> {s, " -st disabled"};
- {fg, Color} -> {s, [" -foreg ", gstk:to_color(Color)]};
- _Other ->
- case lists:member(Kind,[radio,check]) of
- true ->
- case Option of
- {group,Group} -> {s, [" -var ", gstk:to_ascii(Group)]};
- {selectbg,Col} -> {s,[" -selectc ",gstk:to_color(Col)]};
- _ -> invalid_option
- end;
- _ -> invalid_option
- end
- end.
+option_c(L) -> {c, L}.
+
+option_s(L) -> {s, L}.
+
+option_s(Str, Val) -> option_s([Str, Val]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/5
@@ -318,75 +266,55 @@ option(Option, Gstkid, TkW, DB, {Kind,In
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,GstkId,_TkW,DB,_) ->
- ItemId = GstkId#gstkid.id,
- MenuId = GstkId#gstkid.parent,
+read_option(Option, GstkId, _TkW, DB, _) -> read_option(Option, GstkId, DB).
+
+read_option(click, GstkId, DB) -> gstk_db:is_inserted(DB, GstkId, click);
+read_option(font, GstkId, DB) -> gstk_db:opt(DB, GstkId, font, undefined);
+read_option(Option, #gstkid{id = ItemId, widget = MenuW, parent = MenuId} = GstkId, DB) ->
MenuGstkid = gstk_db:lookup_gstkid(DB, MenuId),
- MenuW = MenuGstkid#gstkid.widget,
Idx = gstk_menu:lookup_menuitem_pos(DB, MenuGstkid, ItemId),
PreCmd = [MenuW, " entrycg ", gstk:to_ascii(Idx)],
case Option of
- accelerator -> tcl2erl:ret_str([PreCmd, " -acc"]);
- activebg -> tcl2erl:ret_color([PreCmd, " -activeba"]);
- activefg -> tcl2erl:ret_color([PreCmd, " -activefo"]);
- bg -> tcl2erl:ret_color([PreCmd, " -backg"]);
- fg -> tcl2erl:ret_color([PreCmd, " -foreg"]);
- group -> read_group(GstkId, Option);
- groupid -> read_groupid(GstkId, Option);
- index -> Idx;
- itemtype -> case GstkId#gstkid.widget_data of
- {Type, _, _, _} -> Type;
- {Type, _, _} -> Type;
- Type -> Type
- end;
- enable -> tcl2erl:ret_enable([PreCmd, " -st"]);
- font -> gstk_db:opt(DB,GstkId,font,undefined);
- label -> tcl2erl:ret_label(["list [", PreCmd, " -lab] [",
- PreCmd, " -bit]"]);
- selectbg -> tcl2erl:ret_color([PreCmd, " -selectco"]);
- underline -> tcl2erl:ret_int([PreCmd, " -underl"]);
- value -> tcl2erl:ret_atom([PreCmd, " -val"]);
- select -> read_select(MenuW, Idx, GstkId);
- click -> gstk_db:is_inserted(DB, GstkId, click);
- _ -> {bad_result, {GstkId#gstkid.objtype, invalid_option, Option}}
- end.
-
-read_group(Gstkid, Option) ->
- case Gstkid#gstkid.widget_data of
- {_, G, _, _} -> G;
- {_, G, _} -> G;
- _Other -> {bad_result,{Gstkid#gstkid.objtype, invalid_option, Option}}
- end.
-
-read_groupid(Gstkid, Option) ->
- case Gstkid#gstkid.widget_data of
- {_, _, Gid, _} -> Gid;
- {_, _, Gid} -> Gid;
- _Other -> {bad_result,{Gstkid#gstkid.objtype, invalid_option, Option}}
- end.
-
-
+ accelerator -> tcl2erl:ret_str([PreCmd, " -acc"]);
+ activebg -> tcl2erl:ret_color([PreCmd, " -activeba"]);
+ activefg -> tcl2erl:ret_color([PreCmd, " -activefo"]);
+ bg -> tcl2erl:ret_color([PreCmd, " -backg"]);
+ fg -> tcl2erl:ret_color([PreCmd, " -foreg"]);
+ index -> Idx;
+ enable -> tcl2erl:ret_enable([PreCmd, " -st"]);
+ label -> tcl2erl:ret_label(["list [", PreCmd, " -lab] [", PreCmd, " -bit]"]);
+ selectbg -> tcl2erl:ret_color([PreCmd, " -selectco"]);
+ underline -> tcl2erl:ret_int([PreCmd, " -underl"]);
+ value -> tcl2erl:ret_atom([PreCmd, " -val"]);
+ select -> read_select(MenuW, Idx, GstkId);
+ _ -> read_option(Option, GstkId)
+ end;
+read_option(Option, GstkId, _DB) -> read_option(Option, GstkId).
+read_option(itemtype, #gstkid{widget_data = {Type, _, _, _}}) -> Type;
+read_option(itemtype, #gstkid{widget_data = {Type, _, _}}) -> Type;
+read_option(itemtype, #gstkid{widget_data = Type}) -> Type;
+read_option(group, GstkId) -> read_group(GstkId, group);
+read_option(groupid, GstkId) -> read_groupid(GstkId, groupid);
+read_option(Option, #gstkid{objtype = ObjType}) -> {bad_result, {ObjType, invalid_option, Option}}.
-read_select(TkMenu, Idx, Gstkid) ->
- case Gstkid#gstkid.widget_data of
- {radio, _, _, _} ->
- Cmd = ["list [set x [", TkMenu, " entrycg ", gstk:to_ascii(Idx),
- " -var];global $x;set $x] [", TkMenu,
- " entrycg ", gstk:to_ascii(Idx)," -val]"],
- case tcl2erl:ret_tuple(Cmd) of
- {X, X} -> true;
- _Other -> false
- end;
- {check, _, _} ->
- Cmd = ["set x [", TkMenu, " entrycg ", gstk:to_ascii(Idx),
- " -var];global $x;set $x"],
- tcl2erl:ret_bool(Cmd);
- _Other ->
- {error,{invalid_option,menuitem,select}}
- end.
+read_group(#gstkid{widget_data = {_, G, _, _}}, _Option) -> G;
+read_group(#gstkid{widget_data = {_, G, _}}, _Option) -> G;
+read_group(#gstkid{objtype = ObjType}, Option) -> {bad_result, {ObjType, invalid_option, Option}}.
+read_groupid(#gstkid{widget_data = {_, _, Gid, _}}, _Option) -> Gid;
+read_groupid(#gstkid{widget_data = {_, _, Gid}}, _Option) -> Gid;
+read_groupid(Gstkid, Option) -> read_group(Gstkid, Option).
+read_select(TkMenu, Idx, #gstkid{widget_data = {radio, _, _, _}}) ->
+ case tcl2erl:ret_tuple(["list [set x [", TkMenu, " entrycg ", gstk:to_ascii(Idx),
+ " -var];global $x;set $x] [", TkMenu, " entrycg ", gstk:to_ascii(Idx), " -val]"]) of
+ {X, X} -> true;
+ _Other -> false
+ end;
+read_select(TkMenu, Idx, #gstkid{widget_data = {check, _, _}}) ->
+ tcl2erl:ret_bool(["set x [", TkMenu, " entrycg ", gstk:to_ascii(Idx), " -var];global $x;set $x"]);
+read_select(_TkMenu, _Idx, _Gstkid) -> {error, {invalid_option, menuitem, select}}.
%%-----------------------------------------------------------------------------
%% PRIMITIVES
@@ -395,190 +323,131 @@ read_select(TkMenu, Idx, Gstkid) ->
%% create version
fix_group_and_value(Opts, DB, Owner) ->
{G, GID, V, NOpts} = fgav(Opts, erlNIL, erlNIL, erlNIL, []),
- RV = case V of
- erlNIL ->
- list_to_atom(lists:concat([v,gstk_db:counter(DB,value)]));
- Other0 -> Other0
+ RV = if
+ V =:= erlNIL -> list_to_atom(lists:concat([v, gstk_db:counter(DB, value)]));
+ true -> V
end,
- NG = case G of
- erlNIL -> mrb;
- Other1 -> Other1
- end,
- RGID = case GID of
- erlNIL -> {mrbgrp, NG, Owner};
- Other2 -> Other2
+ NG = if
+ G =:= erlNIL -> mrb;
+ true -> G
+ end,
+ RGID = if
+ GID =:= erlNIL -> {mrbgrp, NG, Owner};
+ true -> GID
end,
- RG = gstk_db:insert_bgrp(DB, RGID),
- {NG, RGID, RV, [{group, RG}, {value, RV} | NOpts]}.
-
+ {NG, RGID, RV, [{group, gstk_db:insert_bgrp(DB, RGID)}, {value, RV}|NOpts]}.
+
%% config version
-fix_group_and_value(Opts, DB, Owner, Gstkid) ->
- {Type, RG, RGID, RV} = Gstkid#gstkid.widget_data,
- {G, GID, V, NOpts} = fgav(Opts, RG, RGID, RV, []),
- case {G, GID, V} of
- {RG, RGID, RV} ->
- {NOpts, Gstkid};
- {NG, RGID, RV} ->
+fix_group_and_value(Opts, DB, Owner, #gstkid{widget_data = {Type, RG, RGID, RV}} = Gstkid) ->
+ case fgav(Opts, RG, RGID, RV, []) of
+ {RG, RGID, RV, NOpts} -> {NOpts, Gstkid};
+ {NG, RGID, RV, NOpts} ->
NGID = {rbgrp, NG, Owner},
gstk_db:delete_bgrp(DB, RGID),
- NRG = gstk_db:insert_bgrp(DB, NGID),
- NGstkid = Gstkid#gstkid{widget_data={Type,NG,NGID,RV}},
+ NGstkid = Gstkid#gstkid{widget_data = {Type, NG, NGID, RV}},
gstk_db:insert_widget(DB, NGstkid),
- {[{group, NRG} | NOpts], NGstkid};
- {RG, RGID, NRV} ->
- NGstkid = Gstkid#gstkid{widget_data={Type,RG,RGID,NRV}},
+ {[{group, gstk_db:insert_bgrp(DB, NGID)}|NOpts], NGstkid};
+ {RG, RGID, NRV, NOpts} ->
+ NGstkid = Gstkid#gstkid{widget_data = {Type, RG, RGID, NRV}},
gstk_db:insert_widget(DB, NGstkid),
- {[{value,NRV} | NOpts], NGstkid};
- {_, NGID, RV} when NGID =/= RGID ->
+ {[{value, NRV}|NOpts], NGstkid};
+ {_, NGID, RV, NOpts} ->
gstk_db:delete_bgrp(DB, RGID),
- NRG = gstk_db:insert_bgrp(DB, NGID),
- NGstkid = Gstkid#gstkid{widget_data={Type,RG,NGID,RV}},
+ NGstkid = Gstkid#gstkid{widget_data = {Type, RG, NGID, RV}},
gstk_db:insert_widget(DB, NGstkid),
- {[{group, NRG} | NOpts], NGstkid};
- {_, NGID, NRV} when NGID =/= RGID ->
+ {[{group, gstk_db:insert_bgrp(DB, NGID)}|NOpts], NGstkid};
+ {NG, RGID, NRV, NOpts} ->
+ NGID = {rbgrp, NG, Owner},
gstk_db:delete_bgrp(DB, RGID),
- NRG = gstk_db:insert_bgrp(DB, NGID),
- NGstkid = Gstkid#gstkid{widget_data={Type,RG,NGID,NRV}},
+ NGstkid = Gstkid#gstkid{widget_data = {Type, NG, NGID, NRV}},
gstk_db:insert_widget(DB, NGstkid),
- {[{group, NRG}, {value,NRV} | NOpts], NGstkid};
- {NG, RGID, NRV} ->
- NGID = {rbgrp, NG, Owner},
+ {[{group, gstk_db:insert_bgrp(DB, NGID)}, {value, NRV}|NOpts], NGstkid};
+ {_, NGID, NRV, NOpts} ->
gstk_db:delete_bgrp(DB, RGID),
- NRG = gstk_db:insert_bgrp(DB, NGID),
- NGstkid = Gstkid#gstkid{widget_data={Type,NG,NGID,NRV}},
+ NGstkid = Gstkid#gstkid{widget_data = {Type, RG, NGID, NRV}},
gstk_db:insert_widget(DB, NGstkid),
- {[{group, NRG}, {value,NRV} | NOpts], NGstkid}
+ {[{group, gstk_db:insert_bgrp(DB, NGID)}, {value, NRV}|NOpts], NGstkid}
end.
-
-
-fgav([{group, G} | Opts], _, GID, V, Nopts) ->
- fgav(Opts, G, GID, V, Nopts);
-
-fgav([{groupid, GID} | Opts], G, _, V, Nopts) ->
- fgav(Opts, G, GID, V, Nopts);
-
-fgav([{value, V} | Opts], G, GID, _, Nopts) ->
- fgav(Opts, G, GID, V, Nopts);
-
-fgav([Opt | Opts], G, GID, V, Nopts) ->
- fgav(Opts, G, GID, V, [Opt | Nopts]);
-
-fgav([], Group, GID, Value, Opts) ->
- {Group, GID, Value, Opts}.
-
+fgav([{group, G}|Opts], _, GID, V, Nopts) -> fgav(Opts, G, GID, V, Nopts);
+fgav([{groupid, GID}|Opts], G, _, V, Nopts) -> fgav(Opts, G, GID, V, Nopts);
+fgav([{value, V}|Opts], G, GID, _, Nopts) -> fgav(Opts, G, GID, V, Nopts);
+fgav([Opt|Opts], G, GID, V, Nopts) -> fgav(Opts, G, GID, V, [Opt|Nopts]);
+fgav([], Group, GID, Value, Opts) -> {Group, GID, Value, Opts}.
%% check button version
%% create version
fix_group(Opts, DB, Owner) ->
{G, GID, NOpts} = fg(Opts, erlNIL, erlNIL, []),
- NG = case G of
- erlNIL ->
- Vref = gstk_db:counter(DB, variable),
- list_to_atom(lists:flatten(["mcb", gstk:to_ascii(Vref)]));
- Other1 -> Other1
- end,
- RGID = case GID of
- erlNIL -> {mcbgrp, NG, Owner};
- Other2 -> Other2
+ NG = if
+ G =:= erlNIL -> list_to_atom(lists:flatten(["mcb", gstk:to_ascii(gstk_db:counter(DB, variable))]));
+ true -> G
+ end,
+ RGID = if
+ GID =:= erlNIL -> {mcbgrp, NG, Owner};
+ true -> GID
end,
- RG = gstk_db:insert_bgrp(DB, RGID),
- {NG, RGID, [{group, RG} | NOpts]}.
-
+ {NG, RGID, [{group, gstk_db:insert_bgrp(DB, RGID)} | NOpts]}.
+
%% config version
-fix_group(Opts, DB, Owner, Gstkid) ->
- {Type, RG, RGID} = Gstkid#gstkid.widget_data,
- {G, GID, NOpts} = fg(Opts, RG, RGID, []),
- case {G, GID} of
- {RG, RGID} ->
- {NOpts, Gstkid};
- {NG, RGID} ->
+fix_group(Opts, DB, Owner, #gstkid{widget_data = {Type, RG, RGID}} = Gstkid) ->
+ case fg(Opts, RG, RGID, []) of
+ {RG, RGID, NOpts} -> {NOpts, Gstkid};
+ {NG, RGID, NOpts} ->
NGID = {cbgrp, NG, Owner},
gstk_db:delete_bgrp(DB, RGID),
- NRG = gstk_db:insert_bgrp(DB, NGID),
- NGstkid = Gstkid#gstkid{widget_data={Type,NG,NGID}},
+ NGstkid = Gstkid#gstkid{widget_data = {Type, NG, NGID}},
gstk_db:insert_widget(DB, NGstkid),
- {[{group, NRG} | NOpts], NGstkid};
- {_, NGID} when NGID =/= RGID ->
+ {[{group, gstk_db:insert_bgrp(DB, NGID)}|NOpts], NGstkid};
+ {_, NGID, NOpts} ->
gstk_db:delete_bgrp(DB, RGID),
- NRG = gstk_db:insert_bgrp(DB, NGID),
- NGstkid = Gstkid#gstkid{widget_data={Type,RG,NGID}},
+ NGstkid = Gstkid#gstkid{widget_data = {Type, RG, NGID}},
gstk_db:insert_widget(DB, NGstkid),
- {[{group, NRG} | NOpts], NGstkid}
+ {[{group, gstk_db:insert_bgrp(DB, NGID)}|NOpts], NGstkid}
end.
+fg([{group, G}|Opts], _, GID, Nopts) -> fg(Opts, G, GID, Nopts);
+fg([{groupid, GID}|Opts], G, _, Nopts) -> fg(Opts, G, GID, Nopts);
+fg([Opt|Opts], G, GID, Nopts) -> fg(Opts, G, GID, [Opt|Nopts]);
+fg([], Group, GID, Opts) -> {Group, GID, Opts}.
+parse_opts(Opts, TkMenu) -> parse_opts(Opts, TkMenu, none, none, []).
-fg([{group, G} | Opts], _, GID, Nopts) ->
- fg(Opts, G, GID, Nopts);
-
-fg([{groupid, GID} | Opts], G, _, Nopts) ->
- fg(Opts, G, GID, Nopts);
-
-fg([Opt | Opts], G, GID, Nopts) ->
- fg(Opts, G, GID, [Opt | Nopts]);
-
-fg([], Group, GID, Opts) ->
- {Group, GID, Opts}.
-
-
-
-parse_opts(Opts, TkMenu) ->
- parse_opts(Opts, TkMenu, none, none, []).
-
-
-parse_opts([Option | Rest], TkMenu, Idx, Type, Options) ->
+parse_opts([Option|Rest], TkMenu, Idx, Type, Options) ->
case Option of
- {index, I} -> parse_opts(Rest, TkMenu, I, Type, Options);
+ {index, I} -> parse_opts(Rest, TkMenu, I, Type, Options);
{itemtype, T} -> parse_opts(Rest, TkMenu, Idx, T, Options);
- _Other -> parse_opts(Rest, TkMenu, Idx, Type,[Option | Options])
+ _Other -> parse_opts(Rest, TkMenu, Idx, Type, [Option|Options])
end;
parse_opts([], TkMenu, Index, Type, Options) ->
- RealIdx =
- case Index of
- Idx when is_integer(Idx) -> Idx;
- last -> find_last_index(TkMenu);
- Other -> gs:error("Invalid index ~p~n",[Other])
- end,
- {RealIdx, Type, Options}.
+ {case Index of
+ Idx when is_integer(Idx) -> Idx;
+ last -> find_last_index(TkMenu);
+ Other -> gs:error("Invalid index ~p~n", [Other])
+ end, Type, Options}.
find_last_index(TkMenu) ->
case tcl2erl:ret_int([TkMenu, " index last"]) of
- Last when is_integer(Last) -> Last+1;
- none -> 0;
- Other -> gs:error("Couldn't find index ~p~n",[Other])
+ Last when is_integer(Last) -> Last + 1;
+ none -> 0;
+ Other -> gs:error("Couldn't find index ~p~n", [Other])
end.
cbind({true, Edata}, Gstkid, TkMenu, Index, Type, DB) ->
Eref = gstk_db:insert_event(DB, Gstkid, click, Edata),
IdxStr = gstk:to_ascii(Index),
- case Type of
- normal ->
- Cmd = [" -command {erlsend ", Eref,
- " \\\"[",TkMenu," entrycg ",IdxStr," -label]\\\" ",
- IdxStr,"}"],
- {s, Cmd};
- check ->
- Cmd = [" -command {erlsend ", Eref,
- " \[expr \$[", TkMenu, " entrycg ",IdxStr," -var]\] \\\"[",
- TkMenu, " entrycg ",IdxStr," -label]\\\" ",IdxStr,"}"],
- {s, Cmd};
- radio ->
- Cmd = [" -command {erlsend ", Eref,
- " [", TkMenu, " entrycg ",IdxStr," -var] \\\"[",
- TkMenu, " entrycg ",IdxStr," -label]\\\" ",IdxStr,"}"],
- {s, Cmd};
- _Other ->
- none
+ if
+ Type =:= normal -> {s, [" -command {erlsend ", Eref, " \\\"[", TkMenu, " entrycg ", IdxStr,
+ " -label]\\\" ", IdxStr, "}"]};
+ Type =:= check -> {s, [" -command {erlsend ", Eref, " \[expr \$[", TkMenu, " entrycg ", IdxStr,
+ " -var]\] \\\"[", TkMenu, " entrycg ", IdxStr, " -label]\\\" ", IdxStr, "}"]};
+ Type =:= radio -> {s, [" -command {erlsend ", Eref, " [", TkMenu, " entrycg ", IdxStr,
+ " -var] \\\"[", TkMenu, " entrycg ", IdxStr, " -label]\\\" ", IdxStr, "}"]};
+ true -> none
end;
-
cbind({false, _}, Gstkid, _TkMenu, _Index, _Type, DB) ->
gstk_db:delete_event(DB, Gstkid, click),
none;
-
-cbind(On, Gstkid, TkMenu, Index, Type, DB) when is_atom(On) ->
- cbind({On, []}, Gstkid, TkMenu, Index, Type, DB).
-
+cbind(On, Gstkid, TkMenu, Index, Type, DB) when is_atom(On) -> cbind({On, []}, Gstkid, TkMenu, Index, Type, DB).
%%% ----- Done -----
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_oval.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_oval.erl
--- otp_src_19.0.5/lib/gs/src/gstk_oval.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_oval.erl 2016-08-25 16:37:44.566693320 +0300
@@ -30,7 +30,7 @@
%%
%% Options:
%% bw Int
-%% coords [{X1,Y1}, {X2,Y2}]
+%% coords [{X1, Y1}, {X2, Y2}]
%% data Data
%% fg Color
%% fill Color
@@ -61,8 +61,7 @@
%% Not Implemented:
%%
--export([create/3, config/3, read/3, delete/2, destroy/3, event/5,
- option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, destroy/3, event/5, option/5, read_option/5]).
-include("gstk.hrl").
@@ -74,26 +73,19 @@
%% Purpose : Create a widget of the type defined in this module.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
create(DB, Gstkid, Opts) ->
- case gstk_canvas:pickout_coords(Opts, [],oval,2) of
- {error, Error} ->
- {bad_result, Error};
+ case gstk_canvas:pickout_coords(Opts, [], oval, 2) of
+ {error, Error} -> {bad_result, Error};
{Coords, NewOpts} ->
- Ngstkid=gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
- #gstkid{widget=CanvasTkW}=Ngstkid,
- MCmd = [CanvasTkW, " create ov ", Coords],
- gstk_canvas:mk_cmd_and_call(NewOpts,Ngstkid, CanvasTkW, MCmd, DB)
+ #gstkid{widget = CanvasTkW} = Ngstkid = gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
+ gstk_canvas:mk_cmd_and_call(NewOpts, Ngstkid, CanvasTkW, [CanvasTkW, " create ov ", Coords], DB)
end.
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : config/3
%% Purpose : Configure a widget of the type defined in this module.
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
- gstk_canvas:item_config(DB, Gstkid, Opts).
-
-
+config(DB, Gstkid, Opts) -> gstk_canvas:item_config(DB, Gstkid, Opts).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -104,9 +96,7 @@ config(DB, Gstkid, Opts) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- Item = Gstkid#gstkid.widget_data,
- gstk_generic:read_option(DB,Gstkid,Opt,[gstk:to_ascii(Item)]).
+read(DB, #gstkid{widget_data = Item} = Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt, [gstk:to_ascii(Item)]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : delete/2
@@ -116,8 +106,7 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy | {Parent, Objmod, Args}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
- gstk_canvas:item_delete_impl(DB,Gstkid).
+delete(DB, Gstkid) -> gstk_canvas:item_delete_impl(DB, Gstkid).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : destroy/3
@@ -128,9 +117,7 @@ delete(DB, Gstkid) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-destroy(_DB, Canvas, Item) ->
- gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-
+destroy(_DB, Canvas, Item) -> gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : event/5
@@ -143,9 +130,7 @@ destroy(_DB, Canvas, Item) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
-
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%%-----------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -158,13 +143,13 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%% MainW - The main tk-widget
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, _Gstkid, _Canvas, _DB, _AItem) ->
- case Option of
- {fg, Color} -> {s, [" -outline ", gstk:to_color(Color)]};
- {bw, Int} -> {s, [" -w ", gstk:to_ascii(Int)]};
- _ -> invalid_option
- end.
+option(Option, _Gstkid, _Canvas, _DB, _AItem) -> option(Option).
+
+option({fg, Color}) -> option_s(" -outline ", gstk:to_color(Color));
+option({bw, Int}) -> option_s(" -w ", gstk:to_ascii(Int));
+option(_Option) -> invalid_option.
+option_s(Str, Val) -> {s, [Str, Val]}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/5
@@ -175,15 +160,17 @@ option(Option, _Gstkid, _Canvas, _DB, _A
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option, Gstkid, Canvas, _DB, AItem) ->
- case Option of
- bw -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -w"]);
- fg -> tcl2erl:ret_color([Canvas, " itemcg ", AItem," -outline"]);
- stipple -> tcl2erl:ret_stipple([Canvas," itemcg ",AItem," -stipple"]);
- _ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
- end.
+read_option(Option, Gstkid, Canvas, _DB, AItem) -> read_option(Option, Gstkid, Canvas, AItem).
+read_option(Option, Gstkid, Canvas, AItem) ->
+ case read_option(Option, AItem, Canvas) of
+ invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+ O -> O
+ end.
+read_option(bw, AItem, Canvas) -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -w"]);
+read_option(fg, AItem, Canvas) -> tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -outline"]);
+read_option(stipple, AItem, Canvas) -> tcl2erl:ret_stipple([Canvas, " itemcg ", AItem, " -stipple"]);
+read_option(_Option, _AItem, _Canvas) -> invalid_option.
%% ----- Done -----
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_polygon.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_polygon.erl
--- otp_src_19.0.5/lib/gs/src/gstk_polygon.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_polygon.erl 2016-08-25 16:37:44.566693320 +0300
@@ -25,13 +25,12 @@
-module(gstk_polygon).
-
%%-----------------------------------------------------------------------------
-%% POLYGON OPTIONS
+%% POLYGON OPTIONS
%%
%% Attributes:
%% bw Int
-%% coords [{X1,Y1}, {X2,Y2} | {Xn,Yn}]
+%% coords [{X1, Y1}, {X2, Y2} | {Xn, Yn}]
%% data Data
%% fg Color
%% fill Color
@@ -62,8 +61,7 @@
%% type
%%
--export([create/3, config/3, read/3, delete/2, destroy/3, event/5,
- option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, destroy/3, event/5, option/5, read_option/5]).
-include("gstk.hrl").
@@ -76,23 +74,18 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
create(DB, Gstkid, Opts) ->
case pickout_coords(Opts, []) of
- {error, Error} ->
- {bad_result, Error};
+ {error, Error} -> {bad_result, Error};
{Coords, NewOpts} ->
- Ngstkid=gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
- #gstkid{widget=CanvasTkW}=Ngstkid,
- MCmd = [CanvasTkW, " create po ", Coords],
- gstk_canvas:mk_cmd_and_call(NewOpts, Ngstkid,CanvasTkW, MCmd, DB)
+ #gstkid{widget = CanvasTkW} = Ngstkid = gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
+ gstk_canvas:mk_cmd_and_call(NewOpts, Ngstkid, CanvasTkW, [CanvasTkW, " create po ", Coords], DB)
end.
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : config/3
%% Purpose : Configure a widget of the type defined in this module.
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
- gstk_canvas:item_config(DB, Gstkid, Opts).
+config(DB, Gstkid, Opts) -> gstk_canvas:item_config(DB, Gstkid, Opts).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -103,9 +96,7 @@ config(DB, Gstkid, Opts) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- Item = Gstkid#gstkid.widget_data,
- gstk_generic:read_option(DB,Gstkid,Opt,[gstk:to_ascii(Item)]).
+read(DB, #gstkid{widget_data = Item} = Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt, [gstk:to_ascii(Item)]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : delete/2
@@ -115,8 +106,7 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy | {Parent, Objmod, Args}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
- gstk_canvas:item_delete_impl(DB,Gstkid).
+delete(DB, Gstkid) -> gstk_canvas:item_delete_impl(DB, Gstkid).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : destroy/3
@@ -127,12 +117,9 @@ delete(DB, Gstkid) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-destroy(_DB, Canvas, Item) ->
- gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-
+destroy(_DB, Canvas, Item) -> gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%%-----------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -148,15 +135,17 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%%
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, _Gstkid, _Canvas, _DB, _AItem) ->
- case Option of
- {fg, Color} -> {s, [" -outline ", gstk:to_color(Color)]};
- {bw, Int} -> {s, [" -w ", gstk:to_ascii(Int)]};
- {smooth, Bool} -> {s, [" -sm ", gstk:to_ascii(Bool)]};
- {splinesteps, Int} -> {s, [" -sp ", gstk:to_ascii(Int)]};
- _ -> invalid_option
- end.
+option(Option, _Gstkid, _Canvas, _DB, _AItem) -> option(Option).
+
+option({fg, Color}) -> option_s([" -outline ", gstk:to_color(Color)]);
+option({bw, Int}) -> to_ascii(" -w ", Int);
+option({smooth, Bool}) -> to_ascii(" -sm ", Bool);
+option({splinesteps, Int}) -> to_ascii(" -sp ", Int);
+option(_Option) -> invalid_option.
+
+option_s(L) -> {s, L}.
+to_ascii(Str, Val) -> option_s([Str, gstk:to_ascii(Val)]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/5
@@ -164,33 +153,32 @@ option(Option, _Gstkid, _Canvas, _DB, _A
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option, Gstkid, Canvas, _DB, AItem) ->
- case Option of
- bw -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -w"]);
- fg ->
- tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -outline"]);
- smooth -> tcl2erl:ret_bool([Canvas, " itemcg ", AItem, " -sm"]);
- splinesteps -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -sp"]);
- stipple ->
- tcl2erl:ret_stipple([Canvas," itemcg ",AItem," -stipple"]);
+read_option(Option, Gstkid, Canvas, _DB, AItem) -> read_option(Option, Gstkid, Canvas, AItem).
- _ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+read_option(Option, Gstkid, Canvas, AItem) ->
+ case read_option(Option, AItem, Canvas) of
+ invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+ O -> O
end.
+read_option(bw, AItem, Canvas) -> ret_int(" -w", AItem, Canvas);
+read_option(fg, AItem, Canvas) -> tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -outline"]);
+read_option(smooth, AItem, Canvas) -> tcl2erl:ret_bool([Canvas, " itemcg ", AItem, " -sm"]);
+read_option(splinesteps, AItem, Canvas) -> ret_int(" -sp", AItem, Canvas);
+read_option(stipple, AItem, Canvas) -> tcl2erl:ret_stipple([Canvas, " itemcg ", AItem, " -stipple"]);
+read_option(_Option, _AItem, _Canvas) -> invalid_option.
+
+ret_int(Str, AItem, Canvas) -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, Str]).
+
%%-----------------------------------------------------------------------------
%% PRIMITIVES
%%-----------------------------------------------------------------------------
-pickout_coords([{coords,Coords} | Rest], Opts) when length(Coords) >= 2 ->
+pickout_coords([], _Opts) -> {error, "A polygon must have at least four coordinates"};
+pickout_coords([{coords, [_,_|_] = Coords}|Rest], Opts) ->
case gstk_canvas:coords(Coords) of
- invalid ->
- {error, "A polygon must have at least four coordinates"};
- RealCoords ->
- {RealCoords, lists:append(Rest, Opts)}
+ invalid -> pickout_coords([], Opts);
+ RealCoords -> {RealCoords, lists:append(Rest, Opts)}
end;
-pickout_coords([Opt | Rest], Opts) ->
- pickout_coords(Rest, [Opt|Opts]);
-pickout_coords([], _Opts) ->
- {error, "A polygon must have at least four coordinates"}.
+pickout_coords([Opt|Rest], Opts) -> pickout_coords(Rest, [Opt|Opts]).
%% ----- Done -----
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_port_handler.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_port_handler.erl
--- otp_src_19.0.5/lib/gs/src/gstk_port_handler.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_port_handler.erl 2016-08-25 16:37:44.566693320 +0300
@@ -35,7 +35,8 @@
%% ------------------------------------------------------------
-module(gstk_port_handler).
--compile([{nowarn_deprecated_function,{gs,error,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, error, 2}}]).
-include("gstk.hrl").
@@ -44,59 +45,19 @@
% FIXME There has to be a better solution....
% FIXME Add option in app file or environmen variable.
--define(WISHNAMES, ["wish85","wish8.5",
- "wish84","wish8.4",
- "wish83","wish8.3",
- "wish82","wish8.2",
- "wish"]).
+-define(WISHNAMES, ["wish85", "wish8.5", "wish84", "wish8.4", "wish83", "wish8.3", "wish82", "wish8.2", "wish"]).
%% ------------------------------------------------------------
%% DEBUG FUNCTIONS
%% ------------------------------------------------------------
--export([exec/1,call/2,
- start_link/1,init/2,ping/1,stop/1]).
+-export([exec/1, call/2, start_link/1, init/2, ping/1, stop/1]).
-export([wait_for_connection/2]).
--define(START_TIMEOUT , 1000 * 30).
+-define(START_TIMEOUT, 1000 * 30).
-define(ACCEPT_TIMEOUT, 1000 * 20).
-define(DEBUGLEVEL, 4).
--ifdef(DEBUG).
-
--define(DBG(DbgLvl,Format, Data),dbg(DbgLvl, Format, Data)).
--define(DBG_STR(DbgLvl, What, Str),dbg_str(DbgLvl, What, Str)).
-
-dbg(DbgLvl, Format, Data) when DbgLvl =< ?DEBUGLEVEL ->
- ok = io:format("DBG: " ++ Format, Data);
-dbg(_DbgLvl, _Format, _Data) -> ok.
-
-dbg_str(DbgLvl, What, Str) when DbgLvl =< ?DEBUGLEVEL ->
- ok = io:format("DBG: ~s~s\n", [What,dbg_s(Str)]);
-dbg_str(_DbgLvl, _What, _Data) -> ok.
-
-dbg_s([]) ->
- [];
-dbg_s([C | Str]) when list(C) ->
- [dbg_s(C) | dbg_s(Str)];
-dbg_s([C | Str]) when C >= 20, C < 255 ->
- [C | dbg_s(Str)];
-dbg_s([$\n | Str]) ->
- ["\\n" | dbg_s(Str)];
-dbg_s([$\r | Str]) ->
- ["\\r" | dbg_s(Str)];
-dbg_s([$\t | Str]) ->
- ["\\t" | dbg_s(Str)];
-dbg_s([C | Str]) when integer(C) ->
- [io_lib:format("\\~.3.0w",[C]) | dbg_s(Str)].
-
--else.
-
--define(DBG(DbgLvl,Format, Data), true).
--define(DBG_STR(DbgLvl, What, Str), true).
-
--endif.
-
%% ------------------------------------------------------------
%% INTERFACE FUNCTIONS
%% ------------------------------------------------------------
@@ -113,82 +74,56 @@ dbg_s([C | Str]) when integer(C) ->
get_env(App, KeyAtom) ->
KeyStr = atom_to_list(KeyAtom),
- ?DBG(1,"Result from init:get_argument(~w): ~p\n",
- [KeyAtom,init:get_argument(App)]),
case init:get_argument(App) of
- {ok,[[KeyStr,ValStr]]} ->
- {ok,list_to_atom(ValStr)};
- _ ->
- undefined
+ {ok, [[KeyStr, ValStr]]} -> {ok, list_to_atom(ValStr)};
+ _ -> undefined
end.
start_link(Gstk) ->
- ?DBG(1, "start_link(~w)~n", [Gstk]),
-% io:format("STARTS ~p\n",[erlang:localtime()]),
- Mode =
- % FIXME: Want to use application:get_env() if we where an true app
- case {os:type(),get_env(gs,backend_comm)} of
- {{win32,_Flavor},undefined} ->
- use_socket;
- {_OS,undefined} ->
- use_port;
- {_OS,{ok,socket}} ->
- use_socket;
- {_OS,{ok,port}} ->
- use_port
- end,
- ?DBG(1,"We use mode: ~w (~w)\n",[Mode,get_env(gs,backend_comm)]),
- Pid = spawn_link(gstk_port_handler, init, [Gstk,Mode]),
+ Pid = spawn_link(gstk_port_handler, init, [Gstk, case {os:type(), get_env(gs, backend_comm)} of
+ {{win32, _Flavor}, undefined} -> use_socket;
+ {_OS, undefined} -> use_port;
+ {_OS, {ok, socket}} -> use_socket;
+ {_OS, {ok, port}} -> use_port
+ end]),
receive
- {Pid, ok} ->
- {ok, Pid};
- {Pid, error, Reason} ->
- {error, Reason}
- after ?START_TIMEOUT ->
- {error, timeout}
+ {Pid, ok} -> {ok, Pid};
+ {Pid, error, Reason} -> {error, Reason}
+ after ?START_TIMEOUT -> {error, timeout}
end.
call(PortHandler, Cmd) ->
- PortHandler ! {call, ["erlcall {",Cmd,$}]},
+ PortHandler ! {call, ["erlcall {", Cmd, $}]},
receive
- {result, Result} ->
- ?DBG(1, "call reply: ~p~n", [Result]),
- {result, Result};
- {bad_result, Bad_Result} ->
- ?DBG(1, "bad call reply: ~p~n", [Bad_Result]),
- {bad_result, Bad_Result}
+ {result, _Result} = R -> R;
+ {bad_result, _Bad_Result} = R -> R
end.
ping(PortHandler) ->
- ?DBG(1, "ping~n", []),
PortHandler ! {ping, self()},
receive
- {pong,_From,PortOrSock} -> {ok,PortOrSock}
+ {pong, _From, PortOrSock} -> {ok, PortOrSock}
end.
stop(PortHandler) ->
- ?DBG(1, "stop~n", []),
- PortHandler ! {stop,self()},
+ PortHandler ! {stop, self()},
receive
- {stopped,PortHandler} -> ok
+ {stopped, PortHandler} -> ok
end.
%% Purpose: asyncron call to tk
%% too expensive
-% FIXME
+% FIXME
exec(Cmd) ->
- get(port_handler) ! {exec, ["erlexec {",Cmd,$}]},
+ get(port_handler) ! {exec, ["erlexec {", Cmd, $}]},
ok.
% in gstk context, but I don't want "ifndef nt40" in other
% modules than this one.
%exec(Cmd) ->
-% ?DBG_STR(1, "", ["erlexec {",Cmd,"}"]),
% case get(port) of
-% {socket,Sock} ->
-% gen_tcp:send(Sock, ["erlexec {",Cmd,$}]);
-% {port,Port} ->
-% Port ! {get(port_handler),{command,["erlexec {",Cmd,$}]}}
+% {socket, Sock} -> gen_tcp:send(Sock, ["erlexec {", Cmd, $}]);
+% {port, Port} -> Port ! {get(port_handler), {command, ["erlexec {", Cmd, $}]}}
% end,
% ok.
@@ -203,134 +138,79 @@ exec(Cmd) ->
%% gstk: is the pid of the gstk process that started me.
%% all my input (from the port) is forwarded to it.
%%----------------------------------------------------------------------
--record(state,{out,gstk}).
+-record(state, {out, gstk}).
init(Gstk, Mode) ->
- process_flag(trap_exit,true),
-
+ process_flag(trap_exit, true),
% ------------------------------------------------------------
% Set up paths
% ------------------------------------------------------------
-
PrivDir = code:priv_dir(gs),
- TclDir = filename:join(PrivDir,"tcl"),
- TclBinDir = filename:join(TclDir,"bin"),
- TclLibDir = filename:join(TclDir,"lib"),
-
- InitScript = filename:nativename(filename:join(PrivDir,"gstk.tcl")),
-
- ?DBG(1, "TclBinDir : ~s\n", [TclBinDir]),
- ?DBG(1, "TclLibDir : ~s\n", [TclLibDir]),
- ?DBG(1, "InitScript : ~s\n", [InitScript]),
-
+ TclDir = filename:join(PrivDir, "tcl"),
+ InitScript = filename:nativename(filename:join(PrivDir, "gstk.tcl")),
% ------------------------------------------------------------
% Search for wish in priv and in system search path
% ------------------------------------------------------------
-
- {Wish,Options} =
- case filelib:wildcard(filename:join(TclBinDir,"wish*")) of
- % If more than one wish in priv we assume they are the same
- [PrivWish | _] ->
- % ------------------------------------------------
- % We have to set TCL_LIBRARY and TK_LIBRARY because else
- % 'wish' will search in the original installation directory
- % for 'tclIndex' and this may be an incompatible version on
- % the host we run on.
- % ------------------------------------------------
-
- [TclLibrary] =
- filelib:wildcard(filename:join(PrivDir,
- "tcl/lib/tcl[1-9]*")),
- [TkLibrary] =
- filelib:wildcard(filename:join(PrivDir,
- "tcl/lib/tk[1-9]*")),
-
- Opts = [{env,[{"TCL_LIBRARY", TclLibrary},
- {"TK_LIBRARY", TkLibrary},
- {"LD_LIBRARY_PATH",TclLibDir}]},
- {packet,4}],
- {PrivWish,Opts};
- _ ->
- % We use the system wish program
- {search_wish(?WISHNAMES, Gstk),[{packet,4}]}
- end,
-
-
- ?DBG(1, "Wish : ~s\n", [Wish]),
-
- Cmd =
- case Mode of
- use_socket ->
- % ------------------------------------------------------------
- % Set up a listening socket and call accept in another process
- % ------------------------------------------------------------
- SocketOpts =
- [
- {nodelay, true},
- {packet,4},
- {reuseaddr,true}
- ],
- % Let OS pick a number
- {ok,ListenSocket} = gen_tcp:listen(0, SocketOpts),
- {ok,ListenPort} = inet:port(ListenSocket),
-
- % Wait in another process
- spawn_link(?MODULE,wait_for_connection,[self(),ListenSocket]),
- lists:concat([Wish," ",InitScript," -- ",PrivDir," ",
- ListenPort]);
- use_port ->
- lists:concat([Wish," ",InitScript," -- ",PrivDir])
- end,
-
- ?DBG(1, "Port opts :\n~p\n", [Options]),
-
- % FIXME remove timing if not debugging
- Port =
- case timer:tc(erlang,open_port,[{spawn, Cmd}, Options]) of
- {_T,Port1} when is_port(Port1) ->
- ?DBG(1,"open_port takes ~p milliseconds\n",[_T/1000]),
- link(Port1),
- Port1;
- {_T,{error,_Reason1}} -> % FIXME: Why throw away reason?!
- ?DBG(1,"ERROR: ~p\n",[_Reason1]),
- Gstk ! {self(), error, backend_died},
- exit(normal)
- end,
-
- State =
- case Mode of
- use_socket ->
- % ------------------------------------------------------------
- % Wait for a connection
- % ------------------------------------------------------------
- Sock =
- receive
- {connected,Socket} ->
- Socket;
- % FIXME: Why throw away reason?!
- {'EXIT', _Pid, _Reason2} ->
- Gstk ! {self(), error, backend_died},
- exit(normal)
- end,
-
- ?DBG(1,"Got socket ~p~n",[Sock]),
- #state{out={socket,Sock}, gstk=Gstk};
- use_port ->
- #state{out={port,Port}, gstk=Gstk}
- end,
-
- Gstk ! {self(), ok}, % Tell caller we are prepared
- idle(State).
+ {Wish, Options} = case filelib:wildcard(filename:join(filename:join(TclDir, "bin"), "wish*")) of
+ % If more than one wish in priv we assume they are the same
+ [PrivWish|_] ->
+ % ------------------------------------------------
+ % We have to set TCL_LIBRARY and TK_LIBRARY because else
+ % 'wish' will search in the original installation directory
+ % for 'tclIndex' and this may be an incompatible version on
+ % the host we run on.
+ % ------------------------------------------------
+ [TclLibrary] = filelib:wildcard(filename:join(PrivDir, "tcl/lib/tcl[1-9]*")),
+ [TkLibrary] = filelib:wildcard(filename:join(PrivDir, "tcl/lib/tk[1-9]*")),
+ {PrivWish, [{env, [{"TCL_LIBRARY", TclLibrary},
+ {"TK_LIBRARY", TkLibrary},
+ {"LD_LIBRARY_PATH", filename:join(TclDir, "lib")}]},
+ {packet, 4}]};
+ % We use the system wish program
+ _ -> {search_wish(?WISHNAMES, Gstk), [{packet, 4}]}
+ end,
+ Out = if
+ Mode =:= use_socket ->
+ % ------------------------------------------------------------
+ % Set up a listening socket and call accept in another process
+ % ------------------------------------------------------------
+ % Let OS pick a number
+ {ok, ListenSocket} = gen_tcp:listen(0, [{nodelay, true}, {packet, 4}, {reuseaddr, true}]),
+ %{ok, ListenPort} = inet:port(ListenSocket),
+ % Wait in another process
+ spawn_link(?MODULE, wait_for_connection, [self(), ListenSocket]),
+ %Cmd = lists:concat([Wish, " ", InitScript, " -- ", PrivDir, " ", ListenPort]),
+ % ------------------------------------------------------------
+ % Wait for a connection
+ % ------------------------------------------------------------
+ {socket, receive
+ {connected, Socket} -> Socket;
+ % FIXME: Why throw away reason?!
+ {'EXIT', _Pid, _Reason2} ->
+ Gstk ! {self(), error, backend_died},
+ exit(normal)
+ end};
+ Mode =:= use_port ->
+ % FIXME remove timing if not debugging
+ {port, case timer:tc(erlang, open_port, [{spawn, lists:concat([Wish, " ", InitScript, " -- ", PrivDir])}, Options]) of
+ {_T, Port} when is_port(Port) ->
+ link(Port),
+ Port;
+ {_T, {error, _Reason1}} -> % FIXME: Why throw away reason?!
+ Gstk ! {self(), error, backend_died},
+ exit(normal)
+ end}
+ end,
+ Gstk ! {self(), ok}, % Tell caller we are prepared
+ idle(#state{out = Out, gstk = Gstk}).
search_wish([], Gstk) ->
Gstk ! {self(), error, backend_died},
exit(normal);
-search_wish([WishName | WishNames], Gstk) ->
+search_wish([WishName|WishNames], Gstk) ->
case os:find_executable(WishName) of
- false ->
- search_wish(WishNames, Gstk);
- Wish ->
- Wish
+ false -> search_wish(WishNames, Gstk);
+ Wish -> Wish
end.
%%----------------------------------------------------------------------
@@ -338,59 +218,36 @@ search_wish([WishName | WishNames], Gstk
%%----------------------------------------------------------------------
wait_for_connection(CallerPid, ListenSocket) ->
- {ok,Sock} = gen_tcp:accept(ListenSocket, ?ACCEPT_TIMEOUT),
- ?DBG(1,"Got accept ~p~p~n",[self(),Sock]),
- ok = gen_tcp:controlling_process(Sock,CallerPid),
- CallerPid ! {connected,Sock}.
+ {ok, Sock} = gen_tcp:accept(ListenSocket, ?ACCEPT_TIMEOUT),
+ ok = gen_tcp:controlling_process(Sock, CallerPid),
+ CallerPid ! {connected, Sock}.
%% ===========================================================================
%% The main loop
%% ===========================================================================
idle(State) ->
- ?DBG(1, "idle~n", []),
-% io:format("IDLE ~p\n",[erlang:localtime()]),
receive
-
{call, Cmd} ->
output(State, Cmd),
idle(State);
-
{exec, Cmd} ->
collect_exec_calls(Cmd, [], 0, State),
idle(State);
-
{_Port, {data, Input}} ->
- ?DBG_STR(2, "INPUT[port]: ", [Input]),
handle_input(State, Input),
idle(State);
-
{tcp, _Sock, Input} ->
- ?DBG_STR(2, "INPUT[sock]: ", [Input]),
handle_input(State, Input),
idle(State);
-
- {ping,From} ->
- From ! {pong,self(),State#state.out},
- idle(State);
-
- {stop,From} ->
- From ! {stopped,self()};
-
- % FIXME: We are we not to terminate if watforsocket
- % terminated but what about the port???????
- {'EXIT',_Pid,normal} ->
- ?DBG(1, "EXIT[~w]: normal~n", [_Pid]),
+ {ping, From} ->
+ From ! {pong, self(), State#state.out},
idle(State);
-
- {'EXIT',Pid,Reason} ->
- %%io:format("Port died when in idle loop!~n"),
- ?DBG(1,"EXIT[~w]~n~p~n",[Pid,Reason]),
- exit({port_handler,Pid,Reason});
-
+ {stop, From} -> From ! {stopped, self()};
+ {'EXIT', _Pid, normal} -> idle(State);
+ {'EXIT', Pid, Reason} -> exit({port_handler, Pid, Reason});
Other ->
- ?DBG(1,"OTHER: ~p~n",[Other]),
- gs:error("gstk_port_handler: got other: ~w~n",[Other]),
+ gs:error("gstk_port_handler: got other: ~w~n", [Other]),
idle(State)
end.
@@ -400,27 +257,17 @@ idle(State) ->
collect_exec_calls(Cmd, Queue, QueueLen, State) when QueueLen < ?MAXQUEUE ->
receive
- {exec, NewCmd} ->
-% io:format("collect~p~n", [NewCmd]),
- collect_exec_calls(NewCmd, [Cmd | Queue], QueueLen+1, State)
- after 0 ->
- if
- QueueLen == 0 ->
- output(State, Cmd);
- true ->
- output(State, join_cmd_reverse(Cmd, Queue, []))
- end
+ {exec, NewCmd} -> collect_exec_calls(NewCmd, [Cmd|Queue], QueueLen + 1, State)
+ after 0 -> output(State, if
+ QueueLen =:= 0 -> Cmd;
+ true -> join_cmd_reverse(Cmd, Queue, [])
+ end)
end;
-collect_exec_calls(Cmd, Queue, _QueueLen, State) -> % Queue is full, output
- String = join_cmd_reverse(Cmd, Queue, []),
-% io:format("queue full: ~p~n", [String]),
- output(State, String).
-
+% Queue is full, output
+collect_exec_calls(Cmd, Queue, _QueueLen, State) -> output(State, join_cmd_reverse(Cmd, Queue, [])).
-join_cmd_reverse(Cmd, [], DeepStr) ->
- [DeepStr | Cmd];
-join_cmd_reverse(Cmd, [Cmd1 | Cmds], DeepStr) ->
- join_cmd_reverse(Cmd, Cmds, [Cmd1,$; | DeepStr]).
+join_cmd_reverse(Cmd, [], DeepStr) -> [DeepStr|Cmd];
+join_cmd_reverse(Cmd, [Cmd1|Cmds], DeepStr) -> join_cmd_reverse(Cmd, Cmds, [Cmd1, $;|DeepStr]).
%% ----------------------------------------------------------------------
%%
@@ -430,38 +277,21 @@ join_cmd_reverse(Cmd, [Cmd1 | Cmds], Dee
%% 3 - Bad reply from call
%% 4 - Error
%% 5 - End of message
-%%
-
-handle_input(State,[Type | Data]) ->
- GstkPid = State#state.gstk,
- case Type of
- 1 ->
- handle_event(GstkPid,Data);
-
- 2 ->
- GstkPid ! {result, Data};
-
- 3 ->
- GstkPid ! {bad_result, Data};
+%%
- 4 ->
- gs:error("gstk_port_handler: error in input : ~s~n",[Data])
- end.
+handle_input(#state{gstk = GstkPid}, [1|Data]) -> handle_event(GstkPid, Data);
+handle_input(#state{gstk = GstkPid}, [2|Data]) -> GstkPid ! {result, Data};
+handle_input(#state{gstk = GstkPid}, [3|Data]) -> GstkPid ! {bad_result, Data};
+handle_input(_State, [4|Data]) -> gs:error("gstk_port_handler: error in input : ~s~n", [Data]).
%% ----------------------------------------------------------------------
%% output a command to the port
%% buffer several incoming execs
%%
-output(#state{out = {socket,Sock}}, Cmd) ->
- ?DBG_STR(1, "OUTPUT[sock]: ", [Cmd]),
- ok = gen_tcp:send(Sock, Cmd);
+output(#state{out = {socket, Sock}}, Cmd) -> ok = gen_tcp:send(Sock, Cmd);
-output(#state{out = {port,Port}}, Cmd) ->
- ?DBG_STR(1, "OUTPUT[port]: ", [Cmd]),
- Port ! {self(), {command, Cmd}}.
+output(#state{out = {port, Port}}, Cmd) -> Port ! {self(), {command, Cmd}}.
% FIXME why test list?
handle_event(GstkPid, Bytes) when is_list(Bytes) ->
- Event = tcl2erl:parse_event(Bytes),
- ?DBG(1,"Event = ~p\n",[Event]),
- gstk:event(GstkPid, Event). %% Event is {ID, Etag, Args}
+ gstk:event(GstkPid, tcl2erl:parse_event(Bytes)). %% Event is {ID, Etag, Args}
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_radiobutton.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_radiobutton.erl
--- otp_src_19.0.5/lib/gs/src/gstk_radiobutton.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_radiobutton.erl 2016-08-25 16:37:44.566693320 +0300
@@ -31,8 +31,8 @@
%% Attributes:
%% activebg Color
%% activefg Color
-%% align n,w,s,e,nw,se,ne,sw,center
-%% anchor n,w,s,e,nw,se,ne,sw,center
+%% align n, w,s, e,nw, se, ne, sw, center
+%% anchor n, w,s, e,nw, se, ne, sw, center
%% bg Color
%% bw Int
%% data Data
@@ -89,7 +89,7 @@
%% font ??????
%%
--export([create/3,config/3,read/3,delete/2,event/5,option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5]).
-include("gstk.hrl").
@@ -100,15 +100,14 @@
%% Function : create/3
%% Purpose : Create a widget of the type defined in this module.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-create(DB, GstkId, Opts) ->
- TkW = gstk_generic:mk_tkw_child(DB,GstkId),
- {G, GID, V, NOpts} = fix_group_and_value(Opts, DB, GstkId#gstkid.owner),
- NGstkId=GstkId#gstkid{widget=TkW,widget_data={G, GID, V}},
- PlacePreCmd = [";place ", TkW],
- case gstk_generic:make_command(NOpts, NGstkId, TkW, "", PlacePreCmd, DB) of
- {error,Reason} -> {error,Reason};
+create(DB, #gstkid{owner = Owner} = GstkId, Opts) ->
+ TkW = gstk_generic:mk_tkw_child(DB, GstkId),
+ {G, GID, V, NOpts} = fix_group_and_value(Opts, DB, Owner),
+ NGstkId = GstkId#gstkid{widget = TkW, widget_data = {G, GID, V}},
+ case gstk_generic:make_command(NOpts, NGstkId, TkW, "", [";place ", TkW], DB) of
+ {error, _Reason} = E -> E;
Cmd when is_list(Cmd) ->
- gstk:exec(["radiobutton ", TkW," -bo 2 -indi true ",Cmd]),
+ gstk:exec(["radiobutton ", TkW, " -bo 2 -indi true ", Cmd]),
NGstkId
end.
@@ -121,12 +120,9 @@ create(DB, GstkId, Opts) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
- TkW = Gstkid#gstkid.widget,
- {NOpts, NGstkid} = fix_group_and_value(Opts, DB, Gstkid#gstkid.owner, Gstkid),
- SimplePreCmd = [TkW, " conf"],
- PlacePreCmd = [";place ", TkW],
- gstk_generic:mk_cmd_and_exec(NOpts,NGstkid,TkW,SimplePreCmd,PlacePreCmd,DB).
+config(DB, #gstkid{owner = Owner, widget = TkW} = Gstkid, Opts) ->
+ {NOpts, NGstkid} = fix_group_and_value(Opts, DB, Owner, Gstkid),
+ gstk_generic:mk_cmd_and_exec(NOpts, NGstkid, TkW, [TkW, " conf"], [";place ", TkW], DB).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -137,9 +133,7 @@ config(DB, Gstkid, Opts) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- gstk_generic:read_option(DB, Gstkid, Opt).
-
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : delete/2
@@ -149,12 +143,10 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget_data = {_, Gid, _}, widget = TkW} = Gstkid) ->
gstk_db:delete_widget(DB, Gstkid),
- {_, Gid, _} = Gstkid#gstkid.widget_data,
gstk_db:delete_bgrp(DB, Gid),
- Gstkid#gstkid.widget.
-
+ TkW.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : event/5
@@ -168,17 +160,13 @@ delete(DB, Gstkid) ->
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
event(DB, Gstkid, Etype, Edata, Args) ->
- Arg2 = case Etype of
- click ->
- [Text, _Grp | Rest] = Args,
- {G, _Gid, V} = Gstkid#gstkid.widget_data,
- [Text, G, V | Rest];
- _Other ->
- Args
- end,
- gstk_generic:event(DB, Gstkid, Etype, Edata, Arg2).
-
-
+ gstk_generic:event(DB, Gstkid, Etype, Edata, if
+ Etype =:= click ->
+ [Text, _Grp|Rest] = Args,
+ {G, _Gid, V} = Gstkid#gstkid.widget_data,
+ [Text, G, V|Rest];
+ true -> Args
+ end).
%%------------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -193,21 +181,34 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%%
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, TkW, DB,_) ->
- case Option of
- {disabledfg, Color} -> {s, [" -disabledforegr ", gstk:to_color(Color)]};
- {group, Group} -> {s, [" -var ", gstk:to_ascii(Group)]};
- {selectbg, Color} -> {s, [" -selectc ", gstk:to_color(Color)]};
- {underline, Int} -> {s, [" -un ", gstk:to_ascii(Int)]};
- {value, V} -> {s, [" -val ", gstk:to_ascii(V)]};
- {wraplength, Int} -> {s, [" -wr ", gstk:to_ascii(Int)]};
- flash -> {c, [TkW, " f;"]};
- invoke -> {c, [TkW, " i;"]};
- {select, true} -> {c, [TkW, " se;"]};
- {select, false} -> {c, [TkW, " des;"]};
- {click, On} -> cbind(DB, Gstkid, click, On);
- _ -> invalid_option
- end.
+option(Option, Gstkid, TkW, DB, _) -> option(Option, Gstkid, TkW, DB).
+
+option({click, On}, Gstkid, _TkW, DB) -> cbind(DB, Gstkid, click, On);
+option(Option, _Gstkid, TkW, _DB) -> option(Option, TkW).
+
+option(flash, TkW) -> option_c(" f;", TkW);
+option(invoke, TkW) -> option_c(" i;", TkW);
+option({select, true}, TkW) -> option_c(" se;", TkW);
+option({select, false}, TkW) -> option_c(" dse;", TkW);
+option(Option, _TkW) -> option(Option).
+
+option({disabledfg, Color}) -> to_color(" -disabledforegr ", gstk:to_color(Color));
+option({group, Group}) -> to_ascii(" -var ", gstk:to_ascii(Group));
+option({selectbg, Color}) -> to_color(" -selectc ", gstk:to_color(Color));
+option({underline, Int}) -> to_ascii(" -un ", gstk:to_ascii(Int));
+option({value, V}) -> to_ascii(" -val ", gstk:to_ascii(V));
+option({wraplength, Int}) -> to_ascii(" -wr ", gstk:to_ascii(Int));
+option(_Option) -> invalid_option.
+
+option_c(Str, TkW) -> {c, [TkW, Str]}.
+
+option_s(L) -> {s, L}.
+
+option_s(Str, Val) -> option_s([Str, Val]).
+
+to_ascii(Str, V) -> option_s(Str, gstk:to_ascii(V)).
+
+to_color(Str, Color) -> option_s(Str, gstk:to_color(Color)).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/4
@@ -219,27 +220,30 @@ option(Option, Gstkid, TkW, DB,_) ->
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,Gstkid, TkW,DB,_) ->
- case Option of
- disabledfg -> tcl2erl:ret_color([TkW," cg -disabledforegr"]);
- group -> {G, _, _} = Gstkid#gstkid.widget_data, G;
- groupid -> {_, Gid, _} = Gstkid#gstkid.widget_data, Gid;
- selectbg -> tcl2erl:ret_color([TkW," cg -selectc"]);
- underline -> tcl2erl:ret_int([TkW," cg -un"]);
- value -> {_, _, V} = Gstkid#gstkid.widget_data, V;
- wraplength -> tcl2erl:ret_int([TkW," cg -wr"]);
+read_option(Option, Gstkid, TkW, DB, _) -> read_option(Option, Gstkid, TkW, DB).
- select ->
- Cmd = ["list [set x [",TkW," cg -var];global $x;set $x] [",
- TkW," cg -val]"],
- case tcl2erl:ret_tuple(Cmd) of
- {X, X} -> true;
- _Other -> false
- end;
+read_option(click, Gstkid, _TkW, DB) -> gstk_db:is_inserted(DB, Gstkid, click);
+read_option(Option, Gstkid, TkW, _DB) -> read_option(Option, Gstkid, TkW).
- click -> gstk_db:is_inserted(DB, Gstkid, click);
- _ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
- end.
+read_option(disabledfg, _Gstkid, TkW) -> ret_color(TkW, " cg -disabledforegr");
+read_option(selectbg, _Gstkid, TkW) -> ret_color(TkW, " cg -selectc");
+read_option(underline, _Gstkid, TkW) -> ret_int(TkW, " cg -un");
+read_option(wraplength, _Gstkid, TkW) -> ret_int(TkW, " cg -wr");
+read_option(select, _Gstkid, TkW) ->
+ case tcl2erl:ret_tuple(["list [set x [", TkW, " cg -var];global $x;set $x] [", TkW, " cg -val]"]) of
+ {X, X} -> true;
+ _Other -> false
+ end;
+read_option(Option, Gstkid, _TkW) -> read_option(Option, Gstkid).
+
+read_option(group, #gstkid{widget_data = {G, _, _}}) -> G;
+read_option(groupid, #gstkid{widget_data = {_, Gid, _}}) -> Gid;
+read_option(value, #gstkid{widget_data = {_, _, V}}) -> V;
+read_option(Option, #gstkid{objtype = ObjType}) -> {bad_result, {ObjType, invalid_option, Option}}.
+
+ret_color(TkW, Str) -> tcl2erl:ret_color([TkW, Str]).
+
+ret_int(TkW, Str) -> tcl2erl:ret_int([TkW, Str]).
%%------------------------------------------------------------------------------
%% PRIMITIVES
@@ -248,96 +252,67 @@ read_option(Option,Gstkid, TkW,DB,_) ->
%% create version
fix_group_and_value(Opts, DB, Owner) ->
{G, GID, V, NOpts} = fgav(Opts, erlNIL, erlNIL, erlNIL, []),
- RV = case V of
- erlNIL -> list_to_atom(lists:concat([v,gstk_db:counter(DB,value)]));
- Other0 -> Other0
+ RV = if
+ V =:= erlNIL -> list_to_atom(lists:concat([v, gstk_db:counter(DB, value)]));
+ true -> V
end,
- NG = case G of
- erlNIL -> rb;
- Other1 -> Other1
- end,
- RGID = case GID of
- erlNIL -> {rbgrp, NG, Owner};
- Other2 -> Other2
+ NG = if
+ G =:= erlNIL -> rb;
+ true -> G
+ end,
+ RGID = if
+ GID =:= erlNIL -> {rbgrp, NG, Owner};
+ true -> GID
end,
- RG = gstk_db:insert_bgrp(DB, RGID),
- {NG, RGID, RV, [{group, RG}, {value, RV} | NOpts]}.
-
+ {NG, RGID, RV, [{group, gstk_db:insert_bgrp(DB, RGID)}, {value, RV} | NOpts]}.
+
%% config version
-fix_group_and_value(Opts, DB, Owner, Gstkid) ->
- {RG, RGID, RV} = Gstkid#gstkid.widget_data,
- {G, GID, V, NOpts} = fgav(Opts, RG, RGID, RV, []),
- case {G, GID, V} of
- {RG, RGID, RV} ->
- {NOpts, Gstkid};
- {NG, RGID, RV} ->
+fix_group_and_value(Opts, DB, Owner, #gstkid{widget_data = {RG, RGID, RV}} = Gstkid) ->
+ case fgav(Opts, RG, RGID, RV, []) of
+ {RG, RGID, RV, NOpts} -> {NOpts, Gstkid};
+ {NG, RGID, RV, NOpts} ->
NGID = {rbgrp, NG, Owner},
gstk_db:delete_bgrp(DB, RGID),
- NRG = gstk_db:insert_bgrp(DB, NGID),
- NGstkid = Gstkid#gstkid{widget_data={NG,NGID,RV}},
+ NGstkid = Gstkid#gstkid{widget_data = {NG, NGID, RV}},
gstk_db:insert_widget(DB, NGstkid),
- {[{group, NRG} | NOpts], NGstkid};
- {RG, RGID, NRV} ->
- NGstkid = Gstkid#gstkid{widget_data={RG,RGID,NRV}},
+ {[{group, gstk_db:insert_bgrp(DB, NGID)}|NOpts], NGstkid};
+ {RG, RGID, NRV, NOpts} ->
+ NGstkid = Gstkid#gstkid{widget_data = {RG, RGID, NRV}},
gstk_db:insert_widget(DB, NGstkid),
- {[{value,NRV} | NOpts], NGstkid};
- {_, NGID, RV} when NGID =/= RGID ->
+ {[{value, NRV}|NOpts], NGstkid};
+ {_, NGID, RV, NOpts} ->
gstk_db:delete_bgrp(DB, RGID),
- NRG = gstk_db:insert_bgrp(DB, NGID),
- NGstkid = Gstkid#gstkid{widget_data={RG,NGID,RV}},
+ NGstkid = Gstkid#gstkid{widget_data = {RG, NGID, RV}},
gstk_db:insert_widget(DB, NGstkid),
- {[{group, NRG} | NOpts], NGstkid};
- {_, NGID, NRV} when NGID =/= RGID ->
+ {[{group, gstk_db:insert_bgrp(DB, NGID)}|NOpts], NGstkid};
+ {NG, RGID, NRV, NOpts} ->
+ NGID = {rbgrp, NG, Owner},
gstk_db:delete_bgrp(DB, RGID),
- NRG = gstk_db:insert_bgrp(DB, NGID),
- NGstkid = Gstkid#gstkid{widget_data={RG,NGID,NRV}},
+ NGstkid = Gstkid#gstkid{widget_data = {NG, NGID, NRV}},
gstk_db:insert_widget(DB, NGstkid),
- {[{group, NRG}, {value,NRV} | NOpts], NGstkid};
- {NG, RGID, NRV} ->
- NGID = {rbgrp, NG, Owner},
+ {[{group, gstk_db:insert_bgrp(DB, NGID)}, {value, NRV}|NOpts], NGstkid};
+ {_, NGID, NRV, NOpts} ->
gstk_db:delete_bgrp(DB, RGID),
- NRG = gstk_db:insert_bgrp(DB, NGID),
- NGstkid = Gstkid#gstkid{widget_data={NG,NGID,NRV}},
+ NGstkid = Gstkid#gstkid{widget_data = {RG, NGID, NRV}},
gstk_db:insert_widget(DB, NGstkid),
- {[{group, NRG}, {value,NRV} | NOpts], NGstkid}
+ {[{group, gstk_db:insert_bgrp(DB, NGID)}, {value, NRV}|NOpts], NGstkid}
end.
-
-
-fgav([{group, G} | Opts], _, GID, V, Nopts) ->
- fgav(Opts, G, GID, V, Nopts);
-
-fgav([{groupid, GID} | Opts], G, _, V, Nopts) ->
- fgav(Opts, G, GID, V, Nopts);
-
-fgav([{value, V} | Opts], G, GID, _, Nopts) ->
- fgav(Opts, G, GID, V, Nopts);
-
-fgav([Opt | Opts], G, GID, V, Nopts) ->
- fgav(Opts, G, GID, V, [Opt | Nopts]);
-
-fgav([], Group, GID, Value, Opts) ->
- {Group, GID, Value, Opts}.
+fgav([{group, G}|Opts], _, GID, V, Nopts) -> fgav(Opts, G, GID, V, Nopts);
+fgav([{groupid, GID}|Opts], G, _, V, Nopts) -> fgav(Opts, G, GID, V, Nopts);
+fgav([{value, V}|Opts], G, GID, _, Nopts) -> fgav(Opts, G, GID, V, Nopts);
+fgav([Opt|Opts], G, GID, V, Nopts) -> fgav(Opts, G, GID, V, [Opt|Nopts]);
+fgav([], Group, GID, Value, Opts) -> {Group, GID, Value, Opts}.
%%
%% Config bind
%%
-cbind(DB, Gstkid, Etype, On) ->
- TkW = Gstkid#gstkid.widget,
- Cmd = case On of
- {true, Edata} ->
- Eref = gstk_db:insert_event(DB, Gstkid, Etype, Edata),
- [" -command {erlsend ", Eref,
- " \\\"[", TkW, " cg -text]\\\" [", TkW, " cg -var]}"];
- true ->
- Eref = gstk_db:insert_event(DB, Gstkid, Etype, ""),
- [" -command {erlsend ", Eref,
- " \\\"[", TkW, " cg -text]\\\" [", TkW, " cg -var]}"];
- _Other ->
- gstk_db:delete_event(DB, Gstkid, Etype),
- " -command {}"
- end,
- {s, Cmd}.
+cbind(DB, #gstkid{widget = TkW} = Gstkid, Etype, {true, Edata}) ->
+ option_s([" -command {erlsend ", gstk_db:insert_event(DB, Gstkid, Etype, Edata),
+ " \\\"[", TkW, " cg -text]\\\" [", TkW, " cg -var]}"]);
+cbind(DB, Gstkid, Etype, true) -> cbind(DB, Gstkid, Etype, {true, ""});
+cbind(DB, Gstkid, Etype, _On) ->
+ gstk_db:delete_event(DB, Gstkid, Etype),
+ option_s(" -command {}").
%% ----- Done -----
-
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_rectangle.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_rectangle.erl
--- otp_src_19.0.5/lib/gs/src/gstk_rectangle.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_rectangle.erl 2016-08-25 16:37:44.566693320 +0300
@@ -24,14 +24,14 @@
%% ------------------------------------------------------------
-module(gstk_rectangle).
--compile([{nowarn_deprecated_function,{gs,pair,2}}]).
+-compile([{nowarn_deprecated_function, {gs, pair, 2}}]).
%%-----------------------------------------------------------------------------
%% RECTANGLE OPTIONS
%%
%% Attributes:
%% bw Int
-%% coords [{X1,Y1}, {X2,Y2}]
+%% coords [{X1, Y1}, {X2, Y2}]
%% data Data
%% fg Color
%% fill Color
@@ -61,8 +61,7 @@
%%
--export([create/3, config/3, read/3, delete/2, destroy/3, event/5,
- option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, destroy/3, event/5, option/5, read_option/5]).
-include("gstk.hrl").
@@ -82,26 +81,21 @@
%%
%% Return : [Gsid_of_new_widget | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-create(DB,Gstkid, Opts) ->
- case gstk_canvas:pickout_coords(Opts, [],rectangle,2) of
- {error, Error} ->
- {bad_result, Error};
+create(DB, Gstkid, Opts) ->
+ case gstk_canvas:pickout_coords(Opts, [], rectangle, 2) of
+ {error, Error} -> {bad_result, Error};
{Coords, NewOpts} ->
- gstk_db:insert_opt(DB,Gstkid,gs:pair(coords,Opts)),
- Ngstkid=gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
- #gstkid{widget=CanvasTkW}=Ngstkid,
- MCmd = [CanvasTkW, " create re ", Coords],
- gstk_canvas:mk_cmd_and_call(NewOpts, Ngstkid,CanvasTkW, MCmd, DB)
+ gstk_db:insert_opt(DB, Gstkid, gs:pair(coords, Opts)),
+ #gstkid{widget = CanvasTkW} = Ngstkid = gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
+ gstk_canvas:mk_cmd_and_call(NewOpts, Ngstkid, CanvasTkW, [CanvasTkW, " create re ", Coords], DB)
end.
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : config/3
%% Purpose : Configure a widget of the type defined in this module.
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
- gstk_canvas:item_config(DB, Gstkid, Opts).
+config(DB, Gstkid, Opts) -> gstk_canvas:item_config(DB, Gstkid, Opts).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -112,9 +106,7 @@ config(DB, Gstkid, Opts) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- Item = Gstkid#gstkid.widget_data,
- gstk_generic:read_option(DB,Gstkid,Opt,[gstk:to_ascii(Item)]).
+read(DB, #gstkid{widget_data = Item} = Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt, [gstk:to_ascii(Item)]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : delete/2
@@ -124,8 +116,7 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy | {Parent, Objmod, Args}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
- gstk_canvas:item_delete_impl(DB,Gstkid).
+delete(DB, Gstkid) -> gstk_canvas:item_delete_impl(DB, Gstkid).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : destroy/3
@@ -136,12 +127,9 @@ delete(DB, Gstkid) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-destroy(_DB, Canvas, Item) ->
- gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-
+destroy(_DB, Canvas, Item) -> gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%%------------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -157,13 +145,13 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%%
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, _Gstkid, _Canvas, _DB, _AItem) ->
- case Option of
- {bw, Int} -> {s, [" -w ", gstk:to_ascii(Int)]};
- {fg, Color} -> {s, [" -outline ", gstk:to_color(Color)]};
- _ -> invalid_option
- end.
+option(Option, _Gstkid, _Canvas, _DB, _AItem) -> option(Option).
+option({bw, Int}) -> option_s(" -w ", gstk:to_ascii(Int));
+option({fg, Color}) -> option_s(" -outline ", gstk:to_color(Color));
+option(_Option) -> invalid_option.
+
+option_s(Str, Val) -> {s, [Str, Val]}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/5
@@ -175,12 +163,14 @@ option(Option, _Gstkid, _Canvas, _DB, _A
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
read_option(Option, Gstkid, Canvas, _DB, AItem) ->
- case Option of
- bw -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -w"]);
- fg -> tcl2erl:ret_color([Canvas," itemcg ", AItem, " -outline"]);
- stipple ->
- tcl2erl:ret_stipple([Canvas, " itemcg ", AItem, " -stipple"]);
- _ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+ case read_option(Option, AItem, Canvas) of
+ invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+ O -> O
end.
+read_option(bw, AItem, Canvas) -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -w"]);
+read_option(fg, AItem, Canvas) -> tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -outline"]);
+read_option(stipple, AItem, Canvas) -> tcl2erl:ret_stipple([Canvas, " itemcg ", AItem, " -stipple"]);
+read_option(_Option, _AItem, _Canvas) -> invalid_option.
+
%% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_scale.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_scale.erl
--- otp_src_19.0.5/lib/gs/src/gstk_scale.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_scale.erl 2016-08-25 16:37:44.566693320 +0300
@@ -30,7 +30,7 @@
%%
%% Attributes:
%% activebg Color
-%% anchor n,w,s,e,nw,se,ne,sw,center
+%% anchor n, w,s, e,nw, se, ne, sw, center
%% bg Color
%% bw Int
%% data Data
@@ -72,8 +72,7 @@
%% type
%%
--export([create/3,config/3,read/3,delete/2,event/5,
- option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, event/5, option/5, read_option/5]).
-include("gstk.hrl").
@@ -85,14 +84,12 @@
%% Purpose : Create a widget of the type defined in this module.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
create(DB, GstkId, Opts) ->
- TkW = gstk_generic:mk_tkw_child(DB,GstkId),
- PlacePreCmd = [";place ", TkW],
- Ngstkid = GstkId#gstkid{widget=TkW},
- case gstk_generic:make_command(Opts, Ngstkid, TkW,"", PlacePreCmd, DB) of
- {error,Reason} -> {error,Reason};
+ TkW = gstk_generic:mk_tkw_child(DB, GstkId),
+ Ngstkid = GstkId#gstkid{widget = TkW},
+ case gstk_generic:make_command(Opts, Ngstkid, TkW, "", [";place ", TkW], DB) of
+ {error, _Reason} = E -> E;
Cmd when is_list(Cmd) ->
- gstk:exec(["scale ", TkW,Cmd,$;,TkW,
- " conf -bo 2 -sliderrelief raised -highlightth 2"]),
+ gstk:exec(["scale ", TkW, Cmd, $;, TkW, " conf -bo 2 -sliderrelief raised -highlightth 2"]),
Ngstkid
end.
@@ -105,11 +102,8 @@ create(DB, GstkId, Opts) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
- TkW = Gstkid#gstkid.widget,
- SimplePreCmd = [TkW, " conf"],
- PlacePreCmd = [";place ", TkW],
- gstk_generic:mk_cmd_and_exec(Opts,Gstkid,TkW,SimplePreCmd,PlacePreCmd,DB).
+config(DB, #gstkid{widget = TkW} = Gstkid, Opts) ->
+ gstk_generic:mk_cmd_and_exec(Opts, Gstkid, TkW, [TkW, " conf"], [";place ", TkW], DB).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -120,9 +114,7 @@ config(DB, Gstkid, Opts) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- gstk_generic:read_option(DB, Gstkid, Opt).
-
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : delete/2
@@ -132,12 +124,11 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
gstk_db:delete_widget(DB, Gstkid),
- Gstkid#gstkid.widget.
+ TkW.
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%%-----------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -150,20 +141,28 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%%
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, TkW, DB,_) ->
- case Option of
- {activebg, Color} -> {s, [" -activeb ", gstk:to_color(Color)]};
- {orient, How} -> {s, [" -or ", gstk:to_ascii(How)]};
- {range, {From, To}} -> {s, [" -fr ", gstk:to_ascii(From),
- " -to ", gstk:to_ascii(To)]};
- {relief, Relief} -> {s, [" -rel ", gstk:to_ascii(Relief)]};
- {bw, Wth} -> {s, [" -bd ", gstk:to_ascii(Wth)]};
- {text, String} -> {s, [" -la ",gstk:to_ascii(String)]};
- {showvalue, Bool} -> {s, [" -showvalue ",gstk:to_ascii(Bool)]};
- {pos, Pos} -> {c, [TkW, " set ", gstk:to_ascii(Pos)]};
- {click, On} -> cbind(DB, Gstkid, click, On);
- _ -> invalid_option
- end.
+option(Option, Gstkid, TkW, DB, _) -> option(Option, Gstkid, TkW, DB).
+
+option({click, On}, Gstkid, _TkW, DB) -> cbind(DB, Gstkid, click, On);
+option(Option, _Gstkid, TkW, _DB) -> option(Option, TkW).
+
+option({pos, Pos}, TkW) -> {c, [TkW, " set ", gstk:to_ascii(Pos)]};
+option(Option, _TkW) -> option(Option).
+
+option({activebg, Color}) -> option_s(" -activeb ", gstk:to_color(Color));
+option({bw, Wth}) -> to_ascii(" -bd ", Wth);
+option({orient, How}) -> to_ascii(" -or ", How);
+option({relief, Relief}) -> to_ascii(" -rel ", Relief);
+option({text, String}) -> to_ascii(" -la ", String);
+option({showvalue, Bool}) -> to_ascii(" -showvalue ", Bool);
+option({range, {From, To}}) -> option_s([" -fr ", gstk:to_ascii(From), " -to ", gstk:to_ascii(To)]);
+option(_Option) -> invalid_option.
+
+to_ascii(Str, Val) -> option_s([Str, gstk:to_ascii(Val)]).
+
+option_s(L) -> {s, L}.
+
+option_s(Str, Val) -> option_s([Str, Val]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/5
@@ -175,41 +174,41 @@ option(Option, Gstkid, TkW, DB,_) ->
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option,Gstkid,TkW,DB,_) ->
- case Option of
- activebg -> tcl2erl:ret_color([TkW," cg -activeb"]);
- orient -> tcl2erl:ret_atom([TkW," cg -ori"]);
- range ->
- tcl2erl:ret_tuple(["list [",TkW," cg -fr] [",TkW," cg -to]"]);
- bw -> tcl2erl:ret_int([TkW," cg -bd"]);
- relief -> tcl2erl:ret_atom([TkW, " cg -reli"]);
- text -> tcl2erl:ret_str([TkW," cg -lab"]);
- showvalue -> tcl2erl:ret_bool([TkW," cg -showvalue"]);
- pos -> tcl2erl:ret_int([TkW," get"]);
- click -> gstk_db:is_inserted(DB, Gstkid, click);
- _ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+read_option(Option, Gstkid, TkW, DB, _) -> read_option(Option, Gstkid, TkW, DB).
+
+read_option(click, Gstkid, _TkW, DB) -> gstk_db:is_inserted(DB, Gstkid, click);
+read_option(Option, Gstkid, TkW, _DB) ->
+ case read_option(Option, TkW) of
+ invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+ O -> O
end.
+read_option(activebg, TkW) -> tcl2erl:ret_color([TkW, " cg -activeb"]);
+read_option(orient, TkW) -> ret_atom(" cg -ori", TkW);
+read_option(range, TkW) -> tcl2erl:ret_tuple(["list [", TkW, " cg -fr] [", TkW, " cg -to]"]);
+read_option(bw, TkW) -> ret_int(" cg -bd", TkW);
+read_option(relief, TkW) -> ret_atom(" cg -reli", TkW);
+read_option(text, TkW) -> tcl2erl:ret_str([TkW, " cg -lab"]);
+read_option(showvalue, TkW) -> tcl2erl:ret_bool([TkW, " cg -showvalue"]);
+read_option(pos, TkW) -> ret_int(" get", TkW);
+read_option(_Option, _TkW) -> invalid_option.
+
+ret_atom(Str, TkW) -> tcl2erl:ret_atom([TkW, Str]).
+
+ret_int(Str, TkW) -> tcl2erl:ret_int([TkW, Str]).
+
%%-----------------------------------------------------------------------------
%% PRIMITIVES
%%-----------------------------------------------------------------------------
-
%%
%% Config bind
%%
-cbind(DB, Gstkid, Etype, On) ->
- Cmd = case On of
- {true, Edata} ->
- Eref = gstk_db:insert_event(DB, Gstkid, Etype, Edata),
- [" -command {erlsend ", Eref, "}"];
- true ->
- Eref = gstk_db:insert_event(DB, Gstkid, Etype, ""),
- [" -command {erlsend ", Eref, "}"];
- _Other ->
- gstk_db:delete_event(DB, Gstkid, Etype),
- " -command {}"
- end,
- {s, Cmd}.
+cbind(DB, Gstkid, Etype, true) -> cbind(DB, Gstkid, Etype, {true, ""});
+cbind(DB, Gstkid, Etype, {true, Edata}) ->
+ option_s([" -command {erlsend ", gstk_db:insert_event(DB, Gstkid, Etype, Edata), "}"]);
+cbind(DB, Gstkid, Etype, _On) ->
+ gstk_db:delete_event(DB, Gstkid, Etype),
+ option_s(" -command {}").
%% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_text.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_text.erl
--- otp_src_19.0.5/lib/gs/src/gstk_text.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_text.erl 2016-08-25 16:39:20.254844888 +0300
@@ -30,7 +30,7 @@
%%
%% Attributes:
%% anchor n|w|e|s|nw|sw|ne|se|center
-%% coords [{X,Y}]
+%% coords [{X, Y}]
%% data Data
%% fg Color
%% font Font
@@ -64,11 +64,10 @@
%% Not Implemented:
%% fontfamily ?????? Family
%% fontsize ?????? Size
-%% style ?????? [bold,italic]
+%% style ?????? [bold, italic]
%%
--export([create/3, config/3, read/3, delete/2, destroy/3, event/5,
- option/5,read_option/5]).
+-export([create/3, config/3, read/3, delete/2, destroy/3, event/5, option/5, read_option/5]).
-include("gstk.hrl").
@@ -76,25 +75,19 @@
%% MANDATORY INTERFACE FUNCTIONS
%%----------------------------------------------------------------------------
create(DB, Gstkid, Opts) ->
- case gstk_canvas:pickout_coords(Opts, [],text,1) of
- {error, Error} ->
- {bad_result, Error};
+ case gstk_canvas:pickout_coords(Opts, [], text, 1) of
+ {error, Error} -> {bad_result, Error};
{Coords, NewOpts} ->
- Ngstkid=gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
- #gstkid{widget=CanvasTkW}=Ngstkid,
- MCmd = [CanvasTkW, " create te ", Coords],
- gstk_canvas:mk_cmd_and_call(NewOpts,Ngstkid,CanvasTkW, MCmd, DB)
+ #gstkid{widget = CanvasTkW} = Ngstkid = gstk_canvas:upd_gstkid(DB, Gstkid, Opts),
+ gstk_canvas:mk_cmd_and_call(NewOpts, Ngstkid, CanvasTkW, [CanvasTkW, " create te ", Coords], DB)
end.
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : config/3
%% Purpose : Configure a widget of the type defined in this module.
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
- gstk_canvas:item_config(DB, Gstkid, Opts).
-
+config(DB, Gstkid, Opts) -> gstk_canvas:item_config(DB, Gstkid, Opts).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -105,10 +98,7 @@ config(DB, Gstkid, Opts) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- Item = Gstkid#gstkid.widget_data,
- gstk_generic:read_option(DB,Gstkid,Opt,[gstk:to_ascii(Item)]).
-
+read(DB, #gstkid{widget_data = Item} = Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt, [gstk:to_ascii(Item)]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : delete/2
@@ -118,9 +108,7 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy | {Parent, Objmod, Args}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
- gstk_canvas:item_delete_impl(DB,Gstkid).
-
+delete(DB, Gstkid) -> gstk_canvas:item_delete_impl(DB, Gstkid).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : destroy/3
@@ -131,13 +119,9 @@ delete(DB, Gstkid) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-destroy(_DB, Canvas, Item) ->
- gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
-
-
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+destroy(_DB, Canvas, Item) -> gstk:exec([Canvas, " delete ", gstk:to_ascii(Item)]).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
%%-----------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
@@ -150,19 +134,23 @@ event(DB, Gstkid, Etype, Edata, Args) ->
%%
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-option(Option, Gstkid, _Canvas, DB, _AItem) ->
- case Option of
- {anchor, How} -> {s, [" -anchor ", gstk:to_ascii(How)]};
- {fg, Color} -> {s, [" -fi ", gstk:to_color(Color)]};
- {font, Font} when is_tuple(Font) ->
- gstk_db:insert_opt(DB,Gstkid,Option),
- {s, [" -fo ", gstk_font:choose_ascii(DB,Font)]};
- {justify, How} -> {s, [" -j ", gstk:to_ascii(How)]};
- {text, Text} -> {s, [" -te ", gstk:to_ascii(Text)]};
- {width, Width} -> {s, [" -w ", gstk:to_ascii(Width)]};
- _ -> invalid_option
- end.
+option(Option, Gstkid, _Canvas, DB, _AItem) -> option(Option, Gstkid, DB).
+option({font, Font} = Option, Gstkid, DB) when is_tuple(Font) ->
+ gstk_db:insert_opt(DB, Gstkid, Option),
+ {s, [" -fo ", gstk_font:choose_ascii(DB, Font)]};
+option(Option, _Gstkid, _DB) -> option(Option).
+
+option({fg, Color}) -> option_s([" -fi ", gstk:to_color(Color)]);
+option({anchor, How}) -> option_s(" -anchor ", How);
+option({justify, How}) -> option_s(" -j ", How);
+option({text, Text}) -> option_s(" -te ", Text);
+option({width, Width}) -> option_s(" -w ", Width);
+option(_Option) -> invalid_option.
+
+option_s(Str, Val) -> option_s([Str, gstk:to_ascii(Val)]).
+
+option_s(L) -> {s, L}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/5
@@ -174,17 +162,21 @@ option(Option, Gstkid, _Canvas, DB, _AIt
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option, Gstkid, Canvas, DB, AItem) ->
- case Option of
- anchor -> tcl2erl:ret_atom([Canvas, " itemcg ", AItem, " -anchor"]);
- fg -> tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -fi"]);
- font -> gstk_db:opt(DB,Gstkid,font,undefined);
- justify -> tcl2erl:ret_atom([Canvas, " itemcg ", AItem, " -j"]);
- stipple -> tcl2erl:ret_stipple([Canvas," itemcg ",AItem," -stipple"]);
- text -> tcl2erl:ret_str([Canvas, " itemcg ", AItem, " -te"]);
- width -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -w"]);
- _ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+read_option(font, Gstkid, _Canvas, DB, _AItem) -> gstk_db:opt(DB, Gstkid, font, undefined);
+read_option(Option, Gstkid, Canvas, _DB, AItem) ->
+ case read_option(Option, AItem, Canvas) of
+ invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+ O -> O
end.
+read_option(anchor, AItem, Canvas) -> ret_atom(" -anchor", AItem, Canvas);
+read_option(fg, AItem, Canvas) -> tcl2erl:ret_color([Canvas, " itemcg ", AItem, " -fi"]);
+read_option(justify, AItem, Canvas) -> ret_atom(" -j", AItem, Canvas);
+read_option(stipple, AItem, Canvas) -> tcl2erl:ret_stipple([Canvas, " itemcg ", AItem, " -stipple"]);
+read_option(text, AItem, Canvas) -> tcl2erl:ret_str([Canvas, " itemcg ", AItem, " -te"]);
+read_option(width, AItem, Canvas) -> tcl2erl:ret_int([Canvas, " itemcg ", AItem, " -w"]);
+read_option(_Option, _AItem, _Canvas) -> invalid_option.
+
+ret_atom(Str, AItem, Canvas) -> tcl2erl:ret_atom([Canvas, " itemcg ", AItem, Str]).
%% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_widgets.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_widgets.erl
--- otp_src_19.0.5/lib/gs/src/gstk_widgets.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_widgets.erl 2016-08-25 16:37:44.566693320 +0300
@@ -30,65 +30,47 @@
-include("gstk.hrl").
-
-
-
%%
%% Map primitive types to modules or false (false should not be a module!)
%%
%% ordered for efficiency
-type2mod(window) -> gstk_window;
-type2mod(frame) -> gstk_frame;
-type2mod(button) -> gstk_button;
-type2mod(canvas) -> gstk_canvas;
-type2mod(checkbutton) -> gstk_checkbutton;
-type2mod(rectangle) -> gstk_rectangle;
-type2mod(gs) -> gstk_gs;
-type2mod(grid) -> gstk_grid;
-type2mod(gridline) -> gstk_gridline;
-type2mod(text) -> gstk_text;
-type2mod(image) -> gstk_image;
-type2mod(label) -> gstk_label;
-type2mod(line) -> gstk_line;
-type2mod(entry) -> gstk_entry;
-type2mod(listbox) -> gstk_listbox;
-type2mod(editor) -> gstk_editor;
-type2mod(menu) -> gstk_menu;
-type2mod(menubar) -> gstk_menubar;
-type2mod(menubutton) -> gstk_menubutton;
-type2mod(menuitem) -> gstk_menuitem;
-type2mod(message) -> gstk_message;
-type2mod(oval) -> gstk_oval;
-type2mod(polygon) -> gstk_polygon;
-type2mod(prompter) -> gstk_prompter;
-type2mod(radiobutton) -> gstk_radiobutton;
-type2mod(scale) -> gstk_scale;
-type2mod(scrollbar) -> gstk_scrollbar;
-type2mod(arc) -> gstk_arc;
-type2mod(Type) -> {error,{unknown_type, Type}}.
+type2mod(Type) ->
+ proplists:get_value(Type,
+ [{arc, gstk_arc},
+ {button, gstk_button},
+ {canvas, gstk_canvas}, {checkbutton, gstk_checkbutton},
+ {editor, gstk_editor}, {entry, gstk_entry},
+ {frame, gstk_frame},
+ {grid, gstk_grid}, {gridline, gstk_gridline}, {gs, gstk_gs},
+ {image, gstk_image},
+ {label, gstk_label}, {line, gstk_line}, {listbox, gstk_listbox},
+ {menu, gstk_menu}, {menubar, gstk_menubar}, {menubutton, gstk_menubutton},
+ {menuitem, gstk_menuitem}, {message, gstk_message},
+ {oval, gstk_oval},
+ {polygon, gstk_polygon}, {prompter, gstk_prompter},
+ {radiobutton, gstk_radiobutton}, {rectangle, gstk_rectangle},
+ {scale, gstk_scale}, {scrollbar, gstk_scrollbar},
+ {text, gstk_text},
+ {window, gstk_window}],
+ {error, {unknown_type, Type}}).
-objmod(#gstkid{objtype=OT}) -> type2mod(OT).
+objmod(#gstkid{objtype = OT}) -> type2mod(OT).
%%
%% The suffix to add to the parent tk widget
%%
-suffix(button) -> ".b";
-suffix(canvas) -> ".c";
-suffix(checkbutton) -> ".cb";
-suffix(editor) -> ".ed";
-suffix(entry) -> ".e";
-suffix(frame) -> ".f";
-suffix(label) -> ".l";
-suffix(listbox) -> ".lb";
-suffix(menu) -> ".m";
-suffix(menubar) -> ".bar";
-suffix(menubutton) -> ".mb";
-suffix(message) -> ".ms";
-suffix(prompter) -> ".p";
-suffix(radiobutton) -> ".rb";
-suffix(scale) -> ".sc";
-suffix(window) -> ".w";
-suffix(Objtype) -> apply(type2mod(Objtype), suffix, []).
-
-
+suffix(Objtype) ->
+ case proplists:get_value(Objtype, [{button, ".b"},
+ {canvas, ".c"}, {checkbutton, ".cb"},
+ {editor, ".ed"}, {entry, ".e"},
+ {frame, ".f"},
+ {label, ".l"}, {listbox, ".lb"},
+ {menu, ".m"}, {menubar, ".bar"}, {menubutton, ".mb"}, {message, ".ms"},
+ {prompter, ".p"},
+ {radiobutton, ".rb"},
+ {scale, ".sc"},
+ {window, ".w"}]) of
+ undefined -> apply(type2mod(Objtype), suffix, []);
+ S -> S
+ end.
diff -Ndurp otp_src_19.0.5/lib/gs/src/gstk_window.erl otp_src_19.0.5-lib-gs/lib/gs/src/gstk_window.erl
--- otp_src_19.0.5/lib/gs/src/gstk_window.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gstk_window.erl 2016-08-25 16:37:44.567693306 +0300
@@ -24,7 +24,8 @@
%% ------------------------------------------------------------
-module(gstk_window).
--compile([{nowarn_deprecated_function,{gs,destroy,1}}]).
+
+-compile([{nowarn_deprecated_function, {gs, destroy, 1}}]).
%%------------------------------------------------------------------------------
%% WINDOW OPTIONS
@@ -81,8 +82,8 @@
%% focusmodel [active|passive] (wm focusmodel)
%%
--export([create/3, config/3, read/3, delete/2, event/5,destroy_win/1]).
--export([option/5,read_option/5,mk_create_opts_for_child/4]).
+-export([create/3, config/3, read/3, delete/2, event/5, destroy_win/1]).
+-export([option/5, read_option/5, mk_create_opts_for_child/4]).
-include("gstk.hrl").
% bind . <1> {puts "x: [expr %X - [winfo rootx .]] y: [expr %Y - [wi rooty .]]"}
@@ -95,22 +96,17 @@
%% Purpose : Create a widget of the type defined in this module.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
create(DB, Gstkid, Opts) ->
- TkW = gstk_generic:mk_tkw_child(DB,Gstkid),
- NGstkid=Gstkid#gstkid{widget=TkW},
- case gstk_generic:make_command(transform_geometry_opts(Opts),
- NGstkid, TkW, "", ";", DB) of
- {error,Reason} -> {error,Reason};
+ TkW = gstk_generic:mk_tkw_child(DB, Gstkid),
+ NGstkid = Gstkid#gstkid{widget = TkW},
+ case gstk_generic:make_command(transform_geometry_opts(Opts), NGstkid, TkW, "", ";", DB) of
+ {error, _Reason} = E -> E;
Cmd when is_list(Cmd) ->
- BindCmd = gstk_generic:bind(DB, Gstkid, TkW, configure, true),
-% io:format("\nWINDOW1: ~p\n",[TkW]),
-% io:format("\nWINDOW1: ~p\n",[Cmd]),
-% io:format("\nWINDOW1: ~p\n",[BindCmd]),
- gstk:exec(["toplevel ", TkW,Cmd,$;,BindCmd]),
+ gstk:exec(["toplevel ", TkW, Cmd, $;, gstk_generic:bind(DB, Gstkid, TkW, configure, true)]),
NGstkid
end.
-mk_create_opts_for_child(DB,Cgstkid, Pgstkid, Opts) ->
- gstk_generic:mk_create_opts_for_child(DB,Cgstkid,Pgstkid,Opts).
+mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts) ->
+ gstk_generic:mk_create_opts_for_child(DB, Cgstkid, Pgstkid, Opts).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : config/3
@@ -121,11 +117,8 @@ mk_create_opts_for_child(DB,Cgstkid, Pgs
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-config(DB, Gstkid, Opts) ->
- TkW = Gstkid#gstkid.widget,
- SimplePreCmd = [TkW, " conf"],
- gstk_generic:mk_cmd_and_exec(transform_geometry_opts(Opts),
- Gstkid,TkW,SimplePreCmd,"",DB).
+config(DB, #gstkid{widget = TkW} = Gstkid, Opts) ->
+ gstk_generic:mk_cmd_and_exec(transform_geometry_opts(Opts), Gstkid, TkW, [TkW, " conf"], "", DB).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read/3
@@ -136,9 +129,7 @@ config(DB, Gstkid, Opts) ->
%%
%% Return : [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read(DB, Gstkid, Opt) ->
- gstk_generic:read_option(DB, Gstkid, Opt).
-
+read(DB, Gstkid, Opt) -> gstk_generic:read_option(DB, Gstkid, Opt).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : delete/2
@@ -148,10 +139,9 @@ read(DB, Gstkid, Opt) ->
%%
%% Return : TkWidget to destroy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(DB, Gstkid) ->
+delete(DB, #gstkid{widget = TkW} = Gstkid) ->
gstk_db:delete_widget(DB, Gstkid),
- Gstkid#gstkid.widget.
-
+ TkW.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : event/5
@@ -164,24 +154,18 @@ delete(DB, Gstkid) ->
%%
%% Return : [true | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-event(DB, Gstkid, configure, Edata, Args) ->
- [W,H|_] = Args,
- gstk_db:insert_opt(DB,Gstkid,{width,W}),
- gstk_db:insert_opt(DB,Gstkid,{height,H}),
- case gstk_db:opt(DB,Gstkid,configure) of
- true ->
- apply(gstk_generic,event,[DB,Gstkid,configure,Edata,Args]);
- false ->
- ok
+event(DB, Gstkid, configure, Edata, [W, H|_] = Args) ->
+ lists:foreach(fun(E) -> gstk_db:insert_opt(DB, Gstkid, E) end, [{width, W}, {height, H}]),
+ case gstk_db:opt(DB, Gstkid, configure) of
+ true -> gstk_generic:event(DB, Gstkid, configure, Edata, Args);
+ false -> ok
end;
-event(DB, Gstkid, destroy, Edata, Args) ->
- spawn(gstk_window,destroy_win,[gstk:make_extern_id(Gstkid#gstkid.id,DB)]),
+event(DB, #gstkid{id = Id} = Gstkid, destroy, Edata, Args) ->
+ spawn(gstk_window, destroy_win, [gstk:make_extern_id(Id, DB)]),
gstk_generic:event(DB, Gstkid, destroy, Edata, Args);
-event(DB, Gstkid, Etype, Edata, Args) ->
- gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
+event(DB, Gstkid, Etype, Edata, Args) -> gstk_generic:event(DB, Gstkid, Etype, Edata, Args).
-destroy_win(ID) ->
- gs:destroy(ID).
+destroy_win(ID) -> gs:destroy(ID).
%%------------------------------------------------------------------------------
%% MANDATORY FUNCTIONS
%%------------------------------------------------------------------------------
@@ -195,101 +179,89 @@ destroy_win(ID) ->
%%
%% Return : A tuple {OptionType, OptionCmd}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%-define(REGEXP,"regexp {(\\d+)x(\\d+)\\+?(-?\\d+)\\+?(-?\\d+)} ").
+%-define(REGEXP, "regexp {(\\d+)x(\\d+)\\+?(-?\\d+)\\+?(-?\\d+)} ").
% FIXME: Is this ok? Always positive?
--define(REGEXP,"regexp {(\\d+)x(\\d+)\\+(\\d+)\\+(\\d+)} ").
+-define(REGEXP, "regexp {(\\d+)x(\\d+)\\+(\\d+)\\+(\\d+)} ").
-option(Option, Gstkid, TkW, DB,_) ->
- case Option of
-%% Bug in tcl/tk complicates setting of a single x,y,width,height.
- {x, X} ->
- {c,
- [?REGEXP,"[wm ge ",TkW, "] g w h x y;wm ge ", TkW,
- " ${w}x$h",signed(X),"+$y;update idletasks"]};
- {y, Y} ->
- {c,[?REGEXP,"[wm ge ",TkW, "] g w h x y;wm ge ", TkW,
- " ${w}x$h+$x",signed(Y),"; update idletasks"]};
- {width, Width} when Width >= 0 -> % FIXME: Needed test?
- case gstk_db:opt_or_not(DB,Gstkid,width) of
- {value,Width} -> none;
- _Q ->
- gstk_db:insert_opt(DB,Gstkid,{width,Width}),
- {c,[?REGEXP,"[wm ge ",TkW, "] g w h x y;wm ge ", TkW," ",
- gstk:to_ascii(Width),"x$h+$x+$y;update idletasks"]}
- end;
- {height, Height} when Height >= 0 -> % FIXME: Needed test?
- case gstk_db:opt_or_not(DB,Gstkid,height) of
- {value,Height} -> none;
- _Q -> % FIXME: Why different?
- gstk_db:insert_opt(DB,Gstkid,{height,Height}),
- {c,
- ["wm ge ",TkW,
- " [winfo w ", TkW, "]x",gstk:to_ascii(Height),
- ";update idletasks"]}
- end;
- {width_height, {W,H}} when W >= 0, H >= 0 ->
- case {gstk_db:opt_or_not(DB,Gstkid,width),
- gstk_db:opt_or_not(DB,Gstkid,height)} of
- {{value,W},{value,H}} ->
- none;
- _OtherSize ->
- gstk_db:insert_opt(DB,Gstkid,{height,H}),
- gstk_db:insert_opt(DB,Gstkid,{width,W}),
- {c, ["update idletasks;wm ge ", TkW, " ",
- gstk:to_ascii(W),"x",gstk:to_ascii(H),
- ";update idletasks"]}
- end;
- {xy, {X,Y}} ->
- {c, [?REGEXP,"[wm ge ",TkW, "] g w h x y;wm ge ", TkW,
- " ${w}x$h", signed(X),signed(Y),
- ";update idletasks"]};
- {bg, Color} -> {s, [" -bg ", gstk:to_color(Color)]};
- {map, true} -> {c, ["wm deiconify ", TkW]};
- {map, false} -> {c, ["wm withdraw ", TkW]};
- {configure, On} ->
- gstk_db:insert_opt(DB,Gstkid,{configure,On}),
- none;
- {iconify, true} -> {c, ["wm iconify ", TkW]};
- {iconify, false} -> {c, ["wm deiconify ", TkW]};
- {title, Title} -> {c, ["wm title ", TkW, " " ,
- gstk:to_ascii(Title)]};
- {iconname, Name} -> {c, ["wm iconn ",TkW, " ",
- gstk:to_ascii(Name)]};
- {iconbitmap, Bitmap} -> {c, ["wm iconb ",TkW, " ",
- gstk:to_ascii(Bitmap)]};
- {iconmask, Bitmap} -> {c, ["wm iconm ",TkW, " ",
- gstk:to_ascii(Bitmap)]};
- raise -> {c, ["raise ", TkW]};
- lower -> {c, ["lower ", TkW]};
- {setfocus, true} -> {c, ["focus ", TkW]};
- {setfocus, false} -> {c, ["focus {}"]};
- {buttonpress, On} ->
- Eref = mk_eref(On, DB, Gstkid, buttonpress),
- {c,["bind ",TkW," <ButtonPress> ",
- event_onoff(["{erlsend ",Eref," %b ",xy_abs_str(TkW),"};"],On)]};
- {buttonrelease, On} ->
- Eref = mk_eref(On, DB, Gstkid, buttonrelease),
- {c,["bind ",TkW," <ButtonRelease> ",
- event_onoff(["{erlsend ",Eref," %b ",xy_abs_str(TkW),"};"],On)]};
- {motion, On} ->
- Eref = mk_eref(On, DB, Gstkid, motion),
- {c,["bind ",TkW," <Motion> ",
- event_onoff(["{erlsend ",Eref," ",xy_abs_str(TkW),"};"],On)]};
- _ -> invalid_option
- end.
+option(Option, Gstkid, TkW, DB, _) -> option(Option, Gstkid, TkW, DB).
-xy_abs_str(TkW) ->
- ["[expr %X-[winfo rootx ",TkW,"]] [expr %Y-[winfo rooty ",TkW,"]]"].
+option({configure, _} = Option, Gstkid, _TkW, DB) ->
+ gstk_db:insert_opt(DB, Gstkid, Option),
+ none;
+option({width, Width} = Option, Gstkid, TkW, DB) when Width >= 0 -> % FIXME: Needed test?
+ case gstk_db:opt_or_not(DB, Gstkid, width) of
+ {value, Width} -> none;
+ _Q ->
+ gstk_db:insert_opt(DB, Gstkid, Option),
+ option_c([?REGEXP, "[wm ge ", TkW, "] g w h x y;wm ge ", TkW, " ", gstk:to_ascii(Width),
+ "x$h+$x+$y;update idletasks"])
+ end;
+option({height, Height} = Option, Gstkid, TkW, DB) when Height >= 0 -> % FIXME: Needed test?
+ case gstk_db:opt_or_not(DB, Gstkid, height) of
+ {value, Height} -> none;
+ _Q -> % FIXME: Why different?
+ gstk_db:insert_opt(DB, Gstkid, Option),
+ option_c(["wm ge ", TkW, " [winfo w ", TkW, "]x", gstk:to_ascii(Height), ";update idletasks"])
+ end;
+option({width_height, {W, H}}, Gstkid, TkW, DB) when W >= 0, H >= 0 ->
+ case {gstk_db:opt_or_not(DB, Gstkid, width), gstk_db:opt_or_not(DB, Gstkid, height)} of
+ {{value, W}, {value, H}} -> none;
+ _OtherSize ->
+ lists:foreach(fun(E) -> gstk_db:insert_opt(DB, Gstkid, E) end, [{height, H}, {width, W}]),
+ option_c(["update idletasks;wm ge ", TkW, " ", gstk:to_ascii(W), "x", gstk:to_ascii(H), ";update idletasks"])
+ end;
+option({buttonpress, On}, Gstkid, TkW, DB) ->
+ option_c(["bind ", TkW, " <ButtonPress> ",
+ event_onoff(["{erlsend ", mk_eref(On, DB, Gstkid, buttonpress), " %b ", xy_abs_str(TkW), "};"], On)]);
+option({buttonrelease, On}, Gstkid, TkW, DB) ->
+ option_c(["bind ", TkW, " <ButtonRelease> ",
+ event_onoff(["{erlsend ", mk_eref(On, DB, Gstkid, buttonrelease), " %b ", xy_abs_str(TkW), "};"], On)]);
+option({motion, On}, Gstkid, TkW, DB) ->
+ option_c(["bind ", TkW, " <Motion> ",
+ event_onoff(["{erlsend ", mk_eref(On, DB, Gstkid, motion), " ", xy_abs_str(TkW), "};"], On)]);
+option(Option, _Gstkid, TkW, _DB) -> option(Option, TkW).
+
+option(lower, TkW) -> option_c("lower ", TkW);
+option(raise, TkW) -> option_c("raise ", TkW);
+option({setfocus, true}, TkW) -> option_c("focus ", TkW);
+option({map, true}, TkW) -> option_c("wm deiconify ", TkW);
+option({map, false}, TkW) -> option_c("wm withdraw ", TkW);
+option({iconify, true}, TkW) -> option_c("wm iconify ", TkW);
+option({iconify, false}, TkW) -> option_c("wm deiconify ", TkW);
+option({title, Title}, TkW) -> option_c(Title, "wm title ", TkW);
+option({iconname, Name}, TkW) -> option_c(Name, "wm iconn ", TkW);
+option({iconbitmap, Bitmap}, TkW) -> option_c(Bitmap, "wm iconb ", TkW);
+option({iconmask, Bitmap}, TkW) -> option_c(Bitmap, "wm iconm ", TkW);
+%% Bug in tcl/tk complicates setting of a single x, y,width, height.
+option({x, X}, TkW) ->
+ option_c([?REGEXP, "[wm ge ", TkW, "] g w h x y;wm ge ", TkW, " ${w}x$h", signed(X), "+$y;update idletasks"]);
+option({y, Y}, TkW) ->
+ option_c([?REGEXP, "[wm ge ", TkW, "] g w h x y;wm ge ", TkW, " ${w}x$h+$x", signed(Y), "; update idletasks"]);
+option({xy, {X, Y}}, TkW) ->
+ option_c([?REGEXP, "[wm ge ", TkW, "] g w h x y;wm ge ", TkW,
+ " ${w}x$h", signed(X), signed(Y), ";update idletasks"]);
+option(Option, _TkW) -> option(Option).
+
+
+option({setfocus, false}) -> option_c(["focus {}"]);
+option({bg, Color}) -> {s, [" -bg ", gstk:to_color(Color)]};
+option(_Option) -> invalid_option.
+
+option_c(Str, TkW) -> option_c([Str, TkW]).
+
+option_c(L) -> {c, L}.
+
+option_c(Val, Str, TkW) -> option_c([Str, TkW, " " , gstk:to_ascii(Val)]).
+
+xy_abs_str(TkW) -> ["[expr %X-[winfo rootx ", TkW, "]] [expr %Y-[winfo rooty ", TkW, "]]"].
event_onoff(Str, true) -> Str;
-event_onoff(_,false) -> "{}".
+event_onoff(_, false) -> "{}".
+mk_eref(true, DB, Gstkid, Etype) -> gstk_db:insert_event(DB, Gstkid, Etype, []);
mk_eref(false, DB, Gstkid, Etype) ->
gstk_db:delete_event(DB, Gstkid, Etype),
- dummy;
-mk_eref(true,DB,Gstkid,Etype) ->
- gstk_db:insert_event(DB, Gstkid, Etype, []).
-
+ dummy.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function : read_option/3
@@ -301,39 +273,40 @@ mk_eref(true,DB,Gstkid,Etype) ->
%% Return : The value of the option or invalid_option
%% [OptionValue | {bad_result, Reason}]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-read_option(Option, Gstkid, TkW, DB,_) ->
- case Option of
- x -> tcl2erl:ret_x(geo_str(TkW));
- y -> tcl2erl:ret_y(geo_str(TkW));
- width -> tcl2erl:ret_width(geo_str(TkW));
- height -> tcl2erl:ret_height(geo_str(TkW));
- configure -> gstk_db:opt(DB,Gstkid,configure);
- bg -> tcl2erl:ret_color([TkW," cg -bg"]);
- map -> tcl2erl:ret_mapped(["winfo is ", TkW]);
- iconify -> tcl2erl:ret_iconified(["wm st ", TkW]);
- title -> tcl2erl:ret_str(["wm ti ", TkW]);
- iconname -> tcl2erl:ret_str(["wm iconn ", TkW]);
- iconbitmap -> tcl2erl:ret_str(["wm iconb ", TkW]);
- iconmask -> tcl2erl:ret_str(["wm iconm ", TkW]);
- setfocus -> tcl2erl:ret_focus(TkW, "focus");
- _ -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}}
+read_option(Option, Gstkid, TkW, DB, _) -> read_option(Option, Gstkid, TkW, DB).
+
+read_option(configure, Gstkid, _TkW, DB) -> gstk_db:opt(DB, Gstkid, configure);
+read_option(Option, Gstkid, TkW, _DB) ->
+ case read_option(Option, TkW) of
+ invalid_option -> {bad_result, {Gstkid#gstkid.objtype, invalid_option, Option}};
+ O -> O
end.
-geo_str(TkW) ->
- ["update idletasks;",?REGEXP,"[wm geometry ", TkW,
- "] g w h x y;set tmp \"$w $h $x $y\""].
+read_option(x, TkW) -> tcl2erl:ret_x(geo_str(TkW));
+read_option(y, TkW) -> tcl2erl:ret_y(geo_str(TkW));
+read_option(width, TkW) -> tcl2erl:ret_width(geo_str(TkW));
+read_option(height, TkW) -> tcl2erl:ret_height(geo_str(TkW));
+read_option(bg, TkW) -> tcl2erl:ret_color([TkW, " cg -bg"]);
+read_option(map, TkW) -> tcl2erl:ret_mapped(["winfo is ", TkW]);
+read_option(iconify, TkW) -> tcl2erl:ret_iconified(["wm st ", TkW]);
+read_option(title, TkW) -> ret_str("wm ti ", TkW);
+read_option(iconname, TkW) -> ret_str("wm iconn ", TkW);
+read_option(iconbitmap, TkW) -> ret_str("wm iconb ", TkW);
+read_option(iconmask, TkW) -> ret_str("wm iconm ", TkW);
+read_option(setfocus, TkW) -> tcl2erl:ret_focus(TkW, "focus");
+read_option(_Option, _TkW) -> invalid_option.
+ret_str(Str, TkW) -> tcl2erl:ret_str([Str, TkW]).
+geo_str(TkW) -> ["update idletasks;", ?REGEXP, "[wm geometry ", TkW, "] g w h x y;set tmp \"$w $h $x $y\""].
%%----------------------------------------------------------------------
%% PRIMITIVES
%%----------------------------------------------------------------------
-%% Return {+,-}Int to be used in a geometry option
-signed(X) when X>=0 ->
- [$+,integer_to_list(X)];
-signed(X) when X<0 ->
- integer_to_list(X).
+%% Return {+, -}Int to be used in a geometry option
+signed(X) when X >= 0 -> [$+|integer_to_list(X)];
+signed(X) when X < 0 -> integer_to_list(X).
%%----------------------------------------------------------------------
%% Purpose: tcl/tk: wm .window geo sets WxH+x+y at one time.
@@ -341,31 +314,20 @@ signed(X) when X<0 ->
%% possible in one operation.
%%----------------------------------------------------------------------
transform_geometry_opts(Opts) ->
- {Geo,RestOpts} = collect_geo_opts(Opts,[],[]),
- Geo2 = make_atomic(lists:sort(Geo)),
- lists:append(Geo2,RestOpts).
+ {Geo, RestOpts} = collect_geo_opts(Opts, [], []),
+ lists:append(make_atomic(lists:sort(Geo)), RestOpts).
-make_atomic([{height,H},{width,W},{x,X},{y,Y}]) ->
- [{width_height,{W,H}},{xy,{X,Y}}];
-make_atomic([{height,H},{width,W}|XY]) ->
- [{width_height,{W,H}}|XY];
-make_atomic([WH,{x,X},{y,Y}]) ->
- [WH,{xy,{X,Y}}];
+make_atomic([{height, H}, {width, W}, {x, X}, {y, Y}]) -> [{width_height, {W, H}}, {xy, {X, Y}}];
+make_atomic([{height, H}, {width, W}|XY]) -> [{width_height, {W, H}}|XY];
+make_atomic([WH, {x, X}, {y, Y}]) -> [WH, {xy, {X, Y}}];
make_atomic(L) -> L.
%%----------------------------------------------------------------------
-%% Returns: {(list of x,y,width,height options),list of other opts}
+%% Returns: {(list of x, y,width, height options), list of other opts}
%%----------------------------------------------------------------------
-collect_geo_opts([{x,X}|Opts],Geo,Rest) ->
- collect_geo_opts(Opts,[{x,X}|Geo],Rest);
-collect_geo_opts([{y,Y}|Opts],Geo,Rest) ->
- collect_geo_opts(Opts,[{y,Y}|Geo],Rest);
-collect_geo_opts([{height,H}|Opts],Geo,Rest) ->
- collect_geo_opts(Opts,[{height,H}|Geo],Rest);
-collect_geo_opts([{width,W}|Opts],Geo,Rest) ->
- collect_geo_opts(Opts,[{width,W}|Geo],Rest);
-collect_geo_opts([Opt|Opts],Geo,Rest) ->
- collect_geo_opts(Opts,Geo,[Opt|Rest]);
-collect_geo_opts([],Geo,Rest) -> {Geo,Rest}.
-
+collect_geo_opts([{T, _} = Opt|Opts], Geo, Rest) when T =:= x; T =:= y; T =:= height; T =:= width->
+ collect_geo_opts(Opts, [Opt|Geo], Rest);
+collect_geo_opts([Opt|Opts], Geo, Rest) -> collect_geo_opts(Opts, Geo, [Opt|Rest]);
+collect_geo_opts([], Geo, Rest) -> {Geo, Rest}.
+
%%% ----- Done -----
diff -Ndurp otp_src_19.0.5/lib/gs/src/gs_widgets.erl otp_src_19.0.5-lib-gs/lib/gs/src/gs_widgets.erl
--- otp_src_19.0.5/lib/gs/src/gs_widgets.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/gs_widgets.erl 2016-08-25 16:37:44.567693306 +0300
@@ -26,74 +26,53 @@
-module(gs_widgets).
-
%% ----- Exports -----
--export([default_options/1,
- container/1]).
-
+-export([default_options/1, container/1]).
%% ------------------------------------------------------------
%% default_options for widgets
%% Keep the options in the list sorted!
%% ------------------------------------------------------------
-default_options(arc) -> [{coords, [{0,0}, {0,0}]}];
-default_options(button) -> [{click,true}, {height,30}, {width,100}, {x,0},
- {y,0}];
-default_options(canvas) -> [{height,200}, {scrollregion,{0,0,300,200}},
- {width,300}, {x,0}, {y,0}];
-default_options(checkbutton) -> [{click,true}, {height,30}, {width,100}, {x,0},
- {y,0}];
-default_options(editor) -> [{height,200}, {width,300}, {x,0}, {y,0}];
-default_options(entry) -> [{height,30}, {width,100}, {x,0}, {y,0}];
-default_options(frame) -> [{height,100}, {width,150}, {x,0}, {y,0}];
-default_options(grid) -> [{bg,grey}, {cellheight,20},
- {columnwidths, [80,80,80,80]},
- {fg,black}, {font,{screen, 12}},
- {height,100},
- {hscroll,bottom},
- {rows,{1,10}},
- {vscroll,right},
- {width,300},
- {x,0}, {y,0}];
+default_options(arc) -> [{coords, [{0, 0}, {0, 0}]}];
+default_options(button) -> [{click, true}, {height, 30}, {width, 100}, {x, 0}, {y, 0}];
+default_options(canvas) -> [{height, 200}, {scrollregion, {0, 0, 300, 200}}, {width, 300}, {x, 0}, {y, 0}];
+default_options(checkbutton) -> [{click, true}, {height, 30}, {width, 100}, {x, 0}, {y, 0}];
+default_options(editor) -> [{height, 200}, {width, 300}, {x, 0}, {y, 0}];
+default_options(entry) -> [{height, 30}, {width, 100}, {x, 0}, {y, 0}];
+default_options(frame) -> [{height, 100}, {width, 150}, {x, 0}, {y, 0}];
+default_options(grid) -> [{bg, grey}, {fg, black},
+ {cellheight, 20}, {columnwidths, [80, 80, 80, 80]},
+ {font, {screen, 12}},
+ {height, 100}, {width, 300},
+ {hscroll, bottom}, {vscroll, right},
+ {rows, {1, 10}},
+ {x, 0}, {y, 0}];
% Keep the options in the list sorted!
-default_options(gridline) -> [{click,true}, {doubleclick,false}, {row,undefined}];
-default_options(gs) -> [{kernel,false},
- {{default,all,font}, {screen,12}}];
-default_options(image) -> [{anchor,nw}, {coords,[{0,0}]}];
-default_options(label) -> [{height,30}, {width,100}, {x,0}, {y,0}];
-default_options(line) -> [{coords, [{-1,-1},{-1,-1}]}];
-default_options(listbox) -> [{height,130}, {hscroll,true},
- {selectmode,single}, {vscroll,true},
- {width,125}, {x,0}, {y,0}];
-default_options(menu) -> [];
+default_options(gridline) -> [{click, true}, {doubleclick, false}, {row, undefined}];
+default_options(gs) -> [{kernel, false}, {{default, all, font}, {screen, 12}}];
+default_options(image) -> [{anchor, nw}, {coords, [{0, 0}]}];
+default_options(label) -> [{height, 30}, {width, 100}, {x, 0}, {y, 0}];
+default_options(line) -> [{coords, [{-1, -1}, {-1, -1}]}];
+default_options(listbox) ->
+ [{height, 130}, {hscroll, true}, {selectmode, single}, {vscroll, true}, {width, 125}, {x, 0}, {y, 0}];
+default_options(menu) -> [];
% Keep the options in the list sorted!
-default_options(menubar) -> [{bw,2}, {height,25}, {highlightbw,0},
- {relief,raised}];
-default_options(menubutton) -> [{anchor,nw}, {side,left}];
-default_options(menuitem) -> [{click,true}, {index,last}, {itemtype,normal}];
-default_options(message) -> [{height,75}, {width,100}];
-default_options(oval) -> [{coords, [{0,0},{0,0}]}];
-default_options(polygon) -> [{coords, [{0,0},{0,0}]}, {fg,black}, {fill,none}];
-default_options(prompter) -> [{height,200}, {prompt,[]}, {width,300}];
-default_options(radiobutton) -> [{click,true}, {height,30}, {width,100},
- {x,0}, {y,0}];
-default_options(rectangle) -> [{coords, [{0,0},{0,0}]}];
-default_options(scale) -> [{click,true}, {height,50}, {width,100},
- {x,0}, {y,0}];
+default_options(menubar) -> [{bw, 2}, {height, 25}, {highlightbw, 0}, {relief, raised}];
+default_options(menubutton) -> [{anchor, nw}, {side, left}];
+default_options(menuitem) -> [{click, true}, {index, last}, {itemtype, normal}];
+default_options(message) -> [{height, 75}, {width, 100}];
+default_options(oval) -> [{coords, [{0, 0}, {0, 0}]}];
+default_options(polygon) -> [{coords, [{0, 0}, {0, 0}]}, {fg, black}, {fill, none}];
+default_options(prompter) -> [{height, 200}, {prompt, []}, {width, 300}];
+default_options(radiobutton) -> [{click, true}, {height, 30}, {width, 100}, {x, 0}, {y, 0}];
+default_options(rectangle) -> [{coords, [{0, 0}, {0, 0}]}];
+default_options(scale) -> [{click, true}, {height, 50}, {width, 100}, {x, 0}, {y, 0}];
% Keep the options in the list sorted!
-default_options(scrollbar) -> [];
-default_options(text) -> [{anchor,nw}, {coords,[{0,0}]}, {justify,left}];
-default_options(window) -> [{configure,false}, {cursor,arrow}, {destroy,true},
- {height,200}, {map,false}, {width,300}];
-default_options(_) -> [].
+default_options(scrollbar) -> [];
+default_options(text) -> [{anchor, nw}, {coords, [{0, 0}]}, {justify, left}];
+default_options(window) ->
+ [{configure, false}, {cursor, arrow}, {destroy, true}, {height, 200}, {map, false}, {width, 300}];
+default_options(_) -> [].
-container(canvas) -> true;
-container(frame) -> true;
-container(grid) -> true;
-container(menu) -> true;
-container(menubar) -> true;
-container(menubutton) -> true;
-container(menuitem) -> true;
-container(window) -> true;
-container(_) -> false.
+container(C) -> lists:member(C, [canvas, frame, grid, menu, menubar, menubutton, menuitem, window]).
diff -Ndurp otp_src_19.0.5/lib/gs/src/Makefile otp_src_19.0.5-lib-gs/lib/gs/src/Makefile
--- otp_src_19.0.5/lib/gs/src/Makefile 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/Makefile 2016-08-25 16:37:44.567693306 +0300
@@ -73,7 +73,7 @@ IMAGES=../priv/bitmap/fup.bm
# ----------------------------------------------------
# FLAGS
# ----------------------------------------------------
-ERL_COMPILE_FLAGS += +warn_obsolete_guard -Werror
+ERL_COMPILE_FLAGS += +inline +warn_obsolete_guard -Werror
# ----------------------------------------------------
# Targets
diff -Ndurp otp_src_19.0.5/lib/gs/src/tcl2erl.erl otp_src_19.0.5-lib-gs/lib/gs/src/tcl2erl.erl
--- otp_src_19.0.5/lib/gs/src/tcl2erl.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/tcl2erl.erl 2016-08-25 16:37:44.567693306 +0300
@@ -26,7 +26,8 @@
%% ------------------------------------------------------------
-module(tcl2erl).
--compile([{nowarn_deprecated_function,{gs,error,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, error, 2}}]).
-export([parse_event/1,
ret_int/1,
@@ -53,8 +54,6 @@
-include("gstk.hrl").
-
-
%% ----------------------------------------
%% Parse an incoming event represented as
%% a list of bytes
@@ -66,18 +65,12 @@ parse_event(Bytes) ->
{term_seq, Args}= parse_term_seq(Toks),
{list_to_integer(ID), Etag, Args}.
+%%---first word returns {Word, Cont}---%%
+first_word(Bytes) -> fw(Bytes, []).
-%%---first word returns {Word,Cont}---%%
-first_word(Bytes) ->
- fw(Bytes,[]).
-
-fw([],Ack) ->
- {lists:reverse(Ack),[]};
-fw([$ |R],Ack) ->
- {lists:reverse(Ack),R};
-fw([Char|R],Ack) ->
- fw(R,[Char|Ack]).
-
+fw([], Ack) -> {lists:reverse(Ack), []};
+fw([$ |R], Ack) -> {lists:reverse(Ack), R};
+fw([Char|R], Ack) -> fw(R, [Char|Ack]).
%% ---------------------------------------------
%% str_to_term(Str)
@@ -91,13 +84,12 @@ fw([Char|R],Ack) ->
%%
str_to_term(Str) ->
- {tokens,Tokens} = scan(Str),
+ {tokens, Tokens} = scan(Str),
case catch parse_term(Tokens) of
- {_Type, Term,[]} -> {term,Term};
+ {_Type, Term, []} -> {term, Term};
_ -> {string, Str}
end.
-
%% ---------------------------------------------
%% Simple Parser. ;-)
%% Parses tokens or fails.
@@ -111,146 +103,88 @@ str_to_term(Str) ->
%% parse_term_seq(Toks) <-> {term_seq, Term_Sequence} %% no continuation
%%
-parse_term([{var,Var}|R]) -> {var,Var,R};
-parse_term([{atom,Atom}|R]) -> {atom,Atom,R};
-parse_term([{float,Float}|R]) -> {float,Float,R};
-parse_term([{integer,Integer}|R]) -> {integer,Integer,R};
-parse_term([{string,String}|R]) -> {string,String,R};
-parse_term(['-',{integer,Integer}|R]) -> {integer,-Integer,R};
-parse_term(['-',{float,Float}|R]) -> {float,-Float,R};
-parse_term(['+',{integer,Integer}|R]) -> {integer,Integer,R};
-parse_term(['+',{float,Float}|R]) -> {float,Float,R};
-parse_term(['['|R]) -> {list,_Term,_C}=parse_list(['['|R]);
-parse_term(['{'|R]) -> {tuple,_Term,_C}=parse_tuple(['{'|R]);
-parse_term([Char|R]) -> {char,Char,R}.
+parse_term([{T, Val}|R]) when T =:= var; T =:= atom; T =:= flaot; T =:= integer; T =:= string -> {T, Val, R};
+parse_term(['-', {T, Val}|R]) when T =:= integer; T =:= float -> {T, -Val, R};
+parse_term(['+', {T, Val}|R]) when T =:= integer; T =:= float -> {T, Val, R};
+parse_term(['['|R]) -> {list, _Term, _C} = parse_list(['['|R]);
+parse_term(['{'|R]) -> {tuple, _Term, _C} = parse_tuple(['{'|R]);
+parse_term([Char|R]) -> {char, Char, R}.
%%--- parse list ---
-parse_list(['[',']'|C]) ->
- {list, [], C};
-parse_list(['['|R]) ->
- {list,_List,_C}= list_args(R,[]).
+parse_list(['[', ']'|C]) -> {list, [], C};
+parse_list(['['|R]) -> {list, _List, _C} = list_args(R, []).
-list_args(Toks,Ack) ->
- cont_list(parse_term(Toks),Ack).
+list_args(Toks, Ack) -> cont_list(parse_term(Toks), Ack).
-cont_list({_Tag, Term,[','|C]},Ack) ->
- list_args(C,[Term|Ack]);
-cont_list({_Tag, Term,[']'|C]},Ack) ->
- {list,lists:reverse([Term|Ack]),C}.
+cont_list({_Tag, Term, [','|C]}, Ack) -> list_args(C, [Term|Ack]);
+cont_list({_Tag, Term, [']'|C]}, Ack) -> {list, lists:reverse([Term|Ack]), C}.
%%--- parse tuple ---
-parse_tuple(['{','}'|C]) ->
- {tuple,{}, C};
-parse_tuple(['{'|R]) ->
- {tuple,_Tuple,_C}=tuple_args(R,[]).
+parse_tuple(['{', '}'|C]) -> {tuple, {}, C};
+parse_tuple(['{'|R]) -> {tuple, _Tuple, _C} = tuple_args(R, []).
-tuple_args(Toks,Ack) ->
- cont_tuple(parse_term(Toks),Ack).
+tuple_args(Toks, Ack) -> cont_tuple(parse_term(Toks), Ack).
-cont_tuple({_Tag, Term,[','|C]},Ack) ->
- tuple_args(C,[Term|Ack]);
-cont_tuple({_Tag, Term,['}'|C]},Ack) ->
- {tuple,list_to_tuple(lists:reverse([Term|Ack])),C}.
+cont_tuple({_Tag, Term, [','|C]}, Ack) -> tuple_args(C, [Term|Ack]);
+cont_tuple({_Tag, Term, ['}'|C]}, Ack) -> {tuple, list_to_tuple(lists:reverse([Term|Ack])), C}.
%%--- parse sequence of terms ---
-parse_term_seq(Toks) ->
- p_term_seq(Toks,[]).
-
-p_term_seq([],Ack) ->
- {term_seq, lists:reverse(Ack)}; % never any continuation left
-p_term_seq(Toks,Ack) ->
- {_Type,Term,C} = parse_term(Toks),
- p_term_seq(C,[Term|Ack]).
-
+parse_term_seq(Toks) -> p_term_seq(Toks, []).
+p_term_seq([], Ack) -> {term_seq, lists:reverse(Ack)}; % never any continuation left
+p_term_seq(Toks, Ack) ->
+ {_Type, Term, C} = parse_term(Toks),
+ p_term_seq(C, [Term|Ack]).
%% ----------------------------------------
%% Simple Scanner
-scan(Bytes) ->
- {tokens, scan(Bytes,[])}.
-
-scan([],Ack) ->
- lists:reverse(Ack);
-scan([$ |R],Ack) -> % delete whitespace
- scan(R,Ack);
-scan([X|R],Ack) when is_integer(X),X>=$a,X=<$z ->
- scan_atom(R,[X],Ack);
-scan([X|R],Ack) when is_integer(X),X>=$A,X=<$Z ->
- scan_var(R,[X],Ack);
-scan([X|R],Ack) when is_integer(X),X>=$0,X=<$9 ->
- scan_number(R,[X],Ack);
-scan([$"|R],Ack) ->
- scan_string(R,[],Ack);
-scan([X|R],Ack) when is_integer(X) ->
- scan(R,[list_to_atom([X])|Ack]).
-
-scan_atom([X|R],Ack1,Ack2) when is_integer(X),X>=$a,X=<$z ->
- scan_atom(R,[X|Ack1],Ack2);
-scan_atom([X|R],Ack1,Ack2) when is_integer(X),X>=$A,X=<$Z ->
- scan_atom(R,[X|Ack1],Ack2);
-scan_atom([X|R],Ack1,Ack2) when is_integer(X),X>=$0,X=<$9 ->
- scan_atom(R,[X|Ack1],Ack2);
-scan_atom([$_|R],Ack1,Ack2) ->
- scan_atom(R,[$_|Ack1],Ack2);
-scan_atom(L,Ack1,Ack2) ->
- scan(L,[{atom,list_to_atom(lists:reverse(Ack1))}|Ack2]).
+scan(Bytes) -> {tokens, scan(Bytes, [])}.
-scan_var([X|R],Ack1,Ack2) when is_integer(X),X>=$a,X=<$z ->
- scan_var(R,[X|Ack1],Ack2);
-scan_var([X|R],Ack1,Ack2) when is_integer(X),X>=$A,X=<$Z ->
- scan_var(R,[X|Ack1],Ack2);
-scan_var([X|R],Ack1,Ack2) when is_integer(X),X>=$0,X=<$9 ->
- scan_var(R,[X|Ack1],Ack2);
-scan_var([$_|R],Ack1,Ack2) ->
- scan_var(R,[$_|Ack1],Ack2);
-scan_var(L,Ack1,Ack2) ->
- scan(L,[{var,list_to_atom(lists:reverse(Ack1))}|Ack2]).
+scan([], Ack) -> lists:reverse(Ack);
+scan([$ |R], Ack) -> scan(R, Ack); % delete whitespace
+scan([X|R], Ack) when X >= $a, X =< $z -> scan_atom(R, [X], Ack);
+scan([X|R], Ack) when X >= $A, X =< $Z -> scan_var(R, [X], Ack);
+scan([X|R], Ack) when X >= $0, X =< $9 -> scan_number(R, [X], Ack);
+scan([$"|R], Ack) -> scan_string(R, [], Ack);
+scan([X|R], Ack) when is_integer(X) -> scan(R, [list_to_atom([X])|Ack]).
-scan_number([X|R],Ack1,Ack2) when is_integer(X),X>=$0,X=<$9 ->
- scan_number(R,[X|Ack1],Ack2);
-scan_number([$.|R],Ack1,Ack2) ->
- scan_float(R,[$.|Ack1],Ack2);
-scan_number(L,Ack1,Ack2) ->
- scan(L,[{integer,list_to_integer(lists:reverse(Ack1))}|Ack2]).
+scan_term(T, [X|R], Ack1, Ack2) when X >= $a andalso X =< $z; X >= $A andalso X =< $Z; X >= $0 andalso X =< $9 ->
+ scan_term(T, R, [X|Ack1], Ack2);
+scan_term(T, [$_|R], Ack1, Ack2) -> scan_term(T, R, [$_|Ack1], Ack2);
+scan_term(T, L, Ack1, Ack2) -> scan(L, [{T, list_to_atom(lists:reverse(Ack1))}|Ack2]).
-scan_float([X|R],Ack1,Ack2) when is_integer(X),X>=$0,X=<$9 ->
- scan_float(R,[X|Ack1],Ack2);
-scan_float(L,Ack1,Ack2) ->
- Float = list_to_float(lists:reverse(Ack1)),
- Int = trunc(Float),
- if
- Int==Float ->
- scan(L,[{integer,Int}|Ack2]);
- true ->
- scan(L,[{float,Float}|Ack2])
- end.
+scan_atom(L, Ack1, Ack2) -> scan_term(atom, L, Ack1, Ack2).
+scan_var(L, Ack1, Ack2) -> scan_term(var, L, Ack1, Ack2).
-scan_string([$"|R],Ack1,Ack2) ->
- scan(R,[{string,lists:reverse(Ack1)}|Ack2]);
-scan_string([X|R],Ack1,Ack2) when is_integer(X) ->
- scan_string(R,[X|Ack1],Ack2);
-scan_string([],_Ack1,_Ack2) ->
- throw({error,"unterminated string."}).
+scan_number([X|R], Ack1, Ack2) when X >= $0, X =< $9 -> scan_number(R, [X|Ack1], Ack2);
+scan_number([$.|R], Ack1, Ack2) -> scan_float(R, [$.|Ack1], Ack2);
+scan_number(L, Ack1, Ack2) -> scan(L, [{integer, list_to_integer(lists:reverse(Ack1))}|Ack2]).
+scan_float([X|R], Ack1, Ack2) when X >= $0, X =< $9 -> scan_float(R, [X|Ack1], Ack2);
+scan_float(L, Ack1, Ack2) ->
+ Float = list_to_float(lists:reverse(Ack1)),
+ scan(L, [case trunc(Float) of
+ Int when Int == Float -> {integer, Int};
+ _ -> {float, Float}
+ end|Ack2]).
+scan_string([$"|R], Ack1, Ack2) -> scan(R, [{string, lists:reverse(Ack1)}|Ack2]);
+scan_string([X|R], Ack1, Ack2) when is_integer(X) -> scan_string(R, [X|Ack1], Ack2);
+scan_string([], _Ack1, _Ack2) -> throw({error, "unterminated string."}).
%% ---------- Checking Return values -----------
%% Used by read to return a proper type or fail.
-ret_int(Str) ->
- case gstk:call(Str) of
- {result, Result} ->
- {_,Value} = str_to_term(Result),
- Value;
- Bad_result -> Bad_result
- end.
+ret_int(Str) -> ret_term(Str).
-ret_atom(Str) ->
+ret_atom(Str) -> ret_term(Str).
+
+ret_term(Str) ->
case gstk:call(Str) of
{result, Result} ->
- {_,Value} = str_to_term(Result),
+ {_, Value} = str_to_term(Result),
Value;
Bad_result -> Bad_result
end.
@@ -263,9 +197,9 @@ ret_str(Str) ->
ret_tuple(Str) ->
case gstk:call(Str) of
- {result,S} ->
- {tokens,Toks} = scan(S),
- {term_seq,Seq} = parse_term_seq(Toks),
+ {result, S} ->
+ {tokens, Toks} = scan(S),
+ {term_seq, Seq} = parse_term_seq(Toks),
list_to_tuple(Seq);
Bad_result -> Bad_result
end.
@@ -273,187 +207,158 @@ ret_tuple(Str) ->
%%----------------------------------------------------------------------
%% Returns: Coords or error.
%%----------------------------------------------------------------------
-ret_pack(Key, TkW) ->
- Str = ret_list(["pack info ", TkW]),
- pick_out(Str, Key).
+ret_pack(Key, TkW) -> pick_out(ret_list(["pack info ", TkW]), Key).
-ret_place(Key, TkW) ->
- Str = ret_list(["place info ", TkW]),
- pick_out(Str, Key).
+ret_place(Key, TkW) -> pick_out(ret_list(["place info ", TkW]), Key).
-pick_out([Key, Value | _Rest], Key) -> Value;
-pick_out([Key, {} | _Rest], Key) -> 0;
-pick_out(['-' | Rest], Key) -> pick_out(Rest, Key);
-pick_out([_, _ | Rest], Key) -> pick_out(Rest, Key);
+pick_out([Key, Value|_Rest], Key) -> Value;
+pick_out([Key, {}|_Rest], Key) -> 0;
+pick_out(['-'|Rest], Key) -> pick_out(Rest, Key);
+pick_out([_, _|Rest], Key) -> pick_out(Rest, Key);
pick_out(Other, _Key) -> Other.
-
ret_x(Str) ->
case ret_geometry(Str) of
- {_W,_H,X,_Y} -> X;
+ {_W, _H, X, _Y} -> X;
Other -> Other
end.
ret_y(Str) ->
case ret_geometry(Str) of
- {_W,_H,_X,Y} -> Y;
+ {_W, _H, _X, Y} -> Y;
Other -> Other
end.
ret_width(Str) ->
case ret_geometry(Str) of
- {W,_H,_X,_Y} -> W;
+ {W, _H, _X, _Y} -> W;
Other -> Other
end.
ret_height(Str) ->
case ret_geometry(Str) of
- {_W,H,_X,_Y} -> H;
+ {_W, H, _X, _Y} -> H;
Other -> Other
end.
-
-
ret_geometry(Str) ->
case ret_tuple(Str) of
- {W,H,X,Y} when is_atom(H) ->
- [_|Height]=atom_to_list(H),
- {W,list_to_integer(Height),X,Y};
+ {W, H, X, Y} when is_atom(H) -> {W, list_to_integer(tl(atom_to_list(H))), X, Y};
Other -> Other
end.
ret_list(Str) ->
case gstk:call(Str) of
- {result,S} ->
- {tokens,Toks} = scan(S),
- {term_seq,Seq} = parse_term_seq(Toks),
+ {result, S} ->
+ {tokens, Toks} = scan(S),
+ {term_seq, Seq} = parse_term_seq(Toks),
Seq;
Bad_result -> Bad_result
end.
ret_str_list(Str) ->
case gstk:call(Str) of
- {result,S} ->
- mk_quotes0(S,[]);
+ {result, S} -> mk_quotes0(S, []);
Bad_result -> Bad_result
end.
-
ret_label(Str) ->
case ret_str_list(Str) of
[[], [$@|Img]] -> {image, Img};
- [Text, []] -> {text, Text};
- Bad_Result -> Bad_Result
- end.
-
-
-
-ret_mapped(Str) ->
- case ret_int(Str) of
- 1 -> true;
- 0 -> false;
+ [Text, []] -> {text, Text};
Bad_Result -> Bad_Result
end.
+ret_mapped(Str) -> ret_bool(Str).
ret_iconified(Str) ->
case ret_atom(Str) of
- iconic -> true;
- normal -> false;
+ iconic -> true;
+ normal -> false;
Bad_Result -> Bad_Result
end.
-
-ret_focus(W, Str) ->
- case gstk:call(Str) of
- {result, W} -> true;
- _ -> false
- end.
-
+ret_focus(W, Str) -> gstk:call(Str) =:= {result, W}.
ret_file(Str) ->
case gstk:call(Str) of
{result, [$@|File]} -> File;
- {result, []} -> [];
- Bad_result -> Bad_result
+ {result, []} -> [];
+ Bad_result -> Bad_result
end.
-
ret_bool(Str) ->
case ret_int(Str) of
- 1 -> true;
- 0 -> false;
+ 1 -> true;
+ 0 -> false;
Bad_Result -> Bad_Result
end.
ret_enable(Str) ->
case ret_atom(Str) of
- normal -> true;
- active -> true;
- disabled -> false;
+ normal -> true;
+ active -> true;
+ disabled -> false;
Bad_Result -> Bad_Result
end.
-
-
ret_color(Str) ->
case gstk:call(Str) of
- {result,[$#,R1,G1,B1]} ->
- {hex2dec([R1,$0]),hex2dec([G1,$0]),hex2dec([B1,$0])};
- {result,[$#,R1,R2,G1,G2,B1,B2]} ->
- {hex2dec([R1,R2]),hex2dec([G1,G2]),hex2dec([B1,B2])};
- {result,[$#,R1,R2,_R3,G1,G2,_G3,B1,B2,_B3]} ->
- {hex2dec([R1,R2]),hex2dec([G1,G2]),hex2dec([B1,B2])};
- {result,[$#,R1,R2,_R3,_R4,G1,G2,_G3,_G4,B1,B2,_B3,_B4]} ->
- {hex2dec([R1,R2]),hex2dec([G1,G2]),hex2dec([B1,B2])};
- {result,[Char|Word]} when Char>=$A, Char=<$Z ->
- list_to_atom([Char+32|Word]);
- {result,[Char|Word]} when Char>=$a, Char=<$z ->
- list_to_atom([Char|Word]);
- {result,Color} ->
- gs:error("error in tcl2erl:ret_color got ~w.~n",[Color]);
+ {result, [$#|L]} when length(L) =:= 3; length(L) =:= 6; length(L) =:= 9 ->
+ list_to_tuple(lists:map(fun hex2dec/1,
+ case L of
+ [R1, G1, B1] -> {[R1, $0], [G1, $0], [B1, $0]};
+ [R1, R2, G1, G2, B1, B2] -> {[R1, R2], [G1, G2], [B1, B2]};
+ [R1, R2, _R3, _R4, G1, G2, _G3, _G4, B1, B2, _B3, _B4] ->
+ {[R1, R2], [G1, G2], [B1, B2]}
+ end));
+ {result, [Char|Word]} when Char >= $A andalso Char =< $Z; Char >= $a andalso Char =< $z ->
+ list_to_atom([Char bor 32|Word]);
+ {result, Color} -> gs:error("error in tcl2erl:ret_color got ~w.~n", [Color]);
Bad_result -> Bad_result
end.
-
ret_stipple(Str) ->
case gstk:call(Str) of
{result, _Any} -> true;
_Other -> false
end.
-
%% ------------------------------------------------------------
%% Hexadecimal to Decimal converter
%%
-hex2dec(Hex) -> hex2dec(Hex,0).
-
-hex2dec([H|T],N) when H>=$0,H=<$9 ->
- hex2dec(T,(N bsl 4) bor (H-$0));
-hex2dec([H|T],N) when H>=$a,H=<$f ->
- hex2dec(T,(N bsl 4) bor (H-$a+10));
-hex2dec([H|T],N) when H>=$A,H=<$F ->
- hex2dec(T,(N bsl 4) bor (H-$A+10));
-hex2dec([],N) -> N.
+hex2dec(Hex) -> hex2dec(Hex, 0).
+hex2dec([H|T], N) ->
+ hex2dec(T, (N bsl 4) bor (H - if
+ H >= $0, H =< $9 -> $0;
+ H >= $a, H =< $f -> $a - 10;
+ H >= $A, H =< $F -> $A - 10
+ end));
+hex2dec([], N) -> N.
-mk_quotes0([${|T],Res) -> mk_quotes2(T,"",Res);
-mk_quotes0([$ |T],Res) -> mk_quotes0(T,Res);
-mk_quotes0([$\\,X |T],Res) -> mk_quotes1(T,[X],Res);
-mk_quotes0([X|T],Res) -> mk_quotes1(T,[X],Res);
-mk_quotes0([],Res) -> lists:reverse(Res).
+mk_quotes0([${|T], Res) -> mk_quotes2(T, "", Res);
+mk_quotes0([$ |T], Res) -> mk_quotes0(T, Res);
+mk_quotes0([], Res) -> lists:reverse(Res);
+mk_quotes0(L, Res) ->
+ [X|T] = case L of
+ [$\\|[_|_] = R] -> R;
+ [_|_] -> L
+ end,
+ mk_quotes1(T, [X], Res).
-mk_quotes1([$}|T],Ack,Res) -> mk_quotes0(T,[lists:reverse(Ack)|Res]);
-mk_quotes1([$\\,X |T],Ack,Res) -> mk_quotes1(T,[X|Ack],Res);
-mk_quotes1([$ |T],Ack,Res) -> mk_quotes0(T,[lists:reverse(Ack)|Res]);
-mk_quotes1([X|T],Ack,Res) -> mk_quotes1(T,[X|Ack],Res);
-mk_quotes1([],Ack,Res) -> lists:reverse([lists:reverse(Ack)|Res]).
+mk_quotes1([], Ack, Res) -> lists:reverse([lists:reverse(Ack)|Res]);
+mk_quotes1([X|T], Ack, Res) when X =:= $}; X =:= $ -> mk_quotes0(T, [lists:reverse(Ack)|Res]);
+mk_quotes1(L, Ack, Res) ->
+ [X|T] = case L of
+ [$\\|[_|_] = R] -> R;
+ [_|_] -> L
+ end,
+ mk_quotes1(T, [X|Ack], Res).
%% grouped using {bla bla} syntax
-mk_quotes2([$}|T],Ack,Res) -> mk_quotes0(T,[lists:reverse(Ack)|Res]);
-mk_quotes2([$\\,X |T],Ack,Res) -> mk_quotes2(T,[X|Ack],Res);
-mk_quotes2([X|T],Ack,Res) -> mk_quotes2(T,[X|Ack],Res);
-mk_quotes2([],Ack,Res) -> lists:reverse([lists:reverse(Ack)|Res]).
-
-
+mk_quotes2([$}|T], Ack, Res) -> mk_quotes0(T, [lists:reverse(Ack)|Res]);
+mk_quotes2([$\\, X|T], Ack, Res) -> mk_quotes2(T, [X|Ack], Res);
+mk_quotes2([X|T], Ack, Res) -> mk_quotes2(T, [X|Ack], Res);
+mk_quotes2([], Ack, Res) -> lists:reverse([lists:reverse(Ack)|Res]).
diff -Ndurp otp_src_19.0.5/lib/gs/src/tool_file_dialog.erl otp_src_19.0.5-lib-gs/lib/gs/src/tool_file_dialog.erl
--- otp_src_19.0.5/lib/gs/src/tool_file_dialog.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/tool_file_dialog.erl 2016-08-25 16:37:44.567693306 +0300
@@ -20,15 +20,16 @@
%%
-module(tool_file_dialog).
--compile([{nowarn_deprecated_function,{gs,button,3}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,entry,3}},
- {nowarn_deprecated_function,{gs,frame,3}},
- {nowarn_deprecated_function,{gs,label,3}},
- {nowarn_deprecated_function,{gs,listbox,3}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
+
+-compile([{nowarn_deprecated_function, {gs, button, 3}},
+ {nowarn_deprecated_function, {gs, config, 2}},
+ {nowarn_deprecated_function, {gs, entry, 3}},
+ {nowarn_deprecated_function, {gs, frame, 3}},
+ {nowarn_deprecated_function, {gs, label, 3}},
+ {nowarn_deprecated_function, {gs, listbox, 3}},
+ {nowarn_deprecated_function, {gs, read, 2}},
+ {nowarn_deprecated_function, {gs, start, 0}},
+ {nowarn_deprecated_function, {gs, window, 3}}]).
-export([start/1]).
@@ -38,12 +39,12 @@
extensions, % [string()] Filtered file extensions
hidden}). % [{Dir, [File]}] Hidden files per dir.
--define(WIDTH, 250).
+-define(WIDTH, 250).
-define(HEIGHT, 400).
--define(BTNW, 65).
--define(BTNH, 30).
+-define(BTNW, 65).
+-define(BTNH, 30).
-%% start(Opts) -> {ok, AbsFile, Dir} | {error,cancel} | pid()
+%% start(Opts) -> {ok, AbsFile, Dir} | {error, cancel} | pid()
%% Opts = [Opt]
%% Opt = {type, open|save|multiselect}
%% | {extensions, [string()]} % For example ".erl"
@@ -51,7 +52,7 @@
%% ! {file, string() % Filename (no path)
%% AbsFile = string()
%% Dir = string()
-%% An open/save dialog returns {ok, AbsFile, Dir} or {error,cancel}
+%% An open/save dialog returns {ok, AbsFile, Dir} or {error, cancel}
%% (the latter, ridiculous, return value is kept for backwards
%% compatibility reasons only).
%%
@@ -62,167 +63,114 @@
%% a new filedialog with the same directory.
start(Opts0) ->
- Opts = parse_opts(Opts0),
Self = self(),
- case Opts#opts.type of
- multiselect ->
- spawn_link(fun() -> init(Self, Opts) end);
- _Type -> % open | save
- spawn_link(fun() -> init(Self, Opts) end),
- receive
- {fd_result, Res} ->
- Res
- end
+ #opts{type = Type} = Opts = parse_opts(Opts0),
+ Pid = spawn_link(fun() -> init(Self, Opts) end),
+ if
+ Type =:= multiselect -> Pid;
+ true -> receive
+ {fd_result, Res} -> Res
+ end
end.
parse_opts(Opts) ->
{ok, CWD} = file:get_cwd(),
- DefOpts = #opts{type=open, dir=CWD, file="NoName",
- extensions=[], hidden=[]},
- parse_opts(Opts, DefOpts).
+ parse_opts(Opts, #opts{type = open, dir = CWD, file="NoName", extensions = [], hidden = []}).
-parse_opts([{type, Type}|Opts], DefOpts) ->
- if
- Type==open; Type==save; Type==multiselect ->
- parse_opts(Opts, DefOpts#opts{type=Type});
- true ->
- erlang:error(badarg, [{type,Type}])
- end;
-parse_opts([{extensions, Exts}|Opts], DefOpts) ->
- case lists:all(fun(Ext) -> is_list(Ext) end, Exts) of
- true ->
- parse_opts(Opts, DefOpts#opts{extensions=Exts});
- false ->
- erlang:error(badarg, [{extension, Exts}])
- end;
-parse_opts([{dir, Dir}|Opts], DefOpts) ->
- case filelib:is_dir(Dir) of
- true ->
- case filename:pathtype(Dir) of
- absolute ->
- parse_opts(Opts, DefOpts#opts{dir=Dir});
- _ ->
- parse_opts(Opts,
- DefOpts#opts{dir=filename:absname(Dir)})
- end;
- false ->
- erlang:error(badarg, [{dir, Dir}])
- end;
-parse_opts([{file, Name}|Opts], DefOpts) ->
- if
- is_list(Name) ->
- parse_opts(Opts, DefOpts#opts{file=Name});
- true ->
- erlang:error(badarg, [{file, Name}])
- end;
-parse_opts([_|Opts], DefOpts) -> % ignore unknown options
- parse_opts(Opts, DefOpts);
-parse_opts([], DefOpts) ->
- DefOpts.
+parse_opts([{type, Type} = T|Opts], DefOpts) ->
+ lists:member(Type, [open, save, multiselect]) orelse erlang:error(badarg, [T]),
+ parse_opts(Opts, DefOpts#opts{type = Type});
+parse_opts([{extensions, Exts} = E|Opts], DefOpts) ->
+ lists:all(fun is_list/1, Exts) orelse erlang:error(badarg, [E]),
+ parse_opts(Opts, DefOpts#opts{extensions = Exts});
+parse_opts([{dir, Dir} = D|Opts], DefOpts) ->
+ filelib:is_dir(Dir) orelse erlang:error(badarg, [D]),
+ parse_opts(Opts, DefOpts#opts{dir = case filename:pathtype(Dir) of
+ absolute -> Dir;
+ _ -> filename:absname(Dir)
+ end});
+parse_opts([Opt|Opts], DefOpts) ->
+ parse_opts(Opts, case Opt of
+ {file, Name} -> if
+ is_list(Name) -> DefOpts#opts{file = Name};
+ true -> erlang:error(badarg, [Opt])
+ end;
+ _ -> DefOpts % ignore unknown options
+ end);
+parse_opts([], DefOpts) -> DefOpts.
%%--Loop----------------------------------------------------------------
init(From, Opts) ->
make_window(Opts),
- loop(From, {?WIDTH,?HEIGHT}, Opts).
+ loop(From, {?WIDTH, ?HEIGHT}, Opts).
-loop(From, {OldW,OldH}=Size, Opts) ->
+loop(From, {_OldW, _OldH} = Size, #opts{dir = Dir} = Opts) ->
receive
-
%% Window is closed
- {gs, win, destroy, _, _} when Opts#opts.type==multiselect ->
- From ! {close, Opts#opts.dir};
- {gs, win, destroy, _, _} ->
- From ! {fd_result, {error, cancel}};
-
+ {gs, win, destroy, _, _} -> From ! if
+ Opts#opts.type =:= multiselect -> {close, Dir};
+ true -> {fd_result, {error, cancel}}
+ end;
%% Window is moved or resized
- {gs, win, configure, _, [OldW,OldH|_]} ->
- loop(From, Size, Opts);
- {gs, win, configure, _, [W,H|_]} ->
- gs:config(resizer, [{width,W},{height,H}]),
- loop(From, {W,H}, Opts);
-
+ {gs, win, configure, _, [W, H|_]} ->
+ WH = {W, H},
+ WH =:= Size orelse gs:config(resizer, [{width, W}, {height, H}]),
+ loop(From, WH, Opts);
%% Up button is selected
- {gs, up, click, _, _} ->
- Opts2 = set_dir(up, Opts),
- loop(From, Size, Opts2);
-
+ {gs, up, click, _, _} -> loop(From, Size, set_dir(up, Opts));
%% A listbox item (dir or file) is selected
- {gs, lb, click, _, [_I,Item|_]} ->
- Entry = case lists:last(Item) of
- $/ -> "";
- _Ch -> Item
- end,
- gs:config(entry, {text,Entry}),
+ {gs, lb, click, _, [_I, Item|_]} ->
+ gs:config(entry, {text, case lists:last(Item) of
+ $/ -> "";
+ _Ch -> Item
+ end}),
loop(From, Size, Opts);
-
%% A listbox item (dir or file) is double-clicked
- {gs, lb, doubleclick, _, [_I,Item|_]} ->
- case lists:last(Item) of
- $/ -> do_select({dir, Item}, From, Size, Opts);
- _Ch -> do_select({file, Item}, From, Size, Opts)
- end;
-
+ {gs, lb, doubleclick, _, [_I, Item|_]} -> do_select({case lists:last(Item) of
+ $/ -> dir;
+ _Ch -> file
+ end, Item}, From, Size, Opts);
%% Open/Save/Select button is selected
{gs, select, click, _, _} ->
case gs:read(entry, text) of
- "" ->
- case gs:read(lb, selection) of
- [] ->
- gs:config(select, beep),
- loop(From, Size, Opts);
- [I] ->
- Item = gs:read(lb, {get,I}),
- case lists:last(Item) of
- $/ ->
- do_select({dir, Item},
- From, Size, Opts);
- _Ch ->
- do_select({file, Item},
- From, Size, Opts)
- end
- end;
+ "" -> case gs:read(lb, selection) of
+ [] ->
+ gs:config(select, beep),
+ loop(From, Size, Opts);
+ [I] ->
+ Item = gs:read(lb, {get, I}),
+ do_select({case lists:last(Item) of
+ $/ -> dir;
+ _Ch -> file
+ end, Item}, From, Size, Opts)
+ end;
Item -> do_select(Item, From, Size, Opts)
end;
-
%% 'Return' is pressed
- {gs, entry, keypress, _, ['Return'|_]} ->
- case gs:read(entry, text) of
- "" ->
- gs:config(select, beep),
- loop(From, Size, Opts);
- Item ->
- do_select(Item, From, Size, Opts)
- end;
-
+ {gs, entry, keypress, _, ['Return'|_]} -> case gs:read(entry, text) of
+ "" ->
+ gs:config(select, beep),
+ loop(From, Size, Opts);
+ Item -> do_select(Item, From, Size, Opts)
+ end;
%% All button is selected (multiselect dialog)
{gs, all, click, _, _} ->
{_Dirs, Files} = select_all(),
- lists:foreach(fun(File) ->
- AbsFile = filename:join(Opts#opts.dir,
- File),
- From ! {select, AbsFile}
- end,
- Files),
- From ! {close, Opts#opts.dir};
-
+ lists:foreach(fun(File) -> From ! {select, filename:join(Dir, File)} end, Files),
+ From ! {close, Dir};
%% Cancel button is selected (open/save dialog)
- {gs, cancel, click, _, _} ->
- From ! {fd_result, {error, cancel}};
-
+ {gs, cancel, click, _, _} -> From ! {fd_result, {error, cancel}};
%% Close button is selected (multiselect dialog)
- {gs, close, click, _, _} ->
- From ! {close, Opts#opts.dir};
-
+ {gs, close, click, _, _} -> From ! {close, Dir};
Msg ->
- io:format("GOT: ~p~n", [Msg]),
+ io:format(standard_error, "GOT: ~p~n", [Msg]),
loop(From, Size, Opts)
end.
-do_select({dir, Name}, From, Size, Opts) ->
- do_select_dir(filename:join(Opts#opts.dir, Name), From, Size, Opts);
-do_select({file, Name}, From, Size, Opts) ->
- do_select_file(filename:join(Opts#opts.dir, Name), From, Size,Opts);
+do_select({dir, Name}, From, Size, #opts{dir = Dir} = Opts) -> do_select_dir(filename:join(Dir, Name), From, Size, Opts);
+do_select({file, Name}, From, Size, #opts{dir = Dir} = Opts) ->
+ do_select_file(filename:join(Dir, Name), From, Size, Opts);
do_select(Entry, From, Size, Opts) ->
AbsName = case filename:pathtype(Entry) of
absolute -> Entry;
@@ -232,30 +180,20 @@ do_select(Entry, From, Size, Opts) ->
true -> do_select_dir(AbsName, From, Size, Opts);
false -> do_select_file(AbsName, From, Size, Opts)
end.
-
-do_select_dir(Dir, From, Size, Opts) ->
- Opts2 = set_dir(Dir, Opts),
- loop(From, Size, Opts2).
-do_select_file(File, From, Size, Opts) ->
+do_select_dir(Dir, From, Size, Opts) -> loop(From, Size, set_dir(Dir, Opts)).
+
+do_select_file(File, From, Size, #opts{type = Type} = Opts) ->
case filelib:is_file(File) of
- true when Opts#opts.type==multiselect ->
+ true when Type =:= multiselect ->
From ! {select, File},
- Opts2 = update(File, Opts),
- loop(From, Size, Opts2);
- true -> % open | save
- From ! {fd_result, {ok, File, Opts#opts.dir}};
- false when Opts#opts.type==save ->
- case filelib:is_dir(filename:dirname(File)) of
- true ->
- From ! {fd_result, {ok, File, Opts#opts.dir}};
- false ->
- gs:config(select, beep),
- loop(From, Size, Opts)
- end;
- false -> % multiselect | open
- gs:config(select, beep),
- loop(From, Size, Opts)
+ loop(From, Size, update(File, Opts));
+ R -> case R orelse (Type =:= save andalso filelib:is_dir(filename:dirname(File))) of
+ true -> From ! {fd_result, {ok, File, Opts#opts.dir}};
+ _ ->
+ gs:config(select, beep),
+ loop(From, Size, Opts)
+ end
end.
%%--Common GUI functions------------------------------------------------
@@ -263,194 +201,128 @@ do_select_file(File, From, Size, Opts) -
-define(UPW, 35).
-define(UPH, 30).
-define(ENTRYH, 30).
+-define(MARG, {fixed, 5}).
-make_window(Opts) ->
+make_window(#opts{type = Type, dir = Dir} = Opts) ->
GS = gs:start(),
-
- Title = case Opts#opts.type of
- open -> "Open File";
- save -> "Save File";
- multiselect -> "Select Files"
- end,
-
- Font = case gs:read(GS, {choose_font,{screen,[],12}}) of
- Font0 when element(1, Font0)==screen ->
- Font0;
- _ ->
- gs:read(GS, {choose_font,{courier,[],12}})
- end,
-
- gs:window(win, GS, [{title,Title},
- {width,?WIDTH}, {height,?HEIGHT},
- {configure,true}]),
-
- Marg = {fixed,5},
- Parent = gs:frame(resizer, win, [{packer_x,[Marg,{stretch,1},Marg]},
- {packer_y,[Marg,
- {stretch,10},
- {stretch,1,2*?BTNH},
- Marg]}]),
- gs:frame(btnframe, resizer, [{packer_x, [{stretch,1},
- {fixed,?BTNW},
- {stretch,1},
- {fixed,?BTNW},
- {stretch,1},
- {fixed,?BTNW},
- {stretch,1}]},
- {packer_y, [{stretch,1},
- {fixed,?BTNH},
- {stretch,1}]},
- {pack_x,2}, {pack_y,3}]),
-
- gs:frame(frame, Parent, [{packer_x,[{fixed,?UPW},{stretch,1}]},
- {packer_y,[{fixed,?UPH},{fixed,?ENTRYH},
- {stretch,1}]},
- {pack_x,2}, {pack_y,2}]),
-
- Fup = filename:join([code:priv_dir(gs),"bitmap","fup.bm"]),
- gs:button(up, frame, [{label,{image, Fup}},
- {pack_x,1}, {pack_y,1}]),
- gs:label(infodir, frame, [{label,{text," Dir:"}}, {font,Font},
- {pack_x,2}, {pack_y,1}, {align,w}]),
- gs:label(l1, frame, [{label,{text,"File:"}}, {font,Font}, {align,e},
- {pack_x,1}, {pack_y,2}]),
-
- gs:entry(entry, frame, [{font,Font}, {keypress,true},
- {pack_x,2}, {pack_y,2}]),
- gs:listbox(lb, frame, [{font,Font}, {pack_x,{1,2}}, {pack_y,3},
- {selectmode,single},
- {vscroll,right},
- {click,true}, {doubleclick,true}]),
-
- set_dir(Opts#opts.dir, Opts),
-
- case Opts#opts.type of
- multiselect ->
- gs:button(select, btnframe, [{label,{text,"Select"}},
- {font,Font},
- {pack_x,2}, {pack_y,2}]),
- gs:button(all, btnframe, [{label,{text,"All"}}, {font,Font},
- {pack_x,4}, {pack_y,2}]),
- gs:button(close,btnframe,[{label,{text,"Done"}},
- {font,Font},
- {pack_x,6}, {pack_y,2}]);
- Type ->
- Text = case Type of
- open -> "Open";
- save -> "Save"
- end,
- gs:button(select, btnframe, [{label,{text,Text}},
- {font,Font},
- {pack_x,2}, {pack_y,2}]),
- gs:button(cancel, btnframe, [{label,{text,"Cancel"}},
- {font,Font},
- {pack_x,6}, {pack_y,2}])
+ Font = {font, case gs:read(GS, {choose_font, {screen, [], 12}}) of
+ Font0 when element(1, Font0) =:= screen -> Font0;
+ _ -> gs:read(GS, {choose_font, {courier, [], 12}})
+ end},
+ gs:window(win, GS, [{title, if
+ Type =:= open -> "Open File";
+ Type =:= save -> "Save File";
+ Type =:= multiselect -> "Select Files"
+ end},
+ {width, ?WIDTH}, {height, ?HEIGHT},
+ {configure, true}]),
+ gs:frame(btnframe, resizer, [{packer_x, [{stretch, 1},
+ {fixed, ?BTNW},
+ {stretch, 1},
+ {fixed, ?BTNW},
+ {stretch, 1},
+ {fixed, ?BTNW},
+ {stretch, 1}]},
+ {packer_y, [{stretch, 1}, {fixed, ?BTNH}, {stretch, 1}]},
+ {pack_x, 2}, {pack_y, 3}]),
+ gs:frame(frame,
+ gs:frame(resizer, win, [{packer_x, [?MARG, {stretch, 1}, ?MARG]},
+ {packer_y, [?MARG, {stretch, 10}, {stretch, 1, 2 * ?BTNH}, ?MARG]}]),
+ [{packer_x, [{fixed, ?UPW}, {stretch, 1}]}, {packer_y, [{fixed, ?UPH}, {fixed, ?ENTRYH}, {stretch, 1}]},
+ {pack_x, 2}, {pack_y, 2}]),
+ gs:button(up, frame, [{label, {image, filename:join([code:priv_dir(gs), "bitmap", "fup.bm"])}},
+ {pack_x, 1},
+ {pack_y, 1}]),
+ gs:label(infodir, frame, [{label, {text, " Dir:"}}, Font, {pack_x, 2}, {pack_y, 1}, {align, w}]),
+ gs:label(l1, frame, [{label, {text, "File:"}}, Font, {align, e}, {pack_x, 1}, {pack_y, 2}]),
+ gs:entry(entry, frame, [Font, {keypress, true}, {pack_x, 2}, {pack_y, 2}]),
+ gs:listbox(lb, frame, [Font,
+ {pack_x, {1, 2}}, {pack_y, 3},
+ {selectmode, single},
+ {vscroll, right},
+ {click, true}, {doubleclick, true}]),
+ set_dir(Dir, Opts),
+ if
+ Type =:= multiselect -> lists:foldl(fun({T, N}, A) ->
+ gs:button(T, btnframe,
+ [{label, {text, N}}, Font, {pack_x, A}, {pack_y, 2}]),
+ A + 2
+ end, 2, [{select, "Select"}, {all, "All"}, {close, "Done"}]);
+ true ->
+ gs:button(select, btnframe,
+ [{label, {text, if
+ Type =:= open -> "Open";
+ Type =:= save -> "Save"
+ end}},
+ Font,
+ {pack_x, 2}, {pack_y, 2}]),
+ gs:button(cancel, btnframe, [{label, {text, "Cancel"}}, Font, {pack_x, 6}, {pack_y, 2}])
end,
-
- gs:config(resizer, [{width,?WIDTH}, {height,?HEIGHT}]),
- gs:config(win, {map,true}).
+ gs:config(resizer, [{width, ?WIDTH}, {height, ?HEIGHT}]),
+ gs:config(win, {map, true}).
%% update(AbsFile, Opts) -> Opts'
-update(AbsFile, Opts) ->
+update(AbsFile, #opts{hidden = Hidden} = Opts) ->
Dir = filename:dirname(AbsFile),
File = filename:basename(AbsFile),
-
%% Hide the file
- Hidden0 = Opts#opts.hidden,
- Hidden = case lists:keysearch(Dir, 1, Hidden0) of
- {value, {_Dir, Files}} ->
- lists:keyreplace(Dir, 1, Hidden0,
- {Dir, [File|Files]});
- false ->
- [{Dir, [File]} | Hidden0]
- end,
- Opts2 = Opts#opts{hidden=Hidden},
- set_dir(Dir, Opts2).
+ set_dir(Dir, Opts#opts{hidden = case lists:keyfind(Dir, 1, Hidden) of
+ {_Dir, Files} -> lists:keyreplace(Dir, 1, Hidden, {Dir, [File|Files]});
+ false -> [{Dir, [File]}|Hidden]
+ end}).
%% select_all() -> {Dirs, Files}
-select_all() ->
- Is = lists:seq(0, gs:read(lb, size)-1),
- sort_selected(Is, [], []).
+select_all() -> sort_selected(lists:seq(0, gs:read(lb, size) - 1), [], []).
sort_selected([I|Is], Dirs, Files) ->
- FileOrDir = gs:read(lb, {get,I}),
+ FileOrDir = gs:read(lb, {get, I}),
case lists:last(FileOrDir) of
- $/ ->
- sort_selected(Is, [drop_last(FileOrDir)|Dirs], Files);
- _Ch ->
- sort_selected(Is, Dirs, [FileOrDir|Files])
+ $/ -> sort_selected(Is, [lists:droplast(FileOrDir)|Dirs], Files);
+ _Ch -> sort_selected(Is, Dirs, [FileOrDir|Files])
end;
-sort_selected([], Dirs, Files) ->
- {Dirs, Files}.
-
-drop_last(Str) ->
- lists:sublist(Str, length(Str)-1).
+sort_selected([], Dirs, Files) -> {Dirs, Files}.
%% set_dir(Dir0, Opts) -> Opts'
%% Dir0 = up | string() absolute path only
-set_dir(Dir0, Opts) ->
- Dir = if
- Dir0==up -> filename:dirname(Opts#opts.dir);
- true ->Dir0
- end,
-
+set_dir(up, #opts{dir = Dir} = Opts) -> set_dir(filename:dirname(Dir), Opts);
+set_dir(Dir, Opts) ->
case filelib:is_dir(Dir) of
true ->
- gs:config(frame, {cursor,busy}),
+ gs:config(frame, {cursor, busy}),
gs:config(lb, clear),
- Items = get_files(Dir, Opts#opts.hidden,
- Opts#opts.extensions),
- case Opts#opts.type of
- save ->
- gs:config(entry, {text,Opts#opts.file});
- _ ->
- gs:config(entry, {text,""})
- end,
- gs:config(lb, [{items,Items}]),
+ gs:config(entry, {text, if
+ Opts#opts.type =:= save -> Opts#opts.file;
+ true -> ""
+ end}),
+ gs:config(lb, [{items, get_files(Dir, Opts#opts.hidden, Opts#opts.extensions)}]),
gs:config(lb, {selection, clear}),
- gs:config(infodir, {label,{text,["Dir: "|Dir]}}),
- gs:config(frame, {cursor,parent}),
- Opts#opts{dir=Dir};
+ gs:config(infodir, {label, {text, ["Dir: "|Dir]}}),
+ gs:config(frame, {cursor, parent}),
+ Opts#opts{dir = Dir};
false ->
gs:config(select, beep),
Opts
end.
get_files(Dir, Hidden, Exts) ->
- {ok, Items0} = file:list_dir(Dir),
-
- Items = case lists:keysearch(Dir, 1, Hidden) of
- {value, {_Dir, HiddenHere}} ->
- lists:filter(fun(Item0) ->
- not lists:member(Item0,
- HiddenHere)
- end,
- Items0);
- false ->
- Items0
- end,
-
- get_files(Dir, Items, [], [], Exts).
+ {ok, Items} = file:list_dir(Dir),
+ get_files(Dir,
+ case lists:keyfind(Dir, 1, Hidden) of
+ {_Dir, HiddenHere} -> lists:filter(fun(Item) -> not lists:member(Item, HiddenHere) end, Items);
+ false -> Items
+ end,
+ [], [], Exts).
get_files(Dir, [Item0|Items], Dirs, Files, Exts) ->
Item = filename:join(Dir, Item0),
case filelib:is_dir(Item) of
- true ->
- get_files(Dir, Items, [Item0++"/"|Dirs], Files, Exts);
- false ->
- case filelib:is_regular(Item) of
- true when Exts==[] ->
- get_files(Dir, Items, Dirs, [Item0|Files], Exts);
- true ->
- case lists:member(filename:extension(Item), Exts) of
- true ->
- get_files(Dir,Items,Dirs,[Item0|Files],Exts);
- false ->
- get_files(Dir, Items, Dirs, Files, Exts)
- end;
- false ->
- get_files(Dir, Items, Dirs, Files, Exts)
- end
+ true -> get_files(Dir, Items, [Item0 ++ "/"|Dirs], Files, Exts);
+ false -> get_files(Dir, Items, Dirs,
+ case filelib:is_regular(Item) andalso
+ (Exts =:= [] orelse lists:member(filename:extension(Item), Exts)) of
+ true -> [Item0|Files];
+ false -> Files
+ end,
+ Exts)
end;
-get_files(_Dir, [], Dirs, Files, _Exts) ->
- lists:sort(Dirs) ++ lists:sort(Files).
+get_files(_Dir, [], Dirs, Files, _Exts) -> lists:sort(Dirs) ++ lists:sort(Files).
diff -Ndurp otp_src_19.0.5/lib/gs/src/tool_utils.erl otp_src_19.0.5-lib-gs/lib/gs/src/tool_utils.erl
--- otp_src_19.0.5/lib/gs/src/tool_utils.erl 2016-08-16 11:25:33.000000000 +0300
+++ otp_src_19.0.5-lib-gs/lib/gs/src/tool_utils.erl 2016-08-25 16:37:44.567693306 +0300
@@ -20,10 +20,11 @@
%%
-module(tool_utils).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,read,2}}]).
+
+-compile([{nowarn_deprecated_function, {gs, config, 2}},
+ {nowarn_deprecated_function, {gs, create, 3}},
+ {nowarn_deprecated_function, {gs, destroy, 1}},
+ {nowarn_deprecated_function, {gs, read, 2}}]).
-include_lib("kernel/include/file.hrl").
@@ -61,117 +62,63 @@
%% requires that the path Netscape.exe must be in TBD.
%% (TEMPORARY solution..., can be done better)
%%----------------------------------------------------------------------
-open_help(Parent, nofile) ->
- notify(Parent, "Sorry, no help information exists");
+open_help(Parent, nofile) -> notify(Parent, "Sorry, no help information exists");
open_help(Parent, File) ->
case application:get_env(kernel, browser_cmd) of
- undefined ->
- open_help_default(Parent, File);
- {ok, Cmd} when is_list(Cmd) ->
- spawn(os, cmd, [Cmd ++ " " ++ File]);
- {ok, {M, F, A}} ->
- apply(M, F, [File|A]);
- _Other ->
- Str = ["Bad Kernel configuration parameter browser_cmd",
- "Do not know how to display help file"],
- notify(Parent, Str)
+ undefined -> open_help_default(Parent, File);
+ {ok, Cmd} when is_list(Cmd) -> spawn(os, cmd, [Cmd ++ " " ++ File]);
+ {ok, {M, F, A}} -> apply(M, F, [File|A]);
+ _Other -> notify(Parent,
+ ["Bad Kernel configuration parameter browser_cmd", "Do not know how to display help file"])
end.
open_help_default(Parent, File) ->
- Cmd = case file_type(File) of
-
- %% Local file
- local ->
- case os:type() of
- {unix,Type} ->
- case Type of
- darwin -> "open " ++ File;
- _Else -> "netscape -remote \"openURL(file:" ++ File ++ ")\""
- end;
- {win32,_AnyType} ->
- "start " ++ filename:nativename(File);
-
- _Other ->
- unknown
- end;
-
- %% URL
- remote ->
- case os:type() of
- {unix,Type} ->
- case Type of
- darwin -> "open " ++ File;
- _Else -> "netscape -remote \"openURL(file:" ++ File ++ ")\""
+ case os:type() of
+ {win32, _Type} -> case file_type(File) of
+ {error, Reason} -> notify(Parent, [File, file:format_error(Reason)]);
+ T -> spawn(os, cmd,
+ ["start " ++ if
+ T =:= local -> filename:nativename(File);
+ T =:= remote -> re:replace(File, "\\\\", "/",
+ [global, {return, list}])
+ end])
end;
- {win32,_AnyType} ->
- "netscape.exe -h " ++
- re:replace(File,"\\\\","/",[global,{return,list}]);
- _Other ->
- unknown
- end;
-
- Error -> % {error,Reason}
- Error
- end,
-
- if
- is_list(Cmd) ->
- spawn(os, cmd, [Cmd]);
- Cmd==unknown ->
- Str = ["Sorry, do not know how to",
- "display HTML files at this platform"],
- notify(Parent, Str);
- true ->
- {error, Reason} = Cmd,
- Str = file:format_error(Reason),
- notify(Parent, [File,Str])
+ {unix, Type} -> spawn(os, cmd, if
+ Type =:= darwin -> ["open " ++ File];
+ true -> ["xdg-open \"" ++ File ++ "\""]
+ end);
+ _Other -> notify(Parent, ["Sorry, do not know how to", "display HTML files at this platform"])
end.
-%% file_type(File) -> local | remote | {error,Reason}
+%% file_type(File) -> local | remote | {error, Reason}
%% File = string()
%% Reason - see file(3)
%% Returns local if File is an existing, readable file
%% Returns remote if File is a remote URL (ie begins with 'http:')
+file_type("http://" ++ _URL) -> remote;
file_type(File) ->
- case File of
- "http://"++_URL ->
- remote;
- _ ->
- %% HTML files can have a tag (<name>.html#tag), this must be
- %% removed when checking if the file exists
- File2 = case filename:extension(File) of
- ".html#"++_Index ->
- filename:rootname(File)++".html";
- _ ->
- File
- end,
-
- case file:read_file_info(File2) of
- {ok, FileInfo} when FileInfo#file_info.type==regular,
- FileInfo#file_info.access/=none ->
- local;
- {ok, FileInfo} when FileInfo#file_info.type/=regular ->
- {error,einval};
- {ok, FileInfo} when FileInfo#file_info.access==none ->
- {error,eacces};
- Error ->
- Error
- end
+ %% HTML files can have a tag (<name>.html#tag), this must be
+ %% removed when checking if the file exists
+ case file:read_file_info(case filename:extension(File) of
+ ".html#" ++ _Index -> filename:rootname(File) ++ ".html";
+ _ -> File
+ end) of
+ {ok, #file_info{type = regular, access = Access}} when Access =/= none -> local;
+ {ok, #file_info{type = Type}} when Type =/= regular -> {error, einval};
+ {ok, #file_info{access = none}} -> {error, eacces};
+ Error -> Error
end.
-
%%----------------------------------------------------------------------
%% file_dialog(Options) -> tbd
%%----------------------------------------------------------------------
-file_dialog(Options) ->
- tool_file_dialog:start(Options).
-
+file_dialog(Options) -> tool_file_dialog:start(Options).
%%----------------------------------------------------------------------
%% notify(Parent, Strings) -> ok
%% confirm(Parent, Strings) -> ok | cancel
%% confirm_yesno(Parent, Strings) -> yes | no | cancel
-%% request(Parent, Strings) -> {ok,string()} | cancel
+%% request(Parent, Strings) -> {ok, string()} | cancel
%% Parent = gsobj() (GS root object or parent window)
%% Strings = string() | [string()]
%% Opens a window with the specified message (Strings) and locks the GUI
@@ -189,120 +136,92 @@ file_dialog(Options) ->
-define(Hent, 30).
-define(Wbtn, 50).
-define(Hbtn, 30).
--define(PAD, 10).
+-define(PAD, 10).
-notify(Parent, Strings) ->
- help_win(notify, Parent, Strings).
-confirm(Parent, Strings) ->
- help_win(confirm, Parent, Strings).
-confirm_yesno(Parent, Strings) ->
- help_win(confirm_yesno, Parent, Strings).
-request(Parent, Strings) ->
- help_win(request, Parent, Strings).
+notify(Parent, Strings) -> help_win(Parent, Strings, notify).
+confirm(Parent, Strings) -> help_win(Parent, Strings, confirm).
+confirm_yesno(Parent, Strings) -> help_win(Parent, Strings, confirm_yesno).
+request(Parent, Strings) -> help_win(Parent, Strings, request).
-help_win(Type, Parent, Strings) ->
- GenOpts = [{keypress,true}],
- GenOpts2 = [{font,{screen,12}} | GenOpts],
+-define(GenOpts, [{keypress, true}]).
+-define(GenOpts2, [{font, {screen, 12}}|?GenOpts]).
+
+help_win(Parent, Strings, Type) ->
Buttons = buttons(Type),
Nbtn = length(Buttons),
-
%% Create the window and its contents
- Win = gs:create(window, Parent, [{title,title(Type)} | GenOpts]),
- Top = gs:create(frame, Win, GenOpts),
- Lbl = gs:create(label, Top, [{align,c}, {justify,center}|GenOpts2]),
- Mid = if
- Type==request -> gs:create(frame, Win, GenOpts);
- true -> ignore
- end,
- Ent = if
- Type==request ->
- Events = [{setfocus,true},
- {focus,true},{enter,true},{leave,true}],
- gs:create(entry, Mid, GenOpts2++Events);
- true -> ignore
- end,
- Bot = gs:create(frame, Win, GenOpts),
-
+ Win = gs:create(window, Parent, [{title, title(Type)}|?GenOpts]),
+ Top = gs:create(frame, Win, ?GenOpts),
+ Lbl = gs:create(label, Top, [{align, c}, {justify, center}|?GenOpts2]),
+ Bot = gs:create(frame, Win, ?GenOpts),
%% Find out minimum size required for label, entry and buttons
- Font = gs:read(Parent, {choose_font, {screen,12}}),
+ Font = gs:read(Parent, {choose_font, {screen, 12}}),
Text = insert_newlines(Strings),
- {Wlbl0,Hlbl0} = gs:read(Lbl, {font_wh,{Font,Text}}),
- {_Went0,Hent0} = gs:read(Lbl, {font_wh,{Font,"Entry"}}),
- {Wbtn0,Hbtn0} = gs:read(Lbl, {font_wh,{Font,"Cancel"}}),
-
+ [{Wlbl0, Hlbl0}, {_Went0, Hent0}, {Wbtn0, Hbtn0}] = lists:map(fun(E) -> gs:read(Lbl, {font_wh, {Font, E}}) end,
+ [Text, "Entry", "Cancel"]),
%% Compute size of the objects and adjust the graphics accordingly
- Wbtn = erlang:max(Wbtn0+10, ?Wbtn),
- Hbtn = erlang:max(Hbtn0+10, ?Hbtn),
- Hent = erlang:max(Hent0+10, ?Hent),
- Wlbl = erlang:max(Wlbl0, erlang:max(Nbtn*Wbtn+(Nbtn-1)*?PAD, ?Wlbl)),
- Hlbl = erlang:max(Hlbl0, ?Hlbl),
-
- Wwin = ?PAD+Wlbl+?PAD,
-
- Htop = ?PAD+Hlbl,
- Hmid = if Type==request -> ?PAD+Hent; true -> 0 end,
- Hbot = ?PAD+Hbtn+?PAD,
- Hwin = Htop+Hmid+Hbot,
-
- case catch get_coords(Parent, Wwin, Hwin) of
- {Xw, Yw} when is_integer(Xw), is_integer(Yw) ->
- gs:config(Win, [{x,Xw}, {y,Yw}]);
- _ ->
- ignore
+ Wbtn = max(Wbtn0 + 10, ?Wbtn),
+ Hbtn = max(Hbtn0 + 10, ?Hbtn),
+ Hent = max(Hent0 + 10, ?Hent),
+ Wlbl = max(Wlbl0, max(Nbtn * Wbtn + Nbtn * ?PAD - ?PAD, ?Wlbl)),
+ Hlbl = max(Hlbl0, ?Hlbl),
+ Wwin = Wlbl + (?PAD + ?PAD),
+ Htop = Hlbl + ?PAD,
+ {Mid, Ent, Hmid, State} = if
+ Type =:= request ->
+ M = gs:create(frame, Win, ?GenOpts),
+ {M,
+ gs:create(entry, M, ?GenOpts2 ++ [{setfocus, true}, {focus, true},
+ {enter, true}, {leave, true}]),
+ Hent + ?PAD,
+ #state{in_focus = 1, is_cursor = false}};
+ true -> {ignore, ignore, 0, #state{}}
+ end,
+ Hbot = Hbtn + (?PAD + ?PAD),
+ Hwin = Htop + Hmid + Hbot,
+ try get_coords(Parent, Wwin, Hwin) of
+ {Xw, Yw} when is_integer(Xw), is_integer(Yw) -> gs:config(Win, [{x, Xw}, {y, Yw}])
+ catch _:_ -> ignore
end,
-
- gs:config(Win, [ {width,Wwin},{height,Hwin}]),
-
- gs:config(Top, [{x,0}, {y,0}, {width,Wwin},{height,Htop}]),
- gs:config(Lbl, [{x,?PAD},{y,?PAD}, {width,Wlbl},{height,Hlbl}]),
-
- gs:config(Mid, [{x,0}, {y,Htop}, {width,Wwin},{height,Hmid}]),
- gs:config(Ent, [{x,?PAD},{y,?PAD}, {width,Wlbl},{height,Hent}]),
-
- gs:config(Bot, [{x,0}, {y,Htop+Hmid},{width,Wwin},{height,Hbot}]),
-
+ Ww = {width, Wwin},
+ Wl = {width, Wlbl},
+ gs:config(Win, [Ww, {height, Hwin}]),
+ gs:config(Top, [{x, 0}, {y, 0}, Ww, {height, Htop}]),
+ gs:config(Lbl, [{x, ?PAD}, {y, ?PAD}, Wl, {height, Hlbl}]),
+ gs:config(Mid, [{x, 0}, {y, Htop}, Ww, {height, Hmid}]),
+ gs:config(Ent, [{x, ?PAD}, {y, ?PAD}, Wl, {height, Hent}]),
+ gs:config(Bot, [{x, 0}, {y, Htop + Hmid}, Ww, {height, Hbot}]),
%% Insert the label text
- gs:config(Lbl, {label,{text,Text}}),
-
+ gs:config(Lbl, {label, {text, Text}}),
%% Add the buttons
- Xbtns = xbuttons(Buttons, Wbtn, Wwin, Wlbl),
- BtnObjs =
- lists:map(fun({Btext,BX}) ->
- gs:create(button, Bot, [{x,BX-1}, {y,?PAD-1},
- {width,Wbtn+2},
- {height,Hbtn+2},
- {label,{text,Btext}},
- {data,data(Btext)}
- | GenOpts2])
- end,
- Xbtns),
- Highlighted = highlight(undef, 1, BtnObjs),
-
- gs:config(Win, [{map,true}]),
-
- State = if
- Type==request ->
- #state{in_focus=1, is_cursor=false};
- true ->
- #state{}
- end,
- event_loop(State#state{type=Type, win=Win, entry=Ent,
- buttons=BtnObjs, highlighted=Highlighted}).
+ BtnObjs = lists:map(fun({Btext, BX}) ->
+ gs:create(button, Bot, [{x, BX - 1}, {y, ?PAD - 1},
+ {width, Wbtn + 2}, {height, Hbtn + 2},
+ {label, {text, Btext}},
+ {data, data(Btext)}
+ |?GenOpts2])
+ end, xbuttons(Buttons, Wbtn, Wwin, Wlbl)),
+ gs:config(Win, [{map, true}]),
+ event_loop(State#state{type = Type,
+ win = Win,
+ entry = Ent,
+ buttons = BtnObjs,
+ highlighted = highlight(undef, 1, BtnObjs)}).
-title(notify) -> "Notification";
-title(confirm) -> "Confirmation";
+title(notify) -> "Notification";
+title(confirm) -> "Confirmation";
title(confirm_yesno) -> "Confirmation";
-title(request) -> "Request".
+title(request) -> "Request".
-buttons(notify) -> ["Ok"];
-buttons(confirm) -> ["Ok", "Cancel"];
+buttons(notify) -> ["Ok"];
+buttons(confirm) -> ["Ok", "Cancel"];
buttons(confirm_yesno) -> ["Yes", "No", "Cancel"];
-buttons(request) -> ["Ok", "Cancel"].
+buttons(request) -> ["Ok", "Cancel"].
-data("Ok") -> {helpwin,ok};
-data("Yes") -> {helpwin,yes};
-data("No") -> {helpwin,no};
-data("Cancel") -> {helpwin,cancel}.
+data("Ok") -> {helpwin, ok};
+data("Yes") -> {helpwin, yes};
+data("No") -> {helpwin, no};
+data("Cancel") -> {helpwin, cancel}.
get_coords(Parent, W, H) ->
case gs:read(Parent, x) of
@@ -312,9 +231,7 @@ get_coords(Parent, W, H) ->
case gs:read(Parent, width) of
W0 when is_integer(W0) ->
case gs:read(Parent, height) of
- H0 when is_integer(H0) ->
- {round((X+W0/2)-W/2),
- round((Y+H0/2)-H/2)};
+ H0 when is_integer(H0) -> {round((X + W0 / 2) - W / 2), round((Y + H0 / 2) - H / 2)};
_ -> error
end;
_ -> error
@@ -324,115 +241,87 @@ get_coords(Parent, W, H) ->
_ -> error
end.
-xbuttons([B], Wbtn, Wwin, _Wlbl) ->
- [{B, round(Wwin/2-Wbtn/2)}];
-xbuttons([B1,B2], Wbtn, Wwin, Wlbl) ->
- Margin = (Wwin-Wlbl)/2,
- [{B1,round(Margin)}, {B2,round(Wwin-Margin-Wbtn)}];
-xbuttons([B1,B2,B3], Wbtn, Wwin, Wlbl) ->
- Margin = (Wwin-Wlbl)/2,
- [{B1,round(Margin)},
- {B2,round(Wwin/2-Wbtn/2)},
- {B3,round(Wwin-Margin-Wbtn)}].
+xbuttons([B], Wbtn, Wwin, _Wlbl) -> [xbutton(B, Wbtn, Wwin)];
+xbuttons([B1, B2], Wbtn, Wwin, Wlbl) ->
+ Margin = margin(Wwin, Wlbl),
+ [xbutton(B1, Margin), xbutton(B2, Wbtn, Wwin, Margin)];
+xbuttons([B1, B2, B3], Wbtn, Wwin, Wlbl) ->
+ Margin = margin(Wwin, Wlbl),
+ [xbutton(B1, Margin), xbutton(B2, Wbtn, Wwin), xbutton(B3, Wbtn, Wwin, Margin)].
-highlight(Prev, New, BtnObjs) when New>0, New=<length(BtnObjs) ->
- if
- Prev==undef -> ignore;
- true ->
- gs:config(lists:nth(Prev, BtnObjs), [{highlightbw,0}])
- end,
- gs:config(lists:nth(New, BtnObjs), [{highlightbw,1},
- {highlightbg,black}]),
+xbutton(B, Margin) -> {B, round(Margin)}.
+
+xbutton(B, Wbtn, Wwin) -> {B, round(Wwin / 2 - Wbtn / 2)}.
+
+xbutton(B, Wbtn, Wwin, Margin) -> {B, round(Wwin - Margin - Wbtn)}.
+
+margin(Wwin, Wlbl) -> (Wwin - Wlbl) / 2.
+
+highlight(Prev, New, BtnObjs) when New > 0, New =< length(BtnObjs) ->
+ Prev =:= undef orelse gs:config(lists:nth(Prev, BtnObjs), [{highlightbw, 0}]),
+ gs:config(lists:nth(New, BtnObjs), [{highlightbw, 1}, {highlightbg, black}]),
New;
-highlight(Prev, _New, _BtnObjs) -> % New is outside allowed range
- Prev.
+highlight(Prev, _New, _BtnObjs) -> Prev. % New is outside allowed range
event_loop(State) ->
receive
- GsEvent when element(1, GsEvent)==gs ->
- case handle_event(GsEvent, State) of
- {continue, NewState} ->
- event_loop(NewState);
-
- {return, Result} ->
- gs:destroy(State#state.win),
- Result
- end
+ GsEvent when element(1, GsEvent) =:= gs -> case handle_event(GsEvent, State) of
+ {continue, NewState} -> event_loop(NewState);
+ {return, Result} ->
+ gs:destroy(State#state.win),
+ Result
+ end
end.
-handle_event({gs,_,click,{helpwin,Result},_}, State) ->
- if
- State#state.type/=request; Result==cancel ->
- {return, Result};
-
- State#state.type==request, Result==ok ->
- case gs:read(State#state.entry, text) of
- "" ->
- {continue, State};
- Info ->
- {return, {ok, Info}}
- end
+handle_event({gs, _, click, {helpwin, ok}, _}, #state{entry = Ent, type = request} = State) ->
+ case gs:read(Ent, text) of
+ "" -> {continue, State};
+ Info -> {return, {ok, Info}}
end;
+handle_event({gs, _, click, {helpwin, cansel}, _}, _State) -> {return, cancel};
%% When the entry (Type==request) is in focus and the mouse pointer is
%% over it, don't let 'Left'|'Right' keypresses affect which button is
%% selected
-handle_event({gs,Ent,enter,_,_}, #state{entry=Ent}=State) ->
- {continue, State#state{is_cursor=true}};
-handle_event({gs,Ent,leave,_,_}, #state{entry=Ent}=State) ->
- {continue, State#state{is_cursor=false}};
-handle_event({gs,Ent,focus,_,[Int|_]}, #state{entry=Ent}=State) ->
- {continue, State#state{in_focus=Int}};
+handle_event({gs, Ent, enter, _, _}, #state{entry = Ent} = State) -> {continue, State#state{is_cursor = true}};
+handle_event({gs, Ent, leave, _, _}, #state{entry = Ent} = State) -> {continue, State#state{is_cursor = false}};
+handle_event({gs, Ent, focus, _, [Int|_]}, #state{entry = Ent} =State) -> {continue, State#state{in_focus = Int}};
-handle_event({gs,Win,keypress,_,['Right'|_]}, #state{win=Win}=State) ->
- if
- State#state.type==request,
- State#state.in_focus==1, State#state.is_cursor==true ->
- {continue, State};
- true ->
- Prev = State#state.highlighted,
- New = highlight(Prev, Prev+1, State#state.buttons),
- {continue, State#state{highlighted=New}}
- end;
-handle_event({gs,Win,keypress,_,['Left'|_]}, #state{win=Win}=State) ->
- if
- State#state.type==request,
- State#state.in_focus==1, State#state.is_cursor==true ->
- {continue, State};
- true ->
- Prev = State#state.highlighted,
- New = highlight(Prev, Prev-1, State#state.buttons),
- {continue, State#state{highlighted=New}}
- end;
+handle_event({gs, Win, keypress, _, [Key|_]}, #state{win = Win} = State) when Key =:= 'Right'; Key =:= 'Left' ->
+ {continue,
+ case State of
+ #state{type = request, in_focus = 1, is_cursor = true} -> State;
+ #state{highlighted = Prev, buttons = Buttons} ->
+ State#state{highlighted = highlight(Prev,
+ Prev + if
+ Key =:= 'Right' -> +1;
+ true -> -1
+ end,
+ Buttons)}
+ end};
-handle_event({gs,Ent,keypress,_,['Tab'|_]}, #state{entry=Ent}=State) ->
- gs:config(hd(State#state.buttons), {setfocus,true}),
- gs:config(Ent, {select,clear}),
- {continue, State#state{in_focus=0}};
+handle_event({gs, Ent, keypress, _, ['Tab'|_]}, #state{entry = Ent, buttons = [Button|_]} = State) ->
+ gs:config(Button, {setfocus, true}),
+ gs:config(Ent, {select, clear}),
+ {continue, State#state{in_focus = 0}};
-handle_event({gs,Win,keypress,_,['Return'|_]}, #state{win=Win}=State) ->
- Selected = lists:nth(State#state.highlighted, State#state.buttons),
- Data = gs:read(Selected, data),
- handle_event({gs,Win,click,Data,undef}, State);
+handle_event({gs, Win, keypress, _, ['Return'|_]},
+ #state{win = Win, highlighted = Highlighted, buttons = Buttons} = State) ->
+ handle_event({gs, Win, click, gs:read(lists:nth(Highlighted, Buttons), data), undef}, State);
-handle_event({gs,Win,destroy,_,_}, #state{win=Win}=State) ->
- if
- State#state.type==notify -> {return, ok};
- true -> {return, cancel}
- end;
+handle_event({gs, Win, destroy, _, _}, #state{win = Win, type = Type}) ->
+ {return, if
+ Type =:= notify -> ok;
+ true -> cancel
+ end};
%% Flush any other GS events
-handle_event({gs,_Obj,_Event,_Data,_Arg}, State) ->
- {continue, State}.
+handle_event({gs, _Obj, _Event, _Data, _Arg}, State) -> {continue, State}.
%% insert_newlines(Strings) => string()
%% Strings - string() | [string()]
%% If Strings is a list of strings, return a string where all these
-%% strings are concatenated with newlines in between,otherwise return
+%% strings are concatenated with newlines in between, otherwise return
%% Strings.
-insert_newlines([String|Rest]) when is_list(String),Rest/=[]->
- String ++ "\n" ++ insert_newlines(Rest);
-insert_newlines([Last]) ->
- [Last];
-insert_newlines(Other) ->
- Other.
+insert_newlines([String|Rest]) when is_list(String), Rest =/= [] -> String ++ "\n" ++ insert_newlines(Rest);
+insert_newlines(Other) -> Other.