diff --git a/src/add-ons/input_server/devices/virtualkeyboard/Jamfile b/src/add-ons/input_server/devices/virtualkeyboard/Jamfile
index 661c3e3974..a0431bd65d 100644
--- a/src/add-ons/input_server/devices/virtualkeyboard/Jamfile
+++ b/src/add-ons/input_server/devices/virtualkeyboard/Jamfile
@@ -2,16 +2,14 @@ SubDir HAIKU_TOP src apps virtualkeyboard ;
UsePrivateHeaders interface shared ;
-Application VirtualKeyboard :
+Addon VirtualKeyboard :
KeyboardLayout.cpp
KeyboardLayoutView.cpp
Keymap.cpp
KeymapListItem.cpp
- VirtualKeyboardApp.cpp
VirtualKeyboardWindow.cpp
- : be tracker localestub libshared.a $(TARGET_LIBSTDC++)
- : VirtualKeyboard.rdef
+ : be tracker input_server localestub libshared.a $(TARGET_LIBSTDC++)
;
DoCatalogs Sudoku :
@@ -21,6 +19,5 @@ DoCatalogs Sudoku :
KeyboardLayoutView.cpp
Keymap.cpp
KeymapListItem.cpp
- VirtualKeyboardApp.cpp
VirtualKeyboardWindow.cpp
;
diff --git a/src/add-ons/input_server/devices/virtualkeyboard/KeyboardLayoutView.cpp b/src/add-ons/input_server/devices/virtualkeyboard/KeyboardLayoutView.cpp
index 5a8fa79bc8..310db946a3 100644
--- a/src/add-ons/input_server/devices/virtualkeyboard/KeyboardLayoutView.cpp
+++ b/src/add-ons/input_server/devices/virtualkeyboard/KeyboardLayoutView.cpp
@@ -70,6 +70,13 @@ KeyboardLayoutView::SetKeymap(Keymap* keymap)
}
+void
+KeyboardLayoutView::SetEditable(bool editable)
+{
+ fEditable = editable;
+}
+
+
void
KeyboardLayoutView::SetTarget(BMessenger target)
{
@@ -235,80 +242,7 @@ void
KeyboardLayoutView::MouseMoved(BPoint point, uint32 transit,
const BMessage* dragMessage)
{
- if (fKeymap == NULL)
- return;
-
- // prevent dragging for tertiary mouse button
- if ((fButtons & B_TERTIARY_MOUSE_BUTTON) != 0)
- return;
-
- if (dragMessage != NULL) {
- if (fEditable) {
- _InvalidateKey(fDropTarget);
- fDropPoint = point;
-
- _EvaluateDropTarget(point);
- }
-
- return;
- }
-
- int32 buttons;
- if (Window()->CurrentMessage() == NULL
- || Window()->CurrentMessage()->FindInt32("buttons", &buttons) != B_OK
- || buttons == 0)
- return;
-
- if (fDragKey == NULL && (fabs(point.x - fClickPoint.x) > 4
- || fabs(point.y - fClickPoint.y) > 4)) {
- // start dragging
- Key* key = _KeyAt(fClickPoint);
- if (key == NULL)
- return;
-
- BRect frame = _FrameFor(key);
- BPoint offset = fClickPoint - frame.LeftTop();
- frame.OffsetTo(B_ORIGIN);
-
- BRect rect = frame;
- rect.right--;
- rect.bottom--;
- BBitmap* bitmap = new BBitmap(rect, B_RGBA32, true);
- bitmap->Lock();
-
- BView* view = new BView(rect, "drag", B_FOLLOW_NONE, 0);
- bitmap->AddChild(view);
-
- view->SetHighColor(0, 0, 0, 0);
- view->FillRect(view->Bounds());
- view->SetDrawingMode(B_OP_ALPHA);
- view->SetHighColor(0, 0, 0, 128);
- // set the level of transparency by value
- view->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_COMPOSITE);
- _DrawKey(view, frame, key, frame, false);
-
- view->Sync();
- bitmap->Unlock();
-
- BMessage drag(B_MIME_DATA);
- drag.AddInt32("key", key->code);
-
- char* string;
- int32 numBytes;
- fKeymap->GetChars(key->code, fModifiers, fDeadKey, &string,
- &numBytes);
- if (string != NULL) {
- drag.AddData("text/plain", B_MIME_DATA, string, numBytes);
- delete[] string;
- }
-
- DragMessage(&drag, bitmap, B_OP_ALPHA, offset);
- fDragKey = key;
- fDragModifiers = fModifiers;
-
- fKeyState[key->code / 8] &= ~(1 << (7 - (key->code & 7)));
- _InvalidateKey(key);
- }
+
}
diff --git a/src/add-ons/input_server/devices/virtualkeyboard/VirtualKeyboardApp.cpp b/src/add-ons/input_server/devices/virtualkeyboard/VirtualKeyboardApp.cpp
deleted file mode 100644
index 59e04ce24c..0000000000
--- a/src/add-ons/input_server/devices/virtualkeyboard/VirtualKeyboardApp.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2014 Freeman Lou
- * All rights reserved. Distributed under the terms of the MIT license.
- */
-
-#include
-
-#include "VirtualKeyboardWindow.h"
-
-class VirtualKeyboardApp : public BApplication{
-public:
- VirtualKeyboardApp();
-private:
- VirtualKeyboardWindow* fWindow;
-};
-
-
-VirtualKeyboardApp::VirtualKeyboardApp()
- :
- BApplication("application/x-vnd.VirtualKeyboard")
-{
- fWindow = new VirtualKeyboardWindow();
- fWindow->Show();
-}
-
-
-int
-main()
-{
- VirtualKeyboardApp app;
- app.Run();
-
- return 0;
-}
diff --git a/src/add-ons/input_server/devices/virtualkeyboard/VirtualKeyboardWindow.cpp b/src/add-ons/input_server/devices/virtualkeyboard/VirtualKeyboardWindow.cpp
index c1d3aa2d9b..8d7b9989be 100644
--- a/src/add-ons/input_server/devices/virtualkeyboard/VirtualKeyboardWindow.cpp
+++ b/src/add-ons/input_server/devices/virtualkeyboard/VirtualKeyboardWindow.cpp
@@ -4,27 +4,155 @@
*/
#include "VirtualKeyboardWindow.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
#include
#include "KeyboardLayoutView.h"
#include "KeymapListItem.h"
-#include "Keymap.h"
+
+static const uint32 kMsgMenuFontChange = 'MMFC';
+
+static int
+compare_key_list_items(const void* a, const void* b)
+{
+ KeymapListItem* item1 = *(KeymapListItem**)a;
+ KeymapListItem* item2 = *(KeymapListItem**)b;
+
+ return BLocale::Default()->StringCompare(item1->Text(), item2->Text());
+}
+
VirtualKeyboardWindow::VirtualKeyboardWindow()
:
BWindow(BRect(0,0,0,0),"Virtual Keyboard",
B_NO_BORDER_WINDOW_LOOK, B_FLOATING_ALL_WINDOW_FEEL,
- B_NOT_RESIZABLE | B_WILL_ACCEPT_FIRST_CLICK)
+ B_WILL_ACCEPT_FIRST_CLICK | B_AVOID_FRONT)
{
BScreen screen;
BRect screenRect(screen.Frame());
+
ResizeTo(screenRect.Width(), screenRect.Height()/3);
MoveTo(0,screenRect.Height()-screenRect.Height()/3);
+
+ SetLayout(new BGroupLayout(B_VERTICAL));
+
+ //Add to an options window later, use as list for now
+ fMapListView = new BListView("Maps");
+ fFontMenu = new BMenu("Font");
+ fLayoutMenu = new BMenu("Layout");
+
+ _LoadMaps();
+ _LoadLayouts(fLayoutMenu);
+ _LoadFonts();
- Keymap keymap;
+ KeymapListItem* current =
+ static_cast(fMapListView->FirstItem());
+ fCurrentKeymap.Load(current->EntryRef());
+
fKeyboardView = new KeyboardLayoutView("Keyboard");
- fKeyboardView->SetKeymap(&keymap);
- AddChild(fKeyboardView);
+ fKeyboardView->GetKeyboardLayout()->SetDefault();
+ fKeyboardView->SetEditable(false);
+ fKeyboardView->SetKeymap(&fCurrentKeymap);
+
+ AddChild(BGroupLayoutBuilder(B_VERTICAL)
+ .Add(fKeyboardView));
+}
+
+
+void
+VirtualKeyboardWindow::_LoadLayouts(BMenu* menu)
+{
+ directory_which dataDirectories[] = {
+ B_USER_NONPACKAGED_DATA_DIRECTORY,
+ B_USER_DATA_DIRECTORY,
+ B_SYSTEM_NONPACKAGED_DIRECTORY,
+ B_SYSTEM_DATA_DIRECTORY,
+ };
+
+ for (uint i = 0; i < sizeof(dataDirectories)/sizeof(directory_which); i++) {
+ BPath path;
+ if (find_directory(dataDirectories[i], &path) != B_OK)
+ continue;
+
+ path.Append("KeyboardLayouts");
+
+ BDirectory directory;
+ if (directory.SetTo(path.Path()) == B_OK)
+ _LoadLayoutMenu(menu, directory);
+ }
+}
+
+
+void
+VirtualKeyboardWindow::_LoadLayoutMenu(BMenu* menu, BDirectory directory)
+{
+ entry_ref ref;
+
+ while (directory.GetNextRef(&ref) == B_OK) {
+ if (menu->FindItem(ref.name) != NULL)
+ continue;
+
+ BDirectory subdirectory;
+ subdirectory.SetTo(&ref);
+ if (subdirectory.InitCheck() == B_OK) {
+ BMenu* submenu = new BMenu(ref.name);
+ _LoadLayoutMenu(submenu, subdirectory);
+ menu->AddItem(submenu);
+ } else {
+ //BMessage* message = new BMessage(kChangeKeyboardLayout);
+ //message->AddRed("ref",&ref);
+ menu->AddItem(new BMenuItem(ref.name, NULL));
+ }
+ }
+}
+
+
+void
+VirtualKeyboardWindow::_LoadMaps()
+{
+ BPath path;
+ if (find_directory(B_SYSTEM_DATA_DIRECTORY, &path) != B_OK)
+ return;
+
+ path.Append("Keymaps");
+ BDirectory directory;
+ entry_ref ref;
+
+ if (directory.SetTo(path.Path()) == B_OK) {
+ while (directory.GetNextRef(&ref) == B_OK) {
+ fMapListView->AddItem(new KeymapListItem(ref));
+ }
+ }
+ fMapListView->SortItems(&compare_key_list_items);
+}
+
+
+void
+VirtualKeyboardWindow::_LoadFonts()
+{
+ int32 numFamilies = count_font_families();
+ font_family family, currentFamily;
+ font_style currentStyle;
+ uint32 flags;
+
+ be_plain_font->GetFamilyAndStyle(¤tFamily,¤tStyle);
+
+ for (int32 i = 0; i< numFamilies; i++) {
+ if (get_font_family(i, &family, &flags) == B_OK) {
+ BMenuItem* item = new BMenuItem(family, NULL); //new BMessage(kMsgMenuFontChanged));
+ fFontMenu->AddItem(item);
+ if (!strcmp(family, currentFamily))
+ item->SetMarked(true);
+ }
+ }
}
diff --git a/src/add-ons/input_server/devices/virtualkeyboard/VirtualKeyboardWindow.h b/src/add-ons/input_server/devices/virtualkeyboard/VirtualKeyboardWindow.h
index df5326d169..1813dc4214 100644
--- a/src/add-ons/input_server/devices/virtualkeyboard/VirtualKeyboardWindow.h
+++ b/src/add-ons/input_server/devices/virtualkeyboard/VirtualKeyboardWindow.h
@@ -7,15 +7,33 @@
#include
-class KeyboardLayoutView;
+#include
+#include "Keymap.h"
+
+class KeyboardLayoutView;
+class Keymap;
+class BDirectory;
+class BListView;
+class BMenu;
class VirtualKeyboardWindow : public BWindow{
public:
VirtualKeyboardWindow();
- virtual void MessageReceived(BMessage* message);
+ virtual void MessageReceived(BMessage* message);
+
private:
KeyboardLayoutView* fKeyboardView;
+ BListView* fMapListView;
+ BMenu* fFontMenu;
+ BMenu* fLayoutMenu;
+ Keymap fCurrentKeymap;
+
+private:
+ void _LoadLayouts(BMenu* menu);
+ void _LoadLayoutMenu(BMenu* menu, BDirectory directory);
+ void _LoadMaps();
+ void _LoadFonts();
};
#endif // VIRTUAL_KEYBOARD_WINDOW_H