summaryrefslogtreecommitdiff
path: root/atari/ctxmenu.c
diff options
context:
space:
mode:
authorOle Loots <ole@monochrom.net>2011-09-19 18:38:48 +0000
committerOle Loots <ole@monochrom.net>2011-09-19 18:38:48 +0000
commit0f2871e41889f254cb614883ae9bbc6ab6fbceae (patch)
tree7d1a65739fbd044ea7ad490404c81710515ac5de /atari/ctxmenu.c
parent60f641bc44e7c40f3114630f60d0a30b57813e89 (diff)
downloadnetsurf-0f2871e41889f254cb614883ae9bbc6ab6fbceae.tar.gz
netsurf-0f2871e41889f254cb614883ae9bbc6ab6fbceae.tar.bz2
Added context menu,
Allow to set bitmap for iconified window. ( altough it's usesless right now because favicon support has been dropped) svn path=/trunk/netsurf/; revision=12821
Diffstat (limited to 'atari/ctxmenu.c')
-rw-r--r--atari/ctxmenu.c221
1 files changed, 221 insertions, 0 deletions
diff --git a/atari/ctxmenu.c b/atari/ctxmenu.c
new file mode 100644
index 000000000..f889963b2
--- /dev/null
+++ b/atari/ctxmenu.c
@@ -0,0 +1,221 @@
+/*
+ * Copyright 2010 Ole Loots <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdbool.h>
+#include <assert.h>
+#include <windom.h>
+
+#include "desktop/gui.h"
+#include "desktop/netsurf.h"
+#include "desktop/browser.h"
+#include "desktop/mouse.h"
+#include "desktop/textinput.h"
+#include "content/content.h"
+#include "content/hlcache.h"
+#include "content/urldb.h"
+#include "css/css.h"
+#include "render/box.h"
+#include "render/form.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+
+#include "atari/gui.h"
+#include "atari/browser.h"
+#include "atari/browser_win.h"
+#include "atari/misc.h"
+#include "atari/clipboard.h"
+#include "atari/res/netsurf.rsh"
+#include "atari/ctxmenu.h"
+
+
+#define CNT_INVALID 0
+#define CNT_URLINPUT 32
+#define CNT_BROWSER 64
+#define CNT_HREF 128
+#define CNT_SELECTION 256
+#define CNT_INTERACTIVE 512
+#define CNT_IMG 1024
+
+
+struct s_context_info {
+ unsigned long flags;
+ struct contextual_content ccdata;
+};
+
+struct s_context_info ctxinfo;
+
+static struct s_context_info * get_context_info( struct gui_window * gw, short mx, short my )
+{
+ int posx, posy;
+ struct box *box;
+ struct box *file_box = 0;
+ hlcache_handle *h;
+ int box_x, box_y;
+ LGRECT bwrect;
+ struct contextual_content ccdata;
+ struct browser_window * bw = gw->browser->bw;
+ h = bw->current_content;
+
+ ctxinfo.flags = 0;
+
+ browser_get_rect( gw, BR_CONTENT, &bwrect );
+ mx = mx - bwrect.g_x;
+ my = my - bwrect.g_y;
+ if( (mx < 0 || mx > bwrect.g_w) || (my < 0 || my > bwrect.g_h) ){
+ // TODO: check for urlinput location
+ // and set CNT_URLINPUT
+ return(&ctxinfo);
+ }
+
+ if (!bw->current_content || content_get_type(h) != CONTENT_HTML){
+ return(&ctxinfo);
+ }
+
+ ctxinfo.flags |= CNT_BROWSER;
+ browser_window_get_contextual_content(
+ gw->browser->bw, mx, my,
+ (struct contextual_content*)&ctxinfo.ccdata
+ );
+ if( ctxinfo.ccdata.link_url ){
+ ctxinfo.flags |= CNT_HREF;
+ }
+ if( ctxinfo.ccdata.object && (content_get_type(ccdata.object) == CONTENT_IMAGE)) {
+ ctxinfo.flags |= CNT_IMG;
+ }
+
+
+ box = html_get_box_tree(h);
+ box_x = box->margin[LEFT];
+ box_y = box->margin[TOP];
+
+ while ((box = box_at_point(box, mx+gw->browser->scroll.current.x, my+gw->browser->scroll.current.y, &box_x, &box_y, &h)))
+ {
+ if (box->style && css_computed_visibility(box->style) == CSS_VISIBILITY_HIDDEN)
+ continue;
+ if (box->gadget)
+ {
+ switch (box->gadget->type)
+ {
+ case GADGET_TEXTBOX:
+ case GADGET_TEXTAREA:
+ case GADGET_PASSWORD:
+ // TODO: check if there is really an selection, but it
+ // doesn't hurt for now...:
+ ctxinfo.flags |= (CNT_INTERACTIVE | CNT_SELECTION);
+ break;
+
+ default: break;
+ }
+ }
+ }
+ return( &ctxinfo );
+}
+
+void context_popup( struct gui_window * gw, short x, short y )
+{
+ #define POP_FIRST_ITEM POP_CTX_CUT_SEL
+ #define POP_LAST_ITEM POP_CTX_VIEW_SOURCE
+ OBJECT * pop;
+ int choice;
+ struct s_context_info * ctx;
+
+ pop = get_tree( POP_CTX );
+ if( pop == NULL )
+ return;
+ ctx = get_context_info( gw, x, y );
+
+ /*
+ Disable all items by default:
+ */
+ for( choice = POP_FIRST_ITEM; choice<=POP_LAST_ITEM; choice++ ){
+ SET_BIT(pop[ choice ].ob_state, DISABLED, 1);
+ }
+
+ if( ctx->flags & CNT_INTERACTIVE ){
+ SET_BIT(pop[ POP_CTX_PASTE_SEL ].ob_state, DISABLED, 0);
+ }
+
+ if( (ctx->flags & CNT_BROWSER) ){
+ SET_BIT(pop[ POP_CTX_SELECT_ALL ].ob_state, DISABLED, 0);
+ SET_BIT(pop[ POP_CTX_COPY_SEL ].ob_state, DISABLED, 0);
+ SET_BIT(pop[ POP_CTX_VIEW_SOURCE ].ob_state, DISABLED, 0);
+ }
+
+ if( ctx->flags & CNT_HREF ){
+ SET_BIT(pop[ POP_CTX_SAVE_AS ].ob_state, DISABLED, 0);
+ SET_BIT(pop[ POP_CTX_COPY_LINK ].ob_state, DISABLED, 0);
+ SET_BIT(pop[ POP_CTX_OPEN_NEW ].ob_state, DISABLED, 0);
+ }
+
+ if( ctx->flags & CNT_IMG ){
+ SET_BIT(pop[ POP_CTX_SAVE_AS ].ob_state, DISABLED, 0);
+ SET_BIT(pop[ POP_CTX_COPY_URL ].ob_state, DISABLED, 0);
+ SET_BIT(pop[ POP_CTX_OPEN_NEW ].ob_state, DISABLED, 0);
+ }
+
+ choice = MenuPopUp(
+ pop, x, y,
+ -1, -1, -1,
+ P_WNDW + P_CHCK
+ );
+
+ switch( choice ){
+ case POP_CTX_COPY_SEL:
+ browser_window_key_press( gw->browser->bw, KEY_COPY_SELECTION );
+ break;
+
+ case POP_CTX_CUT_SEL:
+ browser_window_key_press( gw->browser->bw, KEY_CUT_SELECTION );
+ break;
+
+ case POP_CTX_PASTE_SEL:
+ gui_paste_from_clipboard(gw, x, y);
+ break;
+
+ case POP_CTX_SELECT_ALL:
+ browser_window_key_press( gw->browser->bw, KEY_SELECT_ALL );
+ break;
+
+ case POP_CTX_COPY_LINK:
+ if( (ctx->flags & CNT_HREF) && ctx->ccdata.link_url != NULL ){
+ scrap_txt_write(&app, (char*)ctx->ccdata.link_url);
+ }
+ break;
+
+ case POP_CTX_OPEN_NEW:
+ if( (ctx->flags & CNT_HREF) && ctx->ccdata.link_url){
+ browser_window_create(
+ ctx->ccdata.link_url,
+ gw->browser->bw,
+ content_get_url(gw->browser->bw->current_content),
+ true, false
+ );
+ }
+
+ break;
+
+ default: break;
+ }
+#undef POP_FIRST_ITEM
+#undef POP_LAST_ITEM
+}