diff --git a/src/core/UBPreferencesController.cpp b/src/core/UBPreferencesController.cpp index 8fb442cc..ff357ee9 100644 --- a/src/core/UBPreferencesController.cpp +++ b/src/core/UBPreferencesController.cpp @@ -106,8 +106,13 @@ void UBPreferencesController::wire() // OSK preferences - mPreferencesUI->keyboardPaletteKeyButtonSize->addItem("29x29"); - mPreferencesUI->keyboardPaletteKeyButtonSize->addItem("41x41"); + + for(int i = 0; i < settings->supportedKeyboardSizes->size(); i++) + mPreferencesUI->keyboardPaletteKeyButtonSize->addItem(settings->supportedKeyboardSizes->at(i)); + +// mPreferencesUI->keyboardPaletteKeyButtonSize->addItem("29x29"); +// mPreferencesUI->keyboardPaletteKeyButtonSize->addItem("30x30"); +// mPreferencesUI->keyboardPaletteKeyButtonSize->addItem("41x41"); connect(mPreferencesUI->keyboardPaletteKeyButtonSize, SIGNAL(currentIndexChanged(const QString &)), settings->boardKeyboardPaletteKeyBtnSize, SLOT(setString(const QString &))); diff --git a/src/core/UBSettings.cpp b/src/core/UBSettings.cpp index 5a7638d6..84511d6a 100644 --- a/src/core/UBSettings.cpp +++ b/src/core/UBSettings.cpp @@ -120,6 +120,8 @@ QSettings* UBSettings::getAppSettings() UBSettings::UBSettings(QObject *parent) : QObject(parent) { + InitKeyboardPaletteKeyBtnSizes(); + mAppSettings = UBSettings::getAppSettings(); QString userSettingsFile = UBSettings::uniboardDataDirectory() + "/UniboardUser.config"; @@ -133,8 +135,38 @@ UBSettings::UBSettings(QObject *parent) UBSettings::~UBSettings() { delete mAppSettings; + + if(supportedKeyboardSizes) + delete supportedKeyboardSizes; +} + +void UBSettings::InitKeyboardPaletteKeyBtnSizes() +{ + supportedKeyboardSizes = new QStringList(); + supportedKeyboardSizes->append("29x29"); + supportedKeyboardSizes->append("41x41"); } +void UBSettings::ValidateKeyboardPaletteKeyBtnSize() +{ + // if boardKeyboardPaletteKeyBtnSize is not initialized, or supportedKeyboardSizes not initialized or empty + if( !boardKeyboardPaletteKeyBtnSize || + !supportedKeyboardSizes || + supportedKeyboardSizes->size() == 0 ) return; + + // get original size value + QString origValue = boardKeyboardPaletteKeyBtnSize->get().toString(); + + // parse available size values, for make sure original value is valid + for(int i = 0; i < supportedKeyboardSizes->size(); i++) + { + int compareCode = QString::compare(origValue, supportedKeyboardSizes->at(i)); + if(compareCode == 0) return; + } + + // if original value is invalid, than set it value to first value from avaliable list + boardKeyboardPaletteKeyBtnSize->set(supportedKeyboardSizes->at(0)); +} void UBSettings::init() { @@ -192,7 +224,8 @@ void UBSettings::init() boardUseHighResTabletEvent = new UBSetting(this, "Board", "UseHighResTabletEvent", true); // boardKeyboardPaletteAutoMinimize = new UBSetting(this, "Board", "KeyboardPaletteAutoMinimize", true); - boardKeyboardPaletteKeyBtnSize = new UBSetting(this, "Board", "KeyboardPaletteKeyBtnSize", "24x24"); + boardKeyboardPaletteKeyBtnSize = new UBSetting(this, "Board", "KeyboardPaletteKeyBtnSize", "16x16"); + ValidateKeyboardPaletteKeyBtnSize(); QStringList penLightBackgroundColors; penLightBackgroundColors << "#000000" << "#FF0000" <<"#004080" << "#008000" << "#C87400" << "#800040" << "#008080" << "#5F2D0A"; diff --git a/src/core/UBSettings.h b/src/core/UBSettings.h index 4c48705b..b93767ee 100644 --- a/src/core/UBSettings.h +++ b/src/core/UBSettings.h @@ -37,6 +37,11 @@ class UBSettings : public QObject public: + QStringList* supportedKeyboardSizes; + void InitKeyboardPaletteKeyBtnSizes(); + void ValidateKeyboardPaletteKeyBtnSize(); + + int penWidthIndex(); qreal currentPenWidth(); diff --git a/src/desktop/UBDesktopAnnotationController.cpp b/src/desktop/UBDesktopAnnotationController.cpp index 6010591d..d7a4a9cd 100644 --- a/src/desktop/UBDesktopAnnotationController.cpp +++ b/src/desktop/UBDesktopAnnotationController.cpp @@ -88,7 +88,8 @@ UBDesktopAnnotationController::UBDesktopAnnotationController(QObject *parent) if (UBPlatformUtils::hasVirtualKeyboard()) { mKeyboardPalette = UBKeyboardPalette::create(mTransparentDrawingView); - //mKeyboardPalette->setParent(mTransparentDrawingView); + mKeyboardPalette->setParent(mTransparentDrawingView); + connect(mKeyboardPalette, SIGNAL(keyboardActivated(bool)), mTransparentDrawingView, SLOT(virtualKeyboardActivated(bool))); } connect(mDesktopPalette, SIGNAL(uniboardClick()), this, SLOT(goToUniboard())); diff --git a/src/frameworks/UBPlatformUtils_win.cpp b/src/frameworks/UBPlatformUtils_win.cpp index 294a9117..b74e1f4f 100644 --- a/src/frameworks/UBPlatformUtils_win.cpp +++ b/src/frameworks/UBPlatformUtils_win.cpp @@ -363,7 +363,7 @@ void UBPlatformUtils::initializeKeyboardLayouts() void UBPlatformUtils::destroyKeyboardLayouts() { - for(int i=0; i<4; i++) + for(int i=0; iactionVirtualKeyboard->activate(QAction.Trigger); + UBApplication::mainWindow->actionVirtualKeyboard->activate(QAction::Trigger); } void UBKeyboardPalette::syncPosition(const QPoint & pos) @@ -125,20 +123,20 @@ void UBKeyboardPalette::setInput(const UBKeyboardLocale* locale) UBKeyboardPalette::~UBKeyboardPalette() { - for (int i=0; i<47; i++) - delete buttons[i]; + //for (int i=0; i<47; i++) + // delete buttons[i]; delete [] buttons; - for (int i=0; i<8; i++) - delete ctrlButtons[i]; + //for (int i=0; i<8; i++) + // delete ctrlButtons[i]; delete [] ctrlButtons; - if (locales!=NULL) - { - for (int i=0; i. */ -#include "UBKeyboardPalette.h" - -#include -#include - - -// The key code to be sent. -// A full list of available codes can be found in /usr/include/X11/keysymdef.h -//#define KEYCODE XK_Down - -// Function to create a keyboard event -XKeyEvent createKeyEvent(Display *display, Window &win, - Window &winRoot, bool press, - int keycode, int modifiers) -{ - XKeyEvent event; - - event.display = display; - event.window = win; - event.root = winRoot; - event.subwindow = None; - event.time = CurrentTime; - event.x = 1; - event.y = 1; - event.x_root = 1; - event.y_root = 1; - event.same_screen = True; - event.keycode = keycode; - event.state = modifiers; - - if(press) - event.type = KeyPress; - else - event.type = KeyRelease; - - return event; -} - -void x11SendKey(Display *display, int keyCode, int modifiers) -{ - -// Get the root window for the current display. - Window winRoot = XDefaultRootWindow(display); - if (winRoot==0) - return; - -// Find the window which has the current keyboard focus. - Window winFocus; - int revert; - XGetInputFocus(display, &winFocus, &revert); - -// Send a fake key press event to the window. - XKeyEvent event = createKeyEvent(display, winFocus, winRoot, true, keyCode, modifiers); - XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event); - -// Send a fake key release event to the window. - event = createKeyEvent(display, winFocus, winRoot, false, keyCode, modifiers); - XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event); -} - -void UBKeyboardButton::sendUnicodeSymbol(unsigned int nSymbol1, unsigned int nSymbol2, bool shift) -{ - unsigned int nSymbol = shift ? nSymbol2 : nSymbol1; - // Obtain the X11 display. - Display *display = XOpenDisplay(0); - if(display == NULL) - return; - - KeyCode keyCode = XKeysymToKeycode(display, nSymbol); - - if (keyCode != NoSymbol) - { - x11SendKey(display, keyCode, shift); - } - - XCloseDisplay(display); -} - -void UBKeyboardButton::sendControlSymbol(int nSymbol) -{ - // Obtain the X11 display. - Display *display = XOpenDisplay(0); - if(display == NULL) - return; - - KeyCode keyCode = XKeysymToKeycode(display, nSymbol); - - if (keyCode != NoSymbol) - { - x11SendKey(display, keyCode, 0); - } - - XCloseDisplay(display); -} - -void UBKeyboardPalette::createCtrlButtons() -{ - ctrlButtons = new UBKeyboardButton*[8]; - - ctrlButtons[0] = new UBCntrlButton(this, "<-", XK_BackSpace); - ctrlButtons[1] = new UBCntrlButton(this, "<->", XK_Tab); - ctrlButtons[2] = new UBCntrlButton(this, "Enter", XK_Return); - ctrlButtons[3] = new UBCapsLockButton(this); - ctrlButtons[4] = new UBCapsLockButton(this); - ctrlButtons[5] = new UBLocaleButton(this); - ctrlButtons[6] = new UBCntrlButton(this, "", XK_space); - ctrlButtons[7] = new UBLocaleButton(this); -} - - -void UBKeyboardPalette::onActivated(bool activated) -{ - if (activated) - { - Display *display = XOpenDisplay(0); - if(display == NULL) - return; - - XDisplayKeycodes(display, &this->min_keycodes, &this->max_keycodes); - KeySym* keySyms = XGetKeyboardMapping(display, min_keycodes, - max_keycodes - min_keycodes, &this->byte_per_code); - - storage = keySyms; - - XCloseDisplay(display); - - onLocaleChanged(locales[nCurrentLocale]); - } - else - { - Display *display = XOpenDisplay(0); - if(display == NULL) - return; - - KeySym* keySyms = (KeySym*)storage; - if (keySyms!=NULL) - { - - XChangeKeyboardMapping(display, min_keycodes, byte_per_code, - keySyms, max_keycodes - min_keycodes); - XFree(keySyms); - } - - - XCloseDisplay(display); - } - -} - - -void setSymbolsFromButton(Display *display, - const UBKeyboardLocale& locale, - int byte_per_code, - int nFromSymbol, - int nFromButton, - int count) -{ - KeySym* keySyms = new KeySym[count * byte_per_code]; - for(int i = 0; i < count; i++) - { - keySyms[byte_per_code * i + 0] = - keySyms[byte_per_code * i + 2] = locale[nFromButton + i]->code1; - keySyms[byte_per_code * i + 1] = - keySyms[byte_per_code * i + 3] = locale[nFromButton + i]->code2; - for(int j=4; j +#include + + +// The key code to be sent. +// A full list of available codes can be found in /usr/include/X11/keysymdef.h +//#define KEYCODE XK_Down + +// Function to create a keyboard event +XKeyEvent createKeyEvent(Display *display, Window &win, + Window &winRoot, bool press, + int keycode, int modifiers) +{ + XKeyEvent event; + + event.display = display; + event.window = win; + event.root = winRoot; + event.subwindow = None; + event.time = CurrentTime; + event.x = 1; + event.y = 1; + event.x_root = 1; + event.y_root = 1; + event.same_screen = True; + event.keycode = keycode; + event.state = modifiers; + + if(press) + event.type = KeyPress; + else + event.type = KeyRelease; + + return event; +} + +void x11SendKey(Display *display, int keyCode, int modifiers) +{ + +// Get the root window for the current display. + Window winRoot = XDefaultRootWindow(display); + if (winRoot==0) + return; + +// Find the window which has the current keyboard focus. + Window winFocus; + int revert; + XGetInputFocus(display, &winFocus, &revert); + +// Send a fake key press event to the window. + XKeyEvent event = createKeyEvent(display, winFocus, winRoot, true, keyCode, modifiers); + XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event); + +// Send a fake key release event to the window. + event = createKeyEvent(display, winFocus, winRoot, false, keyCode, modifiers); + XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event); +} + +void UBKeyboardButton::sendUnicodeSymbol(unsigned int nSymbol1, unsigned int nSymbol2, bool shift) +{ + unsigned int nSymbol = shift ? nSymbol2 : nSymbol1; + // Obtain the X11 display. + Display *display = XOpenDisplay(0); + if(display == NULL) + return; + + KeyCode keyCode = XKeysymToKeycode(display, nSymbol); + + if (keyCode != NoSymbol) + { + x11SendKey(display, keyCode, shift); + } + + XCloseDisplay(display); +} + +void UBKeyboardButton::sendControlSymbol(int nSymbol) +{ + // Obtain the X11 display. + Display *display = XOpenDisplay(0); + if(display == NULL) + return; + + KeyCode keyCode = XKeysymToKeycode(display, nSymbol); + + if (keyCode != NoSymbol) + { + x11SendKey(display, keyCode, 0); + } + + XCloseDisplay(display); +} + +void UBKeyboardPalette::createCtrlButtons() +{ + ctrlButtons = new UBKeyboardButton*[8]; + + ctrlButtons[0] = new UBCntrlButton(this, "<-", XK_BackSpace); + ctrlButtons[1] = new UBCntrlButton(this, "<->", XK_Tab); + ctrlButtons[2] = new UBCntrlButton(this, "Enter", XK_Return); + ctrlButtons[3] = new UBCapsLockButton(this, "capslock"); + ctrlButtons[4] = new UBCapsLockButton(this, "capslock"); + ctrlButtons[5] = new UBLocaleButton(this); + ctrlButtons[6] = new UBCntrlButton(this, "", XK_space); + ctrlButtons[7] = new UBLocaleButton(this); +} + + +void UBKeyboardPalette::onActivated(bool activated) +{ + if (activated) + { + Display *display = XOpenDisplay(0); + if(display == NULL) + return; + + XDisplayKeycodes(display, &this->min_keycodes, &this->max_keycodes); + KeySym* keySyms = XGetKeyboardMapping(display, min_keycodes, + max_keycodes - min_keycodes, &this->byte_per_code); + + storage = keySyms; + + XCloseDisplay(display); + + onLocaleChanged(locales[nCurrentLocale]); + } + else + { + Display *display = XOpenDisplay(0); + if(display == NULL) + return; + + KeySym* keySyms = (KeySym*)storage; + if (keySyms!=NULL) + { + + XChangeKeyboardMapping(display, min_keycodes, byte_per_code, + keySyms, max_keycodes - min_keycodes); + XFree(keySyms); + } + + + XCloseDisplay(display); + } + +} + + +void setSymbolsFromButton(Display *display, + const UBKeyboardLocale& locale, + int byte_per_code, + int nFromSymbol, + int nFromButton, + int count) +{ + KeySym* keySyms = new KeySym[count * byte_per_code]; + for(int i = 0; i < count; i++) + { + keySyms[byte_per_code * i + 0] = + keySyms[byte_per_code * i + 2] = locale[nFromButton + i]->code1; + keySyms[byte_per_code * i + 1] = + keySyms[byte_per_code * i + 3] = locale[nFromButton + i]->code2; + for(int j=4; j. */ -#include "UBKeyboardPalette.h" - -#include -#include -#include -#include - -#include -#include - -void UBKeyboardButton::sendUnicodeSymbol(unsigned int nSymbol1, unsigned int nSymbol2, bool shift) -{ - unsigned int nSymbol = (shift)? nSymbol2 : nSymbol1; - - if (shift) - CGEventPost(kCGSessionEventTap, CGEventCreateKeyboardEvent(NULL, 56, true)); - CGEventPost(kCGSessionEventTap, CGEventCreateKeyboardEvent(NULL, nSymbol, true)); - CGEventPost(kCGSessionEventTap, CGEventCreateKeyboardEvent(NULL, nSymbol, false)); - if (shift) - CGEventPost(kCGSessionEventTap, CGEventCreateKeyboardEvent(NULL, 56, false)); - -} - -void UBKeyboardButton::sendControlSymbol(int nSymbol) -{ - CGEventRef event1 = CGEventCreateKeyboardEvent(NULL, nSymbol, true); - CGEventRef event2 = CGEventCreateKeyboardEvent(NULL, nSymbol, false); - - CGEventPost(kCGHIDEventTap, event1); - CGEventPost(kCGHIDEventTap, event2); -} - -void UBKeyboardPalette::createCtrlButtons() -{ - ctrlButtons = new UBKeyboardButton*[7]; - - ctrlButtons[0] = new UBCntrlButton(this, "<-", 51); - ctrlButtons[1] = new UBCntrlButton(this, "<->", 48); - ctrlButtons[2] = new UBCntrlButton(this, "Enter", 76); - ctrlButtons[3] = new UBCapsLockButton(this); - ctrlButtons[4] = new UBCapsLockButton(this); - ctrlButtons[5] = new UBLocaleButton(this); - ctrlButtons[6] = new UBCntrlButton(this, "", 49); - ctrlButtons[7] = new UBLocaleButton(this); -} - -void SetMacLocaleByIdentifier(const QString& id) -{ - const char * strName = id.toAscii().data(); - CFStringRef iName = CFStringCreateWithCString(NULL, strName, kCFStringEncodingMacRoman ); - - CFStringRef keys[] = { kTISPropertyInputSourceCategory, kTISPropertyInputSourceID }; - CFStringRef values[] = { kTISCategoryKeyboardInputSource, iName }; - CFDictionaryRef dict = CFDictionaryCreate(NULL, (const void **)keys, (const void **)values, 2, NULL, NULL); - CFArrayRef kbds = TISCreateInputSourceList(dict, true); - if (CFArrayGetCount(kbds)!=0) - { - TISInputSourceRef klRef = (TISInputSourceRef)CFArrayGetValueAtIndex(kbds, 0); - if (klRef!=NULL) - TISSelectInputSource(klRef); - } -} - -void UBKeyboardPalette::onActivated(bool activated) -{ - if (activated) - { - TISInputSourceRef selectedLocale = TISCopyCurrentKeyboardInputSource(); - - CFStringRef sr = (CFStringRef) TISGetInputSourceProperty(selectedLocale, - kTISPropertyInputSourceID); - - if (sr!=NULL) - { - char tmp[1024]; - CFStringGetCString(sr, tmp, 1024, 0); - activeLocale = tmp; - } - else - activeLocale = ""; - - - onLocaleChanged(locales[nCurrentLocale]); - } - else - { - if (activeLocale != "") - SetMacLocaleByIdentifier(activeLocale); - } -} - -void UBKeyboardPalette::onLocaleChanged(UBKeyboardLocale* locale) -{ - SetMacLocaleByIdentifier(locale->id); -} - +#include "UBKeyboardPalette.h" + +#include +#include +#include +#include + +#include +#include + +void UBKeyboardButton::sendUnicodeSymbol(unsigned int nSymbol1, unsigned int nSymbol2, bool shift) +{ + unsigned int nSymbol = (shift)? nSymbol2 : nSymbol1; + + if (shift) + CGEventPost(kCGSessionEventTap, CGEventCreateKeyboardEvent(NULL, 56, true)); + CGEventPost(kCGSessionEventTap, CGEventCreateKeyboardEvent(NULL, nSymbol, true)); + CGEventPost(kCGSessionEventTap, CGEventCreateKeyboardEvent(NULL, nSymbol, false)); + if (shift) + CGEventPost(kCGSessionEventTap, CGEventCreateKeyboardEvent(NULL, 56, false)); + +} + +void UBKeyboardButton::sendControlSymbol(int nSymbol) +{ + CGEventRef event1 = CGEventCreateKeyboardEvent(NULL, nSymbol, true); + CGEventRef event2 = CGEventCreateKeyboardEvent(NULL, nSymbol, false); + + CGEventPost(kCGHIDEventTap, event1); + CGEventPost(kCGHIDEventTap, event2); +} + +void UBKeyboardPalette::createCtrlButtons() +{ + ctrlButtons = new UBKeyboardButton*[7]; + + ctrlButtons[0] = new UBCntrlButton(this, "<-", 51); + ctrlButtons[1] = new UBCntrlButton(this, "<->", 48); + ctrlButtons[2] = new UBCntrlButton(this, "Enter", 76); + ctrlButtons[3] = new UBCapsLockButton(this, "capslock"); + ctrlButtons[4] = new UBCapsLockButton(this, "capslock"); + ctrlButtons[5] = new UBLocaleButton(this); + ctrlButtons[6] = new UBCntrlButton(this, "", 49); + ctrlButtons[7] = new UBLocaleButton(this); +} + +void SetMacLocaleByIdentifier(const QString& id) +{ + const char * strName = id.toAscii().data(); + CFStringRef iName = CFStringCreateWithCString(NULL, strName, kCFStringEncodingMacRoman ); + + CFStringRef keys[] = { kTISPropertyInputSourceCategory, kTISPropertyInputSourceID }; + CFStringRef values[] = { kTISCategoryKeyboardInputSource, iName }; + CFDictionaryRef dict = CFDictionaryCreate(NULL, (const void **)keys, (const void **)values, 2, NULL, NULL); + CFArrayRef kbds = TISCreateInputSourceList(dict, true); + if (CFArrayGetCount(kbds)!=0) + { + TISInputSourceRef klRef = (TISInputSourceRef)CFArrayGetValueAtIndex(kbds, 0); + if (klRef!=NULL) + TISSelectInputSource(klRef); + } +} + +void UBKeyboardPalette::onActivated(bool activated) +{ + if (activated) + { + TISInputSourceRef selectedLocale = TISCopyCurrentKeyboardInputSource(); + + CFStringRef sr = (CFStringRef) TISGetInputSourceProperty(selectedLocale, + kTISPropertyInputSourceID); + + if (sr!=NULL) + { + char tmp[1024]; + CFStringGetCString(sr, tmp, 1024, 0); + activeLocale = tmp; + } + else + activeLocale = ""; + + + onLocaleChanged(locales[nCurrentLocale]); + } + else + { + if (activeLocale != "") + SetMacLocaleByIdentifier(activeLocale); + } +} + +void UBKeyboardPalette::onLocaleChanged(UBKeyboardLocale* locale) +{ + SetMacLocaleByIdentifier(locale->id); +} + diff --git a/src/tools/UBGraphicsTriangle.cpp b/src/tools/UBGraphicsTriangle.cpp index 1381f991..b617740b 100644 --- a/src/tools/UBGraphicsTriangle.cpp +++ b/src/tools/UBGraphicsTriangle.cpp @@ -607,13 +607,13 @@ void UBGraphicsTriangle::mouseMoveEvent(QGraphicsSceneMouseEvent *event) QPointF delta = event->pos() - event->lastPos(); if (mOrientation == TopLeft || mOrientation == BottomLeft) { - if (rect().width() + delta.x() < sMinWidth) - delta.setX(sMinWidth - rect().width()); + if (rect().width() + delta.x() < (qreal)sMinWidth) + delta.setX((qreal)sMinWidth - rect().width()); } else { - if (rect().width() - delta.x() < sMinWidth) - delta.setX(sMinWidth - rect().width()); + if (rect().width() - delta.x() < (qreal)sMinWidth) + delta.setX((qreal)sMinWidth - rect().width()); } if (mOrientation == TopLeft || mOrientation == BottomLeft) { @@ -639,13 +639,13 @@ void UBGraphicsTriangle::mouseMoveEvent(QGraphicsSceneMouseEvent *event) QPointF delta = event->pos() - event->lastPos(); if (mOrientation == BottomRight || mOrientation == BottomLeft) { - if (rect().height() - delta.y() < sMinHeight) - delta.setY(sMinHeight - rect().height()); + if (rect().height() - delta.y() < (qreal)sMinHeight) + delta.setY((qreal)sMinHeight - rect().height()); } else { - if (rect().height() + delta.y() < sMinHeight) - delta.setY(sMinHeight - rect().height()); + if (rect().height() + delta.y() < (qreal)sMinHeight) + delta.setY((qreal)sMinHeight - rect().height()); } if (mOrientation == BottomRight || mOrientation == BottomLeft) setRect(QRectF(