summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjcid <devnull@localhost>2008-09-27 21:13:51 +0200
committerjcid <devnull@localhost>2008-09-27 21:13:51 +0200
commit5718a4e8ff728af8976b809171eb5f4343197d6a (patch)
treea4849c6419c511f6d598625416086e5fae5afbb9 /src
parent44d669d639d8999b1302d37227aa349008019b27 (diff)
- Added a workaround for segfaulting popup menus.
Diffstat (limited to 'src')
-rw-r--r--src/html.cc6
-rw-r--r--src/menu.cc79
-rw-r--r--src/menu.hh4
-rw-r--r--src/plain.cc2
-rw-r--r--src/uicmd.cc9
-rw-r--r--src/uicmd.hh5
6 files changed, 61 insertions, 44 deletions
diff --git a/src/html.cc b/src/html.cc
index 68c3c8d0..f6584d4c 100644
--- a/src/html.cc
+++ b/src/html.cc
@@ -755,12 +755,14 @@ bool DilloHtml::HtmlLinkReceiver::press (Widget *widget, int link, int img,
// image menu
if (link != -1)
linkurl = html->links->get(link);
- a_UIcmd_image_popup(bw, html->images->get(img)->url, linkurl);
+ const bool_t loaded_img = (html->images->get(img)->image == NULL);
+ a_UIcmd_image_popup(
+ bw, html->images->get(img)->url, loaded_img, linkurl);
ret = true;
} else {
if (link == -1) {
a_UIcmd_page_popup(bw, a_History_get_url(NAV_TOP_UIDX(bw)),
- bw->num_page_bugs ? bw->page_bugs->str:NULL,
+ bw->num_page_bugs != 0,
html->unloadedImages());
ret = true;
} else {
diff --git a/src/menu.cc b/src/menu.cc
index 113ffad0..17787cb0 100644
--- a/src/menu.cc
+++ b/src/menu.cc
@@ -24,6 +24,7 @@
#include "history.h"
#include "html.hh"
#include "ui.hh" // for (UI *)
+#include "timeout.hh"
using namespace fltk;
@@ -33,12 +34,9 @@ using namespace fltk;
// (This data can be encapsulated inside a class for each popup, but
// as popups are modal, there's no need).
-// Weak reference to the popup's URL
-static const DilloUrl *popup_url = NULL;
+static DilloUrl *popup_url = NULL;
// Weak reference to the popup's bw
static BrowserWindow *popup_bw = NULL;
-// Weak reference to the page's HTML bugs
-static const char *popup_bugs = NULL;
// History popup direction (-1 = back, 1 = forward).
static int history_direction = -1;
// History popup, list of URL-indexes.
@@ -246,10 +244,22 @@ static void Menu_history_cb(Widget *wid, void *data)
}
/*
+ * Manus are popped-up from this timeout callback so the events
+ * associated with the button are gone when it pops. This way we
+ * avoid a segfault when a new page replaces the page that issued
+ * the popup menu.
+ */
+static void Menu_popup_cb(void *data)
+{
+ ((PopupMenu *)data)->popup();
+ a_Timeout_remove();
+}
+
+/*
* Page popup menu (construction & popup)
*/
void a_Menu_page_popup(BrowserWindow *bw, const DilloUrl *url,
- const char *bugs_txt, bool_t unloaded_imgs)
+ bool_t has_bugs, bool_t unloaded_imgs)
{
// One menu for every browser window
static PopupMenu *pm = 0;
@@ -258,8 +268,8 @@ void a_Menu_page_popup(BrowserWindow *bw, const DilloUrl *url,
static Item *load_images_item = 0;
popup_bw = bw;
- popup_url = url;
- popup_bugs = bugs_txt;
+ a_Url_free(popup_url);
+ popup_url = a_Url_dup(url);
if (!pm) {
Item *i;
@@ -287,20 +297,19 @@ void a_Menu_page_popup(BrowserWindow *bw, const DilloUrl *url,
pm->end();
}
- if (bugs_txt == NULL)
- view_page_bugs_item->deactivate();
- else
+ if (has_bugs == TRUE)
view_page_bugs_item->activate();
+ else
+ view_page_bugs_item->deactivate();
- if (unloaded_imgs == TRUE)
+ if (unloaded_imgs == TRUE) {
load_images_item->activate();
- else
+ load_images_item->user_data(NULL); /* wildcard */
+ } else {
load_images_item->deactivate();
+ }
- // NULL is wildcard
- load_images_item->user_data(NULL);
-
- pm->popup();
+ a_Timeout_add(0.0, Menu_popup_cb, (void *)pm);
}
/*
@@ -312,7 +321,8 @@ void a_Menu_link_popup(BrowserWindow *bw, const DilloUrl *url)
static PopupMenu *pm = 0;
popup_bw = bw;
- popup_url = url;
+ a_Url_free(popup_url);
+ popup_url = a_Url_dup(url);
if (!pm) {
Item *i;
pm = new PopupMenu(0,0,0,0,"&LINK OPTIONS");
@@ -335,25 +345,27 @@ void a_Menu_link_popup(BrowserWindow *bw, const DilloUrl *url)
pm->end();
}
- pm->popup();
+ a_Timeout_add(0.0, Menu_popup_cb, (void *)pm);
}
/*
* Image popup menu (construction & popup)
*/
void a_Menu_image_popup(BrowserWindow *bw, const DilloUrl *url,
- DilloUrl *link_url)
+ bool_t loaded_img, DilloUrl *link_url)
{
// One menu for every browser window
static PopupMenu *pm = 0;
// Active/inactive control.
static Item *link_menuitem = 0;
- static Item *load_menuitem = 0;
-
- DilloUrl *userdata_url = a_Url_dup(url);
+ static Item *load_img_menuitem = 0;
+ static DilloUrl *popup_link_url = NULL;
popup_bw = bw;
- popup_url = url;
+ a_Url_free(popup_url);
+ popup_url = a_Url_dup(url);
+ a_Url_free(popup_link_url);
+ popup_link_url = a_Url_dup(link_url);
if (!pm) {
Item *i;
@@ -366,7 +378,7 @@ void a_Menu_image_popup(BrowserWindow *bw, const DilloUrl *url,
i = new Item("Open Image in New Tab");
i->callback(Menu_open_url_nt_cb);
new Divider();
- i = load_menuitem = new Item("Load image");
+ i = load_img_menuitem = new Item("Load image");
i->callback(Menu_load_images_cb);
i = new Item("Bookmark this Image");
i->callback(Menu_add_bookmark_cb);
@@ -383,21 +395,21 @@ void a_Menu_image_popup(BrowserWindow *bw, const DilloUrl *url,
pm->end();
}
- // point to this item initially
- pm->item(load_menuitem);
+ if (loaded_img) {
+ load_img_menuitem->deactivate();
+ } else {
+ load_img_menuitem->activate();
+ load_img_menuitem->user_data(popup_url);
+ }
if (link_url) {
- link_menuitem->user_data(link_url);
+ link_menuitem->user_data(popup_link_url);
link_menuitem->activate();
} else {
link_menuitem->deactivate();
}
- load_menuitem->user_data(userdata_url);
-
- pm->popup();
-
- a_Url_free(userdata_url);
+ a_Timeout_add(0.0, Menu_popup_cb, (void *)pm);
}
/*
@@ -409,7 +421,8 @@ void a_Menu_bugmeter_popup(BrowserWindow *bw, const DilloUrl *url)
static PopupMenu *pm = 0;
popup_bw = bw;
- popup_url = url;
+ a_Url_free(popup_url);
+ popup_url = a_Url_dup(url);
if (!pm) {
Item *i;
pm = new PopupMenu(0,0,0,0,"&BUG METER OPTIONS");
diff --git a/src/menu.hh b/src/menu.hh
index bbdbae1c..2fdcc96e 100644
--- a/src/menu.hh
+++ b/src/menu.hh
@@ -8,10 +8,10 @@ extern "C" {
#endif /* __cplusplus */
void a_Menu_page_popup(BrowserWindow *bw, const DilloUrl *url,
- const char *bugs_txt, bool_t unloaded_imgs);
+ bool_t has_bugs, bool_t unloaded_imgs);
void a_Menu_link_popup(BrowserWindow *bw, const DilloUrl *url);
void a_Menu_image_popup(BrowserWindow *bw, const DilloUrl *url,
- DilloUrl *link_url);
+ bool_t loaded_img, DilloUrl *link_url);
void a_Menu_bugmeter_popup(BrowserWindow *bw, const DilloUrl *url);
void a_Menu_history_popup(BrowserWindow *bw, int direction);
diff --git a/src/plain.cc b/src/plain.cc
index 34672e3c..b75dbea5 100644
--- a/src/plain.cc
+++ b/src/plain.cc
@@ -139,7 +139,7 @@ bool DilloPlain::PlainEventReceiver::buttonPress (Widget *widget,
_MSG("DilloPlain::PlainEventReceiver::buttonPress\n");
if (event->button == 3) {
- a_UIcmd_page_popup(plain->bw, plain->url, NULL, 1);
+ a_UIcmd_page_popup(plain->bw, plain->url, FALSE, FALSE);
return true;
}
return false;
diff --git a/src/uicmd.cc b/src/uicmd.cc
index 83987725..c8e02133 100644
--- a/src/uicmd.cc
+++ b/src/uicmd.cc
@@ -588,9 +588,9 @@ void a_UIcmd_add_bookmark(BrowserWindow *bw, const DilloUrl *url)
* Popup the page menu
*/
void a_UIcmd_page_popup(void *vbw, const DilloUrl *url,
- const char *bugs_txt, bool_t unloaded_imgs)
+ bool_t has_bugs, bool_t unloaded_imgs)
{
- a_Menu_page_popup((BrowserWindow*)vbw, url, bugs_txt, unloaded_imgs);
+ a_Menu_page_popup((BrowserWindow*)vbw, url, has_bugs, unloaded_imgs);
}
/*
@@ -604,9 +604,10 @@ void a_UIcmd_link_popup(void *vbw, const DilloUrl *url)
/*
* Pop up the image menu
*/
-void a_UIcmd_image_popup(void *vbw, const DilloUrl *url, DilloUrl *link_url)
+void a_UIcmd_image_popup(void *vbw, const DilloUrl *url, bool_t loaded_img,
+ DilloUrl *link_url)
{
- a_Menu_image_popup((BrowserWindow*)vbw, url, link_url);
+ a_Menu_image_popup((BrowserWindow*)vbw, url, loaded_img, link_url);
}
/*
diff --git a/src/uicmd.hh b/src/uicmd.hh
index c5c86f6f..18bed3f8 100644
--- a/src/uicmd.hh
+++ b/src/uicmd.hh
@@ -35,9 +35,10 @@ void a_UIcmd_findtext_reset(BrowserWindow *bw);
void a_UIcmd_focus_main_area(BrowserWindow *bw);
void a_UIcmd_focus_location(void *vbw);
void a_UIcmd_page_popup(void *vbw, const DilloUrl *url,
- const char *bugs_txt, bool_t unloaded_imgs);
+ bool_t has_bugs, bool_t unloaded_imgs);
void a_UIcmd_link_popup(void *vbw, const DilloUrl *url);
-void a_UIcmd_image_popup(void *vbw, const DilloUrl *url, DilloUrl *link_url);
+void a_UIcmd_image_popup(void *vbw, const DilloUrl *url, bool_t loaded_img,
+ DilloUrl *link_url);
void a_UIcmd_copy_urlstr(BrowserWindow *bw, const char *urlstr);
void a_UIcmd_view_page_source(const DilloUrl *url);
void a_UIcmd_view_page_bugs(void *vbw);