File 0414-Add-OBSERVER_SCALE-environment-variable-for-HiDPI-su.patch of Package erlang

From 77e83d0757d56d15f4b1bc70044b89d3eaf48b2b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= <essen@ninenines.eu>
Date: Wed, 23 Jan 2019 16:51:44 +0100
Subject: [PATCH] Add OBSERVER_SCALE environment variable for HiDPI support

---
 lib/observer/src/cdv_detail_wx.erl            |  3 ++-
 lib/observer/src/cdv_table_wx.erl             |  3 ++-
 lib/observer/src/cdv_virtual_list_wx.erl      |  3 ++-
 lib/observer/src/cdv_wx.erl                   |  3 ++-
 lib/observer/src/observer_alloc_wx.erl        |  3 ++-
 lib/observer/src/observer_app_wx.erl          | 11 +++++++----
 lib/observer/src/observer_perf_wx.erl         | 15 ++++++++-------
 lib/observer/src/observer_port_wx.erl         | 14 ++++++++------
 lib/observer/src/observer_pro_wx.erl          | 15 ++++++++-------
 lib/observer/src/observer_procinfo.erl        |  8 +++++---
 lib/observer/src/observer_trace_wx.erl        | 17 ++++++++++-------
 lib/observer/src/observer_traceoptions_wx.erl |  9 ++++++---
 lib/observer/src/observer_tv_table.erl        |  3 ++-
 lib/observer/src/observer_tv_wx.erl           | 13 +++++++------
 lib/observer/src/observer_wx.erl              | 14 ++++++++++++--
 15 files changed, 83 insertions(+), 51 deletions(-)

diff --git a/lib/observer/src/cdv_detail_wx.erl b/lib/observer/src/cdv_detail_wx.erl
index 4b1984c394..5e1137511a 100644
--- a/lib/observer/src/cdv_detail_wx.erl
+++ b/lib/observer/src/cdv_detail_wx.erl
@@ -84,8 +84,9 @@ destroy_progress(_) ->
     ok.
 
 init(Id,ParentFrame,Callback,App,Parent,{Title,Info,TW}) ->
+    Scale = observer_wx:get_scale(),
     Frame=wxFrame:new(ParentFrame, ?wxID_ANY, [Title],
-		      [{style, ?wxDEFAULT_FRAME_STYLE}, {size, {850,600}}]),
+		      [{style, ?wxDEFAULT_FRAME_STYLE}, {size, {Scale*850,Scale*600}}]),
     MenuBar = wxMenuBar:new(),
     create_menus(MenuBar),
     wxFrame:setMenuBar(Frame, MenuBar),
diff --git a/lib/observer/src/cdv_table_wx.erl b/lib/observer/src/cdv_table_wx.erl
index 0f28a51017..0cad272262 100644
--- a/lib/observer/src/cdv_table_wx.erl
+++ b/lib/observer/src/cdv_table_wx.erl
@@ -50,11 +50,12 @@ init([ParentWin, {ColumnSpec,Info,TW}]) ->
 	end,
     Grid = wxListCtrl:new(ParentWin, [{style, Style}]),
     Li = wxListItem:new(),
+    Scale = observer_wx:get_scale(),
     AddListEntry = fun({Name, Align, DefSize}, Col) ->
 			   wxListItem:setText(Li, Name),
 			   wxListItem:setAlign(Li, Align),
 			   wxListCtrl:insertColumn(Grid, Col, Li),
-			   wxListCtrl:setColumnWidth(Grid, Col, DefSize),
+			   wxListCtrl:setColumnWidth(Grid, Col, DefSize*Scale),
 			   Col + 1
 		   end,
     lists:foldl(AddListEntry, 0, ColumnSpec),
diff --git a/lib/observer/src/cdv_virtual_list_wx.erl b/lib/observer/src/cdv_virtual_list_wx.erl
index 2702301021..14877b7eab 100644
--- a/lib/observer/src/cdv_virtual_list_wx.erl
+++ b/lib/observer/src/cdv_virtual_list_wx.erl
@@ -132,11 +132,12 @@ create_list_box(Panel, Holder, Callback, Owner) ->
 				       end}
 				     ]),
     Li = wxListItem:new(),
+    Scale = observer_wx:get_scale(),
     AddListEntry = fun({Name, Align, DefSize}, Col) ->
 			   wxListItem:setText(Li, Name),
 			   wxListItem:setAlign(Li, Align),
 			   wxListCtrl:insertColumn(ListCtrl, Col, Li),
-			   wxListCtrl:setColumnWidth(ListCtrl, Col, DefSize),
+			   wxListCtrl:setColumnWidth(ListCtrl, Col, DefSize*Scale),
 			   Col + 1
 		   end,
     ListItems = Callback:col_spec(),
diff --git a/lib/observer/src/cdv_wx.erl b/lib/observer/src/cdv_wx.erl
index 1e9cef8952..811c767e66 100644
--- a/lib/observer/src/cdv_wx.erl
+++ b/lib/observer/src/cdv_wx.erl
@@ -101,8 +101,9 @@ init(File0) ->
     {ok,CdvServer} = crashdump_viewer:start_link(),
 
     catch wxSystemOptions:setOption("mac.listctrl.always_use_generic", 1),
+    Scale = observer_wx:get_scale(),
     Frame = wxFrame:new(wx:null(), ?wxID_ANY, "Crashdump Viewer",
-			[{size, {850, 600}}, {style, ?wxDEFAULT_FRAME_STYLE}]),
+			[{size, {Scale*850, Scale*600}}, {style, ?wxDEFAULT_FRAME_STYLE}]),
     IconFile = filename:join(code:priv_dir(observer), "erlang_observer.png"),
     Icon = wxIcon:new(IconFile, [{type,?wxBITMAP_TYPE_PNG}]),
     wxFrame:setIcon(Frame, Icon),
diff --git a/lib/observer/src/observer_alloc_wx.erl b/lib/observer/src/observer_alloc_wx.erl
index 54e246f247..da47a30fb1 100644
--- a/lib/observer/src/observer_alloc_wx.erl
+++ b/lib/observer/src/observer_alloc_wx.erl
@@ -282,11 +282,12 @@ create_mem_info(Parent) ->
     Grid = wxListCtrl:new(Parent, [{style, Style}]),
 
     Li = wxListItem:new(),
+    Scale = observer_wx:get_scale(),
     AddListEntry = fun({Name, Align, DefSize}, Col) ->
 			   wxListItem:setText(Li, Name),
 			   wxListItem:setAlign(Li, Align),
 			   wxListCtrl:insertColumn(Grid, Col, Li),
-			   wxListCtrl:setColumnWidth(Grid, Col, DefSize),
+			   wxListCtrl:setColumnWidth(Grid, Col, DefSize*Scale),
 			   Col + 1
 		   end,
     ListItems = [{"Allocator Type",  ?wxLIST_FORMAT_LEFT,  200},
diff --git a/lib/observer/src/observer_app_wx.erl b/lib/observer/src/observer_app_wx.erl
index 2a481966da..8c3eef5411 100644
--- a/lib/observer/src/observer_app_wx.erl
+++ b/lib/observer/src/observer_app_wx.erl
@@ -117,16 +117,19 @@ init([Notebook, Parent, _Config]) ->
 
     UseGC = haveGC(),
     Version28 = ?wxMAJOR_VERSION =:= 2 andalso ?wxMINOR_VERSION =:= 8,
+    Scale = observer_wx:get_scale(),
     Font = case os:type() of
 	       {unix,_} when UseGC, Version28 ->
-		   wxFont:new(12,?wxFONTFAMILY_DECORATIVE,?wxFONTSTYLE_NORMAL,?wxFONTWEIGHT_NORMAL);
+		   wxFont:new(Scale * 12,?wxFONTFAMILY_DECORATIVE,?wxFONTSTYLE_NORMAL,?wxFONTWEIGHT_NORMAL);
 	       _ ->
-		   wxSystemSettings:getFont(?wxSYS_DEFAULT_GUI_FONT)
+		   Font0 = wxSystemSettings:getFont(?wxSYS_DEFAULT_GUI_FONT),
+           wxFont:setPointSize(Font0, Scale * wxFont:getPointSize(Font0)),
+           Font0
 	   end,
     SelCol   = wxSystemSettings:getColour(?wxSYS_COLOUR_HIGHLIGHT),
     GreyBrush = wxBrush:new({230,230,240}),
     SelBrush = wxBrush:new(SelCol),
-    LinkPen  = wxPen:new(SelCol, [{width, 2}]),
+    LinkPen  = wxPen:new(SelCol, [{width, Scale * 2}]),
     process_flag(trap_exit, true),
     {Panel, #state{parent=Parent,
 		   panel =Panel,
@@ -134,7 +137,7 @@ init([Notebook, Parent, _Config]) ->
 		   app_w =DrawingArea,
 		   usegc = UseGC,
 		   paint=#paint{font = Font,
-				pen  = wxPen:new({80,80,80}, [{width, 2}]),
+				pen  = wxPen:new({80,80,80}, [{width, Scale * 2}]),
 				brush= GreyBrush,
 				sel  = SelBrush,
 				links= LinkPen
diff --git a/lib/observer/src/observer_perf_wx.erl b/lib/observer/src/observer_perf_wx.erl
index 21c6d26f49..79271addf2 100644
--- a/lib/observer/src/observer_perf_wx.erl
+++ b/lib/observer/src/observer_perf_wx.erl
@@ -110,25 +110,26 @@ setup_graph_drawing(Panels) ->
     _ = [Do(Panel) || Panel <- Panels],
     UseGC = haveGC(),
     Version28 = ?wxMAJOR_VERSION =:= 2 andalso ?wxMINOR_VERSION =:= 8,
+    Scale = observer_wx:get_scale(),
     {Font, SmallFont}
 	= if UseGC, Version28 ->
 		  %% Def font is really small when using Graphics contexts in 2.8
 		  %% Hardcode it
-		  F = wxFont:new(12,?wxFONTFAMILY_DECORATIVE,?wxFONTSTYLE_NORMAL,?wxFONTWEIGHT_BOLD),
-		  SF = wxFont:new(10, ?wxFONTFAMILY_DECORATIVE, ?wxFONTSTYLE_NORMAL, ?wxFONTWEIGHT_NORMAL),
+		  F = wxFont:new(Scale * 12,?wxFONTFAMILY_DECORATIVE,?wxFONTSTYLE_NORMAL,?wxFONTWEIGHT_BOLD),
+		  SF = wxFont:new(Scale * 10, ?wxFONTFAMILY_DECORATIVE, ?wxFONTSTYLE_NORMAL, ?wxFONTWEIGHT_NORMAL),
 		  {F, SF};
 	     true ->
 		  DefFont = wxSystemSettings:getFont(?wxSYS_DEFAULT_GUI_FONT),
 		  DefSize = wxFont:getPointSize(DefFont),
 		  DefFamily = wxFont:getFamily(DefFont),
-		  F = wxFont:new(DefSize-1, DefFamily, ?wxFONTSTYLE_NORMAL, ?wxFONTWEIGHT_BOLD),
-		  SF = wxFont:new(DefSize-2, DefFamily, ?wxFONTSTYLE_NORMAL, ?wxFONTWEIGHT_NORMAL),
+		  F = wxFont:new(Scale * (DefSize-1), DefFamily, ?wxFONTSTYLE_NORMAL, ?wxFONTWEIGHT_BOLD),
+		  SF = wxFont:new(Scale * (DefSize-2), DefFamily, ?wxFONTSTYLE_NORMAL, ?wxFONTWEIGHT_NORMAL),
 		  {F, SF}
 	  end,
-    BlackPen = wxPen:new({0,0,0}, [{width, 1}]),
-    Pens = [wxPen:new(Col, [{width, 1}, {style, ?wxSOLID}])
+    BlackPen = wxPen:new({0,0,0}, [{width, Scale}]),
+    Pens = [wxPen:new(Col, [{width, Scale}, {style, ?wxSOLID}])
             || Col <- tuple_to_list(colors())],
-    DotPens = [wxPen:new(Col, [{width, 1}, {style, ?wxDOT}])
+    DotPens = [wxPen:new(Col, [{width, Scale}, {style, ?wxDOT}])
                || Col <- tuple_to_list(colors())],
     #paint{usegc = UseGC,
 	   font  = Font,
diff --git a/lib/observer/src/observer_port_wx.erl b/lib/observer/src/observer_port_wx.erl
index 445f3dd6b1..00cf1b5fba 100644
--- a/lib/observer/src/observer_port_wx.erl
+++ b/lib/observer/src/observer_port_wx.erl
@@ -96,11 +96,12 @@ init([Notebook, Parent, Config]) ->
 			   wxListCtrl:setColumnWidth(Grid, Col, DefSize),
 			   Col + 1
 		   end,
-    ListItems = [{"Id", ?wxLIST_FORMAT_LEFT,  150},
-		 {"Connected", ?wxLIST_FORMAT_LEFT, 150},
-		 {"Name", ?wxLIST_FORMAT_LEFT, 150},
-		 {"Controls", ?wxLIST_FORMAT_LEFT, 200},
-		 {"Slot", ?wxLIST_FORMAT_RIGHT, 50}],
+    Scale = observer_wx:get_scale(),
+    ListItems = [{"Id", ?wxLIST_FORMAT_LEFT,  Scale*150},
+		 {"Connected", ?wxLIST_FORMAT_LEFT, Scale*150},
+		 {"Name", ?wxLIST_FORMAT_LEFT, Scale*150},
+		 {"Controls", ?wxLIST_FORMAT_LEFT, Scale*200},
+		 {"Slot", ?wxLIST_FORMAT_RIGHT, Scale*50}],
     lists:foldl(AddListEntry, 0, ListItems),
     wxListItem:destroy(Li),
 
@@ -461,10 +462,11 @@ display_port_info(Parent, PortRec, Opened) ->
 do_display_port_info(Parent0, PortRec) ->
     Parent = observer_lib:get_wx_parent(Parent0),
     Title = "Port Info: " ++ PortRec#port.id_str,
+    Scale = observer_wx:get_scale(),
     Frame = wxMiniFrame:new(Parent, ?wxID_ANY, Title,
 			    [{style, ?wxSYSTEM_MENU bor ?wxCAPTION
 				  bor ?wxCLOSE_BOX bor ?wxRESIZE_BORDER},
-                             {size,{600,400}}]),
+                             {size,{Scale * 600, Scale * 400}}]),
     ScrolledWin = wxScrolledWindow:new(Frame,[{style,?wxHSCROLL bor ?wxVSCROLL}]),
     wxScrolledWindow:enableScrolling(ScrolledWin,true,true),
     wxScrolledWindow:setScrollbars(ScrolledWin,20,20,0,0),
diff --git a/lib/observer/src/observer_pro_wx.erl b/lib/observer/src/observer_pro_wx.erl
index 04e654a37e..4ab4a78462 100644
--- a/lib/observer/src/observer_pro_wx.erl
+++ b/lib/observer/src/observer_pro_wx.erl
@@ -163,13 +163,14 @@ create_list_box(Panel, Holder) ->
 			   wxListCtrl:setColumnWidth(ListCtrl, Col, DefSize),
 			   Col + 1
 		   end,
-    ListItems = [{"Pid", ?wxLIST_FORMAT_CENTRE,  120},
-		 {"Name or Initial Func", ?wxLIST_FORMAT_LEFT, 200},
-%%		 {"Time", ?wxLIST_FORMAT_CENTRE, 50},
-		 {"Reds", ?wxLIST_FORMAT_RIGHT, 100},
-		 {"Memory", ?wxLIST_FORMAT_RIGHT, 100},
-		 {"MsgQ",  ?wxLIST_FORMAT_RIGHT, 50},
-		 {"Current Function", ?wxLIST_FORMAT_LEFT,  200}],
+    Scale = observer_wx:get_scale(),
+    ListItems = [{"Pid", ?wxLIST_FORMAT_CENTRE,  Scale*120},
+		 {"Name or Initial Func", ?wxLIST_FORMAT_LEFT, Scale*200},
+%%		 {"Time", ?wxLIST_FORMAT_CENTRE, Scale*50},
+		 {"Reds", ?wxLIST_FORMAT_RIGHT, Scale*100},
+		 {"Memory", ?wxLIST_FORMAT_RIGHT, Scale*100},
+		 {"MsgQ",  ?wxLIST_FORMAT_RIGHT, Scale*50},
+		 {"Current Function", ?wxLIST_FORMAT_LEFT,  Scale*200}],
     lists:foldl(AddListEntry, 0, ListItems),
     wxListItem:destroy(Li),
 
diff --git a/lib/observer/src/observer_procinfo.erl b/lib/observer/src/observer_procinfo.erl
index f436886735..bd5fed0951 100644
--- a/lib/observer/src/observer_procinfo.erl
+++ b/lib/observer/src/observer_procinfo.erl
@@ -59,8 +59,9 @@ init([Pid, ParentFrame, Parent]) ->
 		  {registered_name, Registered} -> io_lib:format("~tp (~p)",[Registered, Pid]);
 		  undefined -> throw(process_undefined)
 	      end,
+    Scale = observer_wx:get_scale(),
 	Frame=wxFrame:new(ParentFrame, ?wxID_ANY, [atom_to_list(node(Pid)), $:, Title],
-			  [{style, ?wxDEFAULT_FRAME_STYLE}, {size, {850,600}}]),
+			  [{style, ?wxDEFAULT_FRAME_STYLE}, {size, {Scale * 850, Scale * 600}}]),
 	MenuBar = wxMenuBar:new(),
 	create_menus(MenuBar),
 	wxFrame:setMenuBar(Frame, MenuBar),
@@ -245,12 +246,13 @@ init_dict_page(Parent, Pid, Table) ->
 init_stack_page(Parent, Pid) ->
     LCtrl = wxListCtrl:new(Parent, [{style, ?wxLC_REPORT bor ?wxLC_HRULES}]),
     Li = wxListItem:new(),
+    Scale = observer_wx:get_scale(),
     wxListItem:setText(Li, "Module:Function/Arg"),
     wxListCtrl:insertColumn(LCtrl, 0, Li),
-    wxListCtrl:setColumnWidth(LCtrl, 0, 300),
+    wxListCtrl:setColumnWidth(LCtrl, 0, Scale * 300),
     wxListItem:setText(Li, "File:LineNumber"),
     wxListCtrl:insertColumn(LCtrl, 1, Li),
-    wxListCtrl:setColumnWidth(LCtrl, 1, 300),
+    wxListCtrl:setColumnWidth(LCtrl, 1, Scale * 300),
     wxListItem:destroy(Li),
     Update = fun() ->
 		     case observer_wx:try_rpc(node(Pid), erlang, process_info,
diff --git a/lib/observer/src/observer_trace_wx.erl b/lib/observer/src/observer_trace_wx.erl
index 2c3b46a3a1..f458c8c34a 100644
--- a/lib/observer/src/observer_trace_wx.erl
+++ b/lib/observer/src/observer_trace_wx.erl
@@ -188,8 +188,9 @@ create_proc_port_view(Parent) ->
 			   wxListCtrl:setColumnWidth(Procs, Col, DefSize),
 			   Col + 1
 		   end,
-    ProcListItems = [{"Process Id",    ?wxLIST_FORMAT_CENTER,  120},
-		     {"Trace Options", ?wxLIST_FORMAT_LEFT, 300}],
+    Scale = observer_wx:get_scale(),
+    ProcListItems = [{"Process Id",    ?wxLIST_FORMAT_CENTER,  Scale*120},
+		     {"Trace Options", ?wxLIST_FORMAT_LEFT, Scale*300}],
     lists:foldl(AddProc, 0, ProcListItems),
 
     AddPort = fun({Name, Align, DefSize}, Col) ->
@@ -199,8 +200,8 @@ create_proc_port_view(Parent) ->
 			   wxListCtrl:setColumnWidth(Ports, Col, DefSize),
 			   Col + 1
 		   end,
-    PortListItems = [{"Port Id",    ?wxLIST_FORMAT_CENTER,  120},
-		     {"Trace Options", ?wxLIST_FORMAT_LEFT, 300}],
+    PortListItems = [{"Port Id",    ?wxLIST_FORMAT_CENTER,  Scale*120},
+		     {"Trace Options", ?wxLIST_FORMAT_LEFT, Scale*300}],
     lists:foldl(AddPort, 0, PortListItems),
 
     wxListItem:destroy(Li),
@@ -242,14 +243,15 @@ create_matchspec_view(Parent) ->
     Funcs   = wxListCtrl:new(Splitter, [{winid, ?FUNCS_WIN}, {style, Style}]),
     Li = wxListItem:new(),
 
+    Scale = observer_wx:get_scale(),
     wxListItem:setText(Li, "Modules"),
     wxListCtrl:insertColumn(Modules, 0, Li),
     wxListItem:setText(Li, "Functions"),
     wxListCtrl:insertColumn(Funcs, 0, Li),
-    wxListCtrl:setColumnWidth(Funcs, 0, 150),
+    wxListCtrl:setColumnWidth(Funcs, 0, Scale*150),
     wxListItem:setText(Li, "Match Spec"),
     wxListCtrl:insertColumn(Funcs, 1, Li),
-    wxListCtrl:setColumnWidth(Funcs, 1, 300),
+    wxListCtrl:setColumnWidth(Funcs, 1, Scale*300),
     wxListItem:destroy(Li),
 
     wxSplitterWindow:setSashGravity(Splitter, 0.0),
@@ -969,7 +971,8 @@ output_file(true, true, Opts) ->
 
 create_logwindow(_Parent, false) -> {false, false};
 create_logwindow(Parent, true) ->
-    LogWin = wxFrame:new(Parent, ?LOG_WIN, "Trace Log", [{size, {750, 800}}]),
+    Scale = observer_wx:get_scale(),
+    LogWin = wxFrame:new(Parent, ?LOG_WIN, "Trace Log", [{size, {750*Scale, 800*Scale}}]),
     MB = wxMenuBar:new(),
     File = wxMenu:new(),
     wxMenu:append(File, ?LOG_CLEAR, "Clear Log\tCtrl-C"),
diff --git a/lib/observer/src/observer_traceoptions_wx.erl b/lib/observer/src/observer_traceoptions_wx.erl
index ea292b92af..514d55ff24 100644
--- a/lib/observer/src/observer_traceoptions_wx.erl
+++ b/lib/observer/src/observer_traceoptions_wx.erl
@@ -167,9 +167,10 @@ select_nodes(Parent, Nodes) ->
     check_selector(Parent, Choices).
 
 module_selector(Parent, Node) ->
+    Scale = observer_wx:get_scale(),
     Dialog = wxDialog:new(Parent, ?wxID_ANY, "Select Module or Event",
 			  [{style, ?wxDEFAULT_DIALOG_STYLE bor ?wxRESIZE_BORDER},
-			   {size, {400, 400}}]),
+			   {size, {400*Scale, 400*Scale}}]),
     Panel = wxPanel:new(Dialog),
     PanelSz = wxBoxSizer:new(?wxVERTICAL),
     MainSz  = wxBoxSizer:new(?wxVERTICAL),
@@ -237,9 +238,10 @@ function_selector(Parent, Node, Module) ->
     end.
 
 check_selector(Parent, ParsedChoices) ->
+    Scale = observer_wx:get_scale(),
     Dialog = wxDialog:new(Parent, ?wxID_ANY, "Trace Functions",
 			  [{style, ?wxDEFAULT_DIALOG_STYLE bor ?wxRESIZE_BORDER},
-			   {size, {400, 400}}]),
+			   {size, {400*Scale, 400*Scale}}]),
 
     Panel = wxPanel:new(Dialog),
     PanelSz = wxBoxSizer:new(?wxVERTICAL),
@@ -331,9 +333,10 @@ select_matchspec(Pid, Parent, AllMatchSpecs, Key) ->
 	    {value,{Key,MSs0},Rest} -> {MSs0,Rest};
 	    false -> {[],AllMatchSpecs}
 	end,
+    Scale = observer_wx:get_scale(),
     Dialog = wxDialog:new(Parent, ?wxID_ANY, "Trace Match Specifications",
 			  [{style, ?wxDEFAULT_DIALOG_STYLE bor ?wxRESIZE_BORDER},
-			   {size, {400, 400}}]),
+			   {size, {400*Scale, 400*Scale}}]),
 
     Panel = wxPanel:new(Dialog),
     PanelSz = wxBoxSizer:new(?wxVERTICAL),
diff --git a/lib/observer/src/observer_tv_table.erl b/lib/observer/src/observer_tv_table.erl
index d6dcee2cda..7bd67a0f0b 100644
--- a/lib/observer/src/observer_tv_table.erl
+++ b/lib/observer/src/observer_tv_table.erl
@@ -99,7 +99,8 @@ init([Parent, Opts]) ->
 		ets -> "TV Ets: " ++ Title0;
 		mnesia -> "TV Mnesia: " ++ Title0
 	    end,
-    Frame = wxFrame:new(Parent, ?wxID_ANY, Title, [{size, {800, 600}}]),
+    Scale = observer_wx:get_scale(),
+    Frame = wxFrame:new(Parent, ?wxID_ANY, Title, [{size, {Scale * 800, Scale * 600}}]),
     IconFile = filename:join(code:priv_dir(observer), "erlang_observer.png"),
     Icon = wxIcon:new(IconFile, [{type,?wxBITMAP_TYPE_PNG}]),
     wxFrame:setIcon(Frame, Icon),
diff --git a/lib/observer/src/observer_tv_wx.erl b/lib/observer/src/observer_tv_wx.erl
index 814f3a1260..247b3e869f 100644
--- a/lib/observer/src/observer_tv_wx.erl
+++ b/lib/observer/src/observer_tv_wx.erl
@@ -87,12 +87,13 @@ init([Notebook, Parent, Config]) ->
 			   wxListCtrl:setColumnWidth(Grid, Col, DefSize),
 			   Col + 1
 		   end,
-    ListItems = [{"Table Name", ?wxLIST_FORMAT_LEFT,  200},
-		 {"Objects",    ?wxLIST_FORMAT_RIGHT, 100},
-		 {"Size (kB)",  ?wxLIST_FORMAT_RIGHT, 100},
-		 {"Owner Pid",  ?wxLIST_FORMAT_CENTER, 150},
-		 {"Owner Name", ?wxLIST_FORMAT_LEFT,  200},
-		 {"Table Id",   ?wxLIST_FORMAT_LEFT, 250}
+    Scale = observer_wx:get_scale(),
+    ListItems = [{"Table Name", ?wxLIST_FORMAT_LEFT,  Scale*200},
+		 {"Objects",    ?wxLIST_FORMAT_RIGHT, Scale*100},
+		 {"Size (kB)",  ?wxLIST_FORMAT_RIGHT, Scale*100},
+		 {"Owner Pid",  ?wxLIST_FORMAT_CENTER, Scale*150},
+		 {"Owner Name", ?wxLIST_FORMAT_LEFT,  Scale*200},
+		 {"Table Id",   ?wxLIST_FORMAT_LEFT, Scale*250}
 		],
     lists:foldl(AddListEntry, 0, ListItems),
     wxListItem:destroy(Li),
diff --git a/lib/observer/src/observer_wx.erl b/lib/observer/src/observer_wx.erl
index 453e3bdc2d..25c79f7989 100644
--- a/lib/observer/src/observer_wx.erl
+++ b/lib/observer/src/observer_wx.erl
@@ -22,7 +22,7 @@
 
 -export([start/0, stop/0]).
 -export([create_menus/2, get_attrib/1, get_tracer/0, get_active_node/0, get_menubar/0,
-	 set_status/1, create_txt_dialog/4, try_rpc/4, return_to_localnode/2]).
+     get_scale/0, set_status/1, create_txt_dialog/4, try_rpc/4, return_to_localnode/2]).
 
 -export([init/1, handle_event/2, handle_cast/2, terminate/2, code_change/3,
 	 handle_call/3, handle_info/2, check_page_title/1]).
@@ -91,14 +91,24 @@ get_active_node() ->
 get_menubar() ->
     wx_object:call(observer, get_menubar).
 
+get_scale() ->
+    ScaleStr = os:getenv("OBSERVER_SCALE", "1"),
+    try list_to_integer(ScaleStr) of
+        Scale when Scale < 1 -> 1;
+        Scale -> Scale
+    catch _:_ ->
+        1
+    end.
+
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 init(_Args) ->
     register(observer, self()),
     wx:new(),
     catch wxSystemOptions:setOption("mac.listctrl.always_use_generic", 1),
+    Scale = get_scale(),
     Frame = wxFrame:new(wx:null(), ?wxID_ANY, "Observer",
-			[{size, {850, 600}}, {style, ?wxDEFAULT_FRAME_STYLE}]),
+			[{size, {Scale * 850, Scale * 600}}, {style, ?wxDEFAULT_FRAME_STYLE}]),
     IconFile = filename:join(code:priv_dir(observer), "erlang_observer.png"),
     Icon = wxIcon:new(IconFile, [{type,?wxBITMAP_TYPE_PNG}]),
     wxFrame:setIcon(Frame, Icon),
-- 
2.16.4

openSUSE Build Service is sponsored by