[prev in list] [next in list] [prev in thread] [next in thread] 

List:       haiku-commits
Subject:    [haiku-commits] r33847 - in haiku/trunk/src/add-ons/input_server/filters: . shortcut_catcher
From:       fredrik () modeen ! se
Date:       2009-10-30 21:35:17
Message-ID: 20091030213517.9EA34682B7 () svn ! haiku-os ! org
[Download RAW message or body]

Author: modeenf
Date: 2009-10-30 22:35:17 +0100 (Fri, 30 Oct 2009)
New Revision: 33847
Changeset: http://dev.haiku-os.org/changeset/33847/haiku

Added:
   haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/
   haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/BitFieldTesters.cpp
   haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/BitFieldTesters.h
   haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/CommandActuators.cpp
   haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/CommandActuators.h
   haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/CommandExecutor.cpp
   haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/CommandExecutor.h
   haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/Jamfile
   haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/KeyCommandMap.cpp
   haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/KeyCommandMap.h
   haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/KeyInfos.cpp
   haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/KeyInfos.h
   haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/ParseCommandLine.cpp
   haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/ParseCommandLine.h
   haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/ShortcutsFilterConstants.h
  haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/ShortcutsServerFilter.cpp
  haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/ShortcutsServerFilter.h
 Modified:
   haiku/trunk/src/add-ons/input_server/filters/Jamfile
Log:
So here it goes..
I hope I have fixed all parts that don't follow our guidelines. (that python script \
was good start) This is the filter..

Modified: haiku/trunk/src/add-ons/input_server/filters/Jamfile
===================================================================
--- haiku/trunk/src/add-ons/input_server/filters/Jamfile	2009-10-30 15:52:07 UTC (rev \
                33846)
+++ haiku/trunk/src/add-ons/input_server/filters/Jamfile	2009-10-30 21:35:17 UTC (rev \
33847) @@ -2,3 +2,4 @@
 
 SubInclude HAIKU_TOP src add-ons input_server filters screen_saver ;
 SubInclude HAIKU_TOP src add-ons input_server filters vmware_mouse ;
+SubInclude HAIKU_TOP src add-ons input_server filters shortcut_catcher ;

Added: haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/BitFieldTesters.cpp
 ===================================================================
--- haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/BitFieldTesters.cpp	 \
                (rev 0)
+++ haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/BitFieldTesters.cpp	2009-10-30 \
21:35:17 UTC (rev 33847) @@ -0,0 +1,305 @@
+/*
+ * Copyright 1999-2009 Haiku Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *		Jeremy Friesner
+ */
+ 
+
+#include "BitFieldTesters.h"
+
+ 
+#include <stdio.h>
+
+BitFieldTester::BitFieldTester()
+{
+	// empty
+}
+
+
+BitFieldTester::BitFieldTester(BMessage* from)
+	:
+	BArchivable(from)
+{
+	// empty
+}
+
+
+status_t
+BitFieldTester::Archive(BMessage* into, bool deep) const
+{
+	return BArchivable::Archive(into, deep);
+} 
+
+
+// ---------------- ConstantFieldTester starts -------------------------------
+ConstantFieldTester::ConstantFieldTester(bool result)
+	:
+	fResult(result)
+{
+	// empty
+}
+
+
+ConstantFieldTester::ConstantFieldTester(BMessage* from)
+	:
+	BitFieldTester(from)
+{
+	if (from->FindBool("ctRes", &fResult) != B_NO_ERROR)
+		printf("ConstantFieldTester: Error, no ctRes!\n");
+}
+
+ 
+status_t
+ConstantFieldTester::Archive(BMessage* into, bool deep) const
+{
+	status_t ret = BitFieldTester::Archive(into, deep);
+	into->AddBool("ctRes", fResult);
+	return ret;
+}
+
+
+BArchivable*
+ConstantFieldTester::Instantiate(BMessage* from)
+{
+	if (validate_instantiation(from, "ConstantFieldTester"))
+		return new ConstantFieldTester(from);
+	else
+		return NULL;
+}
+
+
+bool
+ConstantFieldTester::IsMatching(uint32 field)
+{
+	return fResult;
+}
+
+
+// ---------------- HasBitsFieldTester starts -------------------------------
+HasBitsFieldTester::HasBitsFieldTester(uint32 requiredBits, 
+	uint32 forbiddenBits)
+	: 
+	fRequiredBits(requiredBits), 
+	fForbiddenBits(forbiddenBits)
+{
+	// empty
+}
+
+
+HasBitsFieldTester::HasBitsFieldTester(BMessage* from)
+	:
+	BitFieldTester(from)
+{
+	if (from->FindInt32("rqBits", (int32*) &fRequiredBits) != B_NO_ERROR)
+		printf("HasBitsFieldTester: Error, no rqBits!\n");
+	
+	if (from->FindInt32("fbBits", (int32*) &fForbiddenBits) != B_NO_ERROR)
+		printf("HasBitsFieldTester: Error, no fbBits!\n");
+}
+
+
+status_t
+HasBitsFieldTester::Archive(BMessage* into, bool deep) const
+{
+	status_t ret = BitFieldTester::Archive(into, deep);
+	into->AddInt32("rqBits", fRequiredBits);
+	into->AddInt32("fbBits", fForbiddenBits);
+	return ret;
+}
+
+
+BArchivable*
+HasBitsFieldTester::Instantiate(BMessage* from)
+{
+	if (validate_instantiation(from, "HasBitsFieldTester"))
+		return new HasBitsFieldTester(from);
+	else
+		return NULL;
+}
+
+
+bool
+HasBitsFieldTester::IsMatching(uint32 field)
+{
+	return ((((fRequiredBits & (~field)) == 0)) 
+				&& ((fForbiddenBits & (~field)) == fForbiddenBits));
+}
+
+
+// ---------------- NotFieldTester starts -------------------------------
+NotFieldTester::NotFieldTester(BitFieldTester* slave)
+	:
+	fSlave(slave)
+{
+	// empty
+}
+
+
+NotFieldTester::~NotFieldTester()
+{
+	delete fSlave;
+}
+
+
+NotFieldTester::NotFieldTester(BMessage* from)
+	: 
+	BitFieldTester(from), 
+	fSlave(NULL)
+{
+	BMessage slaveMsg;
+	if (from->FindMessage("nSlave", &slaveMsg) == B_NO_ERROR) {
+		BArchivable* slaveObj = instantiate_object(&slaveMsg);
+		if (slaveObj) {
+			fSlave = dynamic_cast<BitFieldTester*>(slaveObj);
+			if (fSlave == NULL) {
+				printf("NotFieldTester: 
+					Error casting slaveObj to BitFieldTester!\n");
+				delete slaveObj;
+			}
+		} else
+			printf("NotFieldTester: instantiate_object returned NULL!\n");
+	} else
+		printf("NotFieldTester: Couldn't unarchive NotFieldTester slave!\n");
+}
+
+
+status_t
+NotFieldTester::Archive(BMessage* into, bool deep) const
+{
+	if (fSlave == NULL)
+		return B_ERROR;
+
+	status_t ret = BitFieldTester::Archive(into, deep);
+
+	if (ret == B_NO_ERROR) {
+		BMessage msg;
+		ret = fSlave->Archive(&msg, deep);
+		into->AddMessage("nSlave", &msg);
+	}
+
+	return ret;
+}
+
+
+BArchivable*
+NotFieldTester::Instantiate(BMessage* from)
+{
+	if (validate_instantiation(from, "NotFieldTester"))
+		return new NotFieldTester(from);
+	else
+		return NULL;
+}
+
+
+bool
+NotFieldTester::IsMatching(uint32 field)
+{
+	return fSlave ? (!fSlave->IsMatching(field)) : false;
+}
+
+
+// ---------------- MinMatchFieldTester starts -------------------------------
+MinMatchFieldTester::MinMatchFieldTester(int minNum, bool deleteSlaves)
+	:
+	fMinNum(minNum),
+	fDeleteSlaves(deleteSlaves) // fDeleteSlaves state not archived!
+{
+	// empty
+}
+
+
+MinMatchFieldTester::~MinMatchFieldTester()
+{
+	if (fDeleteSlaves) {
+		int nr = fSlaves.CountItems();
+		for (int i = 0; i < nr; i++)
+			delete ((BitFieldTester*) fSlaves.ItemAt(i));
+	}
+}
+
+
+MinMatchFieldTester::MinMatchFieldTester(BMessage* from)
+	: 
+	BitFieldTester(from),
+	fDeleteSlaves(true)
+{
+	int i = 0;
+	BMessage slaveMsg;
+	while (from->FindMessage("mSlave", i++, &slaveMsg) == B_NO_ERROR) {
+		BArchivable* slaveObj = instantiate_object(&slaveMsg);
+		if (slaveObj) {
+			BitFieldTester* nextSlave = dynamic_cast<BitFieldTester*>(slaveObj);
+			if (nextSlave)
+				fSlaves.AddItem(nextSlave);
+			else {
+				printf("MinMatchFieldTester:
+					Error casting slaveObj to BitFieldTester!\n");
+				delete slaveObj;
+			}
+		} else
+			printf("MinMatchFieldTester: instantiate_object returned NULL!\n");
+	}
+
+	if (from->FindInt32("mMin", (int32*) &fMinNum) != B_NO_ERROR)
+		printf("MinMatchFieldTester: Error getting mMin!\n");
+}
+
+
+// (slave) should be allocated with new, becomes property of this object.
+void
+MinMatchFieldTester::AddSlave(const BitFieldTester* slave)
+{
+	fSlaves.AddItem((void*) slave);
+}
+
+
+status_t
+MinMatchFieldTester::Archive(BMessage* into, bool deep) const
+{
+	status_t ret = BitFieldTester::Archive(into, deep);
+
+	if (ret == B_NO_ERROR) {
+		int nr = fSlaves.CountItems();
+		for (int i = 0; i < nr; i++) {
+			BMessage msg;
+			ret = ((BitFieldTester*)fSlaves.ItemAt(i))->Archive(&msg, deep);
+			if (ret != B_NO_ERROR)
+				return ret;
+
+			into->AddMessage("mSlave", &msg);
+		}
+	}
+
+	into->AddInt32("mMin", fMinNum);
+	return ret;
+}
+
+
+BArchivable*
+MinMatchFieldTester::Instantiate(BMessage* from)
+{
+	if (validate_instantiation(from, "MinMatchFieldTester"))
+		return new MinMatchFieldTester(from);
+	else
+		return NULL;
+}
+
+
+// Returns true if at least (fMinNum) slaves return true.
+bool
+MinMatchFieldTester::IsMatching(uint32 field)
+{
+	int nr = fSlaves.CountItems();
+	if ((fMinNum == 0) && (nr == 0))
+		return true; // 0 >= 0, so this should return true!
+
+	int count = 0;
+	
+	for (int i = 0; i < nr; i++)
+		if ((((BitFieldTester*)fSlaves.ItemAt(i))->IsMatching(field)) 
+				&& (++count >= fMinNum))
+			return true;
+	return false;
+}

Added: haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/BitFieldTesters.h
 ===================================================================
--- haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/BitFieldTesters.h	  \
                (rev 0)
+++ haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/BitFieldTesters.h	2009-10-30 \
21:35:17 UTC (rev 33847) @@ -0,0 +1,121 @@
+/*
+ * Copyright 1999-2009 Haiku Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *		Jeremy Friesner
+ */
+
+
+#ifndef BitFieldTesters_h
+#define BitFieldTesters_h
+
+
+#include <Archivable.h>
+#include <List.h>
+#include <Message.h>
+
+
+// This file contains various BitTester classes, each of which defines a 
+// sequence of bit testing logics to do on a uint32.
+
+#ifndef __INTEL__
+#pragma export on 
+#endif
+
+// The abstract base class. Defines the interface.
+_EXPORT class BitFieldTester;
+class BitFieldTester : public BArchivable {
+public:
+							BitFieldTester();
+							BitFieldTester(BMessage* from);
+
+	virtual bool			IsMatching(uint32 field) = 0;
+	virtual status_t		Archive(BMessage* into, bool deep = true) const;
+};
+
+
+// This version always returns the value specified in the constructor.
+_EXPORT class ConstantFieldTester;
+class ConstantFieldTester : public BitFieldTester {
+public:
+							ConstantFieldTester(bool result);
+							ConstantFieldTester(BMessage* from);
+
+	virtual	status_t		Archive(BMessage* into, bool deep = true) const;
+	static	BArchivable*	Instantiate(BMessage* from);
+	virtual bool			IsMatching(uint32 field);
+
+private:
+			bool			fResult;
+};
+
+
+// This version matches if all requiredBits are found in the field,
+// and no forbiddenBits are found.
+_EXPORT class HasBitsFieldTester;
+class HasBitsFieldTester : public BitFieldTester {
+public:
+							HasBitsFieldTester(uint32 requiredBits, 
+								uint32 forbiddenBits = 0);
+							HasBitsFieldTester(BMessage* from);
+
+	virtual	status_t		Archive(BMessage* into, bool deep = true) const;
+	static	BArchivable*	Instantiate(BMessage* from);
+	virtual	bool			IsMatching(uint32 field);
+
+private:
+			uint32			fRequiredBits;
+			uint32			fForbiddenBits;
+};
+
+
+// This one negates the tester it holds.
+_EXPORT class NotFieldTester;
+class NotFieldTester : public BitFieldTester {
+public:
+	// (slave) should be allocated with new, becomes property of this object.
+							NotFieldTester(BitFieldTester* slave);
+							NotFieldTester(BMessage* from);
+							~NotFieldTester();
+
+	virtual	status_t		Archive(BMessage* into, bool deep = true) const;
+	static	BArchivable*	Instantiate(BMessage* from);
+	virtual	bool			IsMatching(uint32 field);
+
+private:
+			BitFieldTester*	fSlave;
+};
+
+
+// The most interesting class: This one returns true if at least (minNum) of
+// its slaves return true. It can be used for OR (i.e. minNum==1), AND 
+// (i.e. minNum==numberofchildren), or anything in between!
+_EXPORT class MinMatchFieldTester;
+class MinMatchFieldTester : public BitFieldTester {
+public:
+							MinMatchFieldTester(int minNum, 
+								bool deleteSlaves = true);
+							MinMatchFieldTester(BMessage* from);
+							~MinMatchFieldTester();
+
+	// (slave) should be allocated with new, becomes property of this object.
+			void			AddSlave(const BitFieldTester* slave);
+
+	virtual	status_t		Archive(BMessage* into, bool deep = true) const;
+	static	BArchivable*	Instantiate(BMessage* from);
+	virtual	bool			IsMatching(uint32 field);
+
+private:
+			BList			fSlaves;
+			int32			fMinNum;
+
+	// true if we should delete all our slaves when we are deleted.
+			bool			fDeleteSlaves;
+};
+
+#ifndef __INTEL__
+#pragma export reset 
+#endif
+
+#endif

Added: haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/CommandActuators.cpp
 ===================================================================
--- haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/CommandActuators.cpp	 \
                (rev 0)
+++ haiku/trunk/src/add-ons/input_server/filters/shortcut_catcher/CommandActuators.cpp	2009-10-30 \
21:35:17 UTC (rev 33847) @@ -0,0 +1,1713 @@
+/*
+ * Copyright 1999-2009 Haiku Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *		Jeremy Friesner
+ *		Fredrik Modéen
+ */
+
+
+#include "CommandActuators.h"
+
+
+#include <stdio.h>
+#include <stdlib.h>
+
+
+#include <String.h>
+#include <Roster.h>
+#include <Alert.h>
+#include <Screen.h>
+#include <Rect.h>
+#include <View.h>
+#include <Directory.h>
+#include <Entry.h>
+#include <List.h>
+#include <Beep.h>
+
+
+#include "ParseCommandLine.h"
+#include "KeyInfos.h"
+
+#define IS_KEY_DOWN(msg) ((msg->what == B_KEY_DOWN) \
+	|| (msg->what == B_UNMAPPED_KEY_DOWN))
+
+// Factory function
+CommandActuator* 
+CreateCommandActuator(const char* command)
+{
+	CommandActuator* act = NULL; 
+	int32 argc;
+	char** argv = ParseArgvFromString(command, argc);
+	if (command[0] == '*') {
+		if (argc > 0) {
+			char* c = argv[0] + 1;
+			if (strcmp(c, "InsertString") == 0) 
+				act = new KeyStrokeSequenceCommandActuator(argc, argv);
+			else if (strcmp(c, "MoveMouse") == 0)
+				act = new MoveMouseByCommandActuator(argc, argv);
+			else if (strcmp(c, "MoveMouseTo") == 0)
+				act = new MoveMouseToCommandActuator(argc, argv);
+			else if (strcmp(c, "MouseButton") == 0) 
+				act = new MouseButtonCommandActuator(argc, argv);
+			else if (strcmp(c, "LaunchHandler") == 0)
+				act = new MIMEHandlerCommandActuator(argc, argv);
+			else if (strcmp(c, "Multi") == 0) 
+				act = new MultiCommandActuator(argc, argv);
+			else if (strcmp(c, "MouseDown") == 0) 
+				act = new MouseDownCommandActuator(argc, argv);
+			else if (strcmp(c, "MouseUp") == 0) 
+				act = new MouseUpCommandActuator(argc, argv);
+			else if (strcmp(c, "SendMessage") == 0) 
+				act = new SendMessageCommandActuator(argc, argv);
+			else
+				act = new BeepCommandActuator(argc, argv);
+		}
+	} else
+		act = new LaunchCommandActuator(argc, argv);
+
+	FreeArgv(argv);
+	return act;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// CommandActuator
+//
+///////////////////////////////////////////////////////////////////////////////
+CommandActuator::CommandActuator(int32 argc, char** argv)
+{
+	// empty
+}
+
+
+CommandActuator::CommandActuator(BMessage* from)
+	:
+	BArchivable(from)
+{
+	// empty
+}
+
+
+status_t
+CommandActuator::Archive(BMessage* into, bool deep) const
+{
+	status_t ret = BArchivable::Archive(into, deep);
+	return ret;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// LaunchCommandActuator
+//
+///////////////////////////////////////////////////////////////////////////////
+LaunchCommandActuator::LaunchCommandActuator(int32 argc, char** argv)
+	:
+	CommandActuator(argc, argv), 
+	fArgv(CloneArgv(argv)), 
+	fArgc(argc)
+{
+	// empty
+}
+
+
+LaunchCommandActuator::LaunchCommandActuator(BMessage* from)
+	:
+	CommandActuator(from)
+{
+	BList argList;
+	const char* temp;
+	int idx = 0;
+	while (from->FindString("largv", idx++, &temp) == B_NO_ERROR) {
+		if (temp) {
+			char* copy = new char[strlen(temp) + 1];
+			strcpy(copy, temp);
+			argList.AddItem(copy);
+		}
+	}
+
+	fArgc = argList.CountItems();
+	fArgv = new char*[fArgc+ 1];
+	
+	for (int i = 0; i < fArgc; i++) 
+		fArgv[i] = (char*) argList.ItemAt(i);
+	
+	fArgv[fArgc] = NULL;// terminate the array
+}
+
+
+LaunchCommandActuator::~LaunchCommandActuator()
+{
+	FreeArgv(fArgv);
+}
+
+
+filter_result
+LaunchCommandActuator::KeyEvent(const BMessage* keyMsg, BList* outlist, 
+	void** setAsyncData, BMessage* lastMouseMove)
+{
+	if (IS_KEY_DOWN(keyMsg)) {
+		// cause KeyEventAsync() to be called asynchronously
+		*setAsyncData = (void*) true;
+	}
+	return B_SKIP_MESSAGE;
+}
+
+
+status_t
+LaunchCommandActuator::Archive(BMessage* into, bool deep) const
+{
+	status_t ret = CommandActuator::Archive(into, deep);
+	
+	for (int i = 0; i < fArgc; i++)
+		into->AddString("largv", fArgv[i]);
+
+	return ret;
+}
+
+
+BArchivable*
+LaunchCommandActuator ::Instantiate(BMessage* from)
+{
+	if (validate_instantiation(from, "LaunchCommandActuator"))
+		return new LaunchCommandActuator(from);
+	else
+		return NULL;
+}
+
+
+void
+LaunchCommandActuator::KeyEventAsync(const BMessage* keyMsg, 
+	void* asyncData)
+{
+	if (be_roster) {
+		status_t err = B_OK;
+		BString str;		
+		BString str1("Shortcuts Launcher Error");
+		if (fArgc < 1)
+			str << "You didn't specify a command for this hotkey.";
+		else if ((err = LaunchCommand(fArgv, fArgc)) != B_NO_ERROR) {
+			str << "Can't launch " << fArgv[0];
+			str << ", no such file exists.";
+			str << " Please check your Shortcuts settings.";
+		}
+
+		if (fArgc < 1 || err != B_NO_ERROR)
+			(new BAlert(str1.String(), str.String(), "Ok"))->Go(NULL);	
+	}
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// MouseCommandActuator
+//
+///////////////////////////////////////////////////////////////////////////////
+MouseCommandActuator::MouseCommandActuator(int32 argc, char** argv)
+	:
+	CommandActuator(argc, argv), 
+	fWhichButtons(B_PRIMARY_MOUSE_BUTTON)
+{
+	if (argc > 1) {
+		fWhichButtons = 0;
+
+		for (int i = 1; i < argc; i++) {
+			int buttonNumber = atoi(argv[i]);
+			
+			switch(buttonNumber) {
+				case 1: 
+					fWhichButtons |= B_PRIMARY_MOUSE_BUTTON;
+				break;
+				case 2:
+					fWhichButtons |= B_SECONDARY_MOUSE_BUTTON;
+				break;
+				case 3:
+					fWhichButtons |= B_TERTIARY_MOUSE_BUTTON;
+				break;
+			}
+		}
+	}
+}
+
+
+MouseCommandActuator::MouseCommandActuator(BMessage* from)
+	:
+	CommandActuator(from),
+	fWhichButtons(B_PRIMARY_MOUSE_BUTTON)
+{
+	from->FindInt32("buttons", &fWhichButtons);
+}
+
+
+MouseCommandActuator::~MouseCommandActuator()
+{
+	// empty
+}
+
+
+status_t
+MouseCommandActuator::Archive(BMessage* into, bool deep) const
+{
+	status_t ret = CommandActuator::Archive(into, deep);
+	into->AddInt32("buttons", fWhichButtons); 
+	return ret;
+}
+
+
+int32
+MouseCommandActuator::_GetWhichButtons() const
+{
+	return fWhichButtons;
+}
+
+
+void
+MouseCommandActuator::_GenerateMouseButtonEvent(bool mouseDown, 
+	const BMessage* keyMsg, BList* outlist, BMessage* lastMouseMove)
+{ 
+	BMessage* fakeMouse = new BMessage(*lastMouseMove);
+	fakeMouse->what = mouseDown ? B_MOUSE_DOWN : B_MOUSE_UP;
+ 
+	// Update the buttons to reflect which mouse buttons we are faking
+	fakeMouse->RemoveName("buttons");
+	
+	if (mouseDown) 
+		fakeMouse->AddInt32("buttons", fWhichButtons); 
+
+	// Trey sez you gotta keep then "when"'s increasing if you want 
+	// click & drag to work!
+	int64 when;
+	
+	const BMessage* lastMessage;
+	
+	if (outlist->CountItems() > 0) {
+		int nr = outlist->CountItems() - 1;
+		lastMessage = (const BMessage*)outlist->ItemAt(nr);
+	} else
+		lastMessage =keyMsg;
+	
+	if (lastMessage->FindInt64("when", &when) == B_NO_ERROR) {
+		when++;
+		fakeMouse->RemoveName("when");
+		fakeMouse->AddInt64("when", when);
+	}
+	outlist->AddItem(fakeMouse);
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// MouseDownCommandActuator
+//
+///////////////////////////////////////////////////////////////////////////////
+MouseDownCommandActuator::MouseDownCommandActuator(int32 argc, char** argv)
+	:
+	MouseCommandActuator(argc, argv)
+{
+	// empty
+}
+
+
+MouseDownCommandActuator::MouseDownCommandActuator(BMessage* from)
+	:
+	MouseCommandActuator(from)
+{
+	// empty
+}
+
+
+MouseDownCommandActuator::~MouseDownCommandActuator()
+{
+	// empty
+}
+
+
+filter_result
+MouseDownCommandActuator::KeyEvent(const BMessage* keyMsg, BList* outlist, 
+	void** setAsyncData, BMessage* lastMouseMove)
+{
+	if (IS_KEY_DOWN(keyMsg)) 
+		_GenerateMouseButtonEvent(true, keyMsg, outlist, lastMouseMove);
+	
+	return B_DISPATCH_MESSAGE;
+}
+
+
+status_t
+MouseDownCommandActuator::Archive(BMessage* into, bool deep) const
+{
+	return MouseCommandActuator::Archive(into, deep);
+}
+
+
+BArchivable*
+MouseDownCommandActuator ::Instantiate(BMessage* from)
+{
+	if (validate_instantiation(from, "MouseDownCommandActuator")) 
+		return new MouseDownCommandActuator(from);
+	else
+		return NULL;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// MouseUpCommandActuator
+//
+///////////////////////////////////////////////////////////////////////////////
+MouseUpCommandActuator::MouseUpCommandActuator(int32 argc, char** argv)
+	:
+	MouseCommandActuator(argc, argv)
+{
+	// empty
+}
+
+
+MouseUpCommandActuator::MouseUpCommandActuator(BMessage* from)
+	:
+	MouseCommandActuator(from)
+{
+	// empty
+}
+
+
+MouseUpCommandActuator::~MouseUpCommandActuator()
+{
+	// empty
+}
+
+
+filter_result
+MouseUpCommandActuator::KeyEvent(const BMessage* keyMsg, BList* outlist, 
+	void** setAsyncData, BMessage* lastMouseMove)
+{
+	if (IS_KEY_DOWN(keyMsg)) 
+		_GenerateMouseButtonEvent(false, keyMsg, outlist, lastMouseMove);
+	return B_DISPATCH_MESSAGE;
+}
+
+
+status_t
+MouseUpCommandActuator::Archive(BMessage* into, bool deep) const
+{
+	return MouseCommandActuator::Archive(into, deep);
+}
+
+
+BArchivable*
+MouseUpCommandActuator ::Instantiate(BMessage* from)
+{
+	if (validate_instantiation(from, "MouseUpCommandActuator")) 
+		return new MouseUpCommandActuator(from);
+	else
+		return NULL;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// MouseButtonCommandActuator
+//
+///////////////////////////////////////////////////////////////////////////////
+MouseButtonCommandActuator::MouseButtonCommandActuator(int32 argc, char** argv)
+	:
+	MouseCommandActuator(argc, argv),
+	fKeyDown(false)
+{
+	// empty
+}
+
+
+MouseButtonCommandActuator::MouseButtonCommandActuator(BMessage* from)
+	:
+	MouseCommandActuator(from),
+	fKeyDown(false)
+{
+	// empty
+}
+
+
+MouseButtonCommandActuator::~MouseButtonCommandActuator()
+{
+	// empty
+}
+
+
+filter_result
+MouseButtonCommandActuator::KeyEvent(const BMessage* keyMsg, BList* outlist, 
+	void** setAsyncData, BMessage* lastMouseMove)
+{
+	if (IS_KEY_DOWN(keyMsg) != fKeyDown) {
+		_GenerateMouseButtonEvent(IS_KEY_DOWN(keyMsg), keyMsg, outlist, 
+			lastMouseMove);
+		fKeyDown = IS_KEY_DOWN(keyMsg);
+		return B_DISPATCH_MESSAGE;
+	} else
+		// This will handle key-repeats, which we don't want turned into lots 
+		// of B_MOUSE_DOWN messages.
+		return B_SKIP_MESSAGE;
+}
+
+
+status_t
+MouseButtonCommandActuator::Archive(BMessage* into, bool deep) const
+{
+	return MouseCommandActuator::Archive(into, deep);
+}
+
+
+BArchivable*
+MouseButtonCommandActuator ::Instantiate(BMessage* from)
+{
+	if (validate_instantiation(from, "MouseButtonCommandActuator")) 
+		return new MouseButtonCommandActuator(from);
+	else
+		return NULL;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// KeyStrokeSequenceCommandActuator
+//
+///////////////////////////////////////////////////////////////////////////////
+KeyStrokeSequenceCommandActuator::KeyStrokeSequenceCommandActuator(int32 argc, 
+	char** argv)
+	:
+	CommandActuator(argc, argv)
+{
+	for (int s = 1; s < argc; s++) {
+		fSequence.Append(argv[s]);
+		if (s < argc - 1)
+			fSequence.Append(" ");
+	}
+
+	// Find any insert-unicode-here sequences and replace them with spaces...
+	int32 nextStart;
+	while ((nextStart = fSequence.FindFirst("$$")) >= 0) {
+		int32 nextEnd = fSequence.FindFirst("$$", nextStart + 2);
+		if (nextEnd >= 0) {
+			uint32 customKey= 0;
+			int32 unicodeVal= 0;
+			uint32 customMods = 0;
+			BString sub; 
+			fSequence.CopyInto(sub, nextStart + 2, nextEnd-(nextStart + 2));
+			sub.ToLower();
+			
+			if ((sub.FindFirst('-') >= 0) || ((sub.Length() > 0)
+				&& ((sub.String()[0] < '0') || (sub.String()[0] > '9')))) {
+			
+				const char* s = sub.String();
+				while (*s == '-') s++;// go past any initial dashes
+
+				bool lastWasDash = true;
+				while (*s) {			
+					if (lastWasDash) {
+						if (strncmp(s, "shift",5) == 0)
+							customMods |=B_LEFT_SHIFT_KEY| B_SHIFT_KEY;
+						else if (strncmp(s, "leftsh", 6) == 0) 
+							customMods |=B_LEFT_SHIFT_KEY| B_SHIFT_KEY;
+						else if (strncmp(s, "rightsh",7) == 0) 
+							customMods |=B_RIGHT_SHIFT_KEY | B_SHIFT_KEY;
+						else if (strncmp(s, "alt",3) == 0) 
+							customMods |=B_LEFT_COMMAND_KEY| B_COMMAND_KEY;
+						else if (strncmp(s, "leftalt",7) == 0) 
+							customMods |=B_LEFT_COMMAND_KEY| B_COMMAND_KEY;
+						else if (strncmp(s, "rightalt", 8) == 0) 
+							customMods |=B_RIGHT_COMMAND_KEY | B_COMMAND_KEY;
+						else if (strncmp(s, "com",3) == 0) 
+							customMods |=B_LEFT_COMMAND_KEY| B_COMMAND_KEY;
+						else if (strncmp(s, "leftcom",7) == 0) 
+							customMods |=B_LEFT_COMMAND_KEY| B_COMMAND_KEY;
+						else if (strncmp(s, "rightcom", 8) == 0) 
+							customMods |=B_RIGHT_COMMAND_KEY | B_COMMAND_KEY;
+						else if (strncmp(s, "con",3) == 0) 
+							customMods |=B_LEFT_CONTROL_KEY| B_CONTROL_KEY;
+						else if (strncmp(s, "leftcon",7) == 0) 
+							customMods |=B_LEFT_CONTROL_KEY| B_CONTROL_KEY;
+						else if (strncmp(s, "rightcon", 8) == 0) 
+							customMods |=B_RIGHT_CONTROL_KEY | B_CONTROL_KEY;
+						else if (strncmp(s, "win",3) == 0) 
+							customMods |=B_LEFT_OPTION_KEY | B_OPTION_KEY;
+						else if (strncmp(s, "leftwin",7) == 0) 
+							customMods |=B_LEFT_OPTION_KEY | B_OPTION_KEY;
+						else if (strncmp(s, "rightwin", 8) == 0) 
+							customMods |=B_RIGHT_OPTION_KEY| B_OPTION_KEY;
+						else if (strncmp(s, "opt",3) == 0) 
+							customMods |=B_LEFT_OPTION_KEY | B_OPTION_KEY;
+						else if (strncmp(s, "leftopt",7) == 0) 
+							customMods |=B_LEFT_OPTION_KEY | B_OPTION_KEY;
+						else if (strncmp(s, "rightopt", 8) == 0) 
+							customMods |=B_RIGHT_OPTION_KEY| B_OPTION_KEY;
+						else if (strncmp(s, "menu", 4) == 0) 
+							customMods |=B_MENU_KEY;
+						else if (strncmp(s, "caps", 4) == 0) 

[... truncated: 2873 lines follow ...]


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic