예제 #1
0
void BWebPage::skipToLastMessage(BMessage*& message)
{
	// NOTE: All messages that are fast-forwarded like this
	// need to be flagged with the intended target BWebPage,
	// or else we steal or process messages intended for another
	// BWebPage here!
    bool first = true;
    BMessageQueue* queue = Looper()->MessageQueue();
    int32 index = 0;
    while (BMessage* nextMessage = queue->FindMessage(message->what, index)) {
    	BHandler* target = 0;
    	nextMessage->FindPointer("target", reinterpret_cast<void**>(&target));
    	if (target != this) {
    		index++;
    	    continue;
    	}
        if (!first)
            delete message;
        message = nextMessage;
        queue->RemoveMessage(message);
        first = false;
    }
}
예제 #2
0
void ArpRemoteTerminal::MessageReceived(BMessage *message)
{
	ArpD(cdb << ADH << "ArpRemoteTerminal::MessageReceived: " << *message << endl);
	switch( message->what ) {
	
		case TERM_XFER_TEXT_MSG: {
#if 1
			const ichar* txt = NULL;
			long len=0;
			int32 idx=0;
			while( message->FindData("text", B_ASCII_TYPE, idx,
									 (const void**)&txt, &len) == B_NO_ERROR ) {
				if( txt && len > 0 ) {
					Emulator().EmulateToTTY(txt,len);
				}
				idx++;
			}
			message->SendReply(B_NO_REPLY);
#else
			int32 recpos = 0;
			BMessage* curmsg = Window()->DetachCurrentMessage();
			BMessageQueue* queue = Window()->MessageQueue();
			while( curmsg ) {
				ichar* txt = NULL;
				long len=0;
				int32 idx=0;
				while( curmsg->FindData("text", B_ASCII_TYPE, idx,
									  &txt, &len) == B_NO_ERROR ) {
					if( txt ) {
						if( recpos + len > sizeof(receiveBuffer) ) {
							if( recpos > 0 ) {
								Emulator().EmulateToTTY(&receiveBuffer[0],recpos);
								recpos = 0;
							}
						}
						if( len > sizeof(receiveBuffer) ) {
							Emulator().EmulateToTTY(txt,len);
						} else {
							memcpy(&receiveBuffer[recpos],txt,len);
							recpos += len;
						}
					}
					idx++;
				}
				delete curmsg;
				curmsg = NULL;
				if( queue ) {
					curmsg = queue->FindMessage((int32)0);
					if( curmsg &&
						curmsg->what == TERM_XFER_TEXT_MSG ) {
						curmsg = queue->NextMessage();
					} else curmsg = NULL;
				}
			}
			if( recpos > 0 ) {
				Emulator().EmulateToTTY(&receiveBuffer[0],recpos);
			}
			return;
#endif
		} break;
		
		case TERM_RESET_MSG: {
			bool hard = false;
			if( message->FindBool("hard", &hard) != B_OK ) hard = false;
			Emulator().Reset(hard);
			TermClean();
			// HACK: The emulator often changes the terminal's mode
			// flags after calling its reset, leaving any active
			// settings view with incorrect settings.  Until we can
			// do better at tracking state changes, for this situation
			// send another update to the settings view.
			if( HaveWatchers() ) {
				BMessage config;
				if( GetConfiguration(&config) == B_NO_ERROR ) {
					ArpD(cdb << ADH << "Reporting change: " << config << endl);
					ReportChange(&config);
				}
			}
		} break;
		
		case TERM_START_SESSION_MSG: {
			StartSession();
			TermClean();
			Owner().SendMessage(message);
		} break;
		
		case TERM_END_SESSION_MSG: {
			EndSession();
			TermClean();
			Owner().SendMessage(message);
		} break;
		
		case TERM_REQUEST_STATUS_MSG: {
			int32 rows,cols;
			TermGetSize(&rows,&cols);
			SendSizeMsg(rows,cols);
			SendEmulatorsMsg();
		} break;
		
		case TERM_WINDOW_SIZE_MSG: {
			int32 rows,cols;
			TermGetFixedSize(&rows,&cols);
			message->FindInt32("rows",&rows);
			message->FindInt32("columns",&cols);
			TermSetFixedSize(rows,cols);
		} break;
		
		case TERM_SELECT_EMULATION_MSG: {
			BMenuItem* item = NULL;
			if( message->FindPointer("source",(void**)&item) ) item = NULL;
			BMenu* menu = NULL;
			if( item ) menu = item->Menu();
			int32 num=0;
			type_code type;
			if( !message->GetInfo("name",&type,&num) ) {
				for( int i=0; i<num; i++ ) {
					const char* str;
					if( !message->FindString("name",i,&str) ) {
						delete SetEmulator(str);
						if( !IsDefaultEmulator() ) {
							if( menu ) CheckEmulationMenu(menu);
							return;
						}
					}
				}
			}
			if( menu ) CheckEmulationMenu(menu);
		} break;
		
		case ARP_PUT_CONFIGURATION_MSG: {
			BMessage config;
			if( message->FindMessage("settings",&config) == B_NO_ERROR ) {
				PutConfiguration(&config);
			} else {
				inherited::MessageReceived(message);
			}
		} break;
		
		case TERM_ADD_WATCHER_MSG: {
			BMessenger w;
			if( message->FindMessenger("watch",&w) == B_NO_ERROR ) {
				AddWatcher(w);
				BMessage config;
				if( GetConfiguration(&config) == B_NO_ERROR ) {
					ReportChange(&config, &w);
				}
			} else {
				inherited::MessageReceived(message);
			}
		} break;
		
		case TERM_REM_WATCHER_MSG: {
			BMessenger w;
			if( message->FindMessenger("watch",&w) == B_NO_ERROR ) {
				RemWatcher(w);
			} else {
				inherited::MessageReceived(message);
			}
		} break;
		
		default:
			inherited::MessageReceived(message);
	}
}
예제 #3
0
파일: ObjectView.cpp 프로젝트: dakyri/qua
void
ObjectView::MessageReceived(BMessage *inMsg)
{
	BPoint delta(0, 0), where(0, 0);
	if (inMsg->WasDropped()) {
		where = inMsg->DropPoint(&delta);
		ConvertFromScreen(&where);
	}
	switch (inMsg->what) {
	
	case REDISPLAY_OBJECT: {
		BRect		r;
		BMessageQueue	*q = Window()->MessageQueue();
		BMessage	*m=nullptr;
		
		if (inMsg->HasRect("rect")) {
			r = inMsg->FindRect("rect");
		} else {
			r = Bounds();
		}
		for (int count=0; m=q->FindMessage(REDISPLAY_OBJECT, count); count++) {
			ObjectView	*ov=nullptr;
			m->FindPointer("object", (void**)&ov);
			if (ov == this) {
				BRect	s;
				if (m->HasRect("rect")) {
					s = m->FindRect("rect");
					s.left = Min(s.left,r.left);
					s.right = Max(s.right, r.right);
					m->ReplaceRect("rect", s);
				} else {
					s = r;
					m->AddRect("rect", s);
				}
				return;
			}
		}
		Draw(r);
		break;
	}
	
	case SET_COLOR: {
		rgb_color		*p;
		ssize_t			sz;
		
		inMsg->FindData("color", B_RAW_TYPE, (const void **)&p, &sz);
		color.red = p->red;
		color.green = p->green;
		color.blue = p->blue;
		ReDraw();
		break;
	}
	
	case SET_DISPLAY_MODE: {
		rgb_color		*p;
		int32			md = inMsg->FindInt32("display mode");
		SetDisplayMode(md);
		break;
	}
	
	default:
		BView::MessageReceived(inMsg);
		break;
		
	}
}
예제 #4
0
void BWebPage::MessageReceived(BMessage* message)
{
    switch (message->what) {
    case HANDLE_SHUTDOWN:
        // NOTE: This message never arrives here when the BApplication is already
        // processing B_QUIT_REQUESTED. Then the view will be detached and instruct
        // the BWebPage handler to shut itself down, but BApplication will not
        // process additional messages. That's why the windows containing WebViews
        // are detaching the views already in their QuitRequested() hooks and
        // LauncherApp calls these hooks already in its own QuitRequested() hook.
        Looper()->RemoveHandler(this);
        delete this;
        // TOAST!
        return;
    case HANDLE_LOAD_URL:
        handleLoadURL(message);
        break;
    case HANDLE_RELOAD:
    	handleReload(message);
    	break;
    case HANDLE_GO_BACK:
        handleGoBack(message);
        break;
    case HANDLE_GO_FORWARD:
        handleGoForward(message);
        break;
    case HANDLE_STOP_LOADING:
        handleStop(message);
        break;

    case HANDLE_SET_VISIBLE:
        handleSetVisible(message);
        break;

    case HANDLE_DRAW: {
        bool first = true;
        BMessageQueue* queue = Looper()->MessageQueue();
        BRect updateRect;
        message->FindRect("update rect", &updateRect);
        int32 index = 0;
        while (BMessage* nextMessage = queue->FindMessage(message->what, index)) {
            BHandler* target = 0;
            nextMessage->FindPointer("target", reinterpret_cast<void**>(&target));
            if (target != this) {
                index++;
                continue;
            }

            if (!first) {
                delete message;
                first = false;
            }

            message = nextMessage;
            queue->RemoveMessage(message);

            BRect rect;
            message->FindRect("update rect", &rect);
            updateRect = updateRect | rect;
        }
        paint(updateRect, false);
        break;
    }
    case HANDLE_FRAME_RESIZED:
        skipToLastMessage(message);
        handleFrameResized(message);
        break;

    case HANDLE_FOCUSED:
        handleFocused(message);
        break;
    case HANDLE_ACTIVATED:
        handleActivated(message);
        break;

    case B_MOUSE_MOVED:
        skipToLastMessage(message);
        // fall through
    case B_MOUSE_DOWN:
    case B_MOUSE_UP:
        handleMouseEvent(message);
        break;
    case B_MOUSE_WHEEL_CHANGED:
        handleMouseWheelChanged(message);
        break;
    case B_KEY_DOWN:
    case B_KEY_UP:
        handleKeyEvent(message);
        break;

	case HANDLE_CHANGE_ZOOM_FACTOR:
		handleChangeZoomFactor(message);
		break;
    case HANDLE_FIND_STRING:
        handleFindString(message);
        break;

	case HANDLE_SET_STATUS_MESSAGE: {
		BString status;
		if (message->FindString("string", &status) == B_OK)
			setStatusMessage(status);
		break;
	}

    case HANDLE_RESEND_NOTIFICATIONS:
        handleResendNotifications(message);
        break;
    case HANDLE_SEND_EDITING_CAPABILITIES:
        handleSendEditingCapabilities(message);
        break;
    case HANDLE_SEND_PAGE_SOURCE:
        handleSendPageSource(message);
        break;

    case B_REFS_RECEIVED: {
		RefPtr<FileChooser>* chooser;
        if (message->FindPointer("chooser", reinterpret_cast<void**>(&chooser)) == B_OK) {
            entry_ref ref;
            BPath path;
            Vector<String> filenames;
            for (int32 i = 0; message->FindRef("refs", i, &ref) == B_OK; i++) {
                path.SetTo(&ref);
                filenames.append(String(path.Path()));
            }
            (*chooser)->chooseFiles(filenames);
            delete chooser;
        }
    	break;
    }
    case B_CANCEL: {
    	int32 oldWhat;
    	BFilePanel* panel;
    	if (message->FindPointer("source", reinterpret_cast<void**>(&panel)) == B_OK
    		&& message->FindInt32("old_what", &oldWhat) == B_OK
    		&& oldWhat == B_REFS_RECEIVED) {
    		// TODO: Eventually it would be nice to reuse the same file panel...
    		// At least don't leak the file panel for now.
    		delete panel;
    	}
    	break;
    }

    default:
        BHandler::MessageReceived(message);
    }
}