diff --git a/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs b/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs index 986a1b012..8a9f0d2a6 100644 --- a/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs +++ b/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs @@ -142,6 +142,7 @@ namespace Terminal.Gui { Curses.raw (); Curses.noecho (); Curses.refresh (); + ProcessWinChange (); } private void ProcessWinChange () diff --git a/Terminal.Gui/ConsoleDrivers/CursesDriver/UnixMainLoop.cs b/Terminal.Gui/ConsoleDrivers/CursesDriver/UnixMainLoop.cs index f0c7cb9df..3e23b78a5 100644 --- a/Terminal.Gui/ConsoleDrivers/CursesDriver/UnixMainLoop.cs +++ b/Terminal.Gui/ConsoleDrivers/CursesDriver/UnixMainLoop.cs @@ -82,7 +82,6 @@ namespace Terminal.Gui { bool poll_dirty = true; int [] wakeupPipes = new int [2]; static IntPtr ignore = Marshal.AllocHGlobal (1); - static IntPtr readHandle = Marshal.AllocHGlobal (1); MainLoop mainLoop; bool winChanged; @@ -97,8 +96,8 @@ namespace Terminal.Gui { { this.mainLoop = mainLoop; pipe (wakeupPipes); - AddWatch (wakeupPipes [1], Condition.PollIn, ml => { - read (wakeupPipes [1], ignore, readHandle); + AddWatch (wakeupPipes [0], Condition.PollIn, ml => { + read (wakeupPipes [1], ignore, (IntPtr)1); return true; }); } @@ -176,6 +175,18 @@ namespace Terminal.Gui { if (mainLoop.timeouts.Count > 0) { pollTimeout = (int)((mainLoop.timeouts.Keys [0] - now) / TimeSpan.TicksPerMillisecond); if (pollTimeout < 0) { + // This avoids 'poll' waiting infinitely if 'pollTimeout < 0' until some action is detected + // This can occur after IMainLoopDriver.Wakeup is executed where the pollTimeout is less than 0 + // and no event occurred in elapsed time when the 'poll' is start running again. + /* + The 'poll' function in the C standard library uses a signed integer as the timeout argument, where: + + - A positive value specifies a timeout in milliseconds. + - A value of 0 means the poll function will return immediately, checking for events and not waiting. + - A value of -1 means the poll function will wait indefinitely until an event occurs or an error occurs. + - A negative value other than -1 typically indicates an error. + */ + pollTimeout = 0; return true; } } else diff --git a/Terminal.Gui/Views/ComboBox.cs b/Terminal.Gui/Views/ComboBox.cs index 4fb87d7e5..0483d82e7 100644 --- a/Terminal.Gui/Views/ComboBox.cs +++ b/Terminal.Gui/Views/ComboBox.cs @@ -5,10 +5,10 @@ // Ross Ferguson (ross.c.ferguson@btinternet.com) // +using NStack; using System; using System.Collections; using System.Collections.Generic; -using NStack; namespace Terminal.Gui { /// @@ -39,10 +39,7 @@ namespace Terminal.Gui { private void Initialize (ComboBox container, bool hideDropdownListOnClick) { - if (container == null) - throw new ArgumentNullException ("ComboBox container cannot be null.", nameof (container)); - - this.container = container; + this.container = container ?? throw new ArgumentNullException (nameof(container), "ComboBox container cannot be null."); HideDropdownListOnClick = hideDropdownListOnClick; } @@ -236,7 +233,7 @@ namespace Terminal.Gui { readonly TextField search; readonly ComboListView listview; bool autoHide = true; - int minimumHeight = 2; + readonly int minimumHeight = 2; /// /// Public constructor @@ -721,7 +718,19 @@ namespace Terminal.Gui { return text; } set { - search.Text = text = value; + SetSearchText (value); + } + } + + /// + /// Current search text + /// + public ustring SearchText { + get { + return search.Text; + } + set { + SetSearchText (value); } } @@ -775,7 +784,7 @@ namespace Terminal.Gui { private void Reset (bool keepSearchText = false) { if (!keepSearchText) { - search.Text = text = ""; + SetSearchText (string.Empty); } ResetSearchSet (); @@ -788,6 +797,11 @@ namespace Terminal.Gui { } } + private void SetSearchText (ustring value) + { + search.Text = text = value; + } + private void ResetSearchSet (bool noCopy = false) { searchset.Clear (); @@ -843,7 +857,7 @@ namespace Terminal.Gui { listview.SetSource (searchset); listview.Clear (); // Ensure list shrinks in Dialog as you type listview.Height = CalculatetHeight (); - this.SuperView?.BringSubviewToFront (this); + SuperView?.BringSubviewToFront (this); } /// @@ -857,7 +871,7 @@ namespace Terminal.Gui { OnOpenSelectedItem (); } var rect = listview.ViewToScreen (listview.Bounds); - Reset (SelectedItem > -1); + Reset (keepSearchText: true); listview.Clear (rect); listview.TabStop = false; SuperView?.SendSubviewToBack (this); diff --git a/UICatalog/Scenarios/Threading.cs b/UICatalog/Scenarios/Threading.cs index 6bd159497..fe2c15f42 100644 --- a/UICatalog/Scenarios/Threading.cs +++ b/UICatalog/Scenarios/Threading.cs @@ -157,7 +157,7 @@ namespace UICatalog.Scenarios { LogJob ($"Returned from task Thread:{Thread.CurrentThread.ManagedThreadId} {DateTime.Now}"); _itemsList.SetSource (items); LogJob ($"Finished populate list view Thread:{Thread.CurrentThread.ManagedThreadId} {DateTime.Now}"); - _btnActionCancel.Text = "Load Items"; + _btnActionCancel.Text = "Cancelable Load Items"; } else { LogJob ("Task was canceled!"); }