Branch: refs/heads/master Author: Colomban Wendling ban@herbesfolles.org Committer: Colomban Wendling ban@herbesfolles.org Date: Wed, 10 Sep 2014 21:23:01 UTC Commit: 7d38ff67ecf18f9f331ed1fad849878a6089097d https://github.com/geany/geany/commit/7d38ff67ecf18f9f331ed1fad849878a608909...
Log Message: ----------- Merge branch 'scintilla/gtk3-dead-windows'
Backport patches applied upstream to cache auto-completion windows, hopefully avoiding dead popup windows lying around on GTK3 builds in some high stress scenarios.
Modified Paths: -------------- scintilla/gtk/PlatGTK.cxx
Modified: scintilla/gtk/PlatGTK.cxx 30 lines changed, 25 insertions(+), 5 deletions(-) =================================================================== @@ -1225,9 +1225,21 @@ Surface *Surface::Allocate(int) { Window::~Window() {}
void Window::Destroy() { - if (wid) - gtk_widget_destroy(GTK_WIDGET(wid)); - wid = 0; + if (wid) { + if (dynamic_cast<ListBox*>(this)) { + gtk_widget_hide(GTK_WIDGET(wid)); + // clear up window content + GtkWidget *child = gtk_bin_get_child(GTK_BIN(wid)); + if (child) + gtk_widget_destroy(child); + // resize the window to the smallest possible size for it to adapt + // to future content + gtk_window_resize(GTK_WINDOW(wid), 1, 1); + } else { + gtk_widget_destroy(GTK_WIDGET(wid)); + } + wid = 0; + } }
bool Window::HasFocus() { @@ -1411,6 +1423,7 @@ enum { };
class ListBoxX : public ListBox { + WindowID widCached; WindowID list; WindowID scroller; void *pixhash; @@ -1423,7 +1436,7 @@ class ListBoxX : public ListBox { CallBackAction doubleClickAction; void *doubleClickActionData;
- ListBoxX() : list(0), scroller(0), pixhash(NULL), pixbuf_renderer(0), + ListBoxX() : widCached(0), list(0), scroller(0), pixhash(NULL), pixbuf_renderer(0), desiredVisibleRows(5), maxItemCharacters(0), aveCharWidth(1), doubleClickAction(NULL), doubleClickActionData(NULL) { } @@ -1432,6 +1445,10 @@ class ListBoxX : public ListBox { g_hash_table_foreach((GHashTable *) pixhash, list_image_free, NULL); g_hash_table_destroy((GHashTable *) pixhash); } + if (widCached) { + gtk_widget_destroy(GTK_WIDGET(widCached)); + wid = widCached = 0; + } } virtual void SetFont(Font &font); virtual void Create(Window &parent, int ctrlID, Point location_, int lineHeight_, bool unicodeMode_, int technology_); @@ -1524,7 +1541,10 @@ static void StyleSet(GtkWidget *w, GtkStyle*, void*) { }
void ListBoxX::Create(Window &, int, Point, int, bool, int) { - wid = gtk_window_new(GTK_WINDOW_POPUP); + if (widCached == 0) + widCached = gtk_window_new(GTK_WINDOW_POPUP); + + wid = widCached;
GtkWidget *frame = gtk_frame_new(NULL); gtk_widget_show(frame);
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).