--- unity-7.0.2+13.10.20130705.1.orig/CMakeLists.txt +++ unity-7.0.2+13.10.20130705.1/CMakeLists.txt @@ -270,9 +270,25 @@ add_subdirectory(doc) # Check for google test and build it locally +set ( + GMOCK_ROOT_DIR + "/usr/src/gmock" + CACHE + PATH + "Path to Google mock srcs" +) + +set ( + GMOCK_INCLUDE_DIR + "/usr/include/gmock/include" + CACHE + PATH + "Path to Google mock include" +) + set( GTEST_ROOT_DIR - "/usr/src/gtest" # Default value, adjustable by user with e.g., ccmake + "${GMOCK_ROOT_DIR}/gtest" # Default value, adjustable by user with e.g., ccmake CACHE PATH "Path to Google test srcs" @@ -280,20 +296,26 @@ set( GTEST_INCLUDE_DIR - "/usr/include/gtest" + "${GMOCK_ROOT_DIR}/gtest/include" CACHE PATH "Path to Google tests include" ) -find_path(GTEST_INCLUDE_DIR gtest/gtest.h) -if (GTEST_INCLUDE_DIR) - #FIXME - hardcoded is bad! +if (GTEST_INCLUDE_DIR AND GMOCK_INCLUDE_DIR) + include_directories ( + ${GMOCK_INCLUDE_DIR} + ${GTEST_INCLUDE_DIR} + ) add_subdirectory( - ${GTEST_ROOT_DIR} - gtest + ${GMOCK_ROOT_DIR} + "${CMAKE_CURRENT_BINARY_DIR}/gmock" + ) +elseif (GTEST_INCLUDE_DIR AND NOT GMOCK_INCLUDE_DIR) + include_directories ( + ${GTEST_INCLUDE_DIR} ) -endif(GTEST_INCLUDE_DIR) +endif(GTEST_INCLUDE_DIR AND GMOCK_INCLUDE_DIR) add_subdirectory(services) add_subdirectory(tests) --- unity-7.0.2+13.10.20130705.1.orig/po/unity.pot +++ unity-7.0.2+13.10.20130705.1/po/unity.pot @@ -1,5 +1,5 @@ # SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR Canonical\ Ltd +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: ayatana-dev@lists.launchpad.net\n" -"POT-Creation-Date: 2013-04-17 16:00+0100\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-07-14 02:39+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,314 +16,1093 @@ "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" +#: ../dash/FilterAllButton.cpp:38 msgid "All" msgstr "" +#: ../dash/FilterGenreWidget.cpp:42 msgid "Categories" msgstr "" +#: ../dash/FilterMultiRangeWidget.cpp:43 msgid "Multi-range" msgstr "" +#: ../dash/FilterRatingsWidget.cpp:49 msgid "Rating" msgstr "" +#: ../dash/PlacesGroup.cpp:329 msgid "See fewer results" msgstr "" +#: ../dash/PlacesGroup.cpp:335 +#, c-format +msgid "See one more result" +msgid_plural "See %d more results" +msgstr[0] "" +msgstr[1] "" + +#: ../dash/ScopeBar.cpp:72 +msgid "Legal notice" +msgstr "" + +#: ../dash/ScopeView.cpp:726 msgid "Sorry, there is nothing that matches your search." msgstr "" +#: ../dash/previews/ApplicationPreview.cpp:211 msgid "Last Updated" msgstr "" +#. The "%s" is used in the dash preview to display the ": " infos +#: ../dash/previews/PreviewInfoHintWidget.cpp:165 +#, c-format +msgid "%s:" +msgstr "" + +#: ../dash/previews/SocialPreview.cpp:220 +msgid "Comments" +msgstr "" + +#: ../hud/HudView.cpp:198 ../hud/HudView.cpp:382 msgid "Type your command" msgstr "" +#: ../launcher/ApplicationLauncherIcon.cpp:867 +#: ../launcher/ApplicationLauncherIcon.cpp:991 msgid "Lock to Launcher" msgstr "" +#: ../launcher/ApplicationLauncherIcon.cpp:867 +#: ../launcher/ApplicationLauncherIcon.cpp:991 +#: ../launcher/VolumeLauncherIcon.cpp:159 msgid "Unlock from Launcher" msgstr "" +#: ../launcher/ApplicationLauncherIcon.cpp:881 +#: ../launcher/ApplicationLauncherIcon.cpp:936 +#: ../launcher/ApplicationLauncherIcon.cpp:1000 msgid "Quit" msgstr "" +#: ../launcher/ApplicationLauncherIcon.cpp:937 +msgid "Exit" +msgstr "" + +#: ../launcher/ApplicationLauncherIcon.cpp:938 +msgid "Close" +msgstr "" + +#: ../launcher/BFBLauncherIcon.cpp:38 msgid "Search your computer and online sources" msgstr "" +#: ../launcher/DesktopLauncherIcon.cpp:36 msgid "Show Desktop" msgstr "" +#: ../launcher/DeviceNotificationDisplayImp.cpp:55 msgid "The drive has been successfully ejected" msgstr "" +#: ../launcher/ExpoLauncherIcon.cpp:35 msgid "Workspace Switcher" msgstr "" +#: ../launcher/HudLauncherIcon.cpp:40 msgid "HUD" msgstr "" #. Application is being installed, or hasn't been installed yet +#: ../launcher/SoftwareCenterLauncherIcon.cpp:71 msgid "Waiting to install" msgstr "" +#: ../launcher/SpacerLauncherIcon.cpp:36 msgid "Drop To Add Application" msgstr "" +#: ../launcher/TrashLauncherIcon.cpp:47 msgid "Trash" msgstr "" -msgid "Empty Trash..." +#: ../launcher/TrashLauncherIcon.cpp:88 +msgid "Empty Trash…" msgstr "" +#: ../launcher/VolumeLauncherIcon.cpp:202 msgid "Open" msgstr "" +#: ../launcher/VolumeLauncherIcon.cpp:220 msgid "Eject parent drive" msgstr "" +#: ../launcher/VolumeLauncherIcon.cpp:220 msgid "Eject" msgstr "" +#: ../launcher/VolumeLauncherIcon.cpp:238 msgid "Safely remove parent drive" msgstr "" +#: ../launcher/VolumeLauncherIcon.cpp:238 msgid "Safely remove" msgstr "" +#: ../launcher/VolumeLauncherIcon.cpp:256 msgid "Unmount" msgstr "" +#: ../panel/PanelMenuView.cpp:76 msgid "Ubuntu Desktop" msgstr "" +#. namespace unity +#: ../plugins/networkarearegion/networkarearegion.xml.in.h:1 +msgid "Unity Scrollbars Support" +msgstr "" + +#: ../plugins/networkarearegion/networkarearegion.xml.in.h:2 +msgid "Support _UNITY_NET_WORKAREA_REGION" +msgstr "" + +#: ../plugins/unity-mt-grab-handles/unitymtgrabhandles.xml.in.h:1 +msgid "Unity MT Grab Handles" +msgstr "" + +#: ../plugins/unity-mt-grab-handles/unitymtgrabhandles.xml.in.h:2 +msgid "Small touch-based grab handles to move and resize a window" +msgstr "" + +#: ../plugins/unity-mt-grab-handles/unitymtgrabhandles.xml.in.h:3 +msgid "Toggle Handles" +msgstr "" + +#: ../plugins/unity-mt-grab-handles/unitymtgrabhandles.xml.in.h:4 +msgid "Key to toggle the handles" +msgstr "" + +#: ../plugins/unity-mt-grab-handles/unitymtgrabhandles.xml.in.h:5 +msgid "Show Handles" +msgstr "" + +#: ../plugins/unity-mt-grab-handles/unitymtgrabhandles.xml.in.h:6 +msgid "Key to show the handles" +msgstr "" + +#: ../plugins/unity-mt-grab-handles/unitymtgrabhandles.xml.in.h:7 +msgid "Hide Handles" +msgstr "" + +#: ../plugins/unity-mt-grab-handles/unitymtgrabhandles.xml.in.h:8 +msgid "Key to hide the handles" +msgstr "" + +#: ../plugins/unity-mt-grab-handles/unitymtgrabhandles.xml.in.h:9 +msgid "Fade Duration" +msgstr "" + +#: ../plugins/unity-mt-grab-handles/unitymtgrabhandles.xml.in.h:10 +msgid "How long the fade should last" +msgstr "" + +#: ../plugins/unitydialog/unitydialog.xml.in.h:1 +msgid "Dialog Handler" +msgstr "" + +#: ../plugins/unitydialog/unitydialog.xml.in.h:2 +msgid "Handles the modal dialog experience in unity" +msgstr "" + +#: ../plugins/unitydialog/unitydialog.xml.in.h:3 +msgid "Alpha" +msgstr "" + +#: ../plugins/unitydialog/unitydialog.xml.in.h:4 +msgid "What dimming alpha to use" +msgstr "" + +#: ../plugins/unitydialog/unitydialog.xml.in.h:5 +msgid "Fade Time" +msgstr "" + +#: ../plugins/unitydialog/unitydialog.xml.in.h:6 +msgid "How long the fade should take (ms)" +msgstr "" + +#: ../plugins/unitydialog/unitydialog.xml.in.h:7 +msgid "Blacklist" +msgstr "" + +#: ../plugins/unitydialog/unitydialog.xml.in.h:8 +msgid "Match for dialogs that shouldn't be accepted as transient modal dialogs" +msgstr "" + +#: ../plugins/unityshell/src/unity-dash-view-accessible.cpp:100 +#: ../shortcuts/CompizShortcutModeller.cpp:161 msgid "Dash" msgstr "" +#: ../plugins/unityshell/src/unity-launcher-accessible.cpp:137 +#: ../plugins/unityshell/unityshell.xml.in.h:25 +#: ../shortcuts/CompizShortcutModeller.cpp:120 msgid "Launcher" msgstr "" +#: ../plugins/unityshell/src/unity-quicklist-menu-accessible.cpp:179 msgid "Quicklist" msgstr "" +#: ../plugins/unityshell/src/unity-switcher-accessible.cpp:147 +#: ../plugins/unityshell/unityshell.xml.in.h:98 msgid "Switcher" msgstr "" +#. anonymous namespace +#. namespace unity +#: ../plugins/unityshell/unityshell.xml.in.h:1 +msgid "Ubuntu Unity Plugin" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:2 +msgid "Plugin to draw the Unity Shell" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:3 +msgid "General" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:4 +#: ../gnome/50-unity-launchers.xml.in.h:2 +msgid "Key to show the HUD" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:5 +msgid "A tap on this key summons the HUD." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:6 +msgid "Key to execute a command" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:7 +msgid "Opens a folder or executes a command." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:8 +msgid "Key to open the first panel menu" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:9 +msgid "" +"Opens the first indicator menu of the Panel, allowing keyboard navigation " +"thereafter." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:10 +msgid "Panel Opacity" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:11 +msgid "The opacity of the Panel background." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:12 +msgid "Panel Opacity for Maximized Windows Toggle" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:13 +msgid "" +"When a window is maximized and visible in the current viewport, the panel " +"opacity is disabled." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:14 +msgid "Background Color" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:15 +msgid "Background color override for the Dash, Launcher and Switcher." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:16 +msgid "Dash Blur" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:17 +msgid "Type of blur in the Dash." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:18 +msgid "No Blur" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:19 +msgid "Static Blur" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:20 +msgid "Active Blur" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:21 +msgid "Automaximize Value" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:22 +msgid "The minimum value to trigger automaximize." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:23 +msgid "Enable Shortcut Hints Overlay" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:24 +msgid "" +"Enables possibility to display an overlay showing available mouse and " +"keyboard shortcuts." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:26 +msgid "Key to show the Dash, Launcher and Help Overlay" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:27 +msgid "" +"Holding this key makes the Launcher and Help Overlay appear. Tapping it " +"opens the Dash." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:28 +msgid "Key to give keyboard-focus to the Launcher" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:29 +msgid "" +"Gives keyboard-focus to the Launcher so it can be navigated with the cursor-" +"keys." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:30 +msgid "Key to start the Launcher Application Switcher" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:31 +msgid "" +"Cycles through icons present in the Launcher. Activates the highlighted icon " +"on release." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:32 +msgid "Key to start the Launcher Application Switcher in reverse" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:33 +msgid "" +"Cycles through icons present in the Launcher, in reverse order. Activates " +"the highlighted icon on release." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:34 +msgid "Dash tap duration" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:35 +msgid "" +"Duration (in millseconds) that will count as a tap for opening the Dash." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:36 +msgid "Launcher Opacity" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:37 +msgid "The opacity of the Launcher background." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:38 +msgid "Hide Launcher" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:39 +msgid "Make the Launcher hide automatically after some time of inactivity." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:40 +msgid "Never" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:41 +msgid "Autohide" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:42 +msgid "Hide Animation" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:43 +msgid "Animation played when the Launcher is showing or hiding." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:44 +msgid "Fade on bfb and Slide" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:45 +msgid "Slide only" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:46 +msgid "Fade only" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:47 +msgid "Fade and Slide" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:48 +msgid "Reveal Trigger" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:49 +msgid "Left Edge" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:50 +msgid "Top Left Corner" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:51 +msgid "Launcher Monitors" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:52 +msgid "Selects on which display the Launcher will be present." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:53 +msgid "All Displays" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:54 +msgid "Primary Display" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:55 +msgid "Launcher Capture Mouse" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:56 +msgid "Determines if the Launcher's edges will capture the mousepointer." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:57 +msgid "Launcher Reveal Edge Responsiveness" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:58 +msgid "" +"A conglomerate setting that modifies the overall responsiveness of the " +"Launcher reveal." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:59 +msgid "Launcher Reveal Pressure" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:60 +msgid "Amount of mouse pressure required to reveal the Launcher." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:61 +msgid "Launcher Edge Stop Overcome Pressure" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:62 +msgid "" +"Amount of mouse pressure required to push the mousepointer into the next " +"monitor." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:63 +msgid "Pressure Decay Rate" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:64 +msgid "The rate at which mouse pressure decays." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:65 +msgid "Edge Stop Velocity" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:66 +msgid "The maximum velocity at which the mouse will still be stopped." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:67 +msgid "Duration of Sticky Edge Release after Break" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:68 +msgid "" +"The number of milliseconds Sticky Edges are deactivated for after the " +"barrier has been broken." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:69 +msgid "Launcher Icon Size" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:70 +msgid "The size of the icons in the Launcher." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:71 +msgid "Launcher Icon Backlight Mode" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:72 +msgid "Change how the icons in the Launcher are backlit." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:73 +msgid "Backlight Always On" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:74 +msgid "Backlight Toggles" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:75 +msgid "Backlight Always Off" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:76 +msgid "Edge Illumination Toggles" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:77 +msgid "Backlight and Edge Illumination Toggles" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:78 +msgid "Launcher Icon Launch Animation" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:79 +msgid "The icon animation playing during the launch of a process." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:80 +msgid "None" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:81 +msgid "Pulse Until Running" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:82 +msgid "Blink" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:83 +msgid "Launcher Icon Urgent Animation" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:84 +msgid "The icon animation playing when a Launcher Icon is in the urgent state." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:85 +msgid "Pulse" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:86 +msgid "Wiggle" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:87 +msgid "Menus" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:88 +msgid "Menus Fade-in Duration" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:89 +msgid "" +"Duration (in milliseconds) of the menus fade-in animation, used when the " +"mouse goes over the top-panel." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:90 +msgid "Menus Fade-out Duration" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:91 +msgid "" +"Duration (in milliseconds) of the menus fade-out animation, used when the " +"mouse goes over the top-panel." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:92 +msgid "Menus Discovery Duration" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:93 +msgid "" +"How many seconds the menus should be shown when a new application has been " +"launched." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:94 +msgid "Menus Discovery Fade-in Duration" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:95 +msgid "" +"Duration (in milliseconds) of the menus fade-in animation, used when the " +"menus of a new launched application have been shown." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:96 +msgid "Menus Discovery Fade-out Duration" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:97 +msgid "" +"Duration (in milliseconds) of the menus fade-out animation, used when the " +"menus of a new launched application have been shown." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:99 +msgid "Key to start the Switcher" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:100 +msgid "Switches to the next open window on the actual viewport." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:101 +msgid "Key to switch to the previous window in the Switcher" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:102 +msgid "" +"Switches to the previous open window on the actual viewport, once the " +"Switcher has been revealed." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:103 +msgid "Key to start the Switcher for all viewports" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:104 +msgid "Switches to the next open window, including windows of all viewports." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:105 +msgid "Key to switch to the previous window in the Switcher for all viewports" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:106 +msgid "" +"Switches to the previous open window, once the Switcher has been revealed, " +"including windows of all viewports." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:107 +msgid "Key to move to the right in the Switcher" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:108 +msgid "Navigates one window to the right in the Switcher." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:109 +msgid "Key to move to the left in the Switcher" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:110 +msgid "Navigates one window to the left in the Switcher." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:111 +msgid "Key to expose windows in the Switcher" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:112 +msgid "" +"Displays a live preview of the selected window; a grid if multiple windows " +"of the selected application are open." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:113 +msgid "Key to collapse windows in the Switcher" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:114 +msgid "Closes the live previews and returns to icons in the Switcher." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:115 +msgid "Key to flip through windows in the Switcher" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:116 +msgid "Flips through all the windows present in the Switcher." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:117 +msgid "Key to flip through windows in the Switcher backwards" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:118 +msgid "" +"Flips through all the windows present in the Switcher, in reverse order." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:119 +msgid "Show live previews of windows in the Switcher" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:120 +msgid "Enables miniature live window previews in the Switcher." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:121 +msgid "Timed automatic to show live previews in the Switcher" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:122 +msgid "" +"Automatically spreads multiple windows of the same application out into a " +"grid after a short time." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:123 +msgid "Bias alt-tab to prefer windows on the current viewport" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:124 +msgid "" +"Bias the Switcher to prefer windows which are placed on the current viewport." +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:125 +msgid "Disable Show Desktop in the Switcher" +msgstr "" + +#: ../plugins/unityshell/unityshell.xml.in.h:126 +msgid "Disables the Show Desktop icon in the Switcher." +msgstr "" + +#: ../shortcuts/ShortcutHintPrivate.cpp:84 msgid "Left Mouse" msgstr "" +#: ../shortcuts/ShortcutHintPrivate.cpp:85 msgid "Middle Mouse" msgstr "" +#: ../shortcuts/ShortcutHintPrivate.cpp:86 msgid "Right Mouse" msgstr "" +#: ../shortcuts/ShortcutView.cpp:76 msgid "Keyboard Shortcuts" msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:122 +#: ../shortcuts/CompizShortcutModeller.cpp:219 msgid " (Hold)" msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:123 msgid "Opens the Launcher, displays shortcuts." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:129 msgid "Opens Launcher keyboard navigation mode." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:135 msgid "Switches applications via the Launcher." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:140 msgid " + 1 to 9" msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:141 msgid "Same as clicking on a Launcher icon." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:146 msgid " + Shift + 1 to 9" msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:147 msgid "Opens a new window in the app." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:153 msgid "Opens the Trash." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:163 +#: ../shortcuts/CompizShortcutModeller.cpp:213 msgid " (Tap)" msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:164 msgid "Opens the Dash Home." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:170 msgid "Opens the Dash App Lens." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:176 msgid "Opens the Dash Files Lens." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:182 msgid "Opens the Dash Music Lens." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:188 msgid "Opens the Dash Video Lens." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:194 msgid "Switches between Lenses." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:196 msgid "Ctrl + Tab" msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:199 +#: ../shortcuts/CompizShortcutModeller.cpp:253 msgid "Moves the focus." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:201 msgid "Arrow Keys" msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:204 msgid "Opens the currently focused item." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:206 msgid "Enter" msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:211 msgid "HUD & Menu Bar" msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:214 msgid "Opens the HUD." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:220 msgid "Reveals the application menu." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:225 msgid "Opens the indicator menu." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:231 msgid "Moves focus between indicators." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:233 +#: ../shortcuts/CompizShortcutModeller.cpp:255 msgid "Cursor Left or Right" msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:238 msgid "Switching" msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:241 msgid "Switches between applications." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:247 msgid "Switches windows of current applications." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:260 msgid "Workspaces" msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:263 msgid "Switches between workspaces." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:268 +#: ../shortcuts/CompizShortcutModeller.cpp:274 msgid " + Arrow Keys" msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:269 msgid "Switches workspaces." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:275 msgid "Moves focused window to another workspace." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:283 msgid "Windows" msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:286 msgid "Spreads all windows in the current workspace." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:292 msgid "Minimises all windows." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:298 msgid "Maximises the current window." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:304 msgid "Restores or minimises the current window." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:309 msgid " or Right" msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:310 msgid "Semi-maximise the current window." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:316 msgid "Closes the current window." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:322 msgid "Opens the window accessibility menu." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:328 msgid "Places the window in corresponding position." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:330 msgid "Ctrl + Alt + Num" msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:332 +#: ../shortcuts/CompizShortcutModeller.cpp:338 msgid " Drag" msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:333 msgid "Moves the window." msgstr "" +#: ../shortcuts/CompizShortcutModeller.cpp:339 msgid "Resizes the window." msgstr "" +#: ../shutdown/SessionView.cpp:114 ../shutdown/SessionButton.cpp:74 msgid "Shut Down" msgstr "" +#: ../shutdown/SessionView.cpp:119 #, c-format -msgid "Hi %s, you have open files that you might want to save before shutting down. Are you sure you want to continue?" +msgid "" +"Hi %s, you have open files that you might want to save before shutting down. " +"Are you sure you want to continue?" msgstr "" +#: ../shutdown/SessionView.cpp:124 #, c-format -msgid "Goodbye, %s. Are you sure you want to close all programs and shut down the computer?" +msgid "" +"Goodbye, %s. Are you sure you want to close all programs and shut down the " +"computer?" msgstr "" +#: ../shutdown/SessionView.cpp:130 ../shutdown/SessionButton.cpp:62 msgid "Log Out" msgstr "" +#: ../shutdown/SessionView.cpp:135 #, c-format -msgid "Hi %s, you have open files that you might want to save before logging out. Are you sure you want to continue?" +msgid "" +"Hi %s, you have open files that you might want to save before logging out. " +"Are you sure you want to continue?" msgstr "" +#: ../shutdown/SessionView.cpp:140 #, c-format -msgid "Goodbye, %s. Are you sure you want to close all programs and log out from your account?" +msgid "" +"Goodbye, %s. Are you sure you want to close all programs and log out from " +"your account?" msgstr "" #. We have enough buttons to show the message without a new line. +#: ../shutdown/SessionView.cpp:153 #, c-format msgid "Hi %s, you have open files you might want to save. Would you like to…" msgstr "" +#: ../shutdown/SessionView.cpp:158 #, c-format msgid "" "Hi %s, you have open files you might want to save.\n" "Would you like to…" msgstr "" +#: ../shutdown/SessionView.cpp:164 #, c-format msgid "Goodbye, %s. Would you like to…" msgstr "" +#: ../shutdown/SessionButton.cpp:58 msgid "Lock" msgstr "" +#: ../shutdown/SessionButton.cpp:66 msgid "Suspend" msgstr "" +#: ../shutdown/SessionButton.cpp:70 msgid "Hibernate" msgstr "" +#: ../shutdown/SessionButton.cpp:78 msgid "Restart" msgstr "" +#: ../services/panel-service.c:1742 msgid "Activate" msgstr "" +#: ../unity-shared/CoverArt.cpp:452 msgid "No Image Available" msgstr "" +#: ../unity-shared/SearchBar.cpp:184 msgid "Filter results" msgstr "" + +#. Namespace +#: ../gnome/50-unity-launchers.xml.in.h:1 +msgid "Launchers" +msgstr "" --- unity-7.0.2+13.10.20130705.1.orig/debian/changelog +++ unity-7.0.2+13.10.20130705.1/debian/changelog @@ -0,0 +1,6044 @@ +unity (7.0.2+13.10.20130705.1-0ubuntu2) saucy; urgency=low + + * Drop unity-common, which is not common at all across versions; instead, + merge the contents into the shared library package and use + Conflicts/Replaces against previous sonames of the package. + LP: #1193120. + * Cherry pick revision 3419 from trunk: Adjust CMake setup to account for + new GMock version. LP: #1185265. + + -- Steve Langasek Fri, 12 Jul 2013 07:23:43 +0000 + +unity (7.0.2+13.10.20130705.1-0ubuntu1) saucy; urgency=low + + [ Timo Jyrinki ] + * Bump version number to go with X.org update + + [ Brandon Schaefer ] + * When the ScopeView changes visibility make sure we update the filter + scroll view as well. This way we don't get random overlay scroll + bars appearing when it shouldn't!. (LP: #1175666) + + [ Timo Jyrinki ] + * Move unity to the new libxi changes, along with the new 1.14 + xserver. Manual merge to be able to migrate together with Xorg from + -proposed. + + [ Didier Roche ] + * Revert rev 3404, makes autopilot tests failing as well as keep weird + filters artefacts in the preview + + [ Marco Trevisan (Treviño) ] + * ScopeProxy: use glib::SignalManager to manage connections and + disconnections. + * Use again glib::Cancellable wrapper in scopes code. + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3410 + + -- Ubuntu daily release Fri, 05 Jul 2013 12:40:50 +0000 + +unity (7.0.1+13.10.20130703-0ubuntu1) saucy; urgency=low + + [ Sebastien Bacher ] + * Depends on the new dconf-cli, we only need the command line tool, + not the gtk editor. + + [ Marco Trevisan (Treviño) ] + * ApplicationLauncherIcon: improve the way we override the Quit + quicklist item If a quit action is defined in static (desktop file + action) or dynamic way we use it to override the default one, + placing it to the proper position. Also override more labels by + default and if a quicklist item has the + QuicklistMenuItem::QUIT_ACTION_PROPERTY (defined as "unity-quit- + action") property set to TRUE, then we use this item as the quit + quicklist item. Factorized the code we use to generate both static + and dynamic ql items. (LP: #876421) + * Use connection::Manager to handle the sigc::connection disconnection + on parent removal. + * ConnectionManager: add connection::Wrapper to wrap a + sigc::connection disconnecting it on destruction. + * Unity: use connection::Wrapper to hold the connections to signals + and disconnect from them. + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3402 + + -- Ubuntu daily release Wed, 03 Jul 2013 04:03:31 +0000 + +unity (7.0.1+13.10.20130702-0ubuntu1) saucy; urgency=low + + [ Michal Hruby ] + * A few changes to unity-core API/ABI. + + [ Ted Gould ] + * Fix upstart job to handle legacy case and not duplicate events. + + [ Marco Trevisan (Treviño) ] + * ApplicationManager: Use nux::ROProperty for Window and Application + title and icon So BamfApplicationManager connect to {name,icon}- + changed signals, set getters for properties and + ApplicationLauncherIcon update icon tooltip_text and icon when App + title/icon changes. (LP: #751909) + * BamfApplicationManager: always use std::make_shared and use + glib::SignalManager::Add Also add some helper constructors. + * ApplicationLauncherIcon: only use a simple std::vector to cache the + quicklist entries Remove the ugly std::string indexed std::map. + * ConnectionManager: add a class container of sigc::connection that + takes care of disconnection Connections added will be disconnected + on class destruction on on explicit removal or replacement request. + + [ Lars Uebernickel ] + * unity-panel-service: call ido_init() and honor indicator's position + requests. + + [ Chris Townsend ] + * Fixes some panel shadow regressions caused by rev. 3381. - No panel + shadow when logging in, ie, no windows are opened. - Indicator drop + down menus have the panel shadow painted over them. - Notification + bubbles cause the panel shadow to be drawn on top of everything. - + Minimizing all windows caused the panel shadow to not be drawn. (LP: + #1194865) + + [ Didier Roche ] + * now build-depends on the desktop definition for scopes as libunity- + common is dead. + + [ Sebastien Bacher ] + * use correct ellipses. + + [ Andrea Azzarone ] + * Remove not necessary assert. (LP: #1192503) + + [ Łukasz 'sil2100' Zemczak ] + * Revert revision 3380. This caused regression of all autopilot tests + as show_desktop was invalidly detected every time there are no + visible windows on screen. + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3396 + + -- Ubuntu daily release Tue, 02 Jul 2013 05:32:40 +0000 + +unity (7.0.0daily13.06.24-0ubuntu2) saucy; urgency=low + + * services/panel-main.c: manually backport lp:~larsu/unity/call-ido-init + to unbreak custom indicators (like indicator-datetime), the order + in the panel is still wrong but that fix can wait for next week + * debian/control: build-depends on libido3-0.1-dev + + -- Sebastien Bacher Fri, 28 Jun 2013 19:36:49 +0200 + +unity (7.0.0daily13.06.24-0ubuntu1) saucy; urgency=low + + [ Brandon Schaefer ] + * Show desktop now only works for individual workspaces. Also if any + new windows are opened, or one is restored on that workspace then + the next Show desktop will minimize those. The only time windows are + restored are when no new windows have been mapped, and no windows + have been restored for that workspace only. (LP: #966030) + * When on the bottom row and you press down, the detail index now + moves right until it hits the last icon in the row. + + [ Chris Townsend ] + * Draw the full panel shadow when there are windows docked on the + panel and no focused windows on the screen such as when the desktop + has been clicked. (LP: #1036614) + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3382 + + -- Ubuntu daily release Mon, 24 Jun 2013 05:42:36 +0000 + +unity (7.0.0daily13.06.19-0ubuntu1) saucy; urgency=low + + [ Michal Hruby ] + * Bump libunity-core SONAME and adjust debian. + + [ Ted Gould ] + * Make Unity depend on bamfdaemon. + + [ Iain Lane ] + * Start unity-panel-service using upstart user session jobs. + + [ Brandon Schaefer ] + * Fixes the use of Alt+` and Right arrow when in detail mode. Now it + goes to the next window instead of closing detail mode. (LP: + #1190798) + * When in detail mode, you are now allowed to use UP/DOWN keys to move + around. (LP: #1131646) + + [ Chris Townsend ] + * Add functionality to wiggle urgent icons at certain time intervals + when the Launcher is hidden. (LP: #893196) + * Add support to close social previews by clicking anywhere in the + preview bubble. (LP: #1190007) + + [ Nick Dedekind ] + * Added check for x-unity-no-preview. Do not preview; send direct + activation to scope. (LP: #1188705) + + [ Xiao-Long Chen ] + * SessionView: Fix build when building without precompiled headers. + (LP: #1191097) + + [ Andrea Azzarone ] + * Fix failing AP test. (LP: #1191039) + * Fix failing test. (LP: #1191059) + * Skip tests if not in desktop mode. (LP: #1191053) + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3378 + + -- Ubuntu daily release Wed, 19 Jun 2013 04:29:36 +0000 + +unity (7.0.0daily13.06.07-0ubuntu1) saucy; urgency=low + + [ Ted Gould ] + * gtk_icon_info_free() is deprecated for g_object_unref(). + * Upstart event for when the indicators are loaded by the panel + service. + * Add an upstart job to unity-common. + * Manage Unity Panel Service's lifecycle with Upstart. + + [ Didier Roche ] + * add dep on autopilot-desktop. + * Revert the panel on upstart from ted, it doesn't respawn as expected + when another service try to communicate with the panel service and + the consequence is a lot of tests failing + + [ Nick Dedekind ] + * Uses a gobject weak ref to test for object deletion in the + GLibObject tests. Previously was checking with G_IS_OBJECT on an + invalid pointer, which was causing a segfault + + [ Manuel de la Pena ] + * Adds support for payment previews that will allow users to buy music + from within the dash. . + + [ Mathieu Trudel-Lapierre ] + * Increase timeouts for hud functional and search tests. + + [ Francis Ginther ] + * Handle StateNotFoundError when querying the label of a hud button. + + [ Łukasz 'sil2100' Zemczak ] + * Now that we're using the new HUD, there have been some changes that + typically cause test_hud tests to fail. Fix the tests to fit the new + model. The first one is that generally we do not have indicator + entries visible in the HUD anymore. Only application menu entries + are in it now. The second one - the way the results are displayed is + different. Now, instead of "Menu > Entry" we have "Entry (Menu)" + etc. + * Fix two HUD failures related to HUD slow action activation. + * Fix some autopilot test failures, some related to test_shortcut_hint + and some to test_scroll in launcher. + * Modify all the hud_query_check lambdas to be more smart and error- + checking. Same for the selected_hud_button method in the HUD + emulator. Also, get rid of the troublesome test_gedit_undo and + change it into test_gedit_save, which is easier to test and anyway + tests what we want. Besides that we also now try to handle the + StateNotFoundError exception in the HUD emulator, another cause of + some AP failures. + * Add a flag for -Wno-error=unused-local-typedefs, since this causes a + FTBFS on ARM + + [ Michal Hruby ] + * Don't activate a result twice after pressing Enter. (LP: #1188191) + + [ Sebastien Bacher ] + * Use '%s:' string for preview hints, rather than just appending ':'. + (LP: #1074038) + + [ Marco Trevisan (Treviño) ] + * IconRenderer: preprocess an icon if its emblem has been shown/hidden + In that way we can update its transformation. (LP: #1171476, + #1171663) + * UnityWindow: don't draw the panel shadow above a fullscreen window. + (LP: #1171934) + * UnityCore: add GtkWrapper to handle GtkIconInfo correctly for + different GTK versions Fix a memory leak in LauncherIcon. (LP: + #1180790) + * SwitcherController: use proper long long types for + WindowActiveNumber Otherwise an overflow can cause bad window + selection after long uptime. + * Unity: "s/unsigned long long/uint64_t/g". + + [ Chris Townsend ] + * Fixes issue where minimizing a full screen window would not draw the + Launcher and Panel after minimization. (LP: #1064155) + * Fixes issue where source files for test-gestures would always be + compiled even if the original source files did not change. (LP: + #1039367) + * Fixes the issue where the filling in of the progress bar over + Launcher icons does not scale when using smaller or larger icon + sizes than the default size of 48. (LP: #968680) + + [ Sam Spilsbury ] + * LauncherDragWindow: defer icon paint until DrawContent rather than + doing so immediately (LP: #1180174). (LP: #1180174) + * Add a pkg-config dependency on xpathselect>=1.2 Technically we + depend on xpathselect>=1.3 in debian/control, however the latest - + dev package in the distro claims the version is 1.2 and it builds + just fine with that. (LP: #1185226). (LP: #1185226) + + [ Leo Arias ] + * Fixed the execute_action_by_id on the dash emulator. (LP: #1181677) + + [ Christopher Lee ] + * Attempt to fix sporadic failure of TestGLibSource.Running for arm + builds. + * Updating Unity autopilot tests to work with the new version of + autopilot (1.3). + * Update unity autopilot tests depends. + * Missed a package depends for unity-autopilot. + * Updating the dbus introspection to use the new xpathselect + 1.3.libxpathselect-dev. + + [ Pawel Stolowski ] + * Add ModelIterator-inl.h to the list of installed headers (as it's + included by ModelIterator.h). + * Fixes for two autopilot tests. + * Bumped required version of libunity. + + [ Andrea Azzarone ] + * Disable detail view for webapp icons. (LP: #1169340) + * Don't build CoverflowResultView.cpp. + * Fix crashing tests. (LP: #1182585) + * Remove AbstractSeparator.cpp (it does not make sense :). + * Allow alt-tabbing during a dnd operation. (LP: #111939) + * Reference BamfApplication in GetRunningApplications. (LP: #1181717) + + [ Thomi Richards ] + * Updating the dbus introspection to use the new xpathselect + 1.3.libxpathselect-dev. + * Update the unity autopilot test suite to be compatible with the new + autopilot API for custom emulators. + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3365 + + -- Ubuntu daily release Fri, 07 Jun 2013 06:43:22 +0000 + +unity (7.0.0daily13.06.03ubuntu.unity.next-0ubuntu1) raring; urgency=low + + [ Chris Townsend ] + * Fixes the issue where the filling in of the progress bar over + Launcher icons does not scale when using smaller or larger icon + sizes than the default size of 48. (LP: #968680) + + [ Andrea Azzarone ] + * Reference BamfApplication in GetRunningApplications. (LP: #1181717) + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3355 (ubuntu-unity/next) + + -- Ubuntu daily release Mon, 03 Jun 2013 04:04:11 +0000 + +unity (7.0.0daily13.05.31ubuntu.unity.next-0ubuntu1) raring; urgency=low + + [ Nick Dedekind ] + * Keyboard focus lost if trying to navigate while search is ongoing + (LP: #1170709) + * Occasional loss of focus in the input text field (LP: #1174488) + + [ Andrea Azzarone ] + * Search Plugins previews in the apps lens should not display any + ‘review stars’ (LP: #1170715) + * [alt-tab] Disable detail view for webapp icons. (LP: #1169340) + * 'There is no content...' message is missing if there no results when + opening some lenses (LP: #1170728) + + [ Nick Dedekind ] + * Nautilus incorrectly highlighted as valid target DND target for lots + of results (LP: #1170721) + + [ Brandon Schaefer ] + * Bump libnux to new version + + [ Łukasz 'sil2100' Zemczak ] + * Re-bumped libnux to 4.0.2 + + [ Ted Gould ] + * gtk_icon_info_free() is deprecated for g_object_unref(). + * Upstart event for when the indicators are loaded by the panel + service. + + [ Marco Trevisan (Treviño) ] + * UnityCore: add GtkWrapper to handle GtkIconInfo correctly for + different GTK versions Fix a memory leak in LauncherIcon. (LP: + #1180790) + * SwitcherController: use proper long long types for + WindowActiveNumber Otherwise an overflow can cause bad window + selection after long uptime. + * Unity: "s/unsigned long long/uint64_t/g". + + [ Francis Ginther ] + * Handle StateNotFoundError when querying the label of a hud button. + + [ Chris Townsend ] + * Fixes issue where minimizing a full screen window would not draw the + Launcher and Panel after minimization. (LP: #1064155) + * Fixes issue where source files for test-gestures would always be + compiled even if the original source files did not change. (LP: + #1039367) + + [ Didier Roche ] + * add dep on autopilot-desktop. + + [ Leo Arias ] + * Fixed the execute_action_by_id on the dash emulator. (LP: #1181677) + + [ Christopher Lee ] + * Updating Unity autopilot tests to work with the new version of + autopilot (1.3). + * Update unity autopilot tests depends. + * Missed a package depends for unity-autopilot. + * Updating the dbus introspection to use the new xpathselect + 1.3.libxpathselect-dev. + + [ Thomi Richards ] + * Updating the dbus introspection to use the new xpathselect + 1.3.libxpathselect-dev. + * Update the unity autopilot test suite to be compatible with the new + autopilot API for custom emulators. + + [ Pawel Stolowski ] + * Add ModelIterator-inl.h to the list of installed headers (as it's + included by ModelIterator.h). + * Fixes for two autopilot tests. + + [ Mathieu Trudel-Lapierre ] + * Increase timeouts for hud functional and search tests. + + [ Andrea Azzarone ] + * Don't build CoverflowResultView.cpp. + * Fix crashing tests. (LP: #1182585) + * Remove AbstractSeparator.cpp (it does not make sense :). + * Allow alt-tabbing during a dnd operation. (LP: #111939) + + [ Sam Spilsbury ] + * LauncherDragWindow: defer icon paint until DrawContent rather than + doing so immediately (LP: #1180174). (LP: #1180174) + + [ Łukasz 'sil2100' Zemczak ] + * Fix two HUD failures related to HUD slow action activation. + * Fix some autopilot test failures, some related to test_shortcut_hint + and some to test_scroll in launcher. + * Modify all the hud_query_check lambdas to be more smart and error- + checking. Same for the selected_hud_button method in the HUD + emulator. Also, get rid of the troublesome test_gedit_undo and + change it into test_gedit_save, which is easier to test and anyway + tests what we want. Besides that we also now try to handle the + StateNotFoundError exception in the HUD emulator, another cause of + some AP failures. + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3352 (ubuntu-unity/next) + + -- Ubuntu daily release Fri, 31 May 2013 04:06:11 +0000 + +unity (7.0.0daily13.05.08ubuntu.unity.next-0ubuntu1) raring; urgency=low + + * Automatic snapshot from revision 3317 (ubuntu-unity/next) + + -- Ubuntu daily release Wed, 08 May 2013 04:57:49 +0000 + +unity (7.0.0daily13.05.01.1ubuntu.unity.next-0ubuntu1) raring; urgency=low + + [ Sebastien Bacher ] + * Some untranslatable and wrong strings in the previews (LP: #1074038) + + [ Andrea Azzarone ] + * [alt-tab] Disable detail view for webapp icons. (LP: #1169340) + + [ Marco Trevisan (Treviño) ] + * Launcher - count label pops out in auto-hide mode (LP: #1171476) + * Panel shadow is drawn above full-screen windows when notifications + are shown (LP: #1171934) + * [regression] Icon count is not shown if the icon is not transformed + (LP: #1171663) + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3315 (ubuntu-unity/next) + + -- Ubuntu daily release Wed, 01 May 2013 21:59:17 +0000 + +unity (7.0.0daily13.04.23ubuntu.unity.experimental.certified-0ubuntu1) raring; urgency=low + + [ Michal Hruby ] + * HORIZONTAL_TILE results aren't displaying "comment" (LP: #1158840) + + [ Brandon Schaefer ] + * Command lens does not close when pressing Alt+F2 (LP: #1167466) + + [ Nick Dedekind ] + * Filters are disappearing and impacting already displayed results + (LP: #1159814) + + [ Marco Trevisan (Treviño) ] + * Adding Lens results is more expensive than needed (LP: #1168569) + * Top Bar, window managment - top bar shadow not falling on restored + windows that are partially off the top edge of the screen (LP: + #871758) + * Opening new-window from quicklist static action does not focus the + newly opened window (LP: #1164483) + * Unity makes unneeded copies of Nux DrawList (LP: #1167605) + * Unityshell uses much of his CPU time only to get tray XIDs from + PanelController (LP: #1167894) + * Unity wastes some memory by allocating multiple times the same + texture (LP: #1166532) + * Launcher pre-processes icons also when the icons have not been + changed since last draw cycle (LP: #1168556) + * Unity is creating multiple instances of DBusIndicators per each + monitor (LP: #1166550) + + [ Andrea Azzarone ] + * Dash should only close when a icon is dragged outside of the + Dash/Launcher area (LP: #1170720) + * Launcher icons automatically placed in the launcher by USC (or apps + lens) fail to have running 'pips'. (LP: #1165097) + * dash preview animation is slow on high resolution screens (also + fullscreen mode) (LP: #1055126) + + [ Michi Henning ] + * ResultIterator.h defines functions that return const values (LP: + #1163705) + + [ Matthieu James ] + * [UIFe] BFB icon swirl should run clockwise not anti-clockwise (LP: + #1169238) + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3121 (ubuntu-unity/experimental- + certified) + + -- Ubuntu daily release Tue, 23 Apr 2013 07:05:10 +0000 + +unity (7.0.0daily13.04.18~13.04-0ubuntu1) raring; urgency=low + + [ Manuel de la Pena ] + * Purchased songs won't download when not logged to U1 (LP: #1168674) + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3309 + + -- Ubuntu daily release Thu, 18 Apr 2013 05:43:34 +0000 + +unity (7.0.0daily13.04.17~13.04-0ubuntu1) raring; urgency=low + + [ Marco Trevisan (Treviño) ] + * Top Bar, window managment - top bar shadow not falling on restored + windows that are partially off the top edge of the screen (LP: + #871758) + + [ Matthieu James ] + * [UIFe] BFB icon swirl should run clockwise not anti-clockwise (LP: + #1169238) + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3305 + + -- Ubuntu daily release Wed, 17 Apr 2013 04:07:04 +0000 + +unity (7.0.0daily13.04.10ubuntu.unity.experimental.certified-0ubuntu1) raring; urgency=low + + [ Didier Roche ] + * bump build-dep on libunity-dev + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3113 (ubuntu-unity/experimental- + certified) + + -- Ubuntu daily release Wed, 10 Apr 2013 07:16:02 +0000 + +unity (7.0.0daily13.04.15-0ubuntu1) raring; urgency=low + + [ Brandon Schaefer ] + * Command lens does not close when pressing Alt+F2 (LP: #1167466) + + [ Andrea Azzarone ] + * dash preview animation is slow on high resolution screens (also + fullscreen mode) (LP: #1055126) + + [ Marco Trevisan (Treviño) ] + * Unity makes unneeded copies of Nux DrawList (LP: #1167605) + * Unityshell uses much of his CPU time only to get tray XIDs from + PanelController (LP: #1167894) + * Adding Lens results is more expensive than needed (LP: #1168569) + * Opening new-window from quicklist static action does not focus the + newly opened window (LP: #1164483) + * Launcher pre-processes icons also when the icons have not been + changed since last draw cycle (LP: #1168556) + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3300 + + -- Ubuntu daily release Mon, 15 Apr 2013 04:17:42 +0000 + +unity (7.0.0daily13.04.10-0ubuntu1) raring; urgency=low + + [ Andrea Azzarone ] + * Launcher icons automatically placed in the launcher by USC (or apps + lens) fail to have running 'pips'. (LP: #1165097) + + [ Marco Trevisan (Treviño) ] + * Unity wastes some memory by allocating multiple times the same + texture (LP: #1166532) + * Unity is creating multiple instances of DBusIndicators per each + monitor (LP: #1166550) + + [ Michi Henning ] + * ResultIterator.h defines functions that return const values (LP: + #1163705) + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3290 + + -- Ubuntu daily release Wed, 10 Apr 2013 04:03:19 +0000 + +unity (7.0.0daily13.04.08-0ubuntu1) raring; urgency=low + + [ Tigran Gabrielyan ] + * [UIFe] Window list in right click context menu should indicate the + focused window (LP: #1152477) + + [ Andrea Azzarone ] + * Launcher - When a app is automatically placed in the Launcher after + being installed from the Software Center, it should be in the 'non- + running' state (LP: #987727) + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3283 + + -- Ubuntu daily release Mon, 08 Apr 2013 04:02:51 +0000 + +unity (7.0.0daily13.04.05.2-0ubuntu1) raring; urgency=low + + * Revert r3266 "Don't close the dash when switching from the command lens + to the home lens.", it's breaking dash closing for individual lens, + which also result in a serie of failing tests (lp: #1164915) + + [ Stephen M. Webb ] + * Bumped released version to 7.0.0 + + + [ Brandon Schaefer ] + * Invalid Dnd is not being ingored in the launcher. (LP: #1163473) + * Dash Overlay scrollbars should allow dragging, until the scrollbars + themselfs hit the top/end of the track. (LP: #1163616) + * [regession] Multi-monitor: Mousepointer hangs when passing between + monitors, although no Launcher is there. (LP: #1161726) + * The dash closes when trying to switch from Command lens to home lens + (LP: #1108956) + + [ Chris Townsend ] + * Need to tweak the icon glow for urgent apps (LP: #1163944) + + [ Andrea Azzarone ] + * Window management - grab icons appear when using touchpad (LP: + #1026712) + + [ Marco Trevisan (Treviño) ] + * compiz crashed with SIGSEGV in + sigc::internal::slot_call0 Fri, 05 Apr 2013 14:51:53 +0000 + +unity (6.12.0daily13.04.01-0ubuntu1) raring; urgency=low + + [ Marco Trevisan (Treviño) ] + * Launcher starts with default size then jumps to configured one on + login (LP: #1099815) + * Launcher - Open Trash window prevents Nautilus being launched when a + user clicks on the Nautilus Launcher icon (LP: #753938) + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3263 + + -- Ubuntu daily release Mon, 01 Apr 2013 04:02:55 +0000 + +unity (6.12.0daily13.03.29.1-0ubuntu1) raring; urgency=low + + [ Brandon Schaefer ] + * launcher - drag and drop of gedit text windows leaves launcher in + drop state (LP: #1121045) + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3260 + + -- Ubuntu daily release Fri, 29 Mar 2013 16:26:36 +0000 + +unity (6.12.0daily13.03.29-0ubuntu1) raring; urgency=low + + [ Marco Trevisan (Treviño) ] + * Empty trash dialog sometimes dont have the focus (LP: #807808) + * Launcher - Trash and Storage device icons in the Launcher should be + illuminated if folder is being viewed in Nautilus (LP: #1063830) + + [ MC Return ] + * CompWindow::syncPosition () function is deprecated and was removed + in lp:compiz, r3639 (LP: #1161285) + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3257 + + -- Ubuntu daily release Fri, 29 Mar 2013 07:24:06 +0000 + +unity (6.12.0daily13.03.25.1-0ubuntu1) raring; urgency=low + + [ Martin Pitt ] + * Add logind support (ConsoleKit and UPower suspend/resume are being + deprecated) (LP: #1155021) + + [ Chris Townsend ] + * Urgent apps need higher glow intensity (LP: #1157866) + * Launcher: Icon Backlight Mode "Edge Illumination Toggles" broken + (regression) (LP: #1103742) + + [ Paolo Rotolo ] + * Shutdown dialog should have correct punctuation (LP: #1157927) + + [ Andrea Azzarone ] + * Launcher tooltips keeps hanging on Desktop (LP: #1158378) + * Launcher tooltips don't disappear when dash is open (LP: #1158021) + * Some tooltip AP tests fail (LP: #1158357) + + [ Didier Roche ] + * Unity/Libunity unit tests broken by latest glib (LP: #1159677) + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3252 + + -- Ubuntu daily release Mon, 25 Mar 2013 13:10:17 +0000 + +unity (6.12.0daily13.03.20-0ubuntu1) raring; urgency=low + + [ Stephen M. Webb ] + * ‘No Image Available’ in previews isn’t translatable (LP: #1106849) + + [ Brandon Schaefer ] + * Unity unit tests take too long to finish (LP: #1053163) + * Unity FTBFS xgettext unicode TrashLauncherIcon.cpp:91 (LP: #1156931) + * HUD's item which is being mouse-hovered is selected, making fast + typing and clicking Enter unsafe (LP: #1066442) + + [ Marco Trevisan (Treviño) ] + * Icons edges are not visible on the 13.04 unity launcher (LP: + #1156698) + * Clicking on a device (volume) icon doesn't always bring nautilus to + focus (LP: #1154792) + * [Regression] No "filter result" label in the dash. (LP: #1155550) + * Launcher icon edges become invisible when loading an application + (LP: #1157303) + * [regression] Tooltip label is not centered (LP: #1155553) + * Clicking on trash icon doesn't always bring nautilus to focus (LP: + #1154862) + * Shutdown dialogue should close the overlays when activated from + power button (LP: #1155610) + * New shutdown Dialogs, shutdown/restart should change order. (LP: + #1154578) + * Shut Down dialog spells "Shut Down" incorrectly (LP: #1156641) + * New shutdown dialog had no default option selected (LP: #1155562) + * alt-tab - the 'pips' the indicate a application has multiple windows + open look pixelated (LP: #863331) + * Log Out dialog spells "Log Out" incorrectly (LP: #1156638) + * Launching an application from the "Appname" quicklist could not + bring it to focus (LP: #1155225) + + [ Mathieu Trudel-Lapierre ] + * gcalctool desktop file got renamed (LP: #1156810) + + [ Chris Townsend ] + * Launcher - auto-scroll needs to be more progressive (LP: #765732) + + [ Andrea Azzarone ] + * Tooltip timeout should not be resetted on each mouse movement. (LP: + #1155659) + * The sharp white line between dash and launcher is missing (LP: + #1125346) + * Reduce launcher tooltip timeout. (LP: #1155665) + * Launcher tooltips need fade animation on show/hide. (LP: #1155672) + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3239 + + -- Ubuntu daily release Wed, 20 Mar 2013 04:03:16 +0000 + +unity (6.12.0daily13.03.13.1-0ubuntu1) raring; urgency=low + + [ Sebastien Bacher ] + * Launcher - Update the icons used for the Software Centre, Nautilus, + and Software Updater (LP: #1081691) + + [ Andrea Azzarone ] + * Nautilus windows don't get the the focus when opened via the dash. + (LP: #1152733) + + [ Marco Trevisan (Treviño) ] + * New Shutdown view disables panel shadow (LP: #1152760) + * Shutdown goodbye text is sometimes partly missing (LP: #1152978) + * Shutdown view should be closable by escape-key (LP: #1152712) + * Press Alt+F1, panel’s shadow dissapear (LP: #942965) + * Long text in previews or dialogs is not properly aligned and/or + missing (LP: #1152980) + * Panel Shadow is not drawn properly during workspace switching (LP: + #1153699) + * QuicklistMenuItem's do not export the event timestamp on Activate + (LP: #1154082) + * [multimonitor] Dash - Opening dash or HUD on one screen removes + panel shadow on the other (LP: #892718) + + [ Łukasz 'sil2100' Zemczak ] + * Lenses shortcuts not working in singular cases (e.g. Super+A) (LP: + #1152517) + + [ Ubuntu daily release ] + * Automatic snapshot from revision 3211 + + -- Ubuntu daily release Wed, 13 Mar 2013 09:23:11 +0000 + +unity (6.12.0daily13.03.11-0ubuntu1) raring; urgency=low + + [ Marco Trevisan (Treviño) ] + * [FFe] Add Unity Style Shutdown Dialog (LP: #1152374) + * New unity style shutdown dialogues (LP: #882041) + + [ Automatic PS uploader ] + * Automatic snapshot from revision 3202 + + -- Automatic PS uploader Mon, 11 Mar 2013 04:02:43 +0000 + +unity (6.12.0daily13.03.08-0ubuntu1) raring; urgency=low + + [ Andrea Azzarone ] + * Launcher, Window Management - More Effective window switching for + apps with multiple windows using the Launcher (LP: #1081843) + + [ Automatic PS uploader ] + * Automatic snapshot from revision 3199 + + -- Automatic PS uploader Fri, 08 Mar 2013 10:34:28 +0000 + +unity (6.12.0daily13.03.07-0ubuntu1) raring; urgency=low + + * Automatic snapshot from revision 3194 + + -- Automatic PS uploader Thu, 07 Mar 2013 04:02:28 +0000 + +unity (6.12.0daily13.03.06.1-0ubuntu1) raring; urgency=low + + [ Didier Roche ] + * Build-dep on libjson-perl to get debian/scopes-recommends-generator + parsing the libunity-common json file successfully (and so having + the recommended scopes… recommended) + + [ Alexandre Abreu ] + * Web apps - After the user quits a web app that has just been + installed the icon doesn't stay in the launcher (LP: #1061056) + + [ Automatic PS uploader ] + * Automatic snapshot from revision 3190 + + -- Automatic PS uploader Wed, 06 Mar 2013 13:26:28 +0000 + +unity (6.12.0daily13.03.05-0ubuntu1) raring; urgency=low + + [ Didier Roche ] + * Need a .json file for having the list of default installed lens and + scopes (LP: #1137303) + + [ Andrea Azzarone ] + * [regression] On start up the Hud draws the panel gradient + incorrectly (LP: #1136447) + + [ Automatic PS uploader ] + * Automatic snapshot from revision 3185 + + -- Automatic PS uploader Tue, 05 Mar 2013 04:02:33 +0000 + +unity (6.12.0daily13.03.01-0ubuntu1) raring; urgency=low + + [ Andrea Azzarone ] + * unity.tests.test_dash.DashVisualTests.test_dash_position_with_non_de + fault_launcher_width randomly fails (LP: #1135628) + + [ Automatic PS uploader ] + * Automatic snapshot from revision 3179 + + -- Automatic PS uploader Fri, 01 Mar 2013 04:02:36 +0000 + +unity (6.12.0daily13.02.28-0ubuntu1) raring; urgency=low + + [ Stephen M. Webb ] + * unity watchfile is broken (LP: #1121754) + + [ Andrea Azzarone ] + * Switcher does not focus the last active window in detail mode (using + alt+grave) (LP: #1133338) + + [ Automatic PS uploader ] + * Automatic snapshot from revision 3175 + + -- Automatic PS uploader Thu, 28 Feb 2013 04:02:34 +0000 + +unity (6.12.0daily13.02.26-0ubuntu1) raring; urgency=low + + [ Andrea Azzarone ] + * Multi-monitor - Panel and launcher visible on top of multimonitor + non-focused fullscreen apps (LP: #748539) + * unity.tests.launcher.test_icon_behavior.LauncherIconsTests.* fails + randomly (LP: #1131679) + + [ Xiao-Long Chen ] + * Add timeout before removing launcher (LP: #1119801) + + [ MC Return ] + * cppcheck reports true positives (LP: #1131152) + + [ Automatic PS uploader ] + * Automatic snapshot from revision 3171 + + -- Automatic PS uploader Tue, 26 Feb 2013 04:02:40 +0000 + +unity (6.12.0daily13.02.19.1-0ubuntu1) raring; urgency=low + + [ Brandon Schaefer ] + * Multi-monitor: Mousepointer hangs when passing between monitors, + although no Launcher is there (regression) (LP: #1120223) + * Sticky edges should only use horizontal mouse movement (LP: #982543) + + [ Marco Trevisan (Treviño) ] + * Launcher - Workspace switcher should not be in the Launcher by + default (LP: #868423) + * [regression] Unlocking a running application, removes it from the + Launcher (LP: #1122311) + * Launcher, Workspaces - dragging and dropping the workspaces icon on + to the trash should switch Workspaces off (LP: #1118271) + + [ Chris Townsend ] + * webapp: alt-tab gets "stucked" on the browser rather than going to + the next entry (LP: #1070715) + + [ Nick Dedekind ] + * Dash - the "Decade" and "Size" dash filter category widgets are + broken (LP: #841899) + * Dash Places group is shining on quick mouse over (LP: #1119487) + + [ Lukas Vacek ] + * Show window list when right clicking an icon in launcher - enables + quick window switching (LP: #1107866) + + [ Marco Trevisan (Treviño) , Lukas Vacek ] + * Show window list when right clicking an icon in launcher - enables + quick window switching (LP: #1107866) + + [ Andrea Azzarone ] + * unity launcher vanishes when switching to mirrored displays (LP: + #991637) + * Opening an app with super+num shorcut doesn't give focus to the app + (LP: #1125331) + * Alt+` and detail switcher broken after revision 3153 (LP: #1129372) + + [ Sam Spilsbury ] + * Unity unnecessarily clears the ShapeBounding shape of windows on + minimize (LP: #1091600) + * Can't access minimized window after Unity restarts (LP: #851964) + + [ Automatic PS uploader ] + * Automatic snapshot from revision 3163 + + -- Automatic PS uploader Tue, 19 Feb 2013 14:26:14 +0000 + +unity (6.12.0daily13.02.08-0ubuntu1) raring; urgency=low + + [ Brandon Schaefer ] + * Multi-monitor - Add 'sticky edges deactivated for number of + milliseconds after the user breaks the barrier' variable that works + when the Launcher set to 'auto-hide' and sticky edges set to 'off' + (LP: #1064945) + + [ Łukasz 'sil2100' Zemczak ] + * testapp is a bad name (LP: #1089561) + + [ Marco Trevisan (Treviño) , Brandon Schaefer ] + * Multi-monitor - Add 'sticky edges deactivated for number of + milliseconds after the user breaks the barrier' variable that works + when the Launcher set to 'auto-hide' and sticky edges set to 'off' + (LP: #1064945) + + [ Marco Trevisan (Treviño) ] + * Alt-Tab switcher should use a very fast fade-in/out effect when + showing/hiding (LP: #1105058) + * Multi-monitor - Add 'sticky edges deactivated for number of + milliseconds after the user breaks the barrier' variable that works + when the Launcher set to 'auto-hide' and sticky edges set to 'off' + (LP: #1064945) + + [ Automatic PS uploader ] + * Automatic snapshot from revision 3140 + + -- Automatic PS uploader Fri, 08 Feb 2013 04:02:00 +0000 + +unity (6.12.0daily13.02.07-0ubuntu1) raring; urgency=low + + [ Andrea Azzarone ] + * make check fails on test-unit (LP: #1117487) + * Notification area whitelist is obsolete (LP: #974480) + + [ Marco Trevisan (Treviño) ] + * Switcher - when opening in detail mode (Alt+`) it should not use the + spread animation (LP: #1116927) + * Alt-tab sometimes focuses a window that is not in top of the app + stack (LP: #1115775) + * Switcher: Opening and closing the detail mode quickly makes unity + re-enable it (LP: #1116785) + * Exiting expo mode leaves the BFB quicklist open (LP: #1090565) + + [ MC Return ] + * unmaximize_window_key instead of unmaximize_or_minimize_window_key + exposed in g-c-c (LP: #1115128) + + [ Automatic PS uploader ] + * Automatic snapshot from revision 3136 + + -- Automatic PS uploader Thu, 07 Feb 2013 06:20:12 +0000 + +unity (6.12.0daily13.02.04.1-0ubuntu1) raring; urgency=low + + * debian/control: + - recommends indicator-sync so it gets installed by default + (lp: #1053482) + - recommends indicator-bluetooth as well (lp: #1111314) + + [ Łukasz 'sil2100' Zemczak ] + * debian/control: + - bump compiz build-dep due to the last ABI break + + [ Brandon Schaefer ] + * [regression] Clicking on the indicators when the Dash is open no + longer closes the Dash. (LP: #1109150) + * [staging][raring] Dash Maximise/Restore button depends on the + launcher icon size. (LP: #1101310) + + [ Romain Perier ] + * The Dash closes when trying to switch to the Command lens (Alt+F2) + (LP: #1019457) + + [ Marco Trevisan (Treviño) ] + * Launcher can have smaller size on monitor resolution change (LP: + #1105382) + * Dragging down a window from the panel on an external monitor, + restores it at wrong offset (LP: #1104043) + * [regression] Alt+Tab/Alt+grave brings other window to the front but + loses focus entirely. (LP: #1111620) + * Quicklist items need a way to be ellipsized (LP: #1111471) + + [ Charles Kerr , Andrea Azzarone ] + * the GObject subclasses in tests/ don't dispose() properly (LP: + #986875) + + [ Nicolas d'Offay ] + * Speed up dash blur (LP: #1102410) + + [ Manuel de la Pena ] + * API changes to FindKeyFocusArea in the Preview class stops more + complicated previous fom setting the correct focus (LP: #1102387) + + [ MC Return ] + * Wrong description in Dconf key + com.canonical.unity.launcher.favorites (LP: #1112560) + * Keyboard shortcut overlay says Ctrl+Super+Down "minimises" the + current window, but it doesn't (LP: #966099) + + [ Andrea Azzarone ] + * unmounting any gvfs-mounted device from unity menu crashes compiz + (LP: #1111389) + * compiz crashed with SIGSEGV in async_wrapper_callback() from + g_simple_async_result_complete() from + _g_simple_async_result_complete_with_cancellable() from + unmount_reply() (LP: #1102926) + + [ Łukasz 'sil2100' Zemczak ] + * SwitcherControllerImpl autopilot test failures in unity - + 6.12.0daily13.01.29.2-0ubuntu1 (LP: #1109192) + + [ Automatic PS uploader ] + * Automatic snapshot from revision 3117 + + -- Automatic PS uploader Mon, 04 Feb 2013 09:59:13 +0000 + +unity (6.12.0daily13.01.25.1-0ubuntu1) raring; urgency=low + + [ Romain Perier ] + * lp:unity FTBFS on quantal: error: ‘bamf_view_is_user_visible’ was + not declared in this scope (LP: #1086276) + + [ Brandon Schaefer ] + * TestOverlayVScrollBar.TestConnectorResetsDuringScrollAnimation + segfaults. (LP: #1102699) + + [ Andrea Azzarone ] + * Removal of 21_correct_timestamp_.. patch returns focus issues in + Unity session (LP: #1072566) + + [ Marco Trevisan (Treviño) ] + * The workspace shortcuts listed in the overlay should be hidden when + workspaces are disabled (LP: #1103561) + * Shortcuts hints overlay hides a disabled shortcut without + relayouting (LP: #1102429) + + [ Manuel de la Pena ] + * ActionLink does not highlight when selected via keyboard navigation + (LP: #1103048) + + [ Automatic PS uploader ] + * Automatic snapshot from revision 3072 + + -- Automatic PS uploader Fri, 25 Jan 2013 12:29:18 +0000 + +unity (6.12.0daily13.01.21-0ubuntu1) raring; urgency=low + + [ Marco Trevisan (Treviño) ] + * Switcher windows spread animation is broken on external monitors + (LP: #1100055) + + [ Automatic PS uploader ] + * Automatic snapshot from revision 3051 + + -- Automatic PS uploader Mon, 21 Jan 2013 04:01:56 +0000 + +unity (6.12.0daily13.01.18-0ubuntu1) raring; urgency=low + + [ Brandon Schaefer ] + * HUD does not save the current input focus correctly (LP: #1100962) + + [ Andrea Azzarone ] + * Unity fails to build on raring: g_io_scheduler_push_job is + deprecated (LP: #1100658) + + [ Marco Trevisan (Treviño) ] + * Launcher - Update BFB icon to use a new special asset (and no tile) + (LP: #1081697) + * Launcher - Update Launcher tile assets (LP: #1081687) + + [ Daniel van Vugt ] + * Allow launcher icons smaller than 32px (LP: #930031) + + [ Automatic PS uploader ] + * Automatic snapshot from revision 3048 + + -- Automatic PS uploader Fri, 18 Jan 2013 04:02:06 +0000 + +unity (6.12.0daily13.01.17-0ubuntu1) raring; urgency=low + + [ Brandon Schaefer ] + * [regression] Scrollbar Overlay still appears after the dash has + closed. (LP: #1099999) + + [ Christopher Townsend ] + * Dash - Users should be able to exit the Preview and return to the + results by right or middle clicking anywhere inside the preview (LP: + #1046315) + + [ Andrea Azzarone ] + * Need some 'minimize' autopilot tests (LP: #1089981) + * TestLauncherController.* fails (LP: #1089900) + * Windows that start minimized cannot be opened (LP: #1087422) + + [ Automatic PS uploader ] + * Automatic snapshot from revision 3043 + + -- Automatic PS uploader Thu, 17 Jan 2013 07:03:58 +0000 + +unity (6.12.0daily13.01.11.2-0ubuntu1) raring; urgency=low + + [ Didier Roche ] + * debian/control: + - bump some missed build-deps + - bump compiz and nux build-deps for the API and ABI breakages + (LP: #1095981) + * debian/rules: + - disable pch for now as it's not working with -g -02 (LP: #1095978) + + [ Brandon Schaefer ] + * Ported Compiz to 0.9.9 + * debian/control: + - bump the build-deps + * Dash and HUD do not have X event focus, causing XIM to not work. + (LP: #1086988) + * Windows losing focus after the start/restart of Unity (LP: #1097368) + + [ Łukasz 'sil2100' Zemczak ] + * Dash - Update Dash nav bar icons (LP: #1089373) + * Autopilot tests failing in the test_hud suite due to locale + dependency (LP: #1076531) + * Super key not registered if held too long (LP: #1097189) + * Unity HUD uses wrong icon when switching from the Dash to HUD (LP: + #1089482) + + [ Marco Trevisan (Treviño) ] + * Using bleeding edge Mesa drivers causes GL_INVALID_OPERATION error + in glDrawBuffer / glReadBuffer (LP: #1092550) + * [Regression] Window buttons / Title doesn't redraw correctly on + windows with no menus (LP: #1090439) + + [ Nick Dedekind ] + * Dash - When the Dash preview is open, the ghost images should run + all the way to the top of the screen as shown in the design (LP: + #1060948) + * Dash - When the Dash preview opens, the category headers should be + expanded and the filters should hide (LP: #1060937) + * Dash - In the Dash preview, when a user moves to the next or + previous preview the highlighted ghost image should change (LP: + #1060941) + * Dash - As soon as a user starts dragging a .png file from the Dash, + the file icon changes size (LP: #863412) + + [ Gord Allott , Łukasz 'sil2100' Zemczak , Didier Roche ] + * "unitydashlegalseen" Causing back-up error (LP: #1066646) + * unity dash should show legal disclaimer (LP: #1065652) + + [ Manuel de la Pena ] + * StaticCairoText makes NUX get into an infinte loop (LP: #1071327) + + [ Daniel van Vugt ] + * Minimized windows don't restore, or restore as blank (LP: #1089779) + + [ Andrea Azzarone ] + * TestOverlayScrollBar.TestScrollDownSignal segfaults (LP: #1089888) + * Dash - Update Dash Launcher icon tooltip to say "Search your + computer and online sources" (LP: #1090325) + * TestLauncherController.GetLastIconPriorityUnStickyWithNoIconsAndUri + segfaults (LP: #1089894) + * TestDashController.TestShowAndHideDash fails (LP: #1089904) + * [Regression] Tapping super key shows shortcuts overlay. (LP: + #1090388) + * [Regression] Unity fails to restore initially minimized windows. + (LP: #1097686) + * launcher does not show minimized update manager while clicked (LP: + #1003950) + * Dash - Update Dash Home search box hint message to say "Search your + computer and online sources" (LP: #1090327) + * can't quit a minimized application (LP: #1086366) + * Unity daily-build (07.01.13) empty space between launcher and dash + in non default launcher size (LP: #1097184) + + [ Sam Spilsbury ] + * Fonts get changed to Ubuntu Italic 11 when running make check (LP: + #1086762) + + [ Gord Allott ] + * "unitydashlegalseen" Causing back-up error (LP: #1066646) + + [ Automatic PS uploader ] + * Automatic snapshot from revision 3034 + + -- Automatic PS uploader Fri, 11 Jan 2013 13:05:11 +0000 + +unity (6.12.0daily12.12.05-0ubuntu1) raring; urgency=low + + [ Michael Terry ] + * debian/control: + - Update Vcs-Bzr + * Automatic snapshot from revision 2905 (bootstrap) + - Hide launcher tooltip once shortcut overlay appears (LP: #1035860) + - Update shortcut overlay design (LP: #1049601) + - Don't cut off shadow on launcher icon drag window (LP: #765715) + - Provide more immediate feedback when clickong on launcher (LP: #893140) + - Decorate spread windows in switcher (LP: #838222) + - Make sure to initialize a variable before it can be used (LP: #1073516) + - Fix FTBFS due to BAMF API change (LP: #1077937) + - Run gtest during build (LP: #133637) + - Make shopping lens test more robust (LP: #1077131) + - Fix some random autopilot test failures (LP: #1078448) + - Fix autopilot tests for details mode (LP: #1073892) + - Fix autopilot tests for indicator-session (LP: #1075350) + - Fix autopilot tests for non-English locales (LP: #1075898) + + [ Didier Roche ] + * debian/control: + - adding libgtest-dev and google-mock build-dep now that there are in main + (LP: #1076763) + - add libunity-core -> unity-common dep (LP: #1079132) + - do not have unity-common dep on compiz-gnome: the migration code is only + ran if compiz-gnome is installed, but compiz-gnome is pulled by compiz + directly. We don't care if the migration code isn't executed. + + [ bschaefer ] + * Ported to nux 4.0 + + [ Ricardo Salveti de Araujo ] + * Doesn't need to depend on gcc 4.6 anymore (LP: #1044836) + + [ Nick Dedekind ] + * Previews loading more than 454 lines of description text crash Unity + (LP: #1066788) + + [ Brandon Schaefer ] + * unity::TimeUtil::TimeDelta returns an int value which overflows + after 24 days of uptime (LP: #806248) + * Top panel "tooltip" is gone (regression) (LP: #1085045) + * Dash - Implement *overlay scrollbars* in Dash. Existing scrollbars + are too thin to grab on to. (LP: #608124) + + [ Andrea Azzarone ] + * Dash - Regression: Clicking between filter label and 'All' button no + longer toggles filter label (LP: #1080534) + + [ Didier Roche ] + * libunity-core fails without the schemas from unity-common (LP: + #1079132) + + [ Manuel de la Pena ] + * There is no common ui element that behaves like a url link (LP: + #1067705) + + [ Automatic PS uploader ] + * Automatic snapshot from revision 2956 + + -- Automatic PS uploader Wed, 05 Dec 2012 09:27:29 +0000 + +unity (6.12.0-0ubuntu4) raring; urgency=low + + * Really fix cmake now + + -- Didier Roche Thu, 22 Nov 2012 14:51:43 +0100 + +unity (6.12.0-0ubuntu3) raring; urgency=low + + * Apply 2 upstream patches to fix FTBFS on raring: + - gettext cmake support change with new cmake + - include directly iostream needed for std::cout + + -- Didier Roche Thu, 22 Nov 2012 12:31:58 +0100 + +unity (6.12.0-0ubuntu2) raring; urgency=low + + * debian/control.in: Recommends gnome-control-center-unity + + -- Sebastien Bacher Wed, 21 Nov 2012 19:22:30 +0100 + +unity (6.12.0-0ubuntu1) raring; urgency=low + + * New upstream release. + - Includes two already cherry-picked fixes in Ubuntu + - Unregister gdbus object in the dtor (LP: #1047760) + - Top panel "tooltip" got out of sync when navigating with the + keyboard (LP: #1067358) + - Fix escaping of _panel_title (LP: #1067357) + - Fix ALT+Tab switches to incorrect window (LP: #1071298) + - Stop Unity UI elements from flickering in some cases (LP: #1070735) + + -- Timo Jyrinki Thu, 08 Nov 2012 11:10:13 +0200 + +unity (6.10.0-0ubuntu2) quantal-proposed; urgency=low + + * Cherry-picked from upstream: + - [SRU Regression] Launcher icon corruption while rearranging + (LP: #1071813) + + -- Łukasz 'sil2100' Zemczak Tue, 30 Oct 2012 18:00:00 +0100 + +unity (6.10.0-0ubuntu1) quantal-proposed; urgency=low + + [ Timo Jyrinki ] + * New upstream release. + - Gap between the dash gradient and the panel one (LP: #1062375) + - [regression] Dash closes if the onscreen keyboard is outside of + Dash' geometry (LP: #1058705) + - Dash - Category expander arrow is in expanded mode no matter if + category is actually expanded (LP: #1053047) + - Unity panel does not show the kate menus in the correct order + (LP: #1062283) + - compiz crashed with SIGSEGV in g_type_check_instance_is_a() from + g_object_unref() from _g_file_attribute_value_clear() from ... from + query_info_async_cb() [libgvfsdbus.so] (LP: #1061510) + - dash's music album previews: can't drag the scrollbar (LP: #1056995) + - Small chunks of the panel shadow appear individually (and very dark) + (LP: #1057528) + - compiz crashed with SIGSEGV on Unity "Unmount" (LP: #1055812) + - [regression] Dash - 'More suggestions' icons in App Lens are too + large (LP: #1052513) + - BamfLauncherIcon: ensure the icon and name values when the running + state changes (LP: #772986) + - Changes the swapping order of the detail mode. Now the currently + active window gets moved to the end, instead of getting swapped + with the last used window (LP: #1061229) + - Fixes GetRegion tex coord maths (LP: #1058391) + - Fixed fade-in behavior of Unity's showdesktop function (LP: #1063249) + - Added showdesktop to unityshell.xml.in, because + the feature showdesktop is provided by unityshell. (LP: #1006429) + (LP: #1006434) (LP: #1063171) + - Make HudLauncherIcon::ubus_manager_ "un-static" (LP: #1048274) + - Fix reference counting problem which leads to memory leaks and a + crash in MT grab handles (LP: #1046201) + - Ensure categories with non-personal results can show up before empty + categories with personal results (LP: #1067327) + - fix a backup error (LP: #1066646) + + [ Łukasz 'sil2100' Zemczak ] + * Cherry-picked from upstream: + - Reverted the switch from boost to std which was part of the fix for + LP: #1046201. The crash is still fixed without this change, so it was + actually unneeded + + -- Timo Jyrinki Tue, 16 Oct 2012 19:35:02 +0300 + +unity (6.8.0-0ubuntu2) quantal; urgency=low + + * Cherry-pick a fix for having legal information in the dash. This links + to a legal html document. The string itself in the dash is picked from + ubuntu-online-account gnome-control-center integration and so, already + translated and part of langpacks for 12.10. (LP: #1065652) + + -- Didier Roche Fri, 12 Oct 2012 11:47:31 +0200 + +unity (6.8.0-0ubuntu1) quantal-proposed; urgency=low + + [ Ángel Guzmán Maeso ] + * debian/unity-crashdb.conf: + - Update dictionary option for follow latest apport spec + + [ Łukasz 'sil2100' Zemczak ] + * New upstream release. + - unity 6.8 candidate segfaults on "app expose" with low gfx mode + (LP: #1060148) + - [regression] Dash - Left separator is missing (LP: #1057798) + - unity-panel-service crashed with SIGSEGV in + panel_indicator_entry_accessible_get_n_children() from + atk_object_get_n_accessible_children() (LP: #913324) + - [regression] If unity is started with maximized dash, unmaximizing the + dash does not wrap rows (LP: #1053116) + - Dash lens buttons don't work after changing form factor to maximize on + desktop (LP: #1053316) + - Clicking on Workspace Switcher icon when the expo is showing, not always + closes it 1059759 convert files list deprecated keys (LP: #1059594) + - Unity through llvmpipe is slow (LP: #1046497) + - compiz crashed with SIGSEGV in unity::QuicklistView::Show() from + unity::QuicklistManager::ShowQuicklist() (LP: #1055995) + - compiz crashed with SIGSEGV from + unity::dash::HomeLens::Impl::LensSearchFinished() (LP: #1054219) + - [regression] Starting an app & then locking to launcher is not persistent + across sessions (LP: #1054645) + - [regression] Dash, Launcher, Menu Bar - Unintended shadows are rendered + for the Unity Launcher and Panel, when the dash is open (LP: #1043260) + - [Unity 6.x] Active blur doesn't update if you disable CCSM > OpenGL > + Framebuffer object (LP: #1039999) + - Alt+Tab/Alt+grave brings other window to the front but loses focus + entirely. (LP: #1035628) + - Spread - Scaling all the windows is too slow (LP: #1055643) + - Window management - Middle clicking on a window inside the spread should + close that window (equivalent action to clicking on the close button) + (LP: #1052821) + - Scale window decorations don't have properly rounded corners + (LP: #1055610) + - Scale window decorations text does not match theme style (Radiance) + (LP: #1055609) + - Spread window decorations does not match the theme when changed + (LP: #1055605) + - scaled window decorations are sometimes wider than the window + (LP: #1053225) + - Launcher should not auto-hide after dragging an icon, if mouse is still + over it (LP: #1053978) + - unity spread window on second click not working when ibus language panel + is shown. (LP: #1035895) + - windows.push_back() in + BamfLauncherIcon::GetFocusableWindows (LP: #1053220) + - Category emblems are blurry (LP: #1056874) + - Rendering flaws of the dash previews (LP: #1055455) + - [UIFe] Social Lens doesn't have authorised and meaningful icon + (LP: #1056191) + - [dash] Preview fade out animation hangs occasionally (LP: #1058145) + - Dash - rendering of ribbons shouldn't be relative (LP: #1057971) + - Horizontal alignment search box and views below (LP: #1055544) + - Compiz crashed in cairo_save() from + unity::UnityWindow::RenderDecoration() from + unity::UnityWindow::scalePaintDecoration() from + ScaleWindow::scalePaintDecoration() (LP: #1061396) + - [regression] Spinner doesn't spin around its center (LP: #1061081) + - [regression] Graphical glitches in HUD/Dash bottom left and top right + corner (LP: #1060532) + - [Quantal] unity-lens-application does not start on some slow machines + (LP: #1058619) + - [Dash] Rendering flaw of the dash search entry (LP: #1059562) + - [dash] Rendering flaw of filterbar after scrolling down/scrolling up. + (LP: #1059607) + - Unity launcher doesn't prompt for password to unlock the device when + clicking on a encrypted volume icon (LP: #713432) + - [regression] Unable to add desktop files with spaces in their name from + Nautilus into the Launcher (LP: #1055552 ) + - Missing context menus for Qt apps after minimizing the window + (LP: #929712) + - Music preview note image is blurry (LP: #1060195) + * debian/control: + - Bumped libnux dependency to 3.8.0 + + -- Łukasz 'sil2100' Zemczak Thu, 04 Oct 2012 18:17:41 +0200 + +unity (6.6.0-0ubuntu3) quantal-proposed; urgency=low + + * Upload to quantal-proposed for the compiz abi transition + + -- Sebastien Bacher Mon, 01 Oct 2012 19:38:57 +0200 + +unity (6.6.0-0ubuntu2) quantal; urgency=low + + [ Łukasz 'sil2100' Zemczak ] + * debian/unity-common.maintscript: + - Added routines for removing the unused + /etc/compizconfig/upgrades/com.canonical.unity.unity.03.upgrade file + * debian/control, debian/compat: + - Bumped the debhelper version to the 9 series + + [ Didier Roche ] + * Fix the above versionning for removing the conffile + * build-dep on compiz as getting an ABI break. + + -- Didier Roche Mon, 01 Oct 2012 14:25:09 +0200 + +unity (6.6.0-0ubuntu1) quantal-proposed; urgency=low + + * New upstream release. + - Fixes non-escaped character sequences in dash previews (LP: #1039020) + - Updated background layer for preview cover-art and details panels + to be 10% low-light + - Expand a PlacesGroup if it is the only category that contains results + (LP: #950710) + - Update unity autopilot tests to match autopilot API + - Updated the convert files to fix some typos in the key names + - Add gmodule dependency + - Activate proper result if the categories aren't displayed in-order + (LP: #1040101) + - Refactor device launcher icons (LP: #713423) + - LauncherController: make the controller enable the launcher struts, + based on hide-mode option (LP: #1044005) + - Launcher: make always possible to drag an icon to the bottom or top + of its sub list (LP: #1043968) + - Don't desat bfb/hud icon in DNDReset (LP: #1043963) + - Progressively adjust the speed of the minimize animation. First + time it is used is slower, then speeds up the more it is used. + (LP: #1017510) + - Implement new ordering of categories for home lens. (LP: #1043915) + - UnityWindow now implements ScaleWindowInterface (LP: #876017) + - Launcher: restore an icon position after that the dragging has been + cancelled (LP: #955561) + - LauncherDragWindow: cancel drag on window mapped/unmapped + (LP: #1044723) + - Now there is a check of an override color in RefreshColor (which is + called when a PropertyNotify event happens). Also added a check in + FullySaturateColor to a void division by zero. (LP: #975350) + - Queue redraw after cover-art texture is updated from a url/file source. + (LP: #1043947) + - Fixed ability to delete glib::Source wrapper during its callback + (LP: #1044823) + - Close preview when dash is hidden. (LP: #1045298) + - LauncherModel: rewrite the Reordering functions to keep the icon + priority deltas (LP: #761155) + - Make sure we can pass extra hints when activating preview actions. + (LP: #1046352) + - UnityWindow: scale window code improved (LP: #1033935) + - The mouse will now cause the HUD buttons to change selection + (LP: #1042692) + - "Alt+Space" shortcut to reveal the window menu is not hardcoded, but a + Compiz key option. " (Hold)" should also be translated. Made all + Compiz plug-in names and all Compiz plug-in option names in + unityshell.cpp static constants. + - remove unity --reset, it's not anymore really needed now that we are + in stable days of unity and we moved to gsettings + - Removed the variables 'oldPrev' and 'oldNext' which got assigned the + value NULL, but then were never used + - Fixed the size of the previews to 770x380 pixels. (LP: #1045243) + - UnityWindow: use smart pointers, use static close_icon (with dynamic + state) and PanelStyle context (LP: #1033935) (LP: #1045127) + (LP: #1046124) (LP: #1046126) + - Remove everything in the #ifndef USE_MODERN_COMPIZ_GL ifdefs and remove + the ifdefs alltogether. unity now requires compiz 0.9.8.0. + - Re-add code to draw panel background texture when the dash is open and + there is a maximized window (LP: #1044460) + - EdgeBarrierController: Temporary disable the edge barriers also when + autohide is set (LP: #1020058) + - a11y: Port unity3d and panel service accessibility init to atk-bridge + (LP: #1023542) (LP: #1046582) + - Dash and Hud get drawn correctly no matter which monitor the mouse is in + (LP: #1002260) + - Fix minor problem with the Hud/Dash being drawn while closing on a + different monitor. + - Extended track play/pause mouse discovery for entire track row. + (LP: #1043997) + - Implemented DBus interface for DashController and made HideDash() + method available via DBus. This is needed by music-preview-player + codec installation functionality for hiding the dash when codec + installation starts. (LP: #1043825) + - Adds the extra_text property to preview Action (LP: #1049008) + - Fixed a layout flicker when first opening previews (LP: #1038944) + (LP: #1043277) + - Update sizing of elements to match designs, update assets (LP: #1049096) + - Fix crash in unity::dash::CoverflowResultView::Impl::Impl() + (LP: #1047420) + - UnityShell: remove scale_highlighted_window_ variable, using scale's + getSelectedWindow instead (LP: #1046795) + - Fixed dash dismissal when changing focus to a window on monitor external + to that of the dash. (LP: #923657) Improved panel update speed when + opening dash. (LP: #1044086) + - Added two new special icons for missing album cover; to be used by + music lens. They don't really fit into unity-asset-pool as they don't + have regular sizes. (LP: #1049217) + - Register file delete events in zeitgeist when file is dropped onto Trash + launcher icon. Added zeitgeist dependency. (LP: #870150) + - Restore the panel shadow, which has been missing since Unity 6.4. + (LP: #1045705) + - Added SocialPreview. (LP: #1049127) + - Disable the flow renderer (LP: #1049593) + - Added two new special icons for missing album cover; to be used by + music lens (LP: #1049217) + - Updated dash result highlight focus to 106x106 pixels with 20% white + opacity. Increased dash result file image size to 96x96. (LP: #1049128) + - Avoid construction of row wrappers. (LP: #1050342) + - Added extra-text to preview actions (for price tags) (LP: #1049593) + - Change the IconLoader methods to allow specifying both + maximum width and height. Updated rendering of the icon + ribbons. (LP: #1049593) + - Preview navigation buttons opacity changes on mouse-over. + (LP: #1049593) + - Adds a new background gradient to the dash and panel, as well as + removes some separator lines (LP: #1049593) + - Fixed a warning emitted by unreferencing an object owned by a smart + pointer in HudController.cpp. Caused by adopting a new nux::BaseWindow. + - Removed dash preview background shadow. (LP: #1049593) + - Raise shortcut overlay on show (LP: #985883) + - Reduce internal-padding inside filter buttons (LP: #856277) + - Added left and right click exit to cover art for all previews + (LP: #1045230) (LP: #1045752) (LP: #1049593) + - Show the alt-tab on the monitor with the mouse (LP: #1044293) + - Fix several failing autopilot tests + - Fix the standalone launcher crash on exit + - Fix uninitialized and invalid reads as reported by valgrind + - Enabled focus navigation for dash preview buttons + (LP: #1045416) (LP: #1049593) + - Fixed scrolling in music preview + - Send the current XLib timestamp to applications when we're opening + them to not confuse them and cause issues like what we have seen + with Firefox (LP: #1050687) + - Implemented the loading of the category icon for the application + category (required for the apps lens) (LP: #1049593) + - Refactor unity::Settings to use nux::RWPropert (LP: #1044681) + - LauncherController, FavoriteStore, Launcher, Icons: always use sort + priority based on favorites to get positioned on launcher + (LP: #761155) (LP: #858540) (LP: #868423) (LP: #1028927) + (LP: #1042845) (LP: #1045146) + - UnityWindow: implements sigc::trackable to fix crash (LP: #1052683) + - Dash/Hud no longer steal mouse events outside their content area. + Better draw handling of hud animation (LP: #1049593) + - add a deprecated --reset option as it seems otherwise to match + to --reset-icons + - Slows the animation down when installing applications in the Dash + Preview and the Software Center (LP: #1045746) + - Updates the API to match nux trunk and nux/3.0 + - Introduced dash to preview transitions, relying on nux (LP: #1049593) + - Don't call GraphicsContext::DeactivateFramebuffer which will + immediately restore the backbuffer. Instead call WindowCompositor:: + RestoreMainFramebuffer to bind either the backbuffer or reference + framebuffer for reading as that is the one we're drawing to as is the + most-up-to-date + - SocialPreview: Don't expand preview_info_hints, it was pushing down + the comments when there wasn't enough comments to fill the space + - Show workspace switcher icon always + - Fix rendering of Dash in maximised mode with redirected textures + by using the same code-patches as the restored Dash mode for the + overlay. (LP: #1053092) + - Fix more unit tests + - Fix ERROR ... unity.thumbnailgenerator ThumbnailGenerator.cpp:429 + More than one thumbnail generator created. + - Implement "focus on hover" behavior for preview action buttons + (LP: #1053014) + - Clicking on Dash border should not close the dash + - Remove two manual-tests, that are now obsolete + - Adds changes to the LauncherController to better handle favourites + and the expo icon + - [UIFE][FFE] Install Amazon and Ubuntu One Music Store webapp items + in the launcher by default (LP: #1046840) + * debian/control: + - build-dep on libzeitgeist-dev and libunity-dev + - bump because of ABI breakage build-dep on compiz and nux + - now recommends unity-lens-shopping (LP: #1053470) + + -- Didier Roche Thu, 20 Sep 2012 16:56:38 +0200 + +unity (6.4.0-0ubuntu6) quantal; urgency=low + + * Backport a fix for [regression] Dash - Hitting enter after opening + Lens or searching no longer opens first item (LP: #1041583) + + -- Didier Roche Mon, 10 Sep 2012 11:33:32 +0200 + +unity (6.4.0-0ubuntu5) quantal; urgency=low + + [ Sebastien Bacher ] + * debian/control: updated some build-depends + + [ Michael Terry ] + * debian/control: Recommend unity-lens-photos (FFe LP: #1044447) + + -- Michael Terry Fri, 07 Sep 2012 11:59:14 -0400 + +unity (6.4.0-0ubuntu4) quantal-proposed; urgency=low + + * CMakeLists.txt: Make the GL/GLU linking conditional on BUILD_GLES, + rather than based on uname, so it actually matches GLES settings. + * dash/previews/CMakeLists.txt: Cargo-cult linking options from other + modules for both -fPIC and UNITY_STANDALONE_LADD, fixing ARM/GLES. + * debian/rules: Remove crazy per-arch quilt madness and drop patches. + + -- Adam Conrad Sun, 02 Sep 2012 18:34:29 -0600 + +unity (6.4.0-0ubuntu3) quantal-proposed; urgency=low + + * no-change rebuild to pick up nux-dev gles bits on armel/armhf + + -- Iain Lane Sun, 02 Sep 2012 18:17:45 +0100 + +unity (6.4.0-0ubuntu2) quantal-proposed; urgency=low + + * debian/rules: "foo" really isnt a valid architecture, set + gles2_architectures to "armel armhf" so that GLES support gets actually + enabled on arm builds (...from the stories of the "Doh! Department") + (LP: #1044709) + + -- Oliver Grawert Sat, 01 Sep 2012 20:28:01 +0000 + +unity (6.4.0-0ubuntu1) quantal-proposed; urgency=low + + [ Łukasz 'sil2100' Zemczak ] + * New upstream release. + - Software Center add to launcher icon animation is delayed when the + launcher is in auto-hide mode (LP: #1012896) + - Home lens: Applications show up in Music category (LP: #1040101) + - WARN unity.hud.hud Hud.cpp:185 Attempted to close the hud connection + without starting it (LP: #1039451) + - Text field textures do not update when maximum width changes. + (LP: #1037187) + - An application is closed if manually removed from favorites on gsettings + (LP: #1032157) + - The switcher (Alt+Tab) is showing incorrect windows after using Deskop + Wall (Ctrl+alt+) (LP: #1031959) + - Dragging icons to reorder -away from launcher causes the dragged icon + image edges to fade away(cut off) (LP: #1026247) + - Screen flickers when changing launcher icon size. (LP: #1024113) + - Arrow for indicating lenses points empty space on alt+F2 (LP: #998752) + - [previews] Music album tracks do not have a scroll-bar when needed. + (LP: #1039462) + - [USE_MODERN_COMPIZ_GL] With unity scrollbar support enabled, hotplugging + monitors doesn't work (LP: #1039410) + - [previews] Track titles aren't escaped (LP: #1039020) + - Launcher - Edge of tiles (with backlight disabled) is too opaque + (LP: #1038138) + - [USE_MODERN_COMPIZ_GL] Benchmark window appears behind the Unity shell + now (LP: #1036609) + - [GLES] [USE_MODERN_COMPIZ_GL] Unity shell (Launcher and Panel) are + missing if framebuffer_object is disabled (LP: #1036569) + - [USE_MODERN_COMPIZ_GL] Benchmark window is mostly invisible, shrunken + and displaced (LP: #1036528) + - Unity quicklist menu items leak memory (LP: #1036338) + - Icon resized between 32 - 48 - 64 look jaggy (LP: #1036231) + - [Regression] Hideous low-res icon when using the HUD with autohide + enabled. (LP: #1035951) + - [regression] Selecting an item of the BFB quicklist when the dash is + open, causes it to hide (LP: #1035641) + - Launcher - Switch on "backlight toggles" mode by default (LP: #1033866) + - Unity spends 15% of time in PlacesGroup::ComputeContentSize when opening + dash (LP: #1033306) + - Launcher dragged icon is not redrawn when the mouse pointer is not moved + (LP: #1032700) + - Bottom - Up key navigation is broken in dash filterbar (LP: #1028810) + - Launcher - SD card can not be ejected by drag-n-dropping to trash + (LP: #960910) + - Alt-tab - The app name in the integrated menu should not change during + Alt-tab switching (LP: #950782) + - Dash - If only one Category Header is displayed, it should be + automatically expanded (LP: #950710) + - Launcher - Unity mouse wheel scroll too small (LP: #906072) + - boot moves desktop icons (LP: #886667) + - Alt-tab - Reduce the spread delay for all items other than the initial + item the select lands on after alt-tab opens (LP: #838232) + - Launcher - Launcher should never autohide when the cursor is positioned + over the Launcher (e.g. When a spread ends) (LP: #745707) + - Dash home opens files by default, should be applications? (LP: #1041583) + - [BUILD_GLES] Multiple build errors in unity-shared/IconRenderer.cpp + (LP: #1039453) + - [USE_MODERN_COMPIZ_GL] [multimonitor] If unityshell is loaded then both + monitors are intermittently painted onto the second monitor (squeezed) + (LP: #1037949) + - [USE_MODERN_COMPIZ_GL] [multimonitor] Launcher/Panel only draws on one + monitor, not both (LP: #1037408) + - [GLES] [USE_MODERN_COMPIZ_GL] [regression] Launcher and Panel are drawn + on top of fullscreen windows (LP: #1036587) + - [GLES] [USE_MODERN_COMPIZ_GL] Screen goes black if unityshell is loaded + and vertex_buffer_object=OFF (LP: #1036568) + - [regression] [USE_MODERN_COMPIZ_GL] Launcher overdrawn; transparency lost + and white line appears. (LP: #1036519) + - lp:unity FTBFS - Launcher.h:138:11: error: ‘GestureDeliveryRequest’ in + namespace ‘nux’ does not name a type (LP: #1036095) + - Results sorting in the lens model is not reflected in the Dash + (LP: #1027811) + - Launcher - Quicklist menu does not respond to being opened on a new icon + if already open (LP: #890991) + - compiz crashed with SIGSEGV in SimpleLauncherIcon::SetIconName() + (LP: #763560) + - Unity crashes on startup with nvidia (LP: #1041123) + - [staging ppa] unity crashes when running dash autopilot tests + (LP: #1040875) + - lp:unity does not build (missing dash/PreviewMusic.cpp) (regression of + bug 1038886) (LP: #1040431) + - Coverflow can crash unity (LP: #1039959) + - lp:unity does not build (missing dash/PreviewMusic.cpp) (LP: #1038886) + - lp:unity (USE_MODERN_COMPIZ_GL) FTBFS IconRenderer.cpp:845:5: error: + ‘TextureCoord0Location’ may be used uninitialised in this function + [-Werror=uninitialized] (LP: #1036514) + + [ Timo Jyrinki ] + * Cherry-pick fixes from upstream: + - Launcher: make always possible to drag an icon to the bottom or top + of its sublist (LP: #1043968) + - LauncherController: make the controller enable the launcher struts, + based on hide-mode option. (LP: #1044005) + - Don't desat bfb/hud icon in DNDReset. (LP: #1043963) + - LensView: fallback to normal renderer (instead of Coverflow) + if GLSL unavailable (LP: #1040628) + + -- Łukasz 'sil2100' Zemczak Thu, 30 Aug 2012 23:49:09 +0200 + +unity (6.2.0-0ubuntu4) quantal; urgency=low + + * debian/control: + - Depends on compiz-plugins-default rather than on a transitional one + * tools/convert-files/compiz-profile-(active)-unity.convert: + - updated to fix some key names typos in the list (lp: #1041631) + + -- Sebastien Bacher Tue, 28 Aug 2012 22:05:26 +0200 + +unity (6.2.0-0ubuntu3) quantal-proposed; urgency=low + + * debian/control: + - updated compiz gsettings version + + [ Didier Roche ] + * Backports: + - the remaining part of the gconf removal from upstream branch + - the .convert migration scripts + * debian/control: + - do not build-dep on gconf anymore + - build-dep on latest compiz for building gsettings keys + (part 2 of LP: #1035261) + * debian/unity-common.install, debian/control: + - don't ship gconf schemas as not built anymore (the gsettings schema ones + are already shipped) + - install the gnome-control-center unity keybinding integration + - install the .convert files handled by the compiz migration script and + make unity-common depending on the right version of compiz-gnome (with + the migration script) + + [ Timo Jyrinki ] + * Add dbus-glib-1 to UNITY_PLUGIN_DEPS to fix FTBFS + * Remove the remaining gconf files from installation + * Remove gconf-2.0 dependency from services + * Make sure USE_GSETTINGS is defined + * Backports: + - gnome-control-center integration + + -- Sebastien Bacher Thu, 23 Aug 2012 17:58:52 +0200 + +unity (6.2.0-0ubuntu2) quantal; urgency=low + + * debian/control: + - create unity-2d transitional packages. Removing unity-2d as it is now + not supported and won't be transitionned to the necessary gsettings + changes (part one of LP: #1035261) + - change some description wording to remove -2d + * debian/*preinst: + - removed, useless now + * debian/profile_upgrade*, debian/unity-common.install: + - remove old profile upgrade content + + -- Didier Roche Mon, 13 Aug 2012 12:10:54 +0200 + +unity (6.2.0-0ubuntu1) quantal-proposed; urgency=low + + [ Adam Conrad ] + * Removed debian/patches/libgeis-rename.patch + + [ Łukasz 'sil2100' Zemczak ] + * debian/rules: + - added override for dh_shlibdeps to point it to the private directory of + libunity-protocol-private.so + * debian/unity.lintian-overrides, + debian/libunity-core-6.0-5.lintian-overrides: + - added override to silence the binary-or-shlib-defines-rpath error, since + we are forced to use RPATH in our case + + [ Didier Roche ] + * New upstream release. + - [nvidia] compiz crashed with SIGSEGV in + nux::GraphicsEngine::QRP_GLSL_Color() from + nux::GraphicsEngine::QRP_Color() from nux::BasePainter::PaintBackground + (LP: #982626) + - Launcher - when a user starts dragging a item, any folded launcher icons + that are valid drop receptacles should unfold. (LP: #839717) + - running applications without an icon use a blank icon (LP: #886778) + - compiz crashed with SIGSEGV in + unity::ui::KeyboardUtil::GetKeycodeAboveKeySymbol() (LP: #920258) + - still some accent issues with unity/nux (LP: #950740) + - Launcher doesn't autoscroll when holding an icon (can't reach trash) + (LP: #987223) + - Purchased items are not being added to the Unity launcher (LP: #925014) + - [GLES] framebuffer output scaled incorrect in both blur and items above + shell with multimonitor (LP: #1016789) + - [regression] [unity 6.0] Fullscreen windows flicker and/or never redraw + properly if panel_opacity<1.0 or dash is opened. (LP: #1024911) + - panel and launcher blinks when using libreoffice presenter/spreadsheet + (LP: #1024459) + - compiz crashed with SIGSEGV in + unity::ui::EdgeBarrierController::Impl::OnPointerBarrierEvent() + (LP: #1020075) + - Update to 1.6.4 (LP: #1014850) + - [nvidia] unity crashed in nux::GraphicsEngine::QRP_GLSL_1Tex + (glDrawArrays) (LP: #1031554) + - Dragging image from firefox/chrome to dock causes lagg/freeze + (LP: #772445) + - Launcher, Dash - Showing dash, via super key, with a quicklist shown + doesn't work (LP: #913994) + - REGRESSION: can't type characters with accent (dead keys) (LP: #961741) + - Launcher wrongly shows top tooltip when peforming the accordion effect + (LP: #980942) + - Unity Launcher Fails To Auto-Hide When Enabled & Installing Commercial + Software (LP: #1002440) + - logging out/in with mounted drives causes unity launcher icons to be + duplicated (LP: #1010714) + - Mounted volume icons doubled up in launcher (LP: #1010858) + - Launcher - when a user starts dragging a item, the launcher icons that + are *not* valid drop receptacles should be tinted (LP: #1020891) + - Alt+F4 does not close the hud when Numlock or Capslock are on. + (LP: #1022801) + - Unity shortcut overlay needs to include shortcut for video lens + (LP: #937334) + - padding between last quicklist item and bottom edge is non-deterministic + (changes randomly) (LP: #955158) + - give a way to remove 'Show Desktop' from the Alt-Tab items + (LP: #1014346) + - Multi-monitor - Add 'sticky edges deactivated for number of milliseconds + after the user breaks the barrier' variable (LP: #1020058) + - Quicklist blocks Hud from opening (LP: #1020246) + - dash should open when pressing "super" in scale mode (LP: #1023811) + - Screen flickers when changing launcher icon size. (LP: #1024113) + - Dragging on a quicklist item highlights the wrong item in the list + (LP: #1027955) + - Switcher does not focus the last active window in detail mode + (LP: #1029215) + - An application is closed if manually removed from favorites on gsettings + (LP: #1032157) + - Support for automation (LP: #685199) + * debian/control: + - build on latest nux (ABI break) + + -- Didier Roche Fri, 10 Aug 2012 15:01:01 +0200 + +unity (6.0.0-0ubuntu6) quantal; urgency=low + + * Don't specify a specific destination for the dbus signals, that + creates issues with the new dbus eavedropping behaviour, + thanks Neil J. Patel for the fix! Required for the new dbus version. + (lp: #1014850) + + -- Sebastien Bacher Thu, 02 Aug 2012 16:35:04 +0200 + +unity (6.0.0-0ubuntu5) quantal; urgency=low + + * Update build-deps to lib{geis,grail}-dev for the great library renaming. + * debian/patches/libgeis-rename.patch: Update CMakeLists.txt for the above. + + -- Adam Conrad Mon, 30 Jul 2012 16:09:17 -0600 + +unity (6.0.0-0ubuntu4) quantal; urgency=low + + * debian/control: + - make unity depending on dconf-tools as the migration script is using the + dconf binary + + -- Didier Roche Thu, 19 Jul 2012 18:34:37 +0200 + +unity (6.0.0-0ubuntu3) quantal; urgency=low + + * Add a dconf migration script from /desktop/unity to /com/canonical/unity + + debian/unity.migrations, debian/control, debian/rules: + - build-dep on dh-migrations + - include the upstream migration script (cherry-picked) + + -- Didier Roche Thu, 19 Jul 2012 12:49:13 +0200 + +unity (6.0.0-0ubuntu2) quantal; urgency=low + + * Cherry pick upstream fixes. + - [regression] [unity 6.0] Fullscreen windows flicker and/or never redraw + properly if panel_opacity<1.0 or dash is opened (LP: #1024911) + - panel and launcher blinks when using libreoffice presenter/spreadsheet + (LP: #1024459) + + -- Łukasz 'sil2100' Zemczak Mon, 16 Jul 2012 14:48:14 +0200 + +unity (6.0.0-0ubuntu1) quantal-proposed; urgency=low + + [ Didier Roche ] + * debian/rules, debian/control, debian/unity-autopilot.install: + - install new unity-autopilot package, containing autopilot bindings and + test for Unity + - add some python build-dep for executing setup.py + - use dh_python2 and add some python:Depends dep for automatic python + version detection + * debian/control: + - remove gnome-desktop dependency: not needed upstream anymore + - unity Breaks older lenses due to path change + - remove libgdu in build-dep + * debian/libunity-core-6.0-5.install, debian/libunity-core-6.0-dev.install, + debian/control: + - version bump in libunity-core, change soname + + [ Matthieu Baerts (matttbe) ] + * Update apport hook for python3 ; thanks to Edward Donovan (LP: #1013171) + + [ Łukasz 'sil2100' Zemczak ] + * New upstream release. + - compiz crashed with SIGSEGV in get_current_slide() from + unity::BGHash::OnSlideshowTransition() (LP: #889625) + - Unity is visible on top of fullscreen apps (LP: #734908) + - App icon on the Unity Launcher lost track of running instance + (LP: #772063) + - unity crashed with NameError in reset_unity_compiz_profile(): global + name 'GError' is not defined (LP: #778470) + - compiz crashed with SIGSEGV in CompWindow::id() from getPaintMask() + [compizminimizedwindowhandler.h] from unity::UnityWindow::glPaint() + (LP: #851982) + - HUD - Formatting of text in the auto-complete is wrong (LP: #939436) + - [regression] Launcher is silent to screen reader users (LP: #949448) + - still some accent issues with unity/nux (LP: #950740) + - [regression] [precise] 3D apps run much slower under Unity (LP: #987304) + - No launcher icon or Alt+Tab entry for Gimp windows (LP: #995916) + - Locked smuxi launcher icon does not indicate smuxi running status + (LP: #999820) + - When number of workspaces is set to 1, the Spread no longer works + (LP: #996604) + - Much slower OpenGL frame rates with unityshell loaded, than plain compiz + (LP: #988079) + - Port to libudisks2 (LP: #1012000) + - Desktop, Launcher and menu bar still visible when screen locked + (LP: #886605) + - Searching in the HUD freezes unity (LP: #1016239) + - Dragged icons rendered under dash (LP: #1021541) + - Regression in Launcher keyboard navigation (with Alt+F1) (LP: #1021549) + - Unity dash is is much slower/laggy after revision 2469. (LP: #1021665) + - Dash and Launcher - As soon as a user starts dragging a file from the + Dash, there is a 'flicker' before the Launcher icons that are valid drop + receptacles re-saturate (LP: #863230) + - Dash - when a file is dragged from the Dash (Dash home, file lens, or + music lens) and dropped on a Launcher icon, the Dash should + automatically close (LP: #865168) + - Refreshing active blur makes the dash painfully slow (LP: #874230) + - Open dash, press Alt+f1 - dash remains open (LP: #919209) + - application reopens itself when last instance is closed from + windows/application switcher (LP: #926406) + - HUD Draws improperly while searching for results (LP: #932531) + - Spread/Scale should exit if Dash is invoked (LP: #944033) + - Launcher - Add API to allow apps to override the Launcher tile + colourisation with a colour of their choosing (LP: #962120) + - Dash - search field is hidden by tooltips (LP: #978030) + - Dash: Inconsistent hover/highlight/clickable area behavior (LP: #979686) + - Black background around after dash is restored (LP: #992516) + - Unity launcher shows internal partitions after they have been unmounted + (LP: #994163) + - Unity r2395 fails to build with libnux 2.12.0-0ubuntu1 (LP: #1010348) + - Hud flickers when show up. (LP: #1011507) + - Nothing should be written into the dash/hud searchbar when holding + super, ctrl or Alt (LP: #1013751) + - Releasing mouse button outside panel 'close' window button removes + keyboard focus from Dash & Hud (LP: #1021087) + - [regression] Unity panel transparency (active blur) not updating + properly (LP: #865006) + - When selecting an action from a quicklist after opening the dash the + dash stays put (LP: #937338) + - Wrong keyboard focus after opening workspace switcher via keyboard + navigation (LP: #962408) + - can't click to dismiss hud in the area where dynamic hud results are + meant to apper (LP: #962651) + - launcher reordering "line" doesn't go to the bottom slot (LP: #971421) + - Tooltips backgrounds are not refreshed (no active blur) (LP: #967112) + - Dash maximise button changed location (LP: #987674) + - alt-backtick flickers between windows (LP: #987156) + - When blur is disabled, shortcuts overlay and alt+tab switcher is + completely transparent. (LP: #989291) + - Duplicated applications icons on quick application restart + (LP: #1003574) + - [Hud] The result grid is not drawn in proximity of the search entry. + (LP: #1008603) + - [hud] The last button is not rounded. (LP: #1008656) + - 'UnityNETWorkareaRegionWindow::resizeNotify' hides overloaded virtual + function (LP: #1010303) + - use of logical '&&' with constant operand (LP: #1010307) + - Unity/Nux input window titles are too generic (risky to match): "panel", + "launcher", "Dash" (LP: #1010338) + - Hud should close with Alt+F4 (LP: #1019440) + - Dragging windows around is slow/sluggish/laggy when multiple monitors + are enabled (LP: #874619) + - No launcher icon or Alt+Tab entry for Scribus windows (LP: #999171) + - launcher is not refreshed after user session switch (LP: #1016430) + - Alt F1 keynav mode is not disabled when the Hud is open (LP: #1020808) + * debian/control, debian/rules: + - switch to nux-3.0 + + -- Didier Roche Mon, 09 Jul 2012 18:07:36 +0200 + +unity (5.12-0ubuntu4) quantal-proposed; urgency=low + + * debian/control: + - build on unversionned version of boost (to transition to 1.49 in quantal) + (LP: #1008219) + - build-dep on latest compiz-dev version for ABI break + - Vcs-Bzr: move to canonical branch + - remove netbook-launcher transitional package and other unsupported + transition cruft + * debian/rules: + - build in parallel + * Cherry-pick some upstream fixes for the newer g-c-c making previous upload + FTBFS in quantal + * as armel/armhf is temporary build with opengl now, build-dep on nux + 2.12.0-0ubuntu2 + + -- Didier Roche Thu, 31 May 2012 10:21:46 +0200 + +unity (5.12-0ubuntu3) quantal; urgency=low + + * Build with gcc-4.6 temporarily while upstream works + on fixing the build with gcc-4.7 and boost1.49. + * Rebuild for the libgnome-desktop SOVER bump. + + -- Adam Conrad Thu, 07 Jun 2012 16:16:44 -0600 + +unity (5.12-0ubuntu2) quantal; urgency=low + + * Cherry pick upstream fixes. + - Fix UnityViewWindow background when blur is disabled (LP: #989291) + - App icon on the Unity Launcher lost track of running + instance (LP: #772063) + - No launcher icon or Alt+Tab entry for Gimp windows (LP: #995916) + - Locked smuxi launcher icon does not indicate smuxi running + status (LP: #999820) + - Fix dash search field hidden by tooltips (LP: #978030) + - Launcher is silent to screen reader users (LP: #949448) + - Fix 3D apps running much slower under Unity (LP: #987304) + - Reduced number of calls to ResultViewGrid::QueueDraw + - Reduced number of calls to BGHash::RefreshColor + + -- Alan Pope Wed, 23 May 2012 18:10:49 +0100 + +unity (5.12-0ubuntu1) precise-proposed; urgency=low + + * New upstream release. + - Launcher, Alt-Tab - clicking on launcher item or selecting a app in Alt- + Tab raises all app windows, not just most recently focused (LP: #959339) + - [heap corruption?] compiz crashed with SIGSEGV in _int_malloc() from + g_realloc() from ... from g_dbus_connection_send_message_with_reply() + from g_object_unref() from unity::dash::HomeLens::Impl::~Impl() from + unity::dash::HomeLens::~HomeLens() (LP: #931201) + - compiz crashed with SIGSEGV in _int_malloc() from __libc_calloc() from + XOpenDisplay() from nux::WindowThread::ThreadCtor() (LP: #947844) + - Regression: Installing apps causes a terrible visual glitch-- have to + restart X.org. (LP: #981168) + - Window management - unity doesn't realise when applications bring their + windows to the front (LP: #802816) + - Dash - Clicking on the desktop dash border should do nothing, *NOT* + close the dash (LP: #839472) + - [FFe, UIFe] HUD - The HUD does not respect launcher icon size settings + in autohide mode (LP: #921506) + - compiz crashed with SIGSEGV in g_volume_get_mount() (LP: #918548) + - multiple instances or double icons of application detected on bamfdaemon + respawn (LP: #928912) + - Panel is transparent when Dash is open; no blur no average BG color + (LP: #965323) + - Unity crashes with SIGSEGV when hitting debug DBus interface hard + (LP: #979429) + - compiz crashed with SIGSEGV in _int_malloc() from g_object_unref() from + unity::dash::Model::~Model() (LP: #941750) + - indicators menu are sometimes cut off at screen edge (LP: #883317) + - the shortcut keys in workspace section of the shortcut overlay aren't + translated (LP: #980828) + - [regression] Dash keeps repainting unnecessarily (LP: #980924) + - compiz crashed with SIGSEGV in nux::NTextureData::ClearData() from + nux::NTextureData::~NTextureData() from nux::Texture2D::~Texture2D() + (LP: #952378) + - compiz crashed with SIGSEGV in g_object_unref() from + unity::dash::Settings::~Settings() from + unity::UnityScreen::~UnityScreen() (LP: #981764) + - compiz crashed with SIGSEGV in unity::dash::ResultView::~ResultView() + from unity::dash::ResultViewGrid::~ResultViewGrid() from + nux::Object::Destroy() from nux::Object::UnReference() (LP: #942286) + - compiz crashed with SIGSEGV in + ends_with_iter_select<__gnu_cxx::__normal_iterator >, char const*, boost::algorithm::is_iequal>() + from unity::ui::PointerBarrierWrapper::EmitCurrentData() (LP: #983268) + - Chinese can't be shown completely in dash filter (LP: #984583) + - [Unity 5.10] compiz crashed with SIGSEGV in + unity::hud::HudIconTextureSource::ColorForIcon() from + unity::hud::Icon::Icon() from emit from unity::IconTexture::IconLoaded + (LP: #983646) + - [regression] Close button does not close the dash/HUD (LP: #986264) + - compiz crashed with SIGSEGV in g_volume_eject_with_operation_finish() + from unity::launcher::DeviceLauncherIcon::OnEjectReady() from + (LP: #977762) + - Launcher - should allow to dnd on any icon (and not just the ones + matching the type) (LP: #880798) + - unity confused with chrome/chromium web apps (LP: #692462) + - App Switcher (Alt+Tab) doesn't display the full title of apps in Chinese + (LP: #830801) + - alt-tab - quick alt + tab (before the switcher shows) not consistent + (LP: #861250) + - run command (alt+F2): results do not contain the exact match + (LP: #842108) + - It's possible to highlight two different Quicklist menu items + simultaneously (LP: #911561) + - Hiding the dash from a lens view fades out home view (LP: #914785) + - Flickering in the dash (LP: #961979) + - Dash - Card view layout needs fixing (LP: #977817) + - [regression] Blurred view of the current workspace is shifted down when + unity dash is in fullscreen mode (LP: #977922) + - Quicklist key navigation is not consistent with menus (LP: #978926) + - Quicklist key navigation should skip the disabled items (LP: #979096) + - Pointer locks up after dragging windows with three touch gesture + (LP: #979418) + - Alt-Tab, multimonitor - The Alt-Tab overlay should appear on the display + which has focus. (LP: #981795) + - Hud to Dash forgets last focused window on exit (LP: #984639) + - Remote scopes are not restarted after crash (LP: #984760) + - compiz crashed with SIGSEGV in unity::dash::DashView::default_focus() + (LP: #982730) + - [regression] Launcher should raise all the urgent windows, not only the + top-most (LP: #986443) + - Clicking on the quicklist application title doesn't initiate the spread + when needed (LP: #986461) + - Hud: spinner keeps spinning long after the query returns (LP: #987781) + - Dash: Incorrectly scaled icons (LP: #988338) + - Music Lens doesn't work for albums in Precise with Rhythmbox + (LP: #970509) + - New apps on the launcher have no shortcut key until something is being + closed (LP: #778499) + - Lens search hint changes to "search" when the entry gets unfocused + (LP: #887036) + - don't show disabled shortcut in keyboard shortcut help (LP: #926418) + - HUD: Can not be closed by clicking on HUD icon (LP: #963918) + - Show desktop icon should be movable, definitely not on top of BFB + (LP: #964073) + - [card view] bottom of results cropped when a category is not expanded + (LP: #975003) + - Non closable maximized windows should show a disabled close button + (LP: #981196) + - make launcher fails (LP: #983989) + - Sources filter shouldn't be shown if there's just one item (LP: #940161) + - Conditional jump or move depends on uninitialised value(s) + unity::SearchBar::UpdateBackground(bool) (SearchBar.cpp:529) + (LP: #983333) + + -- Didier Roche Fri, 27 Apr 2012 08:33:25 +0200 + +unity (5.10.0-0ubuntu6) precise-proposed; urgency=low + + * Cherry-picked upstream: + - Panel is transparent when Dash is open on netbooks; no blur + no average BG color (LP: #965323) + + -- Didier Roche Tue, 17 Apr 2012 18:04:01 +0200 + +unity (5.10.0-0ubuntu5) precise-proposed; urgency=low + + * Cherry-pick two fixes from trunk: + - Fix the software-center install animation making the display useless + on netbooks (LP: #981168) + - Shortcut keys in workspace section of the shortcut overlay aren't + translated. (LP: #980828) + + -- Didier Roche Tue, 17 Apr 2012 08:09:15 +0200 + +unity (5.10.0-0ubuntu4) precise-proposed; urgency=low + + * Cherry-pick an additional fix from trunk fixing multiple bugs: + - alt-tab - quick alt + tab (before the switcher shows) not consistent + (LP: #861250) + - Launcher, Alt-Tab - clicking on launcher item or selecting a app in + Alt-Tab raises all app windows, not just most recently focused + (LP: #959339) + - Alt-Tab, multimonitor - The Alt-Tab overlay should appear on the display + which has focus. (LP: #981795) + + -- Didier Roche Mon, 16 Apr 2012 08:35:28 +0200 + +unity (5.10.0-0ubuntu3) precise-proposed; urgency=low + + [ Oliver Grawert ] + * Enable subarch specific quilt support + * add linaros disable_standalone-clients.patch to make unity build with GLES + + [ Didier Roche ] + * remove a symlink and replace with a real file for + debian/patches/series. as not supported in non v3 (and we don't + want v3 format with full source upstream derived branch) + + -- Didier Roche Fri, 13 Apr 2012 14:34:15 +0200 + +unity (5.10.0-0ubuntu2) precise-proposed; urgency=low + + [ Ricardo Salveti de Araujo ] + * Enabling build with OpenGL ES2.0 support for ARM and disable maintainer + mode on that arch to avoid -Werror failure (LP: #980544) + + -- Didier Roche Fri, 13 Apr 2012 09:13:07 +0200 + +unity (5.10.0-0ubuntu1) precise-proposed; urgency=low + + * New upstream release: + - bamfdaemon crashed with SIGABRT in g_assertion_message() (LP: #926208) + - We are using 1 bad hack for compiz hanging on startup (LP: #963264) + - GConf backend steals glib events from compiz (LP: #965220) + - when I closed QupZill brawser it crashed and then and then I sow + worrning that compiz crashed but fire fox and chrome is estle working. + gtk-window-decorator crashed with SIGSEGV in max_window_name_width() + (LP: #948580) + - compiz crashed with SIGSEGV in std::basic_string<...>::basic_string() + from unity::launcher::HudLauncherIcon::HudLauncherIcon()::{lambda} from + unity::UBusManager::OnCallback (LP: #964897) + - unity-panel-service crashed due to heap corruption in g_free() from + service_proxy_name_changed() [libindicator/indicator-service- + manager.c:574] (LP: #969360) + - Opening dash while an application is maximized makes unity completely + useless, have to relogin (LP: #975103) + - unity crash on alt-tab (LP: #975168) + - Top bar - Menus should be condensed to fit panel/overlay of appmenu + (LP: #655184) + - Topbar - window controls for maximised windows in the top bar should + conform to Fitts's law (LP: #839690) + - [FFe, UIFe] Dash - When the Dash is open and there is a maximised app in + the background, the top bar background should not disappear + (LP: #839480) + - Dash - The inner bottom left, bottom right and top right corners of the + desktop dash border are rendered incorrectly (LP: #839476) + - Showdesktoped window contents invisible in window spread (LP: #877778) + - Maximized windows can be accidentally closed from wrong monitor. + (LP: #865701) + - Unity launcher on-screen corruption on resume from suspend with nVidia + proprietary driver (LP: #915265) + - Launcher - Inserting items into launcher makes unnecessary animations on + other monitors (LP: #925021) + - Far left character in panel (and launcher popups) distorted + (LP: #927441) + - Jenkins build failure: SetAcceptKeyNavFocusOnMouseEnter not declared + (LP: #938037) + - super+ and sometimes super+ keys now cause launch + to wedge with the key hints shown and retains focus instead of selecting + the requested window (LP: #934084) + - three-finger move does not move (Precise) (LP: #940612) + - compiz crashed with SIGSEGV in std::__detail::_List_node_base::_M_hook() + from unity::ui::PointerBarrierWrapper::EmitCurrentData (LP: #944217) + - indicators appear intertwined with global menu (LP: #953868) + - [5.8 pre staging] "sticky edge" option does nothing visible + (LP: #961285) + - HUD: The selection always returns to the first item whenever menus are + updated (LP: #962984) + - Multimonitor - Using single launcher, the HUD draws incorrectly on a + secondary monitor (LP: #963577) + - Type your command does not appear translated in the HUD (LP: #964074) + - HUD doesnt receive input after pressing Tab (LP: #964760) + - compiz crashed with SIGSEGV in g_variant_unref() from + unity::launcher::SoftwareCenterLauncherIcon::OnPropertyChanged + (LP: #963718) + - HUD denial of service (LP: #948820) + - Application launch time increased with type-to-search in unity 5.8 + (LP: #966417) + - Weird translation on the shortcut overlay dialog (LP: #971332) + - compiz crashed with SIGSEV in g_type_check_instance_is_a from + unity::launcher::DeviceLauncherIcon::ShowNotification (LP: #971345) + - Launcher - launcher have a weird background if cursor is over it while + opening dash (LP: #974408) + - compiz crashed with SIGSEGV in + unity::hud::HudIconTextureSource::ColorForIcon() (LP: #935307) + - Compiz: Growing idle memory consumption with latest Nux/Unity (~60 + MiB/h) in unity::PanelIndicatorEntryView::Refresh() (LP: #975801) + - [nvidia] minimized windows are white in the window spread (LP: #977189) + - compiz crashed with SIGSEGV in nux::Rect::Rect() from + unity::launcher::LauncherIcon::OpenQuicklist() from RecvMouseDown() from + unity::launcher::LauncherIcon::RecvMouseDown() (LP: #954736) + - Alt-tab - Reduce the spread delay for all items other than the initial + item the select lands on after alt-tab opens (LP: #838232) + - Dash - The Dash search box should expand horizontally when the Dash + switches to full screen mode (LP: #841907) + - window selected via ALT+F1 doesn't get focus in unity (LP: #875932) + - Non square icons don't fill result tiles as much as they should + (LP: #878015) + - Dash - the spinner and the 'clear' button (the circle with the X) in the + Dash is blurry (LP: #891691) + - Dash - Update the Dash card view so that the implementation conforms to + the attached designs (LP: #901164) + - Launcher bar doesn't saturate when focused via keynav when dash opened + (LP: #913569) + - Global menu doesn't work with multiple monitors (twinview) (LP: #921918) + - Number shortcut overlay won't show if mouse hovers launcher bar area + (LP: #924636) + - Colour of launcher on second monitor is not restored after closing the + dash (LP: #925442) + - [autohide] app icons in HUD are poorly scaled (LP: #931406) + - Show default HUD icon for Desktop (nautilus) menus (LP: #931548) + - Hud shows wrong application icon when activated with the dash showing + (LP: #932371) + - Window management - Dragging down a maximized window from the panel has + not predictable results (LP: #934680) + - Launcher - Properly colorize icons (LP: #938620) + - lens bar clickable area needs to be expanded (LP: #937193) + - Multimonitor - hidden menu indicators are shown in the non active + monitor (LP: #951747) + - Wrong glib #include in Hud.h (LP: #952117) + - [FFe, UIFe] New animation for adding launchers for newly installed + applications (LP: #955147) + - HUD remembers icon of last used app (LP: #961161) + - Launcher - window buttons are not horizontally ad vertically aligned + (LP: #963019) + - Opening HUD after dash shows window title in the panel (LP: #963134) + - Dash picking a really odd color with default wallpaper (LP: #963140) + - HUD overlay has one pixel gap on left side (LP: #964061) + - Launcher icon indicators doesn't redraw when changing the launcher + settings (LP: #964851) + - Dash home results take too long to appear (LP: #965492) + - Multimonitor - Only the panel that controls the focused window should + draw its title (LP: #968261) + - Performing a pinch gesture over a window has no effect (LP: #969554) + - Dash section header icons are missing (LP: #971233) + - Unity displays "no search results" with results present (LP: #971430) + - Pressing Ctrl+Tab from the command lens switches to the wrong lens + (LP: #971850) + - PanelMenuView causes gtk assertion to fail (LP: #971947) + - [regression] The keyboard shortcuts overlay bottom is truncated. + (LP: #973386) + - Not minimizable windows have an enabled "minimize" button on the unity + panel (LP: #936425) + - HUD maximize button affects Dash (LP: #939054) + - Panel opacity toggle doesn't quite work (LP: #940683) + - Dash is totally broken when disabling the blur effect (LP: #941066) + - Dash collapsed view has scrollbar (LP: #956500) + - HUD too many triangles with new transition effect (LP: #961230) + - Menu bar not transparent when invoking dash with super key whilst HUD + enabled and vice versa (LP: #962410) + - Windows controls lost if dash is opened after HUD (LP: #963118) + - HUD service returning more than 5 entries (LP: #965299) + - Dash - Search box text is clipped (LP: #966424) + - IBus Pinyin pup box disappears in the hud (LP: #968777) + - Dash and HUD search fields appear in slightly different places + (LP: #969404) + - Super+Tab, super, loses focus (LP: #970420) + - Dash - reduce frosty effect (LP: #978785) + - HUD doesn't ignore key events while ibus is active (LP: #957927) + - "Show Dekstop icon" typo in Unity's translation template (LP: #934526) + - Starting dash or hud with mouse over launcher desaturates all icons + (LP: #973063) + - Untranslatable strings in the hints screen (LP: #975815) + - Dash text input does not get focus (LP: #774447) + - dash ignore queries done just after session start (LP: #979799) + * Cherry-pick an additional commit for a crash + * debian/control: + - build-dep on latest libnux-2.0-dev for ABI break + - bump Standards-Version to latest + + -- Didier Roche Thu, 12 Apr 2012 15:22:36 +0200 + +unity (5.8.0-0ubuntu2) precise; urgency=low + + * Cherry-picked upstream: + - fix a crash when software-center is installing an application + (LP: #963718) + + -- Didier Roche Mon, 26 Mar 2012 20:19:57 +0200 + +unity (5.8.0-0ubuntu1) precise-proposed; urgency=low + + * New upstream release. + - New "push mouse offscreen" feature really difficult to get (LP: #923749) + - unity-2d-panel crashed with SIGSEGV in + unity::indicator::DBusIndicators::Impl::RequestSyncAll() (LP: #864737) + - Pressing "Alt+Enter" causes compiz to crash in CompOption::value() from + unity::UnityScreen::showLauncherKeyTerminate (LP: #960957) + - SEGSIGV after unplugging external monitor (LP: #962693) + - Background colorization should use a different heuristic (LP: #865239) + - compiz+unity3d generates > 50 wakeups a second on idle system + (LP: #917210) + - [FFe, UIFe] HUD - The HUD does not respect launcher autohide or icon + size settings (LP: #921506) + - clicking on folders in the file lens does not open nautilus + (LP: #921665) + - No text inside multirange filters (LP: #927710) + - can't alt-tab restore minimized uis which have an instance on another + workspace (LP: #933397) + - Ubuntu Software Center Unity launcher integration is not working + (LP: #932280) + - The line separator between the launcher and the dash is cleared when + selecting a category (LP: #941082) + - unity-panel-service crashed with SIGSEGV in g_hash_table_foreach() + (LP: #937119) + - Alt-F10 locks up Unity (LP: #948522) + - multimonitor, launcher: Provide an option to display either a single + launcher or a launcher on each display in a multi-monitor environment + (LP: #950136) + - multimonitor: Please give me a way to turn off sticky monitor edges + (LP: #946104) + - Unity 5.6: key bindings (such as Super) don't work on empty workspace or + on slow/loaded systems (LP: #953089) + - Alt+arrows keyboard shortcuts don't invoke Back and Forward navigation + (LP: #953783) + - HUD is sending 2 menu signals instead of 1 (LP: #956878) + - 6th item of HUD not fully visible (LP: #957229) + - HUD: seems to trigger operations more than once (LP: #960503) + - Launcher gets always desaturated when using HUD on secondary monitor + (LP: #961169) + - [5.8 pre staging] launcher is displayed on the left screen, not the + primary one (LP: #961281) + - launcher icons do not re-saturate after dash is closed (LP: #961844) + - Launcher shows arrows for applications on all workspaces (LP: #961977) + - Dash - Implement overlay scrollbars in Dash (LP: #608124) + - [UIFe] Dash - No message displayed when no results are returned in the + Dash (LP: #711199) + - Dash - "See more..." line should be base-aligned with section header + (LP: #748101) + - Dash - Missing category separator line in dash (LP: #850984) + - Dash and Launcher - As soon as a user starts dragging a file from the + Dash, there is a 'flicker' before the Launcher icons that are valid drop + receptacles re-saturate (LP: #863230) + - Dash - When multiple results have equal string match relevancy ranking, + those with equal ranking should be then sorted by frequency of use. + (LP: #871900) + - Keyboard shortcut - F10 shortcut is used to show menu and this is wrong + (LP: #878492) + - Frozen double icon after launching and dragging at once (LP: #918753) + - HUD is over gtk-menu (LP: #921305) + - Files missing from Unity's POTFILES.in (LP: #923762) + - Hidden menus are not really hidden (LP: #926330) + - Need to bring back a "reveal border" option (LP: #927523) + - Unity Panel lose shadow on changing the wallpaper (LP: #930271) + - Incorrect item count in "See x more results" (LP: #934944) + - Coverity PW.PARAMETER_HIDDEN - CID 10671 (LP: #938890) + - Coverity PW.CAST_TO_QUALIFIED_TYPE - CID 10670 (LP: #938895) + - [Shortcut overlay] Hardcoded value for switching ws (LP: #939517) + - Dash - Font metrics and colors are wrong (LP: #942508) + - Alt-tab switcher view should be pre-loaded to improve the startup time + (LP: #942634) + - Shortcut hint overlay should be hidden by Escape key (LP: #943422) + - Dash/HUD - Spinner off-centre, looks drunk (LP: #943656) + - Unable to restart lens which doesn't do global search (LP: #947301) + - Launcher Switcher (Super+Tab) selection could be changed by arrow keys + too (LP: #950404) + - you have to release alt for alt + F10 working (LP: #943223) + - magnifying glass is being overdrawn by text in searchbar (LP: #955160) + - hud searches don't update properly (LP: #956480) + - Filters not working (LP: #961338) + - Panel goes solid if switching from hud to dash or vice versa + (LP: #962720) + - compiz configuration options for unity are "fixme" (LP: #877382) + - Launcher - When Launcher already has keyboard focus, Alt-F1 doesn't exit + focus (LP: #885304) + - Dash - dash is not closed with alt+f4 (LP: #891818) + - Dash Home tooltip should use header capitalization (LP: #924354) + - Typo in string 149: stoped (LP: #931382) + - unity should not use dconf to store the average background colour + (LP: #949277) + - [UIFE] No HUD keybinding in the shortcut overlay (LP: #942515) + - The hseparator is drawn also for the final dash category (LP: #955296) + * debian/patches/series: + - remove the distro patches in trunk right now + * debian/control: + - build-dep on latest nux,compiz and libcompizconfig for ABI breakage + + -- Didier Roche Fri, 23 Mar 2012 12:55:51 +0100 + +unity (5.6.0-0ubuntu4) precise; urgency=low + + * 02_remove_ungrad_workaround2.patch: + - part 2 of the patch, enabling pressing alt + keys in some additional + cases + + -- Didier Roche Wed, 14 Mar 2012 12:42:23 +0100 + +unity (5.6.0-0ubuntu3) precise; urgency=low + + * debian/control: + - use right build-dep (libxfixes-dev) + + -- Didier Roche Tue, 13 Mar 2012 13:44:53 +0100 + +unity (5.6.0-0ubuntu2) precise; urgency=low + + * debian/patches/01_remove_ungrab_workaround.patch: + - remove a workaround which makes alt + keys not passing events to other + apps (LP: #953783) + * debian/control: + - add libxfixes build-dep (versionned as there is an ABI break). No cmake + file was listing it, will fix that upstream as well. ubuntu4 of libxfixes + need an unity rebuild to avoid not being able to trigger launcher reveal + (LP: #953778) + + -- Didier Roche Tue, 13 Mar 2012 12:35:47 +0100 + +unity (5.6.0-0ubuntu1) precise; urgency=low + + * New upstream release. + - compiz crashed with SIGSEGV in g_type_check_instance_cast() + (LP: #862972) + - compiz crashed with SIGABRT in __gnu_cxx::__verbose_terminate_handler() + (LP: #926793) + - compiz crashed with SIGSEGV in gdk_pixbuf_get_width() (LP: #937421) + - Unity causes ibus to not work correctly (spaces incorrectly placed) + (LP: #880876) + - Dash - update Dash keyboard shortcuts so the 'CTRL + TAB' switches + between Lenses and 'TAB' by itself moves the focus between categories + (LP: #891648) + - HUD - closing a window with + opens the hud (LP: #923410) + - unity-applications-daemon crashed with SIGSEGV in + dee_sequence_model_free_row() (LP: #916356) + - Launcher, Window Management - Launcher reveal should not be triggered + when dragging a window (LP: #928805) + - lenses are loaded on start, should be lazy loaded (LP: #929506) + - Trash icon jumps about when trying to drag an icon onto it (LP: #932365) + - HUD loses keypresses for the first second after opening (LP: #932906) + - HUD doesn't give the focus back to the active application after dash/hud + use (LP: #934061) + - Launcher - unpinned apps show with empty pips in the launcher as if they + exist on another workspace (LP: #937898) + - Unity Dash should support Keywords parameter in .desktop (formerly X + -GNOME-Keywords or X-AppInstall-Keywords) (LP: #941231) + - Support FD.o Desktop Actions spec (LP: #942042) + - Unity hangs when touching my touchpad/trackpad (LP: #942625) + - [regression] Pressing alt doesn't show the menu title bar in top panel + (LP: #943194) + - Alt + F (or other mnemonic) doesn't work in gnome-terminal (LP: #943239) + - [unity 5.6] Using Alt+F1 or Alt+F2 sends a ";3P" or ";3Q" to the active + windows (LP: #943456) + - [unity 5.6] holding alt and pressing a direction opens the alt-tab list + in a buggy way (LP: #943902) + - [unity-5.6] can't enter accents (^o->) in the dash since recent updates + (LP: #944674) + - Dash - Keyboard navigation for search filters is broken (LP: #844033) + - Dash - If mouse highlights one icon in grid, keyboard navigation + highlights another, so there are 2 highlighted icons (LP: #817436) + - Alt+Tab default delay of 150ms is too long (LP: #888636) + - Keyboard shortcut - F10 shortcut is used to show menu and this is wrong + (LP: #878492) + - Dash - Currently the app lens doesn't show applications that are + available for purchase (LP: #916121) + - Chromium is running, but not showing in launcher or alt-tab. + (LP: #918474) + - Dash - Different states of rating stars, and dimensions (LP: #924884) + - alt-tab confused by a multiple instances of an application on different + workspaces (LP: #925484) + - Launcher - Icons are not colorized properly (LP: #930949) + - Remove glow from Alt-tab edge and Search Field image assets + (LP: #933578) + - "Left Mouse Drag" and "Middle Mouse Drag" should be translatable + (LP: #930510) + - Launcher switcher should be terminated if a launcher icon keybinding is + pressed (LP: #943377) + - dash home lens does not include recent files... (LP: #946980) + - Alt-tab switcher can't be terminated by Escape key (LP: #948227) + - Overlay should refer to "Menu Bar" not "Top Bar" (LP: #926213) + - alt-tab is showing preview even if you have just one instance + (LP: #933406) + - When "Bias alt-tab (...)" is switched on, alt+tab and ctrl+alt+tab are + swapped (LP: #942677) + - Numbers on Launcher icons sticking (LP: #942359) + - The launcher icons shortcuts can be shown during the Super Tab Launcher + switcher. (LP: #943372) + - Use title case capitalization "Lock to Launcher" & "Unlock from + Launcher" (LP: #949636) + * debian/control: + - bump compiz-dev and libcompizconfig0-dev build-dep for ABI break + - bump libnux-2.0-dev build-dep for ABI break + - bump libbamf req. for new API + + -- Didier Roche Mon, 12 Mar 2012 12:14:28 +0100 + +unity (5.4.0-0ubuntu2) precise; urgency=low + + * 01_hardcode_new_default_in_hardcoded_values.patch: + - hardcode the new default value for switching between workspaces and + moving a window between workspaces. Unfortunatly, this is still a + harcoding. Opened an upstream bug so that the real values are read + instead with some guidance. + * debian/control, debian/rules: + - add quilt patch handling + + -- Didier Roche Thu, 23 Feb 2012 17:01:16 +0100 + +unity (5.4.0-0ubuntu1) precise; urgency=low + + * New upstream release. + - Unity needs a way to switch (tab) between windows on current workspace + (LP: #863399) + - compiz crashed with SIGSEGV in BamfLauncherIcon::NameForWindow() + (LP: #865840) + - Gradual degradation in desktop performance. (LP: #888039) + - compiz (unity) crashes with SIGSEGV when a window is minimized. + (LP: #918329) + - FavoriteStore external change support (LP: #681503) + - Launcher - Make Launcher left of screen reveal more responsive and less + prone to false positives (LP: #765819) + - Window auto-maximise functionality should be disabled on monitors with a + resolution above 1024 x 600 (LP: #797808) + - Dash: very high latency responding to input (LP: #828582) + - Dash - Behaviour of the 'All' button in the Dash filters broken in + several ways (LP: #841864) + - alt-tab - The app title in the top left of the top bar should change as + the alt-tab focus changes (LP: #855516) + - Keyboard shortcut - Add keyboard shortcut hint overlay that is displayed + when a user presses and holds the Super key (LP: #855532) + - Unity crashes when started in an environment without utouch support + (LP: #860707) + - Dash - Remove Dash Home shortcut icons (LP: #885738) + - Dash - Most Frequently Used apps change to Recently Used, without + Launcher favorites (LP: #893214) + - Should have a launcher on every monitor (LP: #915944) + - Launcher autohide behaviour on multi-monitor (LP: #915946) + - the unity wrapper should kill compiz before restarting it (LP: #919132) + - Launcher - Implement workspace/launcher cross interactions (LP: #690143) + - Application icons should only display windows from the current workspace + in the window spread (LP: #689733) + - Notification area ("system tray") missing when using dual monitors of + different sizes, with their bottoms aligned (LP: #778256) + - Clicking Nautilus launcher icon fails to open a Nautilus file explorer + window when copying a file and all other Nautilus windows are closed / + bamf should skip the taskbar (LP: #784804) + - Dash - the search box is not aligned correctly relative to the Launcher + BFB button (LP: #838904) + - Dash - A expand/collapse arrow is missing from all the filter category + headers (LP: #841870) + - Dash - the filter buttons should not have a mouse over state + (LP: #838901) + - Dash - the "Filter results" text is the wrong size, wrong font weight, + and aligned incorrectly in both the vertical and horizontal axis + (LP: #863240) + - Add SUPER+TAB switching mode that enables the user to switch + applications via the Launcher (LP: #891620) + - Software Centre - automatically add app icon to launcher (LP: #761851) + - Compiz add transparency to titlebar along with the panel (LP: #912682) + - The search box is too opaque and dark (LP: #913717) + - Dash - Make statefulness of Dash Home and Dash Lenses consistent + (LP: #914759) + - Unity 5.0: "All" button for filters render as "..." (LP: #915200) + - Adding an option to the Sources filter from a remote Python scope + doesn't work (LP: #916758) + - super+tab switcher shows shortcut overlay sometimes (LP: #918453) + - SUPER+TAB switcher should be circular (LP: #919018) + - launcher not hiding in one design-specified case (LP: #919162) + - The Unity hints overlay should refer to "Trash" instead of "Rubbish Bin" + (LP: #920529) + - middle-click pasting in run dialog [Alt]+[F2] doesn't work (LP: #842462) + - Dash - Genre filter category in the Music Lens should use a 3 column + layout (LP: #841902) + - Expo plugin not marked as essential for Unity plugin (in ccsm) + (LP: #897697) + - unity log messages in ~/.xsession-errors are NOT identified as coming + from unity (LP: #908004) + - Launcher icon progress overlay is drawn incorrectly when using odd icon + size (LP: #911553) + - Menus don't hide if moving cursor during alt+tab (LP: #913889) + - When removing icon from launcher by unselecting "Keep in launcher" in + the quick, it's super+number shortcut becomes unaccessible until I put + another icon on the launcher (LP: #914018) + - It should be possible to escape from SUPER+TAB with Escape key + (LP: #919019) + - Clicking on an empty areas makes the dash search bar lose focus + (LP: #919567) + - Dash - the options in the "filter results" section are the wrong size, + aligned incorrectly, and the button outline width is incorrect + (LP: #863246) + - clicking filter categories in lenses changes search box hint text. + (LP: #923988) + - Dash home screen contains previous search result (LP: #924649) + - checkbox-unity: test descriptions need an update (LP: #924669) + - Missing dependency on python-gconf (LP: #923288) + * debian/control: + - recommends indicator-printers + - recommends new unity-lens-video + - build-dep on latest nux (ABI break) + + -- Didier Roche Fri, 17 Feb 2012 13:37:09 +0100 + +unity (5.2.0-0ubuntu5) precise; urgency=low + + * debian/unity-crashdb.conf, debian/source_unity.py, + debian/unity-common.install: + - enabling installing + tag from a ppa + * debian/control: + - bump compiz-dev build-dep for ABI break + + -- Didier Roche Thu, 16 Feb 2012 15:16:04 +0100 + +unity (5.2.0-0ubuntu4) precise; urgency=low + + * debian/control: + - build-dep on latest compiz-dev and libcompizconfig0-dev for ABI break + * debian/rules: + - pick new abiversion file + * Cherry-pick new gtk_init initialization in unity (not anymore in compiz) + + -- Didier Roche Mon, 13 Feb 2012 15:32:01 +0100 + +unity (5.2.0-0ubuntu3) precise; urgency=low + + * Cherry-pick: + - additional fix for setting the right strut on startup + + -- Didier Roche Wed, 08 Feb 2012 08:09:31 +0100 + +unity (5.2.0-0ubuntu2) precise; urgency=low + + * Cherry-pick upstream: + - a fix for a 5.0 crasher (LP: #916228) + - default configuration now to "always lock" + * debian/profile_upgrade/com.canonical.unity.unity.03.upgrade, + debian/unity-common.install: + - enabling user profile upgrade installation + - switcher per workspace is now the default on upgrade + - launcher is always locked by default, even on upgrade (LP: #928153) + + -- Didier Roche Tue, 07 Feb 2012 17:53:27 +0100 + +unity (5.2.0-0ubuntu1) precise; urgency=low + + * New upstream release. + - Unity needs a way to switch (tab) between windows on current workspace + (LP: #863399) + - compiz crashed with SIGSEGV in BamfLauncherIcon::NameForWindow() + (LP: #865840) + - Gradual degradation in desktop performance. (LP: #888039) + - compiz (unity) crashes with SIGSEGV when a window is minimized. + (LP: #918329) + - FavoriteStore external change support (LP: #681503) + - Launcher - Make Launcher left of screen reveal more responsive and less + prone to false positives (LP: #765819) + - Window auto-maximise functionality should be disabled on monitors with a + resolution above 1024 x 600 (LP: #797808) + - Dash: very high latency responding to input (LP: #828582) + - Dash - Behaviour of the 'All' button in the Dash filters broken in + several ways (LP: #841864) + - alt-tab - The app title in the top left of the top bar should change as + the alt-tab focus changes (LP: #855516) + - Keyboard shortcut - Add keyboard shortcut hint overlay that is displayed + when a user presses and holds the Super key (LP: #855532) + - Unity crashes when started in an environment without utouch support + (LP: #860707) + - Dash - Remove Dash Home shortcut icons (LP: #885738) + - Dash - Most Frequently Used apps change to Recently Used, without + Launcher favorites (LP: #893214) + - Should have a launcher on every monitor (LP: #915944) + - Launcher autohide behaviour on multi-monitor (LP: #915946) + - the unity wrapper should kill compiz before restarting it (LP: #919132) + - Launcher - Implement workspace/launcher cross interactions (LP: #690143) + - Application icons should only display windows from the current workspace + in the window spread (LP: #689733) + - Notification area ("system tray") missing when using dual monitors of + different sizes, with their bottoms aligned (LP: #778256) + - Clicking Nautilus launcher icon fails to open a Nautilus file explorer + window when copying a file and all other Nautilus windows are closed / + bamf should skip the taskbar (LP: #784804) + - Dash - the search box is not aligned correctly relative to the Launcher + BFB button (LP: #838904) + - Dash - A expand/collapse arrow is missing from all the filter category + headers (LP: #841870) + - Dash - the filter buttons should not have a mouse over state + (LP: #838901) + - Dash - the "Filter results" text is the wrong size, wrong font weight, + and aligned incorrectly in both the vertical and horizontal axis + (LP: #863240) + - Add SUPER+TAB switching mode that enables the user to switch + applications via the Launcher (LP: #891620) + - Software Centre - automatically add app icon to launcher (LP: #761851) + - Compiz add transparency to titlebar along with the panel (LP: #912682) + - The search box is too opaque and dark (LP: #913717) + - Dash - Make statefulness of Dash Home and Dash Lenses consistent + (LP: #914759) + - Unity 5.0: "All" button for filters render as "..." (LP: #915200) + - Adding an option to the Sources filter from a remote Python scope + doesn't work (LP: #916758) + - super+tab switcher shows shortcut overlay sometimes (LP: #918453) + - SUPER+TAB switcher should be circular (LP: #919018) + - launcher not hiding in one design-specified case (LP: #919162) + - The Unity hints overlay should refer to "Trash" instead of "Rubbish Bin" + (LP: #920529) + - middle-click pasting in run dialog [Alt]+[F2] doesn't work (LP: #842462) + - Dash - Genre filter category in the Music Lens should use a 3 column + layout (LP: #841902) + - Expo plugin not marked as essential for Unity plugin (in ccsm) + (LP: #897697) + - unity log messages in ~/.xsession-errors are NOT identified as coming + from unity (LP: #908004) + - Launcher icon progress overlay is drawn incorrectly when using odd icon + size (LP: #911553) + - Menus don't hide if moving cursor during alt+tab (LP: #913889) + - When removing icon from launcher by unselecting "Keep in launcher" in + the quick, it's super+number shortcut becomes unaccessible until I put + another icon on the launcher (LP: #914018) + - It should be possible to escape from SUPER+TAB with Escape key + (LP: #919019) + - Clicking on an empty areas makes the dash search bar lose focus + (LP: #919567) + - Dash - the options in the "filter results" section are the wrong size, + aligned incorrectly, and the button outline width is incorrect + (LP: #863246) + - clicking filter categories in lenses changes search box hint text. + (LP: #923988) + - Dash home screen contains previous search result (LP: #924649) + - checkbox-unity: test descriptions need an update (LP: #924669) + * debian/control: + - dep on python-gconf (LP: #923288) + - add a version dep from unity to libunity-core-5.0-5 as the ABI + is breaking a lot and it helps wrong update for the autogenerated + package from the ppa (especially when people downgrade) + - build-dep on latest Nux + - push priority to extra for the transitional package + - fix a dep on binary:Version + - build-dep on latest libunity-dev + + -- Didier Roche Fri, 03 Feb 2012 11:37:52 +0100 + +unity (5.0.0-0ubuntu3) precise; urgency=low + + * rebuild for libindicator7 + * CMakeLists.txt + - build with -Wno-error=deprecated-declarations + + -- Ken VanDine Wed, 25 Jan 2012 10:02:28 -0500 + +unity (5.0.0-0ubuntu2) precise; urgency=low + + * Rebuild with nux on glew1.6 + + -- Sebastien Bacher Thu, 19 Jan 2012 18:28:49 +0100 + +unity (5.0.0-0ubuntu1) precise; urgency=low + + [ Didier Roche ] + * New upstream release. + - compiz crashed with SIGSEGV in __dynamic_cast() (LP: #853038) + - unity-panel-service crashed with SIGSEGV in panel_service_show_entry() + (LP: #861144) + - unity-panel-service crashed with SIGSEGV in + panel_indicator_entry_accessible_get_n_children() (LP: #869816) + - Launcher - Launcher icon for Dash does not highlight when the Alt+F1 key + shortcut is pressed (LP: #849561) + - compiz crashed with SIGSEGV in unity::PanelTray::FilterTrayCallback() + (LP: #868868) + - [regression] Compiz: Visible tearing is worse in 11.10 than 11.04, even + when "Sync To VBlank" is enabled, but only when Unity is active. + (LP: #880707) + - [regression] All apps have a lower frame rate under Unity. (LP: #861061) + - compiz crashed with SIGSEGV in + nux::Property::operator=() from + unity::switcher::SwitcherController::OnBackgroundUpdate() (LP: #887465) + - DashSearchBarSpinner.cpp:56: Conditional jump or move depends on + uninitialised value(s) (LP: #901610) + - quicklist shows in incorrect position when launched from workspace + switcher (LP: #914251) + - Build "show me the desktop" mini-app that adds a show desktop button to + Launcher (LP: #681348) + - Select quicklist items with just one right click (LP: #688830) + - cannot change volume by scrolling on the icon when the SoundMenu is + opened (LP: #722082) + - [a11y] Unity launcher buttons are not Actionable (LP: #772573) + - Ubuntu Start launcher item doesn't start dash with keyboard navigation + (LP: #825037) + - multimonitor , window management - Multi-Monitor Maximized Difficulty + (LP: #843958) + - [regression] Drag and drop inside dash is very slow with Active Blur + activated (LP: #851172) + - Activating an alt-tab icon that holds initially unminimized windows + should unminimize all windows (LP: #854595) + - Dash - The Dash category headers are positioned incorrectly + (LP: #839467) + - Missing global menu with a semi-maximized window dragged to the right. + (LP: #861279) + - Launcher - Dragging and dropping a running application in to the Trash + should quit the application and (if the app is pinned to the Launcher) + un-pin the application from the Launcher (LP: #870143) + - top bar, integrated menu - when a application is first launched, the + integrated menu should be displayed for 2 seconds before fading out of + view (LP: #874254) + - Window control buttons are not shown when an indicator is opened and the + pointer is over the top-left corner (LP: #890970) + - Quicklist item using some special chars doesn't show at all + (LP: #899677) + - PanelView.cpp:370: Conditional jump or move depends on uninitialised + value(s) (LP: #901602) + - unityshell.cpp:1982,1984: Conditional jump or move depends on + uninitialised value(s) (LP: #901603) + - Dash Search spinner sometimes doesn't spin at all (LP: #903090) + - Point of tooltip is misaligned to focused application indicator arrow + (LP: #702989) + - Dash - "See more..." line should be base-aligned with section header + (LP: #748101) + - right-clicking launcher when choosing a workspace causes quicklists to + freeze (LP: #791810) + - Panel should (optionally) go opaque when window is maximized + (LP: #807891) + - love handles don't show on windows that cannot be resized (LP: #827566) + - dconf shows-on-edge setting ignored (LP: #853086) + - Icon selection stays is Dash after dragging shortcut outside + (LP: #867548) + - right click on the dash icon should display a list of the lenses + (LP: #868452) + - Top Bar - rename the "Desktop" title in the Top Bar (displayed when no + window has focus) to "Ubuntu Desktop" (LP: #869873) + - Dash should close on "Spread" (LP: #870284) + - Double-click on the dash top panel is taken effect on the window + underneith (LP: #870844) + - Clicking on the panel when the dash is open causes a maximized window to + raise (LP: #873100) + - Launcher - the "Keep in Launcher" quicklist option should change from + the current checkbox option to a two state toggle (LP: #874380) + - Launcher - Reduce Launcher icon de-coupling delay (LP: #874410) + - When ejecting optical discs, the notification displays a USB stick icon + (LP: #875467) + - Menus are not shown when an indicator is opened and the pointer is over + the global-menu area (LP: #888650) + - Application title on quicklist should be bold (or more visible) + (LP: #900400) + - Clicking on a dash category header should not give it keyboard focus + (LP: #905921) + - unable to remove the "Apps Available for Download" section from + Applications Lens (LP: #785101) + - Global Menu Fade should be configurable (LP: #875472) + - BaseWindow on UnityRootAccessible shouldn't be added manually + (LP: #702700) + - Unity Dash not accessible (LP: #731403) + - Quicklist items are not yet accessible. (LP: #740698) + - Unity acts not as a dock for LibreOffice but as a launcher (LP: #741995) + - Unity accessible support should use AtkWindow (LP: #842033) + - Alt+tab switcher doesn't works with Orca (LP: #856392) + - Libreoffice Calc icon does not appear when opened via Writer + (LP: #861355) + - Libreoffice and unity integration broken. (LP: #842566) + * debian/control: + - add libgdu-dev build-dep + - remove now uneeded libgnome-desktop-dev and libgtk2.0-dev build-deps + * debian/control, debian/rules: + - depends now on the new Nux ABI mecanism + - bump de dep on Nux 2.0 as well + - bump libunity-core to 5.0 + * debian/source: + - remove source 3 format, doesn't play well with UDD and drives crazy + diff for the release team + + [ Aurélien Gâteau ] + * debian/control: + - update build-dep of libunity, libdee and libbamf + + -- Didier Roche Fri, 13 Jan 2012 09:10:59 +0100 + +unity (4.24.0-0ubuntu1) UNRELEASED; urgency=low + + * debian/control: + - add libgdu-dev build-dep + - remove now uneeded libgnome-desktop-dev and libgtk2.0-dev build-deps + * debian/control, debian/rules: + - depends now on the new Nux ABI mecanism + - bump de dep on Nux 2.0 as well + - bump libunity-core to 5.0 + * debian/source: + - remove source 3 format, doesn't play well with UDD and drives crazy + diff for the release team + + -- Didier Roche Tue, 06 Dec 2011 09:45:13 +0100 + +unity (4.24.0-0ubuntu2) oneiric-proposed; urgency=low + + * Cherry-pick upstream: + - SRU0-Regression: scrollbar displacement caused dash rows to show less + icons (LP: #875023) + - Really reverts the UI change that was still uploaded even if we had + reverted it… + + -- Didier Roche Tue, 18 Oct 2011 12:47:54 +0200 + +unity (4.24.0-0ubuntu1) oneiric-proposed; urgency=low + + * New upstream release and some cherry-pick: + - compiz crashed with SIGSEGV in PluginClassHandler::get() (LP: #864758) + - unity panel menus don't stay open when clicked on second monitor + (LP: #869196) + - (oneiric) menu bar in wrong place and invisible (LP: #845856) + - Lens range widgets do not function correctly (LP: #862996) + - Cannot raise window from panel after minimize (LP: #863114) + - unity-panel-service crashed with SIGSEGV in g_closure_invoke() + (LP: #843280) + - Windows get corrupted sometimes when semi-maximizing them. (LP: #865177) + - Automaximization happens on unminimize (LP: #868930) + - compiz crashed with SIGSEGV in nux::ROProperty::operator + std::string() (LP: #869109) + - Dash - horizental divider line in between categories incorrectly drawn + (LP: #841750) + - F10 opens a random menu item when it should open the first one + [regression] (LP: #862849) + - Switching desktops after using showdesktop can cause hidden windows to + become "active" (LP: #864503) + - Clicking blank space on top panel doesn't raise maximized window to + front (LP: #864708) + - unity launcher loses track of deja-dup windows (LP: #865051) + - Dash - App Lens 'Rating' filter behaves incorrectly (LP: #865482) + - Launcher does not show on "Show desktop" (LP: #867959) + - ibus character selection window not drawn (LP: #867885) + - the dash's entry get wrongly colored on left or right key use + (LP: #868434) + - [ibus] Pressing down when ibus is active moves focus (LP: #872730) + - Double-click on the dash top panel is taken effect on the window + underneith (LP: #870844) + + -- Didier Roche Mon, 17 Oct 2011 09:20:09 +0200 + +unity (4.22.0-0ubuntu3) oneiric; urgency=low + + * Cherry-pick upstream: + - Resize the _gradient_texture (in PanelMenuView::Draw) if needed + (LP: #863068, #868293, #869028) + + -- Didier Roche Fri, 07 Oct 2011 09:03:50 +0200 + +unity (4.22.0-0ubuntu2) oneiric; urgency=low + + * Cherry-pick upstream: + - fix minimize windows not showing when clicking on a launcher icon + (LP: #868185) + + -- Didier Roche Wed, 05 Oct 2011 12:04:39 +0200 + +unity (4.22.0-0ubuntu1) oneiric; urgency=low + + * New upstream release. + - unity 3d firefox window borders disappear (LP: #861143) + - Desktop drawn with offset (LP: #862743) + - Crash when selecting Evolution in alt-tab (LP: #859431) + - unity-panel-service crashed with SIGSEGV in g_type_check_instance_cast() + - with a11y enabled (LP: #829367) + - compiz crashed with SIGSEGV in + unity::switcher::SwitcherController::~SwitcherController() (LP: #863302) + - compiz assert failure: *** glibc detected *** compiz: double free or + corruption (!prev): 0x00007fa248593900 *** (LP: #862938) + - Onboard can cause unity to crash (LP: #863693) + - compiz crashed with SIGSEGV in LauncherIcon::SetHasWindowOnViewport() + (LP: #863652) + - Dash opens the wrong application after scrolling in the application list + (LP: #863555) + - Categories "Applications" and "Files and folders" are untranslated + (LP: #865430) + - focus nautilus desktop to get focus at startup (LP: #863037) + - The 'Desktop' label isn't shown if you use "Show desktop" in alt + tab + (LP: #863129) + - UIFe: Remove Ubuntu logo again from desktop title (LP: #865150) + - compiz assert failure: *** glibc detected *** compiz: free(): corrupted + unsorted chunks: 0x0000000004a1d390 *** (LP: #863303) + - Fix a mem leak + - compiz crashed with SIGSEGV in unity::dash::LensView::~LensView() + (LP: #863191) + + -- Didier Roche Tue, 04 Oct 2011 15:45:58 +0200 + +unity (4.20.0-0ubuntu2) oneiric; urgency=low + + * Merge trunk: + - Desktop drawn with offset (LP: #862743) + + -- Martin Pitt Fri, 30 Sep 2011 07:30:20 +0200 + +unity (4.20.0-0ubuntu1) oneiric; urgency=low + + * New upstream release + cherry-pick: + - compiz crashed with SIGSEGV in PluginClassHandler::get() (LP: #835259) + - dash does not scroll down during keyboard navigation (LP: #852506) + - compiz crashed with SIGSEGV in _XFreeEventCookies() (LP: #851472) + - compiz crashed with SIGSEGV in g_object_unref() (LP: #847512) + - compiz crashed with SIGSEGV in nux::WindowCompositor::MouseEventCycle() + (LP: #831678) + - compiz and X can disagree on the stacking order (LP: #845719) + - compiz crashed with SIGSEGV in unity::dash::LensView::OnResultAdded() + (LP: #855252) + - CCSM crashes Unity (LP: #861643) + - compiz crashed with SIGSEGV in PrivateWindow::addWindowStackChanges() + (LP: #862115) + - Touch - When dragging a window with a 3 touch, dragging to the top + should show the maximize gesture preview. (LP: #750316) + - compiz crashed with SIGABRT in raise() (LP: #750386) + - Launcher - Spread should not affect the state of window (LP: #764673) + - [UIFe] Add system setting icon to Launcher (LP: #764744) + - compiz crashed with SIGABRT in raise() [Merely unchecking the Unity + plugin is enough to crash Compiz...] (LP: #823386) + - Launcher - does not hide if revealed from top 24px of the left edge of + the screen (LP: #835989) + - Clickable areas of previously active window remains on 'Show Desktop' + (LP: #836325) + - Cannot search for some apps in Dash (LP: #837075) + - Dash - Search box cursor not responding correctly to focus (LP: #839704) + - Multi-display: Application menu only showing on primary screen + (LP: #845212) + - Ellipsized values in size filter (LP: #851359) + - (oneiric) dash result expansions don't display icons (LP: #854615) + - run the wrong command if enter is hit before the view is refreshed + (LP: #856205) + - Java application windows cut-off/truncated/not displayed properly + (LP: #857201) + - compiz crashed with SIGSEGV in sigc::signal_base::impl() (LP: #831769) + - Minimizing a window should switch focus to the windows underneath it + (breaks restore) (LP: #859885) + - Ratings filter allows ratings > 1.0 (LP: #861255) + - Serious Unity problem stuck in spread when dragging icons back to the + dash (LP: #862045) + - Must use hardware keyboard to perform search for applications in Unity + (LP: #739812) + - Files lens should also search Downloads (LP: #748915) + - The dash crosses the monitor boundary when resolution is 1152x864 or + lesser width (LP: #765338) + - Dash - dragging a file outside of the Desktop Dash should close the Dash + (LP: #764641) + - Text in Dash search text box overflows and doesn't crop with longer + strings; RtL input starts in wrong place (LP: #834765) + - Where the average background colour is either very light or dark, adjust + this value to darken/lighten in order to preserve readability + (LP: #837993) + - Dash does not resize when I connect to an external display and mirror + displays (LP: #838132) + - wrong workspace is activated (LP: #838766) + - [oneiric] Clicking the maximize/restore button for the dash window loses + the keyboard focus (LP: #850467) + - Non-square dash items are stretched to a 1:1 ratio (LP: #851196) + - Dash - 'Shortcuts' arrow should be removed (LP: #852130) + - Dash - reflections should be fixed on the centre of the viewport, *NOT* + the centre of the entire page including occluded areas (LP: #838925) + - Dash - horizental divider line in between categories incorrectly drawn + (LP: #841750) + - Dash - whenever there is a search query in the search box and the search + is no longer running, the circle with the X inside should be displayed + in place of the magnifying glass (LP: #841760) + - Top bar - Pressing F10 as second time should close the top bar app menus + (LP: #856468) + - Dash - Dash should support drag and drop to external applications + (LP: #857431) + - (oneirc) default placement of windows is behind panel (LP: #857214) + - FFe : Add option to make alt-tab easier to use for workspace users + (LP: #860622) + - Clicking a filter removes keyboard input focus from search entry + (LP: #861251) + - UIFe: Desktop should be titled (LP: #732016) + - Dash - clicking inside the Dash search box should remove the search hint + and display a blinking carete (LP: #764859) + - Minimizing a maximized Qt app leaves nothing in focus (LP: #821601) + - unmaximizable windows still show orange glow but fail to maximize + (LP: #827560) + - UIFe: scrollbar in unity dash should be rounded (and with glow) + (LP: #836656) + - Dash - alt-f2 have 'Filter results' which does nothing (LP: #838127) + - Alt-tab - Alt-tab should ellipsis long application names (LP: #850400) + - Super+number shortcuts don't work with numpad (LP: #850792) + - Dash should close when an app is launched from the messaging menu (or + any other indicator) (LP: #853300) + - Dash - In the App lens filters, users should only be able filter by + 'star' rating in one star increments (LP: #839759) + - Dash - When the Dash is re-opened and statefully displaying a previous + query, it should be possible to add to the query by pressing the 'right + arrow cursor key' (LP: #841828) + - Dash - When a result is selected or in the mousover state (white box + highlight), the casted shadow should be hidden. (LP: #841831) + - text in searchbar keeps getting bolder/darker (LP: #861487) + + -- Didier Roche Thu, 29 Sep 2011 19:07:09 +0200 + +unity (4.18.0-0ubuntu1) oneiric; urgency=low + + * New upstream release. + - Screen corruption when resuming from suspend/hibernate (LP: #676166) + - unity-panel-service crashed with SIGSEGV in bamf_factory_view_for_path() + (LP: #764024) + - Dash and launcher appear underneath windows (LP: #805087) + - unity-panel-service crashed with SIGSEGV in g_type_check_instance_cast() + (LP: #811401) + - [Oneric] unity-panel-service crashed with SIGSEGV in getenv() + (LP: #817691) + - compiz crashed with SIGSEGV in unity::FilterBar::RemoveFilter() + (LP: #845732) + - crash on closing a window (LP: #856015) + - Cannot open a window that starts iconified (LP: #732997) + - Launcher - When useing Alt F1 launcher keyboard navigation, Launcher + should not scroll until top or bottom of Launcher is reached + (LP: #765749) + - Stacking problem when switching between apps with multiple windows + (LP: #802527) + - Pull panel to de-maximize window occasionally not working in a secondary + screen (LP: #802651) + - Window under Dash gets focused if it opened later (LP: #830730) + - Clickable areas of previously active window remains on 'Show Desktop' + (LP: #836325) + - A minimized window 'remains' behind on the desktop if + /apps/compiz-1/plugins/unityshell/screen0/options/show_minimized_windows + is set to true (LP: #847967) + - a11y support on Unity is broken (LP: #851103) + - compiz crashed with SIGSEGV in dee_model_get_tag() (LP: #840758) + - crash when looping paint list in preparePaint (on closing windows) + (LP: #853807) + - Alt-Tab should not preview windows at excessively large sizes + (LP: #854740) + - Clicking on a tweet/message link sometimes does not work (LP: #790565) + - Dragging a launcher icon makes it squashed (LP: #855761) + - unable to unminimize gedit windows where more than one window where one + has a dialog open (LP: #856030) + - (oneiric) alt-tab UX doesn't work well on multi-monitor (LP: #855364) + - Launcher shows on the primary monitor instead of the left most monitor + (LP: #857668) + - Keynav - pressing down key causes launcher items to jump up and down + (LP: #858469) + - Windows creep cross the screen with ALT+TAB (LP: #722830) + - Minimize animation flickr when for maximized apps (LP: #737125) + - All unity windows are invisible (panel, launcher, dash) (LP: #745996) + - Dash "See 97 more results" has ~1 second of latency (LP: #731158) + - Windows cannot be dragged down from panel if banshee closed to sound + menu (LP: #781215) + - no menu bar on top, compositing bug? (LP: #806358) + - Launcher - a spread can accidentally be triggered during the 'dragging + and dropping behind the Launcher' interaction (LP: #832988) + - Impossible to navigate between panel menus when the mouse cursor is over + the panel (LP: #834065) + - Pressing alt on maximized window does show menu but not window controls + (LP: #836274) + - Application name drawn under Dash controls when window opens under Dash + (LP: #838176) + - Start dragging a maximized application title causes it to re-decorate + (LP: #838923) + - Dash loses focus after switching windows or desktops (LP: #842466) + - ccsm crashed with KeyError in compizconfig.Plugin.ApplyStringExtensions + (src/compizconfig.c:6780)(): '\xd0\t\x9b\n\x01' (LP: #832458) + - No feedback when trying to drag&drop an icon that’s already in the + launcher (LP: #851619) + - Dash - the search box is not aligned correctly relative to the Launcher + BFB button (LP: #838904) + - Dash - Shape and positioning of most of the elements in the Dash need + adjustment (Part 3) (LP: #852030) + - minimizing a window with a modal dialog is broken (LP: #855068) + - Dash - Dash missing 'streak of reflected light' in the top left corner + (LP: #844030) + - alt-tab - When the ALT key is pressed, there should be a very short + delay before the app menu is exposed in the top bar (LP: #855521) + - holding down super while dash is open resaturates launcher but super- + key-shortcuts don't appear (LP: #855909) + - Panel Titlebar double click is emitted for any mouse button + (LP: #736491) + - unity panel shadow opacity does not match panel opacity (LP: #747682) + - maximising via dragging to panel and unmaximising leaves faded panel + title (LP: #761228) + - Sometimes dragging down from the panel just stops working (LP: #774121) + - Shadowless panel in multi monitor setup (LP: #815454) + - Window buttons in the panel have no indication of the "pressed" form + (LP: #823353) + - Activating a menu item or clicking outside area menu doesn't hide the + application menu (LP: #843670) + - Using menus with only one click doesn't work as expected (LP: #844309) + - Showing menu of a maximized application via dragging needs an extra + movement (LP: #845772) + - Restored windows dragged down from the panel still shows their menu + (LP: #845774) + - When the dash is shown, "dragging behind launcher" interaction should + not be triggered (LP: #851185) + - Make the dash darker (LP: #851243) + - Dash unmaximize/maximize button is mismatched with actual window size + (LP: #852984) + - Alt-tab - Add missing dots to alt-tab border (LP: #838113) + - Expo centering need to change when launcher size changed (LP: #856112) + - unity confused with chromium web apps (LP: #692462) + - alt-tab on multimonitor doesn't work well (LP: #791198) + - Unity need gtk_render_icon and therefore gtk+ 3.2 (LP: #846447) + - Panel shouldn't be dragged when the dash is showing (LP: #858815) + * Cherry-pick: + - Dash - dragging a file outside of the Desktop Dash should close the Dash + (LP: #764641) + - Cherry-pick another fix for home dash text height not being cut + * debian/control: + - build-dep on gtk 3.1 and latest nux + + -- Didier Roche Mon, 26 Sep 2011 14:43:35 +0200 + +unity (4.16.0-0ubuntu2) oneiric; urgency=low + + * com.canonical.Unity.gschema.xml: + - add Update-notifier to the whitelist (LP: #779382) + + -- Didier Roche Tue, 20 Sep 2011 08:17:34 +0200 + +unity (4.16.0-0ubuntu1) oneiric; urgency=low + + * New upstream release. + - compiz crashed with SIGSEGV in nux::GpuDevice::GetGpuInfo() + (LP: #765375) + - F10 doesn't start keyboard navigation to the panel (LP: #839628) + - Change on the at-spi accessibility-toolkit can affect also Unity + (LP: #844927) + - compiz crashed with SIGSEGV when a lens is shutting down (LP: #848675) + - [UIFe] Radiance panel icons are unreadable and ugly when panel goes + transparent with Dash (LP: #828862) + - window switcher stuck (not only, but can be triggered with Onboard) + (LP: #832033) + - Window titlebar is click through after raising a minimized window + (LP: #840285) + - Alt+Shift+` does not work in symmetry with Alt+` (LP: #843250) + - UIFe: Alt-Tab: Update layout behavior to make previews larger and + outline active preview (LP: #847944) + - windows clipped on resize (LP: #848962) + - Alt-tab - Add orange border to selected window in alt-tab window spread + (LP: #838114) + - Launcher - the direction the Launcher is scrolled with the mouse wheel + is inverted (LP: #839703) + - Launcher - the rendering of the BFB and Lens squircle does not match the + design (LP: #838708) + - Alt-Tab - In the app window spread, all windows should have the same + height, only the width should vary (LP: #838110) + - Launcher - the background of the Launcher should be tinted using the + average colour of the wallpaper (LP: #850068) + - Alt-tab - It is currently very difficult to see pips in the left of the + app icon for the currently selected app (LP: #838134) + - Launcher - Auto scroll missing from the top of the Launcher + (LP: #838744) + - Scope searches blocks the lens (LP: #850816) + - Shortcuts SUPER+1...9 doesn’t work until opening a window (LP: #768076) + - Dash closes prematurely when dragging apps into the launcher + (LP: #773892) + - Dash - As soon as a user starts dragging a .png file from the Dash, the + file icon turns into a grey question mark (LP: #764447) + - Dash shows an empty icon for some applications. (LP: #830887) + - Windows are click through after restore from minimize (LP: #834034) + - Dash - No keyboard shortcuts for switching lenses (LP: #842086) + - Dash search for files states "two more results" but doesn't display them + (LP: #840005) + - ++ to start a new instance of a program doesn't + work anymore (LP: #842977) + - Alt-tab - Cross interactions between Alt-tab and Dash are broken + (LP: #844021) + - UIFe: Dash - Shape and positioning of most of the elements in the Dash + need adjustment (Part 2) (LP: #844889) + - Alt-Tab - make pause to spread default alt-tab behaviour. Upgrade + existing installs as well. (LP: #838075) + - Do not install unity-preference (LP: #847599) + - Update unity --distro to latest plugins installed (LP: #847799) + - off by one error in count of additional results in a category + (LP: #848218) + - UIFe - Launcher - The background of the BFB, Workspace Switcher, Lens, + and Trash launcher icons tiles needs to use the average background + colour of the wallpaper (LP: #838688) + - dragging a window to the top while maximized gives it double borders + (LP: #850985) + - Launcher does not show if the cursor is placed 1px away from the left + edge and then moved to the edge (LP: #801320) + - [alt-tab] [wishlist] Use Alt-` as a keyboard shortcut to switch between + multiple windows of the same app (LP: #825467) + - compiz crashed with SIGSEGV in nux::Size::SetWidth() (LP: #815864) + * debian/unity.install: + - remove /usr/share/applications as unity-preferences no longer exist + + -- Didier Roche Thu, 15 Sep 2011 18:53:02 +0200 + +unity (4.14.2-0ubuntu2) oneiric; urgency=low + + * Cherry-pick a fix for remapping minimized window correctly (LP: #840285) + * debian/control: + - bump build-dep for latest compiz-dev ABI break + + -- Didier Roche Mon, 12 Sep 2011 08:12:54 +0200 + +unity (4.14.2-0ubuntu1) oneiric; urgency=low + + * New upstream release. + - unity crashed with AttributeError in reset_unity_compiz_profile(): 'str' + object has no attribute 'get_string' (LP: #809378) + - Trying to minimize Unity Dash to make it fit on a 1024x768 screen makes + Unity freeze and then, after I log out by killing X, never start again + (LP: #839200) + - unity-panel-service crashed with SIGSEGV in main_arena() (LP: #817477) + - UIFe: Panel - Indicators should be orderable regardless of their parent + IndicatorObject (LP: #823061) + - 'Show Desktop' fails to hand focus to desktop (LP: #836315) + - Dash - Functionality of top left close, minimise and maximise/restore + window decorations is confused (LP: #838875) + - unity-panel-service Leaks Memory (LP: #779185) + - Missing lens shortcuts (Super-A, Super-F) (LP: #834078) + - Unity window switcher takes over key (LP: #835699) + - update assets for window buttons (topleft) with dash opened + (LP: #836655) + - Where the average background colour is either very light or dark, adjust + this value to darken/lighten in order to preserve readability + (LP: #837993) + - Applications don't have priority over other results (LP: #839518) + - task tray icons are misaligned and badly sized (LP: #839354) + - UIFe: Dash - Shape and positioning of most of the elements in the Dash + need adjustment (LP: #841945) + - Cannot drag applications from dash to desktop (LP: #756614) + - systray icons still visible on each desktop in expo mode (LP: #759129) + - transparency on unity panel broken (LP: #827012) + - Window buttons and application menu don't autohide if left edge is + touched (LP: #835637) + - 'Filter results' should be right indented as in the mockups(and unity- + 2d) (LP: #838118) + - window title should not appear until cursor leaves the menubar + (LP: #838759) + - Window title is not redrawn on leaving global-menu from buttons + (LP: #839488) + - In the dash, main text field can not be edited, except at the end + (LP: #840862) + - Quicklist can't be correctly hidden (LP: #843425) + - After double clicking on the panel to restore a window, the menus won't + be hidden on mouse-out (LP: #838021) + - After restoring a window the application title doesn't fade-out and it + goes below the menus (LP: #838479) + * debian/control: + - build-dep on latest libunity-dev for ABI/API break, nux + * debian/rules: + - bump shlibs, remove tweak for garantuing the version as the ABI + is considered stable until finale now. + + -- Didier Roche Thu, 08 Sep 2011 20:07:50 +0200 + +unity (4.12.0-0ubuntu2) oneiric; urgency=low + + * Build-depend on libxcb-icccm4-dev instead of libxcb-icccm1-dev. + + -- Matthias Klose Fri, 02 Sep 2011 13:50:57 +0200 + +unity (4.12.0-0ubuntu1) oneiric; urgency=low + + * New upstream release. + - P3: [natty] Cannot click on indicators (LP: #819202) + - Icons not visible in the launcher or alt-tab switcher (LP: #833905) + - [dash] Search field in Unity can not support iBus (LP: #663776) + - [dash] preferred applications are not stored in GConf anylonger + (LP: #805063) + - SysTray icons have a white square background in Unity. (LP: #823407) + - new dash does not fit a normal netbook screen (LP: #825370) + - Dash picks random weird colors (yellow, green), fonts invisible (with + blur en- or disabled) (LP: #828363) + - Music Lens doesn't display items until you search (LP: #824892) + - Dash - Adjustments to stateful behaviour (LP: #838667) + - Dragging from dash to launcher still doesn't work (LP: #824833) + - Click on 'More Apps' et al closes the dash (LP: #824842) + - cannot paste into dash (particularly relevant for alt+f2) (LP: #736222) + - Ctrl X doesn't cut selected text in Dash search field (LP: #737731) + - Ctrl+C doesn't copy selected text in Dash search field (LP: #737732) + - The indicators shows a big white square when systray whitelisted + (LP: #822672) + - ARM FTBFS fix (LP: #834576) + * debian/control: + - build on latest nux + * debian/rules: + - bump shlibs + + -- Didier Roche Thu, 01 Sep 2011 17:33:06 +0200 + +unity (4.10.2-0ubuntu2) oneiric; urgency=low + + * Backported some fixes from trunk: + - build fix for armel (lp: #834576) + - dnd from the application lens to the launcher work + - small screen dash improvements + + -- Sebastien Bacher Fri, 26 Aug 2011 18:21:49 +0200 + +unity (4.10.2-0ubuntu1) oneiric; urgency=low + + * New upstream release: + - fix the launcher don't dodging sometimes when it should + - correctly set the focus when selecting a lens + - fix launcher and switcher icons not showing on some video cards + + -- Sebastien Bacher Thu, 25 Aug 2011 23:27:16 +0200 + +unity (4.10.0-0ubuntu1) oneiric; urgency=low + + * New upstream release: + - unity task switcher (alt-tab, alt-down) shows empty spaces for iconified + windows in window detail mode (lp: #828348) + - compiz crashed with SIGSEGV in + unity::DeviceLauncherIcon::OnStopDriveReady() (lp: #824093) + - Dash performance issues with 'Active Blur' enabled (lp: #824890) + - compiz crashed with SIGABRT in raise() when setting background + to full color (lp: #829049) + - Dragging from dash to launcher still doesn't work (lp: #824833) + - .desktops dragged on to unity launcher will not be added to + com.canonical.Unity.Launcher favorites unless moved in the launcher + (lp: #830536) + - application's menu shown when the cursor is a little left + to window controls (lp: #820293) + - Ubuntu Start launcher item should always start the dash with + the Home screen (lp: #825034) + - search spinner does not stop hence nothing can be launched with + the Return key (lp: #824836) + * debian/control: updated nux requirement + * debian/rules: updated shlibs + + -- Sebastien Bacher Thu, 25 Aug 2011 15:40:18 +0200 + +unity (4.8.2-0ubuntu4) oneiric; urgency=low + + * Backport another trunk commit to fix an alt-tab segfault + + -- Sebastien Bacher Fri, 19 Aug 2011 18:53:28 +0200 + +unity (4.8.2-0ubuntu3) oneiric; urgency=low + + * Update to current trunk to get closer from an usable version, including + - improvements to the alt-tab switcher, fixing the performances issues + on intel cards, thanks Jason Smith + - reworked dnd code fixing launcher showing when dragging text(lp: #773028) + or widgets (lp: #724986), the expose slowness (lp: #821538) and other + bugs as well, thanks Andrea Azzarone + - the dash text is selected by default allow to type directly a new command + (lp: #826904) + + -- Sebastien Bacher Fri, 19 Aug 2011 18:04:19 +0200 + +unity (4.8.2-0ubuntu2) oneiric; urgency=low + + * debian/control: really update the nux requirement + + -- Sebastien Bacher Fri, 19 Aug 2011 10:58:49 +0200 + +unity (4.8.2-0ubuntu1) oneiric; urgency=low + + * New upstream release. + - Dash shows random solid color on first launch of 'active blur' + enabled Unity (lp: #824886) + - Unity crashes if you select a gradient as wallpaper (lp: #825091) + - If the wallpaper file is deleted, Unity/Compiz crash on Oneiric + (lp: #827579) + - Unity 4.8 Dash is no longer keyboard accessible (lp: #824966) + * debian/control.in: updated nux requirement + * Backported a leak fix and a fix for small screens from trunk + + [ Didier Roche ] + * debian/control: + - add libdee-dev to the unitycore dev package as fixed in trunk + (put in the .pc file) + + -- Sebastien Bacher Thu, 18 Aug 2011 18:43:12 +0200 + +unity (4.8.0-0ubuntu3) oneiric; urgency=low + + * Backport r1373 to fix a segfault happening on theme updates (lp: #825587) + (lp: #741652) + * Backport r1380 to fix an alt-tab switcher segfault (lp: #825148) + * Backport r1381 to fix a session start compiz segfault (lp: #825040) + + -- Sebastien Bacher Thu, 18 Aug 2011 11:21:50 +0200 + +unity (4.8.0-0ubuntu2) oneiric; urgency=low + + * Backport r1371 to fix launcher autohidding issues + + -- Sebastien Bacher Tue, 16 Aug 2011 11:24:31 +0200 + +unity (4.8.0-0ubuntu1) oneiric; urgency=low + + * New upstream release. + - store kde4 applications in a gio-friendly way (LP: #741129) + * Take and make some additional post-release adjustement + * debian/control: + - add libjson-glib-dev + - now build depend on libunity-dev + - make libunity-core-4.0-dev dep on libunity-dev even if not in .pc file + (seems to leak the API) + - build-dep on latest nux + - now recommends lenses, not places and add music lens as a recommends + * remove patched plugins/unityshell/src/BGHash.cpp for replacing dark with + real dash color + * debian/rules: + - bump libunity-core-4.0-4 shlib for ABI break + * remove 01_revert_removed_function_for_unity2d_to_build.patch: + - incoming unity-2d upload has the needed bits + * debian/unity-common.install: + - install new assets and json scripts + + -- Didier Roche Thu, 11 Aug 2011 19:47:19 +0200 + +unity (4.6.0-0ubuntu4) oneiric; urgency=low + + * debian/control: + - remove the recommends on ubuntuone-control-panel-gtk now that + ubuntu-desktop recommends it. + - transition to boost 1.46 + - dep on latest compiz-dev for boost transition + + -- Didier Roche Wed, 10 Aug 2011 11:56:56 +0200 + +unity (4.6.0-0ubuntu2) oneiric; urgency=low + + * debian/rules: + - remove networkarea and unitydialogs .so files are they are not in use for + now + + -- Didier Roche Thu, 04 Aug 2011 14:55:09 +0200 + +unity (4.6.0-0ubuntu1) oneiric; urgency=low + + * New upstream release. + - compiz crashed with SIGSEGV in __strlen_sse2() (LP: #814619) + - PlacesHomeView::PlacesHomeView leaks memory (LP: #818450) + - PluginAdapter::MaximizeIfBigEnough leaks memory (LP: #818477) + - Launcher - Make Launcher left of screen reveal more responsive and less + prone to false positives (LP: #765819) + - Launcher - clicking on a App launcher icon incorrectly un-minimizes + windows (LP: #783434) + - Unity doesn't get any mouse wheel scroll event in Indicators InputArea + (LP: #814574) + - Unity launcher gets cluttered when having multiple partitions and/or + external volumes attached (LP: #713423) + - Unity panel menus and indicators slow to respond. Too much lag. + (LP: #742664) + - In Unity the distinction between GVolume, GDrive and GMount is a bit + confusing. (LP: #799890) + - Launcher - When a item is deleted by dragging to Trash, the trash should + pulse once before the Launcher disappears (LP: #750311) + - ccsm needs an option to change launcher opacity (LP: #815032) + - add a ccsm option to hide volumes in launcher (LP: #794707) + - scale plugin doesn't work as desired when "Click Desktop To Show + Desktop" is true (LP: #810315) + - mute/unmute sound when user clicks on sound applet using scroll button + or middle mouse button (LP: #609860) + - Secondary activate (i.e. middle click) support for indicators advanced + usage (LP: #812933) + * debian/control: + - dep on latest libunity-misc + - dep on latest nux + - add build-dep on libgnome-desktop-3-dev + * debian/rules: + - bump libunity-core-4.0-4 shlib for ABI break + - don't ship unity dialogs right now. Not ready for alpha quality + * distro-patch the grey to darker grey (until the blur is done in nux) + * Switch to dpkg-source 3.0 (quilt) format + * debian/patches/01_revert_removed_function_for_unity2d_to_build.patch: + - revert a removed API making unity-2d not building + + -- Didier Roche Mon, 01 Aug 2011 19:53:15 +0200 + +unity (4.4.0-0ubuntu1) oneiric; urgency=low + + * New upstream release. + - moving a launcher icon around generates lots of disk write activity + (LP: #733425) + - compiz crashed with SIGSEGV in sigc::signal_base::impl() (LP: #762801) + - Drag and drop a USB key into the trash should eject the USB key + (LP: #764905) + - unity window decorator needs to support different metacity frame types + (LP: #795048) + - Don't switch title to menu when hovering window buttons (LP: #691808) + - spacing between indicators should be 5 pixels (LP: #734010) + - Dash: highlight box is mis-aligned with smaller icon (LP: #761465) + - Merge libindicator scroll signals (LP: #804618) + - unity: Dead code in Launcher.cpp: "mask | (Button1Mask & Button2Mask & + Button3Mask)" (LP: #805327) + - TrashLauncherIcon::UpdateTrashIconCb is leaking (LP: #806984) + - Title fade effect no longer works (LP: #809907) + - Accessibility support not initialized on Oneiric (LP: #810033) + * debian/control: + - build-dep on libnotify-dev + - bump libnux-1.0-dev dep for ABI break + * debian/rules: + - bump libunity-core-4.0-4 shlib for ABI break + + -- Didier Roche Thu, 21 Jul 2011 18:41:15 +0200 + +unity (4.2.0-0ubuntu5) oneiric; urgency=low + + * debian/control: + - build-dep on latest compiz-dev for ABI bump + + -- Didier Roche Tue, 19 Jul 2011 08:05:40 +0200 + +unity (4.2.0-0ubuntu4) oneiric; urgency=low + + * debian/control + - Dropped recommends for indicator-me + - Added recommends for indicator-power + * services/panel-service.c + - Removed libme.so and added libpower.so + + -- Ken VanDine Thu, 14 Jul 2011 15:16:20 -0400 + +unity (4.2.0-0ubuntu3) oneiric; urgency=low + + [ Chow Loong Jin ] + * plugins/unityshell/src/PlacesHomeView.cpp: update banshee-1 to banshee in + _music_alternatives (LP: #805938) + + -- Jamie Strandboge Wed, 13 Jul 2011 08:22:38 -0500 + +unity (4.2.0-0ubuntu2) oneiric; urgency=low + + * Upstream fixes: + - don't leak in the indicator code (lp: #806485) + - use the new libindicator + * debian/control: + - drop libgnomeui-dev build-depends, it doesn't seem required + - updated libindicator requirement + * services/CMakeLists.txt: don't use Werror to workaround new gcc being picky + + -- Sebastien Bacher Fri, 08 Jul 2011 16:36:53 +0200 + +unity (4.2.0-0ubuntu1) oneiric; urgency=low + + * New upstream release. + * debian/control: + - breaks against older compiz (those not doing gtk_init) + * debian/rules: + - ship the unitydialogs plugin (not networkarearegion as it seems to do + weird artefacts) + - bump libunity-core-4.0-4 shlib + + -- Didier Roche Mon, 04 Jul 2011 19:18:31 +0200 + +unity (4.0.1-0ubuntu3) oneiric; urgency=low + + * Backport Neil's commit to migrate the indicator loaders to GTK3 + * CMakeLists.txt: build without Werror to workaround a build issue + + -- Sebastien Bacher Thu, 30 Jun 2011 15:52:19 +0100 + +unity (4.0.1-0ubuntu2) oneiric; urgency=low + + * Move back the .desktop file in unity from unity-common to avoid a lintian + warning + * do the same for the man page moved to unity and unity-services + (and add Replaces: then) + * Move from libunity-core-4.0-1 to libunity-core-4.0-4 for last soname change + * Fix a typo in debian/changelog + * make -dev arch:any to be binuable if needed + + -- Didier Roche Thu, 23 Jun 2011 10:56:11 +0200 + +unity (4.0.1-0ubuntu1) oneiric; urgency=low + + * New upstream release. + - Launcher - move Launcher icon count indicator so that it appears on the + right side of the Launcher icons (LP: #767046) + * Cherry pick some patches to not build on GTest, soname fixes as well as + invalid value for automaximize + * Some lintian cleanage: + debian/control: + - bump Standards-Version + - don't build-dep on quilt + debian/rules, debian/patches: + - dont use --with-quilt + * debian/control: + - add build-dep on libgtk-3-dev, libcairo2-dev, libindicator3-dev, + libsigc++-2.0-dev + - bump deps on libunity-misc-dev, libnux-1.0-dev, libbamf3-dev + - remove vala + * debian/unity-common.install, debian/control: + - now ship the ccsm unityshell image, gconf schemas, all images and + apport hook + * debian/unity-services.install, debian/control + - new unity-services package containing current and futur unity services, + moving files to it from unity + * debian/libunity-core-4.0-1.install, debian/libunity-core-4.0-dev.install, + debian/control: + - new libunity-core packages for shared library between unity and unity-2d + * debian/rules: + - remove unitydialog and networkarearegion from ccsm to avoid enabling them, + they are making compiz hanging and segfault on switch + - generate some shlibs for libunity-core-4.0-1 taking into accout ABI + unstability + + -- Didier Roche Wed, 22 Jun 2011 18:01:16 +0200 + +unity (3.8.16-0ubuntu2) oneiric; urgency=low + + * Revert commit for this bug for #769335, to fix: + - launcher autohidding is failing with 3.8.16 (lp: #798318) + + -- Sebastien Bacher Fri, 17 Jun 2011 12:11:52 +0200 + +unity (3.8.16-0ubuntu1) oneiric; urgency=low + + * New upstream version: + - Unable to load icon text-x-preview at size 48 in a loop (lp: #794556) + - Display garbled upon restoring original resolution (lp: #795454) + - Display garbled upon connecting external displays (lp: #795458) + - Panel disappears after resolution change (lp: #795459) + - Dragging the launcher with right mouse button is + confusing as menu pops up (lp: #735031) + - In a double monitor setup the Unity top panel in the second screen is + cut at the right (lp: #750481) + - Launcher tooltips sometimes don´t show (lp: #769335) + - Menu key should open quicklist for the selected item in the launcher + (lp: #750778) + - unity is spamming ~/.xsession-errors when windows are closed + (lp: #767642) + - Dash button ignores transparency when clicked. (lp: #767733) + + -- Sebastien Bacher Thu, 16 Jun 2011 18:10:09 +0200 + +unity (3.8.14-0ubuntu2) oneiric; urgency=low + + * Now depends on compiz-plugins-main-default instead of compiz-plugins-main + + -- Didier Roche Tue, 07 Jun 2011 14:07:38 +0200 + +unity (3.8.14-0ubuntu1) oneiric; urgency=low + + * New upstream bug-fix release. + - In a dual monitor setup with different resolutions, Unity places windows + in the "dead zone" (LP: #752098) + - Left pixel of launcher is not clickable on session start (LP: #758026) + - unity crashed with AttributeError in reset_unity_compiz_profile(): 'str' + object has no attribute 'get_string' (LP: #737320) + - unity --reset crashes with NameError (LP: #774280) + - Bottom icon on launcher tilts when it maybe shouldn't if icons fill + launcher nearly exactly (LP: #728949) + - Dodge active window - launcher should not show when modal dialog is + opened (LP: #718185) + - Unity maximizes windows that don't support resize on launch (LP: #769781) + - compiz crashed with SIGSEGV in sigc::signal_base::impl() (LP: #762801) + - inactive menus becomes brighter on sub-sequent clicks (LP: #733740) + - Unity crashes when dynamic quicklist dbusmenu contains a hidden menuitem. + (LP: #759174) + - Opening quicklist with launcher keynav returns focus to previous window + (LP: #750781) + - window's title does not fade in the right position (LP: #722178) + * debian/control: + - depends on compiz for some people upgrading (LP: #773253) + * debian/patches/01_add_scp_to_systray.patch: + - remove, upstream now + + -- Didier Roche Thu, 26 May 2011 17:41:14 +0200 + +unity (3.8.12-0ubuntu1) natty-proposed; urgency=low + + * New upstream release. + - Display garbled upon restoring original resolution or connecting external + displays (LP: #753971) + - migrate_favorites.py crashed with NameError in __main__: name 'GError' is + not defined (LP: #759744) + - compiz crashed with SIGSEGV in PlacesHomeView::Refresh() (LP: #762120) + - launcher loses focus (LP: #763883) + * debian/patches/01_add_scp_to_systray.patch: + - Whitelist systray to system-config-printer (LP: #771562) + + -- Didier Roche Wed, 27 Apr 2011 11:04:17 +0200 + +unity (3.8.10-0ubuntu2) natty; urgency=low + + * Cherry-pick some fixes before freeze: + - Fix tooltip stays stuck next to the launcher (LP: #751077) + - Trash/ws switcher icon in unity resets to default icon theme on the event + of a deletion or emptying the trash or after an upgrade (LP: #761289) + - double clicks should be disabled on bfb/Place launcher icon/double key + press (LP: #766776) + - Intellihide can be puzzled by dash / and post reveal broken (LP: #767250) + + -- Didier Roche Wed, 20 Apr 2011 20:10:19 +0200 + +unity (3.8.10-0ubuntu1) natty; urgency=low + + * New upstream release. + - Application windows can sometimes fail to display and will mask regions + of the screen (LP: #709461) + - Launcher appears _under_ application windows (LP: #743834) + - Unity Launcher Temporarily Appears Broken at Login (LP: #756951) + - compiz crashed with signal 7 in g_file_get_uri() (LP: #728319) + - Only with few windows (and one maximized) or Dodge active window - When + re-focusing on maximised window Unity launcher does not hide + (LP: #734681) + - UIFe: Unity Dash button does not give adequate feedback (LP: #748676) + - Focus problem with Thunderbird (LP: #753951) + - compiz crashed with SIGSEGV in PrivateWindow::updateStartupId() + (LP: #759363) + - unity places don't start up on login. (LP: #761225) + - unity crashes when emptying trash twice (LP: #761643) + - compiz crashed with SIGSEGV in PlacesResultsController::Clear() + (LP: #761211) + - compiz crashed with SIGSEGV in PanelView::~PanelView() (LP: #761634) + - compiz crashed with SIGSEGV in SimpleLauncherIcon::SetIconName() + (LP: #763560) + - compiz crashed with SIGSEGV in PlacesView::ConnectPlaces() (LP: #761942) + - Intellihide stuck with in x=0 on the bfb (LP: #764643) + - compiz crashed with SIGSEGV in PlacesView::OnResizeFrame() (LP: #763800) + - unity crashed with GError in reset_unity_compiz_profile(): Failed to + contact configuration server; the most common cause is a missing or + misconfigured D-Bus session bus daemon. See + http://projects.gnome.org/gconf/ for information. (Details - 1: Failed + to get connection to session: Command line `dbus-launch + --autolaunch=f0af37ac055f6f348acd417f00000008 --binary-syntax --close- + stderr' exited with non-zero exit status 1: No protocol + specified\nAutolaunch error: X11 initialization failed.\n) (LP: #753528) + - Chromium fullscreen + Alt-TAB confuses the launcher (LP: #757434) + - Cannot click on left-most indicator on panel if a non-indicator icon + appears (LP: #761409) + - vim.gnome window is invisible (LP: #719001) + - Trash/ws switcher icon in unity resets to default icon theme on the + event of a deletion or emptying the trash or after an upgrade + (LP: #761289) + - Incorrect keynav hilight/opened Quicklist without any request + (LP: #764730) + - indicator font does not update when changing font in Appearance + Preferences. (LP: #759886) + - In dash search filter drop box, black text is on a black background when + item is selected (LP: #761201) + + -- Didier Roche Tue, 19 Apr 2011 19:30:20 +0200 + +unity (3.8.8-0ubuntu2) natty; urgency=low + + * Cherry pick a lazy activation case not starting the places on demand + (LP: #761225) + + -- Didier Roche Fri, 15 Apr 2011 12:15:40 +0200 + +unity (3.8.8-0ubuntu1) natty; urgency=low + + * New upstream release. + - Empty desktop after login (LP: #687660) + - compiz crashed with SIGSEGV in nux::Area::InitiateResizeLayout() + (LP: #757709) + - compiz crashed on initial load of Java Citrix Client/Inkscape in + PrivateWindow::processMap() (LP: #758307) + - Sometimes dragging down from the panel just stops working (LP: #750155) + - Ensure Unity prioritises icon loading from Unity-icon-theme + (LP: #750471) + - text truncated in Dash. Empty search from Applications or Files lense + returns “Your search did not” due to cut off label (LP: #757362) + - should list PlacesGroup.cpp in POTFILES.in (LP: #757663) + - Launcher intellhide stuck after edge reveal (LP: #757810) + - unity-preferences doesn't load translations (LP: #759682) + - dynamic quicklists are not working (LP: #729074) + - with second monitor, first monitor does not show nautilus + application/global menu when displaying desktop (LP: #743149) + - Launcher - The Workspace, File Lens, App Lens and Trash Launcher icons + need to be rendered correctly (LP: #745555) + - the launcher background gets dimmed after icons dnd (LP: #747304) + - Numpad 'Enter' does not work on unity launcher when navigating through + keyboard (LP: #760003) + - Launcher shouldn't hover when being in the dash (LP: #760770) + - Launcher displays key shortcuts while holding Super while the dash is + open but the shortcuts are unfunctional (LP: #760728) + - Running/active indicators point to space between launcher icons for + folded icons (LP: #703067) + - user-trash.svg and user-trash-full.svg not lens grayscale versions + (LP: #741804) + - code-cleanup: unregistered any established ubus-interests (LP: #757588) + - dropdown box in places search bar does not resize when font size changes + (LP: #759763) + - [FFE] Centered layout for expo plugin (LP: #754689) + - Unity launcher icons tooltips do not disappear when swiching workspaces + (LP: #744795) + - Dash - Update Dash scroll bar (LP: #750374) + - Letters cut off at the end in the applications window (LP: #753083) + * debian/control: + - build-dep on grail/geis with version bumped + * 01_dont_dep_on_latest_geis_grail.patch: + - not needed anymore + + -- Didier Roche Thu, 14 Apr 2011 22:03:42 +0200 + +unity (3.8.6-0ubuntu1) natty; urgency=low + + * New upstream release. + - compiz crashed with SIGABRT in raise() (LP: #748163) + - System freezes when maximize button is clicked (LP: #754063) + - compiz crashed with SIGSEGV in QuicklistView::IsMenuItemSeperator() + (LP: #754302) + - compiz crashed with SIGSEGV in std::_List_node_base::_M_hook() + (LP: #754235) + - compiz crashed with SIGSEGV in ubus_server_pump_message_queue() + (LP: #754657) + - drag from dash to launcher (LP: #662616) + - Add a test case for unity-decorator regressions (LP: #736878) + - the files place category combo has empty space (LP: #741641) + - panel superposition (LP: #742859) + - Unity Launcher stops autohiding and is not responsive (LP: #744325) + - Unity Launcher stops autohiding and is not responsive (LP: #744325) + - [FFE] Need API to set urgency from background process (LP: #747677) + - Launcher - Escape from 'drag behind the Launcher' interaction + (LP: #750298) + - Launcher needs to be desaturated when Dash is open, not transparent. + (LP: #750358) + - compiz crashed with SIGSEGV in free() (LP: #752293) + - migrate_favorites.py crashed with ImportError in __main__: No module + named gconf (LP: #752176) + - compiz crashed with SIGSEGV in PluginClassHandler::get() (LP: #743807) + - cannot close the dash by clicking on the bfb (LP: #753914) + - Animation for Grid Previews is broken (LP: #754088) + - compiz crashed with SIGSEGV in PanelMenuView::OnPlaceViewShown() + (LP: #754585) + - Pressing F10 then "left arrow" wit Unity on Natty makes the system + unusable (LP: #756867) + - compiz crashed with SIGSEGV in __pthread_mutex_lock() (LP: #711231) + - Tooltips and Dash Font Problems (LP: #741605) + - Title elipisising incorrect. Type “Shotwell” for a good example + (LP: #750350) + - compiz crashed with SIGSEGV in Launcher::Launcher() (LP: #748096) + - BFB - Turn top left corner blue rather than Ubuntu logo (LP: #755286) + - launcher appears and gets stuck when resizing windows with mouse + (LP: #754690) + - Wrong item gets dragged out (LP: #729796) + - Launcher - when the launcher is folded, the bottom icon partially falls + off the end of the screen (LP: #731869) + - unity-window-decorator: Resize padding: Tiny focused windows lose resize + padding and shadow when <69 pixels wide (LP: #737707) + - Deinstalling an application with launcher entry leaves orphaned shortcut + (LP: #748107) + - Two Nautilus windows open when clicked on a device icon on Launcher + (started after 3.8.2) (LP: #748299) + - compiz crashed with SIGSEGV in Launcher::AnimationTimeout() + (LP: #749890) + * debian/control: + - build-dep on latest nux (ABI break) + * debian/unity-common.install: + - install the desktop file for the new capplet + + -- Didier Roche Mon, 11 Apr 2011 12:42:33 +0200 + +unity (3.8.4-0ubuntu1) natty; urgency=low + + * New upstream release. + - [fglrx] compiz crashed with SIGSEGV in nux::IOpenGLSurface::UnlockRect() + (LP: #685682) + - SIGSEGV in g_atomic_int_get (LP: #688803) + - unity-panel-service crashed with SIGSEGV in bamf_factory_view_for_path() + (LP: #717684) + - New window tracking system breaks in the case where windows try to + restack relative to destroyed windows that were never mapped + (LP: #723014) + - Numpad 'Enter' doesn't work on highlighted items in dash, places-files and + places-apps (LP: #741615) + - compiz crashed with SIGSEGV in free() (LP: #738864) + - compiz crashed with SIGSEGV in g_closure_invoke() (LP: #741674) + - compiz crashed with SIGSEGV in CompWindow::id() (LP: #742028) + - Windows that reparent away from the root before they are mapped can + cause other windows to become invisible (and compiz to crash) + (LP: #743011) + - compiz crashed with SIGABRT in raise() (LP: #743414) + - compiz crashed with SIGSEGV in g_object_get_qdata() (LP: #742905) + - compiz crashed with SIGSEGV in g_closure_invoke() (LP: #748033) + - compiz crashed with SIGSEGV in CompScreen::dpy() (LP: #751372) + - compiz crashed with SIGABRT in __kernel_vsyscall() (LP: #744867) + - unity-window-decorator crashed with SIGSEGV in gdk_window_get_events() + (LP: #725284) + - Missing icons in app launcher (LP: #728393) + - Multiple quick clicks on launcher icon with multiple windows completely + crashes Unity (LP: #731790) + - Add a test case for invisible windows regressions (LP: #736876) + - Re-sync with xquerytree to avoid stacking order issues (LP: #740465) + - Wrong window moves (LP: #741656) + - compiz crashed with SIGSEGV in g_cclosure_marshal_VOID__VOID() + (LP: #742280) + - panel superposition (LP: #742859) + - unity-window-decorator doesn't start on secondary X session + (LP: #730495) + - Unity Launcher stops autohiding and is not responsive (LP: #744325) + - dash categories dropdown menu leaves "ghost" on desktop (LP: #746800) + - new dialogs open close enough of the launcher to make hide (LP: #747302) + - dnd from the application place to the launcher works only once + (LP: #747316) + - compiz crashed with SIGSEGV in CompWindow::id() while opening tcl/tk + interface of R (LP: #747439) + - minimize animates window fading to the top left corner (ubuntu symbol) + (LP: #747765) + - Spread - Clicking on a app icon to spread the windows must always show + all the windows, regardless of whether or not some of the windows are + minimised (LP: #750349) + - Launcher - Show visual de-coupling of Launcher app icons (LP: #751196) + - unity-window-decorator crashed with SIGSEGV in event_filter_func() + (LP: #748317) + - Pressing Super-W to switch windows also presents Dash (LP: #753453) + - Don't create windows over the launcher (LP: #688816) + - Unity Grid is broken for multi-monitor setups (LP: #709221) + - F10 key does not move focus to indicators when on the desktop. + (LP: #727548) + - dynamic quicklists are not working (LP: #729074) + - Launcher tooltips appear under Dash (LP: #729093) + - Upon first login, launcher gets in the way of maximized windows + (LP: #731786) + - Dash: Applications should have higher preference (LP: #737379) + - Empty Trash legend illegible (LP: #739862) + - ATI/fglrx workaround patch (LP: #740298) + - Dash draws some icons off right edge of screen (LP: #740415) + - Add test case for ICCCM Section 4.1.4 (LP: #741074) + - you can see the dash icons when a place is closed (LP: #741599) + - Launcher unhides and stays unhidden when dragging elements in Opera + (LP: #741731) + - Applications added to the launcher can be put in a state where they are + named "EmptyLabel" (LP: #742378) + - Wall of desktop move wrong window (LP: #743634) + - Compiz switcher Alt-Tab order is not predictable - should maintain LIFO + ordering in application switcher (LP: #175874) + - Restart the panel service to resync app menus (LP: #746474) + - If you hold super key, the application launcher doesn't works with + numpad of FN key (LP: #747153) + - Horizontal renderer rendering issues (LP: #747337) + - Shortcut hint in Launcher is too large and refine the shortcut (LP: #747812) + - Enforce switcher 'bring to front' to avoid seeing the launcher while + doing ALT-Tab (LP: #750283) + - Deal with repeated key on launcher shortcut (LP: #750535) + - When we press Enter to run the first search result, Unity should wait + until searching is finished (LP: #749428) + - Dash can be wrongly displayed with super if you are too quick or trigger + scale and such (LP: #751102) + - the application panel stays up with auto hide after a password dialog + (LP: #684590) + - Keynav with keypad arrow keys not possible (LP: #741154) + - Feature Freeze Exception: Animation for Grid Plugin Previews + (LP: #744104) + - Add packaging dependency on compiz-plugins-main (LP: #748564) + - Dash - Switch dash highlight to new highlight (LP: #750365) + - Compiz won't allow Desktop Cube plugin to load with unity (LP: #711561) + - unity messes up with workspaces (LP: #728428) + - Dash - improve carrot (LP: #750354) + - Dash - Cursor navigation allows the user to keep scrolling down + indefinitely (LP: #750375) + - Dash - Icons inside tiles are not centered (LP: #748588) + * debian/control: + - makes unity depends on compiz-plugins-main as we are binding to the expose + mode. + - dep on latest nux for the ABI beak and picking the right shlibs + + -- Didier Roche Thu, 07 Apr 2011 18:27:02 +0200 + +unity (3.8.2-0ubuntu1) natty; urgency=low + + * New upstream release. + - compiz crashed with SIGSEGV in std::_List_node_base::_M_hook() + (LP: #711916) + - New window tracking system breaks in the case where windows try to + restack relative to destroyed windows that were never mapped + (LP: #723014) + - does not display icons until hovered (LP: #726033) + - Unity Launcher has black spaces where icons should be (LP: #729353) + - compiz crashed with SIGSEGV in sigc::internal::signal_emit0::emit() (LP: #729715) + - compiz crashed with SIGSEGV in SimpleLauncherIcon::OnIconThemeChanged() + (LP: #741652) + - compiz crashed with SIGSEGV in free() (LP: #738864) + - compiz crashed with SIGSEGV in g_closure_invoke() (LP: #741674) + - compiz crashed with SIGSEGV in free() (LP: #742300) + - Unity can't get touch the touch initialization signals from GEIS + (LP: #742555) + - Windows that reparent away from the root before they are mapped can + cause other windows to become invisible (and compiz to crash) + (LP: #743011) + - compiz crashed with SIGSEGV in gdk_cairo_set_source_pixbuf() + (LP: #744231) + - [dash] Keyboard navigation not implemented as specified (LP: #608132) + - xterms broken in unity (LP: #692463) + - Unity opens application menu on Alt+F10 shortcut (LP: #722674) + - First four items in Dash begin "Find" "Find" "Find" "Find" (LP: #729002) + - Increase the size of the top left Launcher reveal area from 1px to a + slightly larger triangle that comes out of the top left corner + (LP: #736034) + - Add a test case for invisible windows regressions (LP: #736876) + - Re-sync with xquerytree to avoid stacking order issues (LP: #740465) + - Keyboard navigation: quicklist not opening for Trash launcher item + (LP: #741793) + - Wrong window moves (LP: #741656) + - compiz crashed with SIGSEGV in + SimpleLauncherIcon::ActivateLauncherIcon() (LP: #742110) + - Combo in the search bar did not disappear after the places was closed + (LP: #742712) + - Expo doesn't quit reliably when using keynav or shortcut (LP: #744196) + - Make the BFB icon turn blue when an application goes urgent + (LP: #744973) + - Launcher - increase "launcher reveal %" for 'Fade and slide' launcher + reveal transition to 65% (LP: #745602) + - Arrows do not fade out with rest of launcher durring DND (LP: #746811) + - Don't create windows over the launcher (LP: #688816) + - Launcher - Indicate which application is currently focused with a + glowing Launcher icon (LP: #676604) + - Unity Grid is broken for multi-monitor setups (LP: #709221) + - dynamic quicklists are not working (LP: #729074) + - When windows open for the first time they should not hide the launcher + (LP: #723878) + - it is still possible to quit unity from the panel (LP: #733725) + - Selection does not fit small icons in Unity Dash (LP: #735746) + - Unmounting media gives no error when failed (LP: #737633) + - ATI/fglrx workaround patch (LP: #740298) + - "Files & Folders" tooltip says "Files & Folders" (LP: #741654) + - Time & Date has no application quicklist menuitem title (LP: #741680) + - Launcher icon progress-bar too big for a 32px launcher (LP: #741775) + - Dash - Starting to drag a file from the Dash closes the Dash as a + temporary stop-gap measure (LP: #741926) + - compiz crashed with SIGSEGV in IconLoader::ProcessGIconTask() + (LP: #742091) + - Lenses with no shortcut still display black box when pressing super + (LP: #742985) + - Wall of desktop move wrong window (LP: #743634) + - Whitelist HPLIP's hp-systray for Unity's application indicators + (LP: #744308) + - libzeitgeist SIGSEGV when reinstalling ZeitgeistMonitors (LP: #742438) + - Compiz switcher Alt-Tab order is not predictable - should maintain LIFO + ordering in application switcher (LP: #175874) + - Add hide and hover machines state debug through dbus (LP: #745586) + - the application panel stays up with auto hide after a password dialog + (LP: #684590) + - Panel - Should have Drop Shadow (LP: #688555) + - Wrong item gets dragged out (LP: #729796) + - launcher hide a little bit too early if you bring the current window + next to it (LP: #741761) + - Launcher icons shouldn't hover when tapping press (LP: #744344) + - unity appmenu opens when pressing esc while moving a dialog + (LP: #745062) + - "Unable to show unity-runner:" warnings (LP: #745746) + - Several ATK_STATE(s) not properly used on the accessibility framework + (LP: #727140) + - Window maximise/un-maximise does not return the window to the same + position. (LP: #723859) + - "Applications" and "Files & Folders" keyboard shortcut overlays not + drawn correctly with scalable launcher (LP: #731212) + - [natty-alpha3] [LiveCD] compiz crash on boot, unity fails to start, + installation impossible (LP: #729597) + - [a11y] Regression on the Launcher accessibility support between revno + 948 and revno 964 (LP: #736790) + - can't search in "more applications" section (LP: #737393) + - [a11y] panel service crashes with a11y enabled while navigating + (LP: #740360) + - superkey shortcut labels does not scale properly (LP: #741346) + - Keyboard navigation: don't allow right key on workspace switcher + (LP: #741772) + - LauncherEntryRemote startup race condition (LP: #742695) + * use dh7 --with translations module: (LP: #745774) + - debian/rules: remove cruft, add --with translations + - debian/control: build-dep on dh-translations + * debian/control: + - build-dep on latest nux + * add debian/patches/01_dont_dep_on_latest_geis_grail.patch: + - new geis/grail still not in natty. Remove MT support making us depending + it on it for now + - build-dep on quilt + + -- Didier Roche Fri, 01 Apr 2011 12:03:56 +0200 + +unity (3.6.8-0ubuntu3) natty; urgency=low + + * debian/unity.install: + - ensure we ship every files (compiz moved some) (LP: #741858) + * debian/rules: + - readd previously removed --fail-missing + + -- Didier Roche Thu, 24 Mar 2011 17:52:33 +0100 + +unity (3.6.8-0ubuntu2) natty; urgency=low + + * Backport from trunk: + - compiz crashed with SIGSEGV in SimpleLauncherIcon::OnIconThemeChanged() + (LP: #741652) + - launcher hide a little bit too early if you bring the current window next + to it (LP: #741761) + - "Files & Folders" tooltip says "Files & Folders" (LP: #741654) + - Time & Date has no application quicklist menuitem title (LP: #741680) + + -- Didier Roche Thu, 24 Mar 2011 16:07:44 +0100 + +unity (3.6.8-0ubuntu1) natty; urgency=low + + * New upstream release. + - crash at the second drag and drop from an unity place (LP: #736704) + - Compiz crashes with SIGSEGV in nux::GraphicsDisplay::GrabPointer when + opening the Dash (LP: #737287) + - Visual Tearing/Rendering Issues with Unity Launcher (LP: #737476) + - unity-window-decorator crash on unity panel dragout (LP: #740480) + - unity-panel-service crashed with SIGSEGV in g_type_check_instance_is_a() + (LP: #694699) + - compiz crashed with SIGSEGV in nux::BaseTexture::GetDeviceTexture() + (LP: #692823) + - the "no result" and "search the web" items need icons (LP: #711199) + - Resizing with external padding/grab area prevents reaching edge of + screen (LP: #710356) + - drag and drop of launcher icons uses microscopic drag icon (LP: #727647) + - text in places look squeezed (LP: #727799) + - at-spi-registry consumes most of the CPU and make the system unusable on + Natty (LP: #729827) + - migrate_favorites.py crashed with GError in __main__: Bad key or + directory name: "/desktop/unity/launcher/favorites/app- + dc++.desktop/type": `+' is an invalid character in key/directory names + (LP: #737016) + - Launcher hide state is confusing (LP: #739850) + - Polish new launcher hide state (part 2) (LP: #740020) + - launcher icons should expan on super or when entering keynav + (LP: #741319) + - Launcher - Dragging a Launcher icon to the Trash should remove the icon + (LP: #676466) + - Launcher - Enable dragging and dropping of files & folders to Launcher + icons (LP: #676549) + - Dash - Add Dash group header mouseover effect (LP: #689640) + - unity aborts when you plug in an external monitor (LP: #700757) + - Keyboard-navigation: focus on launcher remembered (LP: #713340) + - Launcher Quicklists should always contain the application title + (LP: #723877) + - When a maximized window has window on top of it in 'restored state' (not + maximised) , it is not possible to un-maximized the window by dragging + the title bar downwards (LP: #723882) + - When windows open for the first time they should not hide the launcher + (LP: #723878) + - UI blocked when expanding a section with more than 2000 items + (LP: #736059) + - Change ALT-Tab to bring the target window to the front (LP: #736938) + - compiz crashed with SIGABRT in __kernel_vsyscall() (LP: #737814) + - Launcher does not respond to changes in icon theme (LP: #605475) + - Implement new style scrollbars in Dash (LP: #608124) + - Closing launcher menu raises window under mouse (LP: #728787) + - adding url launcher support from the search (LP: #739038) + - Launcher - Set Launcher 'Hide Animation' to 'Slide only' by default. + Also introduce subtle fade in effect. (LP: #739567) + - "Time & Date" settings appears in launcher with empty tooltip + (LP: #740907) + - ZeitgeistLog missing implementation of get_property for "connected" + (LP: #734080) + - often can't alt-click-dnd to move the focussed dialog (LP: #711911) + - The Unity Panel's window controls and window dragging features should + work for the uppermost maximized window regardless of current window in + focus. (LP: #716177) + - When Unity launcher is visible restore a maximized window loses its + focus (LP: #728690) + - Missing "children_changed" event emission from the atk support for the + nux::View and nux::Layout objects (LP: #734806) + - Possible race condition in PanelMenuView::OnWindowMaximized and + OnWindowRestored (LP: #736580) + - dash search box doesn't respond to keyboard input (LP: #736850) + - category dropdown in *.places is nonfunctional (nothing can be selected + (LP: #737203) + - compiz crashed with SIGSEGV in DeviceLauncherIcon::UpdateVisibility() + (LP: #737318) + - Dragging a file to the bottom left corner should send it to the trash + (LP: #728598) + - Unity doesn't support Touchscreen/drag to slide (LP: #737520) + - [a11y] Launcher a11y support works with at-spi2 but not with at-spi + (LP: #739689) + - unity --distro fail on symlinks (LP: #740779) + - dash home screen can become outdated (LP: #730623) + * debian/control: + - depends on libutouch-geis-dev to bring MT support to unity + - dep on latest nux + + -- Didier Roche Thu, 24 Mar 2011 04:55:41 +0100 + +unity (3.6.6-0ubuntu1) natty; urgency=low + + * New upstream release: + - drag and drop from dash to launcher issues (LP: #727675) + - unity-panel-service crashed in g_type_class_meta_marshal (LP: #727788) + - Dash: first-use text entry does not work until Alt-F2 version is used + (LP: #735342) + - compiz crashed with SIGSEGV in g_type_check_instance_is_a() + (LP: #734721) + - drag from dash to launcher (LP: #662616) + - Dash - Create single widget for Dashboard (LP: #683729) + - [FFe] Recently installed applications should be easy to run + (LP: #670403) + - Pressing Alt key does not underline mnemonics (LP: #689179) + - indicator-appmenu breaks Alt accelerator keys (LP: #663030) + - can't pin KTouch to the launcher (LP: #693755) + - Unity paints multiple times with multi-screen (LP: #727116) + - unitymtgrabhandles crashes when no key is set (LP: #727144) + - SIGSEGV in PlaceEntryHome::SetSearch (LP: #731927) + - [launcher] New Default favorites (LP: #714707) + - Dash: Alt-F2 Pressing enter on the dash can start the first entry of the + second group from the history (LP: #734738) + - Dash: keyboard arrow navigation disappears off bottom (LP: #735347) + - Increase the size of the top left Launcher reveal area from 1px to a 3px + by 3px square (LP: #736034) + - [dash] scrollbar's clickable zone should extend to the right border of + the dash border (LP: #651398) + - Launcher - Replace Dash lens Launcher icons with updated versions + (LP: #676613) + - NuxUtilAccessible requires to implement support to key event listeners + (LP: #702672) + - launcher icons dnd doesn't behave correctly when the dash is in use + (LP: #708885) + - Keyboard-navigation: highlight stays after losing focus (LP: #713632) + - Implement AtkComponent for ATK objects in the panel service + (LP: #715297) + - Super shortcuts for application place and worskspace swither conflicts + with compiz keys (LP: #723273) + - Use DeeIndex instead of strcmp in PlaceEntryHome (LP: #724886) + - [dash] text cursor not vertically centred in the entry (LP: #724927) + - Moving cursor in dash text entry field causes cursor artifacts + (LP: #725493) + - Missing "children_changed" event emission from the atk support + (LP: #727137) + - Typing should immediately search; focusing the search field is fiddly + (LP: #727295) + - "Find Internet Apps", "Browse the Web", and "Check Mail" are scattered + in default Dash (LP: #729009) + - Press-holding on a icon in the Launcher should de-couple the icon and + enable the user to reorder the icon vertically without leaving the + Launcher. (LP: #727922) + - "Shortcuts" heading in Dash seems pointless (LP: #729000) + - intellihide is incompatible with totem fullscreen / Still some false + positive on ws switch (LP: #730679) + - Launcher - provide visual design for launcher keyboard navigation + (LP: #702490) + - Dash - Update the 'Shortcuts' dash home icon (LP: #689763) + - The Unity panel service Does not connect to the + INDICATOR_OBJECT_SIGNAL_ACCESSIBLE_DESC_UPDATE signal. (LP: #731651) + - [dash] items reordering after first group expanding (LP: #732031) + - Accessibility object parent-child hierarchy on unity panel-service is + broken (LP: #732049) + - "Your search did not match any files" when I haven't searched yet + (LP: #732746) + - Keyboard navigation in quick lists not possible. (LP: #733052) + - Keyboard navigation should jump invisible icons (LP: #734018) + - Dash: Alt-F2 gives no indication it is any different to using Super + (LP: #734740) + - Dash: Alt-F2 box hint says "Search commands" not "Run a + command"/"Execute command" (LP: #733897) + - Synopsis and description refer to "Ubuntu Desktop Edition" (LP: #735557) + - weird launcher behaviour on non short clicks when a place is displayed + (LP: #727703) + - Launcher - Disabled item in the quicklist need to be styled semantically + (LP: #676928) + - Menubar – Menu integration issue with applications that do not support + menu integration (LP: #723835) + - unity --reset-icons is needed to restore default launcher icons + (LP: #731578) + - Whitelist mumble for systray (LP: #732682) + - Applications places quicklist items are blank for categories with '&' + (LP: #733743) + - delete files in the dash (LP: #662658) + - Scale mode doesn't cancel like it used to (LP: #724045) + - Appsearch shortcuts not clickable, searchfield broken (LP: #728219) + - Arrow keys don't work in "All Files" menu (LP: #732744) + * debian/control: + - change the description of the package (remove desktop edition) + (LP: #735557) + - build-dep on latest nux + + -- Didier Roche Thu, 17 Mar 2011 17:56:48 +0100 + +unity (3.6.4-0ubuntu1) natty; urgency=low + + * New upstream release. + - Unity: Alt-F2 not working (LP: #580295) + - When running with dual monitors, Unity will use the height of the larger + one for calculating when to fold (LP: #696388) + - Unity app launcher is filled up with doublettes (LP: #690537) + - Unity interface not resized properly when external monitor is used + (LP: #691772) + - Dash needs keyboard navigation (LP: #727714) + - It is possible to focus Unity itself and Close it from the global menu + (LP: #728790) + - Systray icons showing on top of everything (LP: #728719) + - Pressing ENTER in the dash during a search should open the first + displayed item (LP: #729699) + - compiz crashed with SIGSEGV in LauncherIcon::OpenQuicklist() + (LP: #731096) + - inactive menus are not shown (LP: #732162) + - Icon-only menu titles don't have accessible names (LP: #691677) + - unity not working on rotated displays (LP: #694596) + - unity_support_test crashed with SIGSEGV in + nux::IOpenGLAsmVertexShader::IOpenGLAsmVertexShader() (LP: #709649) + - Dragging .desktop file to launcher's trash creates space for new + launcher icon (LP: #717250) + - Unable to scroll in Applications/Files and Folders Place using mouse + wheel (LP: #721447) + - The applications place is empty (LP: #724259) + - compiz crashed with SIGSEGV in + nux::GpuRenderStates::SubmitChangeStates() (LP: #719156) + - Quicklists are difficult to dismiss (LP: #726890) + - Apps in Available group not rendered in Dash (LP: #729710) + - Clicking on Shortcuts header doesn't do anything. (LP: #730774) + - Zeitgeist FTS Extension doesn't filter on subject URIs (LP: #731208) + - dual monitor,,,upper panel turns white / nvidia (LP: #685179) + - Dash file Lens – Rename “Favourite Folders” category header to “Folders” + (LP: #723866) + - looking for 'places' icons in the wrong location (LP: #727672) + - Empty trash quicklist item is missing an ellipsis (LP: #731472) + - Wastebasket quicklist is missing “Empty Wastebasket” option when the + wastebasket is empty (LP: #723880) + - Emptying the trash from the unity sidebar should respect nautilus' "Ask + before emptying" setting (LP: #730003) + - start-here icon updated at wrong time (LP: #726267) + - Unity overlay unhide issue (LP: #726926) + - Orca doesn't report that the Launcher receives the focus (LP: #727133) + - Accessibility object parent-child hierarchy on unity is broken + (LP: #727908) + - Regression: Orca doesn't speech out the selection changes on the + Launcher (LP: #729165) + - quicklist must respect enabled state (LP: #731533) + - unity-panel-service crashed with SIGSEGV in + dbusmenu_menuitem_send_about_to_show() (LP: #725631) + * debian/control: + - build-dep on latest nux + + -- Didier Roche Thu, 10 Mar 2011 19:52:53 +0100 + +unity (3.6.2-0ubuntu1) natty; urgency=low + + * New upstream release: + - unity-window-decorator crashed with SIGSEGV in + g_cclosure_marshal_VOID__OBJECT() (LP: #724874) + - blinking screen at searching "gn" (LP: #674022) + - Top panel isn't multimonitor aware (LP: #675862) + - Leaving fullscreen causes the launcher to rapidly appear and then + disappear (LP: #718054) + - migrate_favorites.py crashed with GError in __main__: Bad key or + directory name: "/desktop/unity/launcher/favorites/app-Watch TV + Shows.desktop/type": ` ' is an invalid character in key/directory names + (LP: #722403) + - does not display icons until hovered (LP: #726033) + - Unintuative Application Matching (LP: #726711) + - icons missing in the dash recent files and directory search returns + (LP: #727824) + - some result cache broke the dash search (LP: #728961) + - Protect against conflicts with unity super keys (LP: #729166) + - not installed apps sorting in global search (LP: #636996) + - No 'safely remove' option is present in the unity menu when a usb disk + is inserted (LP: #660010) + - Dash - Implement new Dash design! (LP: #683762) + - Expose or add missing nux functions for a11y support (LP: #701672) + - Launcher - A single finger 'hold' on a Launcher app icon should open the + quicklist (LP: #702486) + - No "Search" default entry (LP: #710794) + - Icon in Launcher should be home folder icon (LP: #721121) + - Launcher bindings require Super to be held down to work (LP: #727580) + - compiz crashed with SIGSEGV in nux::CairoGraphics::GetBitmap() + (LP: #727636) + - Unity "Lens" do not scroll to bottom (LP: #719616) + - Double-click on panel to unmaximize only works in right half + (LP: #725529) + - clicking multiple time on the bfb makes the logo darker and darker + (LP: #727146) + - the launcher should go away if it has been open using the keyboard and + the mouse is not moved while the cursor is on it (LP: #727746) + - migrate_favorites.py crashed with OSError in makedirs(): [Errno 13] + Permission denied: '/home/aquarius/.local/share/unity' (LP: #723656) + - No feedback when unmounting busy device in Unity (LP: #730638) + + -- Didier Roche Mon, 07 Mar 2011 19:10:27 +0100 + +unity (3.6.0-0ubuntu2) natty; urgency=low + + * services/panel-indicator-entry-accessible.c: + - Use dispose function, not finalize function, to notify ATK that an + entry is removed. Fixes continual panel crashes. LP: #727788 + + -- Michael Terry Wed, 02 Mar 2011 09:24:07 -0500 + +unity (3.6.0-0ubuntu1) natty; urgency=low + + * New upstream release. + - Menu bar becomes blank periodically (LP: #683065) + - Unity does not update when screen resolution changes (LP: #684539) + - [dash] Keyboard navigation not implemented as specified (LP: #608132) + - Dash - build the Desktop Dash (LP: #683719) + - Quicklists not working (LP: #719780) + - Launcher auto hide animation has a life of it's own / Unity launcher + constantly sliding in and out without user interaction (LP: #717364) + - compiz crashed with SIGSEGV in PrivateWindow::getModalTransient() + (LP: #726235) + - Don't show launcher number overlays on tap of super (LP: #726630) + - Optimize texture memory usage for unexposed view icons (LP: #609994) + - Unity should handle video-out keycodes that correspond to Super + P + + Enter (LP: #632632) + - dash - wrong count of remaining items to see (LP: #662605) + - dash - x search box button visibility (LP: #662614) + - Touch window management gesture previews (LP: #683688) + - unity not working on rotated displays (LP: #694596) + - unity main top bar in displays in wrong area (multi-head issue) + (LP: #707209) + - unity place group visual improvements (LP: #714528) + - Implement ref_state_set for toplevel ATK objects in the panel service + (LP: #715299) + - Alt + F1 doesn't show the launcher if hidden (LP: #717125) + - Keyboard navigation: Choosing a window from launcher doesn't change + input focus. (LP: #721811) + - Quicklists not closing when losing focus (LP: #724739) + - wrong animation in the launcher (LP: #724956) + - Window management - windows go below launcher and panel (LP: #725463) + - Media and PrintScreen keys don't work (LP: #621887) + - super-shortcuts should be "serializable" (LP: #638936) + - Chromium icon in Unity is distorted / some scaled distored in the unity + place applications (LP: #670169) + - launcher stays on screen when it shouldn't | false show/hide positives + on the launcher (LP: #711176) + - Keyboard navigation: no public API to know the current Laucher Icon + selected when key nav is activated (LP: #722660) + - Require to implement AtkSelection on the Launcher (LP: #723804) + - LauncherIcon accessibility support requires to expose the selection + state (LP: #723806) + - Add keyboard shortcuts for launching separate instances of applications + (LP: #724865) + * debian/control: + - dep on latest nux + + -- Didier Roche Tue, 01 Mar 2011 14:27:16 +0100 + +unity (3.4.6-0ubuntu2) natty; urgency=low + + * Cherry-pick some fixes from trunk to ensure at least having those in + alpha3: + - stop make the launcher dance (LP: #717364) + - fix FTBFS on armel (LP: #724615) + + -- Didier Roche Mon, 28 Feb 2011 20:58:19 +0100 + +unity (3.4.6-0ubuntu1) natty; urgency=low + + * New upstream release. + - dash times out (LP: #662618) + - possible memory leak in compiz when using places, dashboard + (LP:#720446) + - compiz crashed with SIGSEGV in IconTexture::~IconTexture() (LP: #721907) + - dash - search string not always taken into account (LP: #701569) + - Unity allows you to Quit itself (LP: #705536) + - invisible window border problems (LP: #710271) + - Slowliness in the file places (LP: #710791) + - add super shortcuts to the launcher - logic (LP: #721264) + - key navigation doesn't activate trash, keys, expo or places + (LP:#723141) + - Super-shortcuts for apps, files, and workspace switcher (LP: #617356) + - New launcher tile super key overlay aesthetic (LP: #646712) + - add cursor-key navigation to quicklists (LP: #701543) + - Super key should open Dash (LP: #706713) + - Dash view should use "Prefferred Applications" icons where appropriate + (LP: #708479) + - some partitions appear with questionmark icon (LP: #710809) + - Unity wrongly resizes thumbnails after first opening of Files place + (LP:#721123) + - Change the fading and showing curve effect when hovering the bfb + (LP:#721125) + - Recent files appear duplicated in the Dash (LP: #646758) + - All Applications tab only shows first 100 applications (LP: #660979) + - slide animation typo in unity configuration (LP: #723354) + - Place icons should be in their respective packages (LP: #672447) + - Trash right click menu is positioned incorrectly (LP: #718880) + - Require to use gconf to check on unity and the panel-service if the + accessibility should be enabled (LP: #723699) + * debian/control: + - dep on latest nux + + -- Didier Roche Thu, 24 Feb 2011 20:16:29 +0100 + +unity (3.4.4-0ubuntu2) natty; urgency=low + + * debian/control + - bump build depends for libindicator-dev to >= 0.3.19 + + -- Ken VanDine Thu, 17 Feb 2011 15:26:07 -0500 + +unity (3.4.4-0ubuntu1) natty; urgency=low + + * New upstream release: + - add systray support (LP: #655140, #596879) + - Dragging and holding a selection over an entry in the Launcher should + spread out windows belonging to that application (LP: #607796) + - Unity shouldn't allow to Quit itself (LP: #705536) + - Launcher should not be locked in place until the pointer is actually in + the corner (LP: #706146) + - Top Panel does not respect GTK theme (LP: #663524) + - Update Unity-Panel Style implementation (LP: #685830) + - Add keyboard shortcut for the panel (LP: #701663) + - clicking on the ubuntu logo doesn't close the dash dialog (LP: #708762) + - "Escape" doesn't close the dash screen (LP: #711195) + - migrate_favorites.py crashed with GError in __main__: Bad key or + directory name: "/desktop/unity/launcher/favorites//type": Can't have + two slashes '/' in a row (LP: #716382) + - Icon state does not revert when remote libunity user closes (LP: #716863) + - transparency in places window a bit too high (LP: #718357) + - Navigating between menus briefly gives focus back to applications + (LP: #690714) + - pace on cursor navigation mode should act like middle click (LP: #717213) + - Do not switch to fallback menu on mouse-over (LP: #703555) + - Fix the panel service and menus atk object hierarchy (LP: #704350) + - Expose home panel button via ATK (LP: #715295) + * debian/source_unity.py: enhanced apport hook for incoming compiz hook + * debian/control: + - bump nux and libunity-misc dep + + -- Didier Roche Thu, 17 Feb 2011 20:37:42 +0100 + +unity (3.4.2-0ubuntu2) natty; urgency=low + + * backport some fixes from trunk like launcher can be wrongly shown + (LP: #716803) + + -- Didier Roche Fri, 11 Feb 2011 09:43:29 +0100 + +unity (3.4.2-0ubuntu1) natty; urgency=low + + * New upstream release: + - add --distro switch to remove local installation of unity with default + options (LP: #715703) + - global search and speedups in places + - Using fade effect to cut the window Title when it's longer than the panel + (LP: #694924) + - Launcher - Add ability for apps to indicate progress through Launcher icon + (LP: #676596) + - calling unity should kill unity-panel-service (LP: #711289) + - unity places should return a default icon when no matching icon is found + (LP: #711200) + - the launcher should start hidding when an icon is clicked (LP: #709178) + - Highlight drag-friendly Launcher tiles when dragging a file (LP: #607782) + - Fix migrate_favorites.py crashed with OSError in get_log_file(): [Errno 2] + No such file or directory: '/home/ubuntu/.local/share/unity' (LP: #711964) + - places should support wrong Icon= format (with extensions) (LP: #711189) + - unity crashed with AttributeError in reset_unity_compiz_profile(): + 'NoneType' object has no attribute 'get_default_value' (LP: #711105) + - unity crashed with GError in reset_unity_compiz_profile() (LP: #710876) + - Middle click on application icon should open a new window (LP: #709707) + - Launcher - Add interaction to support dragging and dropping behind the + launcher (LP: #702482) + - Launcher - Enable dragging and dropping of files & folders to Launcher + icons (LP: #676549) + - Launcher - Add number notifier to Launcher icons (LP: #676455) + - Support dragging files to trash to delete them (LP: #619686) + - [launcher] Indicator-only applications showing as open applications + (LP: #703396) + - Unity does not accept mouse clicks (LP: #683328) + - dash is empty (LP: #710792) + * debian/control: + - depends on latest nux + + -- Didier Roche Thu, 10 Feb 2011 20:45:47 +0100 + +unity (3.4.0-0ubuntu2) natty; urgency=low + + * Cherry-pick fix when the favorite migration tools is crashing on first run + on new install (LP: #711964) + + -- Didier Roche Wed, 02 Feb 2011 18:00:35 +0100 + +unity (3.4.0-0ubuntu1) natty; urgency=low + + * New upstream release: + - Add places back to unity + - Add autoscroll to launcher (LP: #690096) + - Fix performance issue due to redecorate windows (LP: #705427) + - Change automaximize value to 75% of the workarea (LP: #708809) + - The launcher should not let you dnd special icons (LP: #709119) + - The launcher shouldn't move icon on right click dragging (LP: #709179) + * Cherry-pick a small fix for not having places empty at start + * debian/control: + - recommends again places now that unity can support them + + -- Didier Roche Mon, 31 Jan 2011 18:40:50 +0100 + +unity (3.2.16-0ubuntu1) natty; urgency=low + + * New upstream release: + - Add the Launcher BaseWindow to the a11y component only if a11y was + initialized (LP: #705442) + - Enable _NET_WM_WINDOW_TYPE_UTILITY windows (like gimp toolbox) to hide + the Launcher (LP: #706109) + - Fix the defaul indicators size, making them inconsistent (LP: #705803) + - Always have the indicator session to the top right (LP: #705697) + - Show launcher when places are activated (LP: #705948) + - Fix memory leaks in dash (LP: #705705) + - Support i18n (LP: #697166) + - Enabling double click on the launcher to restore a maximized window + (LP: #661049) + - Update the title bar on tab change (LP: #691651) + - Hide the launcher instantanly on key press or dash if we have already + waited the launcher trigger time (LP: #705805) + - Make sure keypad keys also work in the search entry (LP: #599902) + - Dash elipsizes file and application names too soon, making them unreadable + (LP: #632526) + - Implement Places Group View (LP: #704493) + * debian/control: + - ensure we have latest bamf and nux + + -- Didier Roche Thu, 27 Jan 2011 14:43:29 +0100 + +unity (3.2.14-0ubuntu3) natty; urgency=low + + * debian/rules: + - build .pot file now (LP: #697168) + * debian/control: + - rebuild for ABI break in compiz + + -- Didier Roche Thu, 27 Jan 2011 13:16:53 +0100 + +unity (3.2.14-0ubuntu2) natty; urgency=low + + * Backport a fix to remove invisible window on top at startup + (LP: #705672) + * debian/source_unity.py : + - fixing typo (LP: #705702) + + -- Didier Roche Mon, 24 Jan 2011 17:38:22 +0100 + +unity (3.2.14-0ubuntu1) natty; urgency=low + + * New upstream release: + - Use a padding of 6px for the appmenu and 3px for the other indicators. + (LP: #684114) + - appmenu doesn't correspond to currently focused application (LP: #69806) + - Places tile view (LP: #697687) + * remove inline patch to build tests against + * debian/control: + - recommends ubuntuone-control-panel-gtk + - removed libunity*: seperate source now + - bump libnux requirement + * removed debian/libunity* + * debian/source_unity.py: + - enhance apport hook to report compiz (and xorg) information only on + graphical bugs (the report can take time and would upload too many data for + just a weird quick behavior bug for instance) + + -- Didier Roche Thu, 20 Jan 2011 19:24:47 +0100 + +unity (3.2.12-0ubuntu3) natty; urgency=low + + * debian/control: + - drop the recommends on unity-places* as they don't work today, and pull + libunity0, which has still a dep on libindicator1, conflicting with + libindicator2. The places can't be rebuilt right now (API breakage) and + we need to wait for next release + + -- Didier Roche Mon, 17 Jan 2011 14:27:11 +0100 + +unity (3.2.12-0ubuntu2) natty; urgency=low + + * No changes rebuild for new libindicator2 + + -- Jonathan Riddell Sat, 15 Jan 2011 02:56:13 +0000 + +unity (3.2.12-0ubuntu1) natty; urgency=low + + * New upstream release. + - Window border doesn't get restored (LP: #691812) + - When a menu is triggered from Alt+key, app name stays visible on panel + (LP: #691765) + - show the launcher on KeyPress, this will be needed when the + shortcut will be implemented if we are in intellihide mode + - Make sure an underscore is correctly placed under the corresponding + accelerator-key. (LP: #683427) + - Adding a dummy --replace option for compatibility reason (LP: #692569) + - Compiz crashed with SIGSEGV in CompWindow::id() (LP: #694945) + - Tooltip text not vertically centered (LP: #697791) + - Maximizing a window horizontally or vertically removes the title bar + (LP: #696780) + - Mousewheel support for indicators (LP: #681428) + - Avoid Quicklists being positioned so that they are partially offscreen at + the bottom screen-edge. (LP: #691114) + - Migrate awn, docky and cairo-dock dock launchers (LP: #692967) + - Include manpages, and make them translatable. (LP: #684896) + - Automaximize windows in Unity with some rules like blacklisting some + applications, initial window size. + It fixes also some bugs, like maximized window on first map not + undecorated (LP: #667009, #669716, #693779, #691741) + - Update libunity to conform to latest GIO VAPI breakage (LP: #679964) + - Initial unity-atk module implementation (LP: #701680) + - Panel autohide when on Quicklist (LP: #683261) + * debian/control: + - unity breaks on older bamf version (dbus protocol changed) + - needs latest and greatest from dee + - add libatk1.0-dev build-dep + * CMakeList: + - distro-patch to avoid building tests right now as building them is failing + with the current vala/gir stack. THIS NEED TO BE REMOVED. + * debian/rules: + - don't --fail-missing as we don't want to install the vapi yet. The gir + package will come next week. + * debian/unity-common.install: + - install the manpages + * debian/libunity3.symbols: + - updated + + -- Didier Roche Fri, 14 Jan 2011 20:47:25 +0100 + +unity (3.2.8-0ubuntu3) natty; urgency=low + + * debian/control: + libdbusmenu-glib-dev 0.4 is 0.3.91 + + -- Didier Roche Fri, 14 Jan 2011 17:04:27 +0100 + +unity (3.2.8-0ubuntu2) natty; urgency=low + + * src/unityshell.cpp: + - backport a fix for WindowCompizid + * debian/control: + - ABI break in compiz, rebuild against latest version + * CMakeLists.txt, libunity/CMakeLists.txt: + - don't build some vala stuff + * debian/libunity3.symbols: + - refresh the symbols regarding to previous changes + * backport dbusmenu transition: + - debian/control: build-dep on the new package + - backport the commits + + -- Didier Roche Fri, 14 Jan 2011 01:22:00 +0100 + +unity (3.2.8-0ubuntu1) natty; urgency=low + + * New upstream release: + - unity-panel-service should be autorestarted by unity when crashing + (lp: #686591) + - App name in panel menu is truncated (lp: #619477) + - Removing the appmenu indicator left-aligns all other indicators + (lp: #688764) + - unity support for firefox menubar (lp: #690447) + - the unityshell plugin has no icon in ccsm (lp: #688594) + - the unityshell plugin has an "unknown category" in ccsm (lp: #688592) + * debian/control: + - updated the dee and nux requirement. + * debian/libunity3.symbols: + - updated to include the new symbols + * debian/unity.install: + - install the ccsm icons there + + -- Sebastien Bacher Fri, 17 Dec 2010 19:18:58 +0100 + +unity (3.2.6-0ubuntu2) natty; urgency=low + + * debian/control: + - fix typo in description + - set nux-tools as a dep rather than recommends + - ensure we build/run with latest compiz-core (abi breakage) + - update Vcs-Bzr + - fix -common dep + + -- Didier Roche Mon, 13 Dec 2010 16:43:58 +0100 + +unity (3.2.6-0ubuntu1) natty; urgency=low + + [ Didier Roche ] + * New upstream release: + - Autohide option should be more like Intellihide (LP: #685861) + - Add an unity binary (LP: #599716) + - Dock icons disappearing on reopen (all programs) (LP: #687466) + - Application with .desktop file containing "icon=/absolute/path" doesn't + have an icon in unity panel (LP: #683444) + - Indicators are mis-aligned (LP: #646740) + - Navigating between indicator gives focus back to other dialogs during + transition (LP: #637143) + - Migration script should dump a lot of migrated items for debugging + (LP: #687721) + - Add desktop action support to launcher quicklists (LP: #687403) + - Rendering of Quicklist radio-button-item still way off (LP: #684048) + - Clicking on a launcher icon does not raise most recent window (LP: #677577) + - Quicklist menu item testing - Part 2 (LP: #676040) + - Panel does not behave like a menu bar (keyboard scrubbing) (LP: #686655) + - Separated menus: no keyboard shortcuts for menus (LP: #684060) + - No installation instructions in source (LP: #683792) + - Unity plugin should depend on "Desktop Wall" plugin (LP: #683211) + - Network indicator shows up on the left-hand side of the panel (LP: #680545) + - Scrubbing menu items or indicators in panel prematurely ends (LP: #677601) + - fix trash icon not being updated (LP: #683241) + * Revert source 3, it's breaking daily build and hudson + * remove the patch as well, fixed upstream + * debian/control, debian/unity.install, debian/unity-common.install: + - add unity-common package and move some files there + - install the new perf bootchart there as well + * debian/unity.install: + - install new unity binary + * debian/control: + - dep on latest nux + - recommends nux-tools + * debian/libunity3.symbols: + - updated to include the new symbols + + [ Sebastien Bacher ] + * debian/source_unity.py: + - reassign crashes due to the indicators to the right source directly + + -- Didier Roche Thu, 09 Dec 2010 19:57:14 +0100 + +unity (3.2.2-0ubuntu2) natty; urgency=low + + * debian/control: + - Add Vcs-Bzr link + * debian/source: + - Use source version 3.0 + * debian/patches/lp682345.patch: + - Fix crash on startup (LP: #682345) + + -- Robert Ancell Thu, 02 Dec 2010 10:00:40 +1100 + +unity (3.2.2-0ubuntu1) natty; urgency=low + + * New upstream release: + - fix crash in migration settings if gsetting not installed (LP: #682314) + - fix quicklist crash (LP: #681515) + - Quicklist rendering fixes (LP: #681498) + - BFB button launches nautilus /usr/share/applications (LP: #681504) + - Quicklist default items + Keep/remove favorite (LP: #681500) + - Add fullscreen application support (LP: #677255) + * debian/control: + - add libglib2.0-bin and python dep for the migration script + - build again latest nux + + -- Didier Roche Tue, 30 Nov 2010 17:33:03 +0100 + +unity (3.2.0-0ubuntu3) natty; urgency=low + + * revert previous upload done which is breaking the gconf unity settings + * debian/source_unity.py: + - let apport collect the same as it does for compiz, it will provide + details on xorg and drivers in use for example + * debian/unity.install: + - install the gconf file + - install source_unity.py + * debian/control: + - depends on new compiz and libcompiz version containing the gconf CMake fix + * debian/libunity3.symbols: + - add new exported symbols as places are installed in buildd + + -- Didier Roche Fri, 26 Nov 2010 20:34:58 +0100 + +unity (3.2.0-0ubuntu2) natty; urgency=low + + * FTBFS: install gconf schemas to fix --fail-missing + * Lintian: echo 1.0 > debian/source/format + + -- Paul Sladen Thu, 25 Nov 2010 21:38:00 +0100 + +unity (3.2.0-0ubuntu1) natty; urgency=low + + * New upstream release: + - Clicking a second time on a menu item does not dismiss it (LP: #661048) + - FavoriteStore re-ordering support (LP: #676106) + - Quicklist menu item testing - part 1 (LP: #676030) + - Base Quicklist Menu Items (LP: #676013) + - Tooltip launcher don't appear in unity compiz (LP: #675486) + - The migration script should be migrated to gsettings + (LP: #680873, #652785, #655175) + - Launcher clickable-area does not extend to left edge of screen + (LP: #677573) + - The ws switcher is always visible if launcher in floating and autohide + mode (LP: #677554) + - add application startup notification (LP: #638319) + - Unity appears on top of gnome-screensaver (LP: #677705) + - launcher tooltips hover over gnome-screensaver (LP: #652937) + * debian/control: + - don't recommend ubuntu-netbook-default-settings anymore + - change the description + - bump build-dep on latest nux + - add libstartup-notification0-dev build-dep + * debian/rules: + - try a slighter best solution for netbook-launcher virtual package, thanks + geser + * debian/unity.install: + - no more gconf file to install + * debian/libunity3.symbols: + - updated to latest and greatest + + -- Didier Roche Thu, 25 Nov 2010 19:46:58 +0100 + +unity (3.1.4-0ubuntu4) natty; urgency=low + + * debian/rules: + - give back netbook-launcher epoch for transition. Seems there is no elegant + way to do it with dh7, opened to suggestion… + + -- Didier Roche Fri, 19 Nov 2010 15:33:25 +0100 + +unity (3.1.4-0ubuntu3) natty; urgency=low + + * Argh, of course, as we removed the vala file build, we export less symbols + (update debian/libunity3.symbols) + + -- Didier Roche Fri, 19 Nov 2010 13:46:43 +0100 + +unity (3.1.4-0ubuntu2) natty; urgency=low + + * Don't build some vala files: + - places aren't present today and that make a FTBFS on buildd (some vapi + files should have changed) + + -- Didier Roche Fri, 19 Nov 2010 13:07:06 +0100 + +unity (3.1.4-0ubuntu1) natty; urgency=low + + * New upstream release. + - The top half of icons in the launcher is white (LP: #675082) + - Tooltip launcher don't appear in unity compiz (LP: #675486) + - Quicklist Menu - Initial Support (LP: #676154) + * debian/watch: + - look for upstream bz2 file now + * debian/control: + - bump libnux-0.9-dev build-dep + * debian/libunity3.symbols: + - update with new symbols + + -- Didier Roche Thu, 18 Nov 2010 18:31:37 +0100 + +unity (3.1.3-0ubuntu2) natty; urgency=low + + * don't build the place bindings right now as it doesn't build in a chroot + and it's not used anyway + * debian/libunity3.symbols: + - removing symbols accordingly + + -- Didier Roche Fri, 12 Nov 2010 19:06:26 +0100 + +unity (3.1.3-0ubuntu1) natty; urgency=low + + * New upstream release. + * udpate debian/copyright + * change debian/rules to build unity as a compiz plugin + - needed cmake + - skip tests for now + * debian/control: + - remove clutk/clutter and mutter deps + - add gsettings-desktop-schemas-dev and libnux-0.9-dev + - don't ship the -dbg package for now + * debian/libunity3.symbols: + - update to new internal API + * debian/*install: + - dispatch new layout and files in the right places + * debian/control, debian/libunity*.*: + - rename libunity0 to libunity3 + + -- Didier Roche Fri, 12 Nov 2010 18:35:04 +0100 + +unity (0.2.46-0ubuntu5) maverick-proposed; urgency=low + + * Revert to maverick branch + (lucid une ppa branch wrongly merged in this one): + + debian/control: + - Readd netbook-launcher transitional package, this is needed for people + not having ubuntu-netbook installed on dist-upgrade to be + transitionned to unity. (LP: #657838) + - recommends ubuntu-netbook-default-settings and not + ubuntu-netbook-unity-defaut-settings + + -- Didier Roche Mon, 11 Oct 2010 21:40:23 +0200 + +unity (0.2.46-0ubuntu4) maverick; urgency=low + + * Cherry-picked from upstream: + - the Places and Applications tabs now caters for localized text + longer than the English ones (LP: #644275) + * debian/libunity0.symbols: + - updated for new symbols + + -- Didier Roche Fri, 01 Oct 2010 14:09:10 +0200 + +unity (0.2.46-0ubuntu3) maverick; urgency=low + + * Cherry pick from upstream: + - Finally load the right translations from .place files for + "Applications" and "Files & Folders" tooltips (LP: #644215) + + -- Didier Roche Thu, 30 Sep 2010 16:33:54 +0200 + +unity (0.2.46-0ubuntu2) maverick; urgency=low + + * Cherry pick from upstream: + - hanges the launcher behaviour to launch a new application if no user + visible windows are found to fix (LP: #647979) + + -- Didier Roche Tue, 28 Sep 2010 13:14:26 +0200 + +unity (0.2.46-0ubuntu1) maverick; urgency=low + + * New upstream release: + - use get_basename instead of silly str manipulating, should fix (LP: #648625) + - fix remaining issues when software is at start for non 3D detection + (LP: #614088) + - Fix duplicate ubiquity entry in UNE live session (was importing it from + the GNOME desktop) (LP: #648827) + + -- Didier Roche Mon, 27 Sep 2010 21:24:05 +0200 + +unity (0.2.44-0ubuntu1) maverick; urgency=low + + * New upstream release: + - refine launcher tile super key overlay aesthetic (LP: #633069) + - improve Cof logo (LP: #644686) + - fix a crasher in the place activation (LP: #634364) + - fixes favorite loading for didrocks (thanks!) (LP: #645835) + - workaround translation issue for Unity trash (LP: #646653) + - MT final adjustement for maverick (LP: #645848, #640501) + * debian/control: + - depend on latest unity-asset-pool + * backport fix to respect workspace layout + * debian/libunity0.symbols: + - updated + + -- Didier Roche Fri, 24 Sep 2010 19:57:46 +0200 + +unity (0.2.42-0ubuntu3) maverick; urgency=low + + * we need the .c file too (not automatically rebuilt) to fix crash on system + indicators (LP: #645923) + + -- Didier Roche Thu, 23 Sep 2010 19:06:59 +0200 + +unity (0.2.42-0ubuntu2) maverick; urgency=low + + * Cherry pick from upstream bzr to avoid crash when clicking on system + indicators (LP: #645923) + + -- Didier Roche Thu, 23 Sep 2010 14:27:39 +0200 + +unity (0.2.42-0ubuntu1) maverick; urgency=low + + * New upstream release: + - "Applications" and "Files & Folders" tooltips are not translatable + (LP: #644215) + - Fix inactive menus are accessible on switching to a window (LP: #604505) + - Fix wrong launcher tile label/quicklist x position (LP: #631446) + - Fix highlighted items in quicklist have different widths (LP: #643315) + - In migration tool, being safe when people are using crazy caracters in + desktop file (LP: #644114, #635156) + - Detect if 3D acceleration support is provided. Otherwise, prompt for + logout and change default session (LP: #614088) + - Fix quicklist shows hidden menu items (LP: #641543) + - Fix removing launchers via dnd fails (LP: #643434) + - Better launcher auto-scroll performances (LP: #640560) + - Make the insensitive state of the forward- and back-button more obvious by + decreasing their opacity, thus users don't assume they are actually + clickable. (LP: #638285) + - Fix some dialogs aren't maximized but are undecorated (LP: #628822) + - Fix some menus don't go away when window closes (LP: #640557) + - Fixes bug where the wrong icon where at times associated with a tile in + the places view. (LP: #642935) + - Speedup icon loading (LP: #641246) + - Make trash menu items in Unity are either not translatable or translations + are not loaded (LP: #645038) + - Fix using dnd on launcher makes focus not work out of the unity ui + (LP: #637123) + - Multi-monitor support (LP: #637123) + - Enable/disable super key by a gconf key (LP: #632581) + - Remove glow on fold (LP: #619344) + - Ensure we dont map windows when expose is active (LP: #599766) + - take new indicator API for action for top-level dropdown menu item not + activated (LP: #637692) + - Make the home buttons reactive (LP: #638857) + - Add red tint when search fails (LP: #607821) + - New (and final!) UI adjustement, but UNE isn't in the doc as seen with + the doc team (LP: #627009) + - Single-touches on the launcher are usually interpreted as a drag + (LP: #641328) + - URI activation in global view (LP: #612562) + - Clicking a Place icon while viewing the same place in the Dash should + return to the Home screen of that place and clear the search (LP: #607829) + - Fix mutter crashed with SIGSEGV in g_type_check_instance() (LP: #641561) + - Fix panel and menu item font colors don't match (LP: #637480) + - Fix inactive menus are accessible on switching to a window (LP: #604505) + - Use semi-transparent rectangle around launcher-icon (LP: #643388) + - Fix mutter crashes when closing pop-up dialog (LP: #642669) + - Change launcher icon reference size loading (LP: #641669) + - Fix mutter crashing in mumble start (LP: #641335) + - Fix clicking on a category from CoFs does not directly take you to the + desired category (LP: #638402) + - Fix some menus don't go away when window closes (LP: #640557) + - Launchers should act like if the application was not focussed in the place + views (LP: #637136) + - Fix mutter crashed with SIGSEGV in mutter_window_get_window_type() + (LP: #645066) + - Fix new windows don't get focus (LP: #642994) + - Fix cropping an image in shotwell crashes unity (LP: #641554) + - Some fixes on matching user icons (LP: #622146) + * debian/control: + - depends on latest libindicator-dev for ABI change transition + * debian/libunity0.symbols: + - update to track internal ABI symbols (only used by places) + + -- Didier Roche Wed, 22 Sep 2010 22:36:00 +0200 + +unity (0.2.40-0ubuntu1) maverick; urgency=low + + * New upstream release: + - Fix inactive menus accessible (LP: #604505) + - Fix some more memory leaks (LP: #604777, #621690, #628144) + - Fix weird behaviors of quicklist (LP: #617339) + - Provide an "open this folder" button (LP: #633201) + - Hidden menu causing gap (LP: #600191) + - Cannot go fullscreen for flash videos (LP: #631381) + - Can't access menu items from the keyboard (LP: #636728) + - Don't register for MDRAGs since they aren't used (LP: #632613) + - Don't run indicator on special launchers (LP: #627488) + - Center arrows position in folded launcher tiles (LP: #633084) + - Launcher icons first appear as white upon login (LP: #601093) + - Removes jittering when rubber band is in use on the launcher (LP: #632991) + - Mutter restarts on closing almost any application (LP: #634701) + - Can't launch apps like synaptic with root privileges from launch bar + (LP: #599298) + - Launcher tile dragging shouldn't be masked (LP: #631443) + - Fix Carousel-ed icons have distorted perspective (LP: #607515) + - Use no longer sync call (LP: #620011) + * update debian/libunity0.symbols + + -- Didier Roche Fri, 17 Sep 2010 14:02:54 +0200 + +unity (0.2.38-0ubuntu1) maverick; urgency=low + + * New upstream release: + - Correct the offset of the quicklist so it doesn't jump to the right when + expanding from a tooltip. Fixes (LP: #631446) + - Log apps launched via unity-place-application (LP: #632203) + - Fix launcher does not contract if a menu is open (LP: #631452) + - Auto scroll speed is now corrected (LP: #633045) + - Removes jittering when rubber band is in use on the launcher (LP: #632991) + - Fix clicking on the right of the divider also triggers action on logo + (LP: #636602) + - Full i18n support (LP: #637128) + - Avoids the crash on Super-key-shortcuts with places. (LP: #632460) + - Pressing enter in search mode should activate the first result + (LP: #620945) + - Esc close the places view (LP: #599891) + - Launcher shouldn't 'fold' when hovering on a quicklist (LP: #632079) + * update debian/libunity0.symbols + + -- Didier Roche Tue, 14 Sep 2010 20:11:57 +0200 + +unity (0.2.36-0ubuntu1) maverick; urgency=low + + * New upstream release: + - Fix width of home-button on panel, so groove aligns with right edge of + launcher, fixes (LP: #630031) + - migration script to transition first time new people to unity + (LP: #622146) + - Quicklist name disappearing (LP: #627666) + * debian/unity.install: + - install libexec in unity package (for migration tool) + * debian/libunity0.symbols: + - update symbol + + -- Didier Roche Thu, 09 Sep 2010 19:13:29 +0200 + +unity (0.2.34-0ubuntu1) maverick; urgency=low + + * New upstream release: + - Use gettext plural form (LP: #625199) + - Fix newly pinned app is removed from the launcher on closing that app but + works fine afterward (LP: #614329) + - Fix Memory leak in places (LP: #628588) + * remove debian/source/: + - revert to previous format, seems to confuse daily build and we don't have + anymore bin patch + * remove upstreamed debian/trash.png, debian/applications.png and + debian/files.png + * debian/rules: + - remove copying debian/*png + * debian/libunity0.symbols: + - refreshed + + -- Didier Roche Fri, 03 Sep 2010 17:00:45 +0200 + +unity (0.2.32-0ubuntu4) maverick; urgency=low + + * Backport a fix for new tiles being unresponsive (lp: #623953) + + -- Sebastien Bacher Thu, 02 Sep 2010 11:20:34 +0200 + +unity (0.2.32-0ubuntu3) maverick; urgency=low + + * Backport Gord's changes to fix scrolling and click issues in the + launcher and Neil's changes for the recent artwork changes + * debian/source: + - use format 3 + - list binaries that changed in the backport + + -- Sebastien Bacher Tue, 31 Aug 2010 16:39:52 +0200 + +unity (0.2.32-0ubuntu2) maverick; urgency=low + + * debian/control: clean the build-depends on libvala it's not required + + -- Sebastien Bacher Thu, 26 Aug 2010 22:41:53 +0200 + +unity (0.2.32-0ubuntu1) maverick; urgency=low + + * New upstream release. + * debian/libunity0.symbols: new version update + + -- Sebastien Bacher Thu, 26 Aug 2010 20:07:01 +0200 + +unity (0.2.30-0ubuntu1) maverick; urgency=low + + * New upstream release fixing those issues: + - clicking on an app window in workspace switcher does not get it to focus + (lp: #612327) + - App name stays in panel after exit (lp: #613087) + - Bright line at the bottom of the launcher bar (lp: #613084) + - additional round corner when clicking on application places item + (lp: #612542) + - removing active application in the launcher make unity crashes + (lp: #612535) + - Intermittent loss of all input (lp: #607519) + - Wallpaper picture-options are not all taken into account (lp: #605788) + - Add some sort of hint that the Ubuntu circle is click-able (lp: #592787) + - doesn't render appmenu accelerators correctly (lp: #601011) + - should highlight the selected items (lp: #600946) + - Files Place displays mimetype icons for file items when + thumbnails are available (lp: #599896) + * debian/control: build-depends on libxcb-icccm1-dev and libutouch-grail-dev + + -- Sebastien Bacher Thu, 26 Aug 2010 18:31:40 +0200 + +unity (0.2.28-0ubuntu2) maverick; urgency=low + + * Backported change to fix a bug where some launcher icons are not there + + -- Sebastien Bacher Fri, 20 Aug 2010 15:40:20 +0200 + +unity (0.2.28-0ubuntu1) maverick; urgency=low + + * New upstream release fixing those bugs: + - Files Place empty search view is not implemented (lp: #607764) + - poor battery performance in Unity (lp: #599425) + - When launching an app, grids glow around its icon (lp: #610250) + - Add some sort of hint that the Ubuntu circle is click-able (lp :#592787) + - the buttons to display extra items are not updated correctly (lp: #604958) + - launcher bubbles flickers a lot when places with scrollbars are displayed + (lp: #599911) + - white square displayed next to indicators crashing unity (lp: #601014) + - Display removable media (USB device, etc.) on the launcher (lp: #619695) + - Add support for DND between workspaces (lp: #594160) + - indicators dont get focus in workspace switch mode (lp: #612323) + - Workspace switch cleanups (lp: #594163) + - workspace switcher should have a title on hover (lp: #614926) + * debian/control: + - build-depends on libpango1.0-dev to match the configure + * debian/libunity0.symbols: + - new version update + * debian/patches/01_show_gicons.patch: + - the change is in the new version + + -- Sebastien Bacher Thu, 19 Aug 2010 18:34:26 +0200 + +unity (0.2.26-0ubuntu1) maverick; urgency=low + + * New upstream release. + - Fix mutter grabbing the [Super] key and breaks the shorcuts + overlay (LP: #612992) + - Fix flattened icons move when expansion is triggered by a mouse over a + flattened launcher item (LP: #600977) + - Holding down super should reveal a list of keyboard shortcuts + (LP: #610366) + - Update the applications model when changes are detected (LP: #610382) + - Implement Applications Place Software Center integration (LP: #608179) + - Files Place home screen should have a Recent group (LP: #607815) + * debian/patches/01_show_gicons.patch: + - adapt with latest libindicator change + * update debian/libunity0.symbols + + -- Didier Roche Fri, 13 Aug 2010 15:13:24 +0200 + +unity (0.2.24-0ubuntu1) maverick; urgency=low + + * New upstream release. + - makes sure to load translations from .desktop files (LP: #612494) + - get launcher events working correctly + - better spaces interactions + - new custom rendering for radiobutton- and checkmark-items in quicklist + (LP: #607251) + * debian/libunity0.symbols: + - update symbol file + * debian/control: + - build-dep on libmutter-dev 2.31.5 + - bump Standards-Version to latest + * debian/patches/01_add_dbusmenu_glib_vapi.patch, 02_i18n_launcher.patch: + - removed + + -- Didier Roche Fri, 06 Aug 2010 16:17:12 +0200 + +unity (0.2.22-0ubuntu1) maverick; urgency=low + + * New upstream release. + - Add support for window control buttons on the panel (LP: #610014) + - Create a files group model for downloads (LP: #610370) + - Fix odd representation of (partially) off-screen windows (LP: #594221) + - Fix selected category doesn't match the displayed one after a place + switch (LP: #604949) + - Move places shortcuts to the launcher (LP: #610015) + - Fix wrong arrow location in place views (LP: #604800) + - Launcher icons no more folded when launcher first starts (LP: #601107) + * debian/control: + - bump clutk build-dep + * debian/patches/02_disable_expandable_menu.patch, + debian/patches/03_strip_underscore_on_quicklist.patch, + debian/patches/04_fix_scroller_focus_issue.patch, + debian/patches/05_fix_ws_switching.patch: + - removed + * debian/patches/02_i18n_launcher.patch: + - from trunk, support use localized apps name (LP: #612494) + + -- Didier Roche Mon, 02 Aug 2010 15:55:16 +0200 + +unity (0.2.20-0ubuntu2) maverick; urgency=low + + * Misc fixes from git + - debian/patches/03_strip_underscore_on_quicklist.patch + - debian/patches/04_fix_scroller_focus_issue.patch + - debian/patches/05_fix_ws_switching.patch + + -- Didier Roche Tue, 27 Jul 2010 10:59:25 +0200 + +unity (0.2.20-0ubuntu1) maverick; urgency=low + + * New upstream release. + - Right click and selecting application doesn't launch it (LP: #592817) + - Add some hint that the Ubuntu circle is click-able (LP: #592787) + - Remove unpinned launchers when quitting the app (LP: #608492) + - add to launcher isn't changed to remove from launcher (LP: #606266) + - quicklist should be hidden when drag and drop a launcher (LP: #606258) + - Fix reorganizing launchers (LP: #600738) + - Removing active application makes the application closes (LP: #598175) + - UnityLauncherQuicklistMenu clutter_actor_queue_relayout() warning + (LP: #599718) + * debian/control: + - bump libclutk-dev to latest + * debian/patches/01_add_dbusmenu_vapi_file.patch: + - add missing file + * debian/patches/02_disable_expandable_menu.patch: + - disable latest changes making mutter respawning with some intel card + + -- Didier Roche Thu, 22 Jul 2010 22:37:56 +0200 + +unity (0.2.18-0ubuntu1) maverick; urgency=low + + * New upstream release. + - can't drag and drop item to last position in launcher (LP: #595819) + - set a solid color as background (LP: #594232) + - select a place by default (LP: #601020) + - Support offline shortcuts in quicklist (LP: #595842) + - keyboard focus in places should default to the search entry (LP: #599888) + - fix various search issues in places (LP: #600732, #604964) + - contracted/expanded feature doesn't take mouse position into account + (LP: #595878) + - Use X-GNOME-FullName when available for launcher hover text (LP: #594285) + - SIGSEGV in _clutter_stage_has_full_redraw_queued (LP: #594209) + * debian/control: + - bump libclutk-dev build-dep to latest + - add libdbusmenu-glib-dev, libgnome-desktop-dev and libgnomeui-dev deps + * add debian/patches/01_add_dbusmenu_glib_vapi.patch: + - not distribute yet, small fix in the vapi to make a method return an + unowned variable instead of an owned one + + -- Didier Roche Fri, 16 Jul 2010 14:48:14 +0200 + +unity (0.2.16-0ubuntu1) maverick; urgency=low + + * New upstream release. + - The launcher doesn't list some running softwares (LP: #601082) + - Design support for dynamic quicklist items (LP: #597259) + - In overlay mode clicking on an app icon should open/focus that appxi + (LP: #595130) + - Launcher doesnt go away when a full screen app is started (LP: #599422) + - Launcher grows beyond desktop bounds (LP: #600686) + - Can't focus indicators in places mode (LP: #598363) + - Extra file to distribute (LP: #598398) + - gtk_menu_popdown: assertion `GTK_IS_MENU (menu)' failed (LP: #599719) + + -- Didier Roche Mon, 12 Jul 2010 15:51:11 +0200 + +unity (0.2.16-0ubuntu1~lucid1) lucid; urgency=low + + * Backport to lucid ppa + + -- Didier Roche Mon, 12 Jul 2010 16:24:58 +0200 + +unity (0.2.14-0ubuntu1) maverick; urgency=low + + * New upstream release. + - fix wrong window geometry (LP: #578545) + - fix quicklist items were unresponsive when the mouse was overing over them + (LP: #598561) + - fix can't drag and drop item to last position in launcher (LP: #595819) + - removes/unfavorites apps on drag out, (LP: #592744) + - fix contracted/expanded feature doesn't take mouse position into account + (LP: #595878) + - fix really slow to display place icons (LP: #599901) + - display files thumbnails (LP: #599896) + * debian/control: + - recommend ubuntu-netbook-default-settings as the session file is there + and a lot of people could install unity without the session file + - build-dep on last clutk + + -- Didier Roche Thu, 01 Jul 2010 19:08:22 +0200 + +unity (0.2.14-0ubuntu1~lucid1) lucid; urgency=low + + * Backport to lucid UNE ppa + * debian/control + - recommends ubuntu-netbook-unity-default-settings + + -- Didier Roche Fri, 02 Jul 2010 08:18:41 +0200 + +unity (0.2.12-0ubuntu2) maverick; urgency=low + + * debian/control, add indicators as recommends: + indicator-appmenu, indicator-application, indicator-sound, + indicator-datetime, indicator-messages, indicator-me, + indicator-session, + + -- Didier Roche Mon, 28 Jun 2010 13:56:08 +0200 + +unity (0.2.12-0ubuntu1) maverick; urgency=low + + * New upstream release: + - reordered applications launchers don't save their location (LP: #592087) + - cannot close panel menus unless clicking on particular zones of the + display (LP: #595880) + - Add support for switching workspaces (LP: #594157) + - Indicators should listen to show/hide from GtkWidget (LP: #590920) + - Race in expose manager event processing (LP: #588299) + - Files Place (View) - add support for file grouping (LP: #597256) + - Apps Place (View) - add basic support (LP: #597257) + * debian/patches/01_draw_background_with_nautilus_off.patch: + - integrated upstream + * debian/control: + - add libclutk-dev as a dep to libunity-dev + - bump clutk, dee and bamf dep to latest + + -- Didier Roche Thu, 24 Jun 2010 21:12:40 +0200 + +unity (0.2.12-0ubuntu1~ppa1) lucid; urgency=low + + * Backport to lucid ppa + + -- Didier Roche Fri, 25 Jun 2010 09:23:25 +0200 + +unity (0.2.10-0ubuntu1) maverick; urgency=low + + * New upstream release: + - Panels don't reappear after leaving fullscreen (LP: #578956) + - Background seems to be wrongly detecting screen size (LP: #578686) + - Unity panels don't disapear when VLC is on full side mode (LP: #583053) + - Clicking on launcher does not raise the last used window of the + application (LP: #592583) + * debian/netbook-launcher.preinst, debian/unity.preinst: + - add debhelper token + * debian/patches/01_draw_background_with_nautilus_off.patch: + - draw background when nautilus don't draw desktop + + -- Didier Roche Thu, 17 Jun 2010 18:35:26 +0200 + +unity (0.2.10-0ubuntu1~lucid1) lucid; urgency=low + + * Unity lucid version doesn't break maximus as in different session + + -- Didier Roche Fri, 18 Jun 2010 08:58:10 +0200 + +unity (0.2.8-0ubuntu1) maverick; urgency=low + + * New upstream release. + (LP: #592120, #590728, #580104, #586015, #587237, #582530, #586002, #591742) + * removed patches integrated upstream: + debian/patches/01_drop_mutter_req.patch + debian/patches/02_make_perceptualdiff_optional.patch + debian/patches/03_use_new_mutter_plugin_init_order.patch + debian/patches/99_autoconf.patch + * debian/control: + - remove libwnck-dev dep + + -- Didier Roche Thu, 10 Jun 2010 19:21:55 +0200 + +unity (0.2.8-0ubuntu1~lucid1) lucid; urgency=low + + * Unity lucid version doesn't break maximus as in different session + + -- Didier Roche Fri, 11 Jun 2010 22:18:30 +0200 + +unity (0.2.7-0ubuntu2) maverick; urgency=low + + * debian/rules: + - include gnome.mk for installing default schema in /usr + * debian/unity.preinst: + - remove schema in /etc installed by previous package + * debian/control: + - Add transitional netbook-launcher package, and have Unity + C/R/P: netbook-launcher. + - Add Breaks: maximus as incompatible in with Unity + * debian/rules: + - Force an epoch bump on the transitional netbook-launcher package, + since the original package has a higher version. + * debian/unity.preinst: + - Remove netbook-launcher autostart .desktop conffile on upgrade. + * debian/copyright: + - fix typo + + -- Didier Roche Wed, 09 Jun 2010 13:29:48 +0200 + +unity (0.2.7-0ubuntu1) maverick; urgency=low + + * New upstream release. + * debian/copyright: + - update to latest copyright change + * debian/libunity-dev.install: + - now unity ship a .pc file + * debian/control: + - add to -dev package .pc file dependencies + + -- Didier Roche Tue, 08 Jun 2010 12:52:04 +0200 + +unity (0.2.6-0ubuntu1) maverick; urgency=low + + * New upstream release. + * add debian/watch + * update debian/copyright + * debian/control: + - change HomePage + - update Standards-Version + - remove liblauncher-dev as a build-dep + - bump buil-dep to latest + - provides indicator-renderer + - change the description + - remove unsupported Breaks: transition on mutter + - remove uneeded dep on -dev package + - remove recommends. Will be in seed now + - use unity-dbg as debug package + * debian/rules: + - make it more sane in ordering includes/rules + - fix rm *{,l}a files + - use unity-dbg as debug package + * debian/libunity-dev.install: + - install vapi file + * debian/patches/01_drop_mutter_req.patch: + - don't depend on extra mutter functionality + * debian/patches/02_make_perceptualdiff_optional.patch, debian/control: + - remove perceptualdiff as will be optional + * debian/patches/03_use_new_mutter_plugin_init_order.patch: + - new registration order with plugins for mutter + * debian/patches/99_autoconf.patch: + - refresh for change in configure.ac + + -- Didier Roche Mon, 07 Jun 2010 12:21:02 +0200 + +unity (0.2.4-0ubuntu1) maverick; urgency=low + + * New upstream release. + * debian/control: + - replace libwncksync-dev by libbamf-dev + - replace libdbusmodel-dev by libdee-dev + + -- Didier Roche Thu, 27 May 2010 19:07:31 +0200 + +unity (0.2.2-0ubuntu1) lucid; urgency=low + + * New upstream release. + * debian/control: + - bump libclutk-dev, libdbusmodel-dev and libclutk-dev and libmutter-dev + build-dep + - add perceptualdiff build-dep + - libunity-places0 removed in favor of libunity0 containing the new library + for unity and the -private one. + * renamed *.install file accordingly + + -- Didier Roche Fri, 16 Apr 2010 18:02:43 +0200 + +unity (0.1.24-0ubuntu1) lucid; urgency=low + + * debian/control: + - add debug package to both unity and libunity-places0 + - bump clutk, liblauncher and wncksync build-dep + * New upstream release. + + -- Didier Roche Fri, 19 Mar 2010 15:40:10 +0100 + +unity (0.1.22-0ubuntu1) lucid; urgency=low + + * New upstream release. + * debian/control: + - bump libclutk-dev and liblauncher-dev build-dep + * debian/rules: + - include gnome.mk to call dh_gconf + * debian/unity.install: + - install locales and gconf schema + + -- Didier Roche Thu, 11 Mar 2010 20:36:49 +0100 + +unity (0.1.20-0ubuntu1) lucid; urgency=low + + * New upstream release. + * debian/control: + - bump clutk, liblauncher and wncksync build-dep + + -- Didier Roche Thu, 04 Mar 2010 20:47:17 +0100 + +unity (0.1.18-0ubuntu1) lucid; urgency=low + + * New upstream release. + * debian/control: + - remove maximus as a recommend + - bump libclutk-dev and liblauncher-dev build-dep + + + -- Didier Roche Fri, 26 Feb 2010 13:44:42 +0100 + +unity (0.1.16-0ubuntu1) lucid; urgency=low + + * New upstream release. + * debian/control: + - unity now depends on unity-asset-pool + - bump libclutk-dev and liblauncher-dev build-dep + - add intltool build-dep + - add indicator-datetime and chromium-browser as recommends + * debian/rules: + - remove -Wall from CFLAGS, FTFBS due to unused reference + + -- Didier Roche Thu, 18 Feb 2010 20:15:25 +0100 + +unity (0.1.14-0ubuntu1) lucid; urgency=low + + * New upstream release + * debian/control: + - bump libclutk-dev and liblauncher-dev build-dep + + -- Didier Roche Thu, 11 Feb 2010 20:05:44 +0100 + +unity (0.1.12-0ubuntu1) lucid; urgency=low + + * debian/control: + - remove netbook-launcher transitional package as the old one will + be shipped in lucid + - remove C/R/P as well + - recommends maximus and ubuntu-netbook-unity-default-settings as we + have no more meta-package for it + * debian/rules: + - remove DEB_DH_GENCONTROL_ARGS_netbook-launcher rule for + transitional package + * remove debian/unity.preinst as we don't remove netbook-launcher now + + -- Didier Roche Mon, 08 Feb 2010 13:40:19 +0100 + +unity (0.1.12) lucid; urgency=low + + * new upstream version: + * debian/control: + - bump libclutk build-dep + - dep on liblauncher-dev now + - add Breaks: mutter (<< 2.28.1~git20091208-1ubuntu5) + + -- Didier Roche Thu, 04 Feb 2010 20:47:31 -0800 + +unity (0.1.10-0ubuntu1~ppa3) lucid; urgency=low + + * debian/control: + - libunity-places-dev should depends on libunit-places0 + + -- Didier Roche Fri, 29 Jan 2010 14:58:50 +0100 + +unity (0.1.10-0ubuntu1~ppa2) lucid; urgency=low + + * debian/control: + - add unity-place-applications as unity recommends + + -- Didier Roche Fri, 29 Jan 2010 14:37:00 +0100 + +unity (0.1.10-0ubuntu1~ppa1) lucid; urgency=low + + [ Martin Pitt ] + * debian/unity.preinst: Fix version comparison for cleaning up the obsolete + netbook-launcher autostart .desktop. + + [ Didier Roche ] + * New upstream release + * debian/control: + - add libindicator-dev, libunity-misc and libdbusmodel-dev build-dep + - remove autotools-dev build-dep + - bump libclutk-dev and libmutter-dev build-dep + - add libunity-places0 and libunity-places-dev packages + * add debian/libunity-places0.install and debian/libunity-places-dev.install + + -- Didier Roche Fri, 29 Jan 2010 12:14:44 +0100 + +unity (0.1.8-0ubuntu1~dxppa2) lucid; urgency=low + + * Add DEBHELPER token to debian/unity.preinst + * debian/control: add unused ${misc:Depends} to netbook-launcher for + lintian cleaning + + -- Didier Roche Thu, 21 Jan 2010 14:40:03 +0100 + +unity (0.1.8-0ubuntu1~dxppa1) lucid; urgency=low + + [ Martin Pitt ] + * debian/control: Drop Vcs-Bzr headers, until unity is properly registered + in Launchpad. + + [ Didier Roche ] + * new upstream release + * debian/control: + + remove uneeded gnome-common build-dep (don't run autogen during build) + + bump clutk build-dep + + change maintainer field + * debian/rules: remove DEB_CONFIGURE_SCRIPT (don't run autogen) + + -- Didier Roche Thu, 21 Jan 2010 14:33:30 +0100 + +unity (0.1.5+r69) lucid; urgency=low + + * debian/rules: Fix the dpkg-gencontrol invocation. + + -- Martin Pitt Tue, 12 Jan 2010 17:55:44 +0100 + +unity (0.1.5+r68) lucid; urgency=low + + * debian/control: Add transitional netbook-launcher package, and have unity + C/R/P: netbook-launcher. This can be dropped after lucid's release. + * Add debian/unity.install (now needed because we build two binaries). + * debian/control: Explicitly add mutter dependency, since it's not covered + by shlibs. + * Add debian/unity.preinst: Remove netbook-launcher autostart .desktop + conffile on upgrade. + * debian/rules: Don't generate shlibs/maintainer script code for private + shared libraries. + * debian/rules: Force an epoch on the transitional netbook-launcher package, + since the original package has a higher version. + + -- Martin Pitt Tue, 12 Jan 2010 17:25:43 +0100 + +unity (0.1.5+r60) lucid; urgency=low + + * configure with libmutter-dev + + -- Didier Roche Tue, 12 Jan 2010 14:23:23 +0100 + +unity (0.1.5+r58) lucid; urgency=low + + * New release from trunk + * debian/control + - Add mutter as a dependency + + -- Didier Roche Tue, 12 Jan 2010 11:27:57 +0100 + +unity (0.1.5-0ubuntu2) lucid; urgency=low + + * debian/control + - Bumping build depends for libgee-dev to libgee-dev (>= 0.5.0) + + -- Ken VanDine Mon, 21 Dec 2009 21:31:19 -0500 + +unity (0.1.5-0ubuntu1) lucid; urgency=low + + * New snapshot + - Build-Depend on valac and libvala-dev (>= 0.7.8) + + -- Ken VanDine Fri, 18 Dec 2009 15:57:55 -0500 + +unity (0.1.5) karmic; urgency=low + + * New release + + -- Neil J. Patel Tue, 15 Dec 2009 12:24:03 +0000 + +unity (0.1.0~ppa2) karmic; urgency=low + + * debian/control + - Added build dep for valac + + -- Ken VanDine Fri, 06 Nov 2009 11:53:38 -0500 + +unity (0.1.0~ppa1) karmic; urgency=low + + * Initial Packaging (LP: #474944) + + -- Ken VanDine Fri, 06 Nov 2009 08:40:43 -0500 --- unity-7.0.2+13.10.20130705.1.orig/debian/unity-services.install +++ unity-7.0.2+13.10.20130705.1/debian/unity-services.install @@ -0,0 +1,3 @@ +usr/lib/unity/*service +usr/share/upstart +usr/share/man/*/unity-panel-service.1 --- unity-7.0.2+13.10.20130705.1.orig/debian/libunity-core-6.0-7.lintian-overrides +++ unity-7.0.2+13.10.20130705.1/debian/libunity-core-6.0-7.lintian-overrides @@ -0,0 +1 @@ +libunity-core-6.0-7: binary-or-shlib-defines-rpath --- unity-7.0.2+13.10.20130705.1.orig/debian/source_unity.py +++ unity-7.0.2+13.10.20130705.1/debian/source_unity.py @@ -0,0 +1,38 @@ +import apport.packaging +from apport.hookutils import * + +def add_info(report, ui): + + # for install from the ppa + if not apport.packaging.is_distro_package(report['Package'].split()[0]): + report['CrashDB'] = 'unity' + try: + version = packaging.get_version('unity') + except ValueError: + version = 'N/A' + if version is None: + version = 'N/A' + report['Tags'] += " rc-%s" % version + + # the crash is not in the unity code so reassign + if "Stacktrace" in report and "/usr/lib/indicators" in report["Stacktrace"]: + for words in report["Stacktrace"].split(): + if words.startswith("/usr/lib/indicators"): + report.add_package_info(apport.packaging.get_file_package(words)) + return + + # only reports all compiz infos if a graphical bug + compiz_bug = False + if ui and report['SourcePackage'] == "unity": + if ui.yesno("Thanks for reporting this bug on unity. Is the issue you are reporting purely graphical (will report more information about your graphic configuration and will report the bug against compiz)?"): + compiz_bug = True + if compiz_bug: + report.add_hooks_info(ui, srcpackage='compiz') + else: + # still send some info like the plugins activated + # Plugins + report['CompizPlugins'] = command_output(['gconftool-2', + '--get', '/apps/compiz-1/general/screen0/options/active_plugins']) + + # User configuration + report['GconfCompiz'] = command_output(['gconftool-2', '-R', '/apps/compiz-1']) --- unity-7.0.2+13.10.20130705.1.orig/debian/unity.migrations +++ unity-7.0.2+13.10.20130705.1/debian/unity.migrations @@ -0,0 +1 @@ +tools/migration-scripts/01_unity_change_dconf_path --- unity-7.0.2+13.10.20130705.1.orig/debian/unity-common.maintscript +++ unity-7.0.2+13.10.20130705.1/debian/unity-common.maintscript @@ -0,0 +1 @@ +rm_conffile /etc/compizconfig/upgrades/com.canonical.unity.unity.03.upgrade 6.6.0-0ubuntu2~ unity-common --- unity-7.0.2+13.10.20130705.1.orig/debian/unity.lintian-overrides +++ unity-7.0.2+13.10.20130705.1/debian/unity.lintian-overrides @@ -0,0 +1 @@ +unity: binary-or-shlib-defines-rpath --- unity-7.0.2+13.10.20130705.1.orig/debian/watch +++ unity-7.0.2+13.10.20130705.1/debian/watch @@ -0,0 +1,3 @@ +version=3 +opts=dversionmangle=s/daily.*// \ + https://launchpad.net/unity/+download .*/unity-([0-9.]+)\.tar\.(?:xz|bz2|gz) --- unity-7.0.2+13.10.20130705.1.orig/debian/unity7.conf +++ unity-7.0.2+13.10.20130705.1/debian/unity7.conf @@ -0,0 +1,22 @@ +description "Unity Shell v7" +author "Ted Gould " + +start on xsession SESSION=ubuntu and started gnome-settings-daemon +stop on desktop-end + +pre-start script + # If gnome-session is going to start compiz, + # we don't want to be the ones doing it. + + if grep -q compiz /usr/share/gnome-session/sessions/ubuntu.session ; then + echo "GNOME Session is starting Compiz" + stop ; exit 0 + fi +end script + +env COMPIZ_CONFIG_PROFILE="ubuntu" +export COMPIZ_CONFIG_PROFILE + +respawn +exec compiz + --- unity-7.0.2+13.10.20130705.1.orig/debian/copyright +++ unity-7.0.2+13.10.20130705.1/debian/copyright @@ -0,0 +1,53 @@ +This package was debianized by Didier Roche on +Tue, 09 Nov 2010 13:19:35 +0200. + +Upstream Authors: + + Neil Jagdish Patel + Gordon Allott + Mirco "MacSlow" Müller + Jay Taoko + Jason Smith + Sam Spilsbury + +Copyright: + + Copyright (C) 2009-2010 Canonical Ltd + +License: + + * (if not otherwise specified): + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License version 3 as + published by the Free Software Foundation. + + This program 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. + +On Debian/Ubuntu systems, the full text of the GPL v3 can be found in +`/usr/share/common-licenses/GPL-3' + + unity/*: + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License Version 3.0 as published by the Free Software Foundation. + + This library 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 + Lesser General Public License for more details. + +On Debian/Ubuntu systems, the full text of the LGPL v3 can be found in +`/usr/share/common-licenses/LGPL-3' + + +The Debian packaging is: + + Copyright (C) 2010 Didier Roche + +On Debian/Ubuntu systems, the full text of the GPL v3 can be found in +`/usr/share/common-licenses/GPL-3' --- unity-7.0.2+13.10.20130705.1.orig/debian/compat +++ unity-7.0.2+13.10.20130705.1/debian/compat @@ -0,0 +1 @@ +9 --- unity-7.0.2+13.10.20130705.1.orig/debian/scopes-recommends-generator +++ unity-7.0.2+13.10.20130705.1/debian/scopes-recommends-generator @@ -0,0 +1,27 @@ +#!/usr/bin/perl -w + +use strict; +binmode STDOUT, ":utf8"; +use utf8; + +use JSON; + +my $json; +{ + local $/; #Enable 'slurp' mode + open my $fh, "<", $ARGV[0]; + $json = <$fh>; + close $fh; +} +# get it to a scalar +my $j = "[" . $json . "]"; + +my $decoded_json = decode_json( $j ); + +my $recommends_list = ""; +for my $record ( @$decoded_json ) { + foreach my $key ( keys(%$record) ) { + $recommends_list = $recommends_list . $key . ", "; + } +} +print $recommends_list; --- unity-7.0.2+13.10.20130705.1.orig/debian/rules +++ unity-7.0.2+13.10.20130705.1/debian/rules @@ -0,0 +1,60 @@ +#!/usr/bin/make -f +# -*- makefile -*- + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 +DEB_HOST_ARCH := $(shell dpkg-architecture -qDEB_HOST_ARCH) +DEB_HOST_GNU_TYPE := $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +gles2_architectures := armel armhf + +DEB_VERSION := $(shell dpkg-parsechangelog | egrep '^Version:' | cut -f 2 -d ' ') + +CFLAGS=$(shell echo $$CFLAGS | sed -e 's/\-Wall//') + +# http://ccache.samba.org/manual.html#_precompiled_headers +CCACHE_SLOPPINESS=time_macros + +CORE_ABIVERSION := $(shell sed -rn 's/^\#define[[:space:]]+CORE_ABIVERSION[[:space:]]+//p' /usr/include/compiz/core/abiversion.h ) +NUX_ABIVERSION := $(shell sed -rn 's/^\#define[[:space:]]+NUX_ABIVERSION[[:space:]]+//p' /usr/include/Nux-4.0/Nux/ABI.h ) + +LIBUNITY_PRIVATE := $(shell pkg-config --libs-only-L unity-protocol-private | sed -e 's/-L\(.*\)/\1/' ) + +SCOPES_RECOMMENDS := $(shell perl debian/scopes-recommends-generator /usr/share/unity/client-scopes.json) + + +override_dh_auto_configure: +ifeq ($(DEB_HOST_ARCH),$(findstring $(DEB_HOST_ARCH), $(gles2_architectures))) + dh_auto_configure -- -DUSE_GSETTINGS=TRUE -DCOMPIZ_BUILD_WITH_RPATH=FALSE -DCOMPIZ_PACKAGING_ENABLED=TRUE -DCOMPIZ_PLUGIN_INSTALL_TYPE=package -DBUILD_GLES=TRUE -DDISABLE_MAINTAINER_CFLAGS=ON +else + dh_auto_configure -- -DUSE_GSETTINGS=TRUE -DCOMPIZ_BUILD_WITH_RPATH=FALSE -DCOMPIZ_PACKAGING_ENABLED=TRUE -DCOMPIZ_PLUGIN_INSTALL_TYPE=package +endif + +override_dh_install: + # install autopilot tests + cd tests/autopilot; \ + set -ex; for python in $(shell pyversions -r); do \ + $$python setup.py install --root=$(CURDIR)/debian/tmp --install-layout=deb; \ + done; \ + cd $(CURDIR) + find debian/tmp/usr/lib -name \*.*a -exec rm {} \; + rm -f debian/tmp/usr/share/compiz/networkarearegion.xml + rm -f debian/tmp//usr/lib/compiz/libnetworkarearegion.so + rm -f debian/tmp/usr/share/compiz/unitydialog.xml + rm -f debian/tmp/usr/lib/compiz/libunitydialog.so + rm -rf debian/tmp/usr/share/gconf/schemas/ + dh_install --fail-missing + +override_dh_gencontrol: + dh_gencontrol -- -Vcoreabiversion=$(CORE_ABIVERSION) -Vnuxabiversion=$(NUX_ABIVERSION) -Vunity-default-masterscopes="$(SCOPES_RECOMMENDS)" + +override_dh_makeshlibs: + dh_makeshlibs -plibunity-core-6.0-7 -V 'libunity-core-6.0-7 (>= 7.0.0)' + +override_dh_shlibdeps: + dh_shlibdeps -l$(LIBUNITY_PRIVATE) -O--parallel + +override_dh_auto_test: + make -C obj-$(DEB_HOST_GNU_TYPE) check-headless + +%: + dh $@ --with translations,quilt,python2,migrations --parallel --- unity-7.0.2+13.10.20130705.1.orig/debian/unity-autopilot.install +++ unity-7.0.2+13.10.20130705.1/debian/unity-autopilot.install @@ -0,0 +1 @@ +usr/lib/python*/*/unity* --- unity-7.0.2+13.10.20130705.1.orig/debian/libunity-core-6.0-7.install +++ unity-7.0.2+13.10.20130705.1/debian/libunity-core-6.0-7.install @@ -0,0 +1,10 @@ +usr/lib/libunity-core*.so.* +usr/lib/unity/*.py +usr/share/ccsm +usr/share/glib-2.0 +usr/share/gnome-control-center/ +usr/share/unity +debian/unity-crashdb.conf etc/apport/crashdb.conf.d/ +debian/source_unity.py usr/share/apport/package-hooks +debian/unity7.conf usr/share/upstart/sessions +tools/convert-files/* usr/lib/compiz/migration/ --- unity-7.0.2+13.10.20130705.1.orig/debian/unity.install +++ unity-7.0.2+13.10.20130705.1/debian/unity.install @@ -0,0 +1,5 @@ +usr/bin +usr/lib/compiz +usr/share/man/*/unity.1 +usr/share/compiz +usr/share/locale --- unity-7.0.2+13.10.20130705.1.orig/debian/libunity-core-6.0-dev.install +++ unity-7.0.2+13.10.20130705.1/debian/libunity-core-6.0-dev.install @@ -0,0 +1,3 @@ +usr/include/ +usr/lib/pkgconfig/ +usr/lib/libunity-core*.so --- unity-7.0.2+13.10.20130705.1.orig/debian/unity-crashdb.conf +++ unity-7.0.2+13.10.20130705.1/debian/unity-crashdb.conf @@ -0,0 +1,5 @@ +unity = { + 'impl' : 'launchpad', + 'project' : 'unity', + 'bug_pattern_url' : None, + } --- unity-7.0.2+13.10.20130705.1.orig/debian/control +++ unity-7.0.2+13.10.20130705.1/debian/control @@ -0,0 +1,243 @@ +Source: unity +Section: gnome +Priority: optional +Maintainer: Ubuntu Developers +Build-Depends: cmake, + debhelper (>= 9.0.0~), + dh-translations (>= 94), + dh-migrations, + pkg-config, + python (>= 2.7), + python-setuptools, + libjson-perl, + quilt, + intltool (>= 0.35.0), + libsigc++-2.0-dev, + libgee-dev (>= 0.5.0), + libunique-dev, + libbamf3-dev (>= 0.5.0+13.10.20130626), + gsettings-desktop-schemas-dev, + libglib2.0-dev (>= 2.30), + libdbusmenu-glib-dev (>= 0.3.91), + libgtk-3-dev (>= 3.1), + libcairo2-dev, + libpango1.0-dev, + libdee-dev (>= 1.0.0), + libindicator-dev (>= 0.12.2), + libindicator3-dev (>= 0.12.2), + libido3-0.1-dev (>= 13.10.0), + libunity-misc-dev (>= 4.0.4), + libgrail-dev (>= 1.0.20), + libxcb-icccm4-dev, + libnux-4.0-dev (>= 4.0.2), + compiz-dev (>= 1:0.9.9~daily13.01.25bzr3586), + libcompizconfig0-dev (>= 1:0.9.9~daily12.12.05-0ubuntu2), + xsltproc, + libboost-dev, + libboost-serialization-dev, + libnotify-dev, + libstartup-notification0-dev, + libatk1.0-dev, + libjson-glib-dev, + libgeis-dev (>= 2.0.10), + libunity-dev (>= 7.0.2), + libunity-scopes-json-def-desktop, + libzeitgeist-dev (>= 0.3.18), + libxfixes-dev (>= 1:5.0.1-1), + libxi-dev (>= 2:1.7.1.901), + libxpathselect-dev (>=1.3), + libgtest-dev, + google-mock (>= 1.6.0+svn437), +Standards-Version: 3.9.3 +Homepage: https://launchpad.net/unity +# If you aren't a member of ~unity-team but need to upload packaging changes, +# just go ahead. ~unity-team will notice and sync up the code again. +Vcs-Bzr: https://code.launchpad.net/~unity-team/unity/trunk + +Package: unity +Architecture: any +Depends: ${shlibs:Depends}, + ${misc:Depends}, + ${python:Depends}, + libunity-core-6.0-7 (= ${binary:Version}), + compiz, + compiz-core, compiz-core-abiversion-${coreabiversion}, + libnux-abiversion-${nuxabiversion}, + compiz-plugins-default, + libglib2.0-bin, + python-gconf, + nux-tools, + dconf-cli, + unity-asset-pool (>= 0.8.18), + bamfdaemon, + libxfixes3 (>= 1:5.0.1-1), + libxi6 (>= 2:1.7.1.901), +Provides: indicator-renderer +Recommends: gnome-control-center-unity, + ${unity-default-masterscopes} + indicator-appmenu, + indicator-application, + indicator-sound, + indicator-bluetooth, + indicator-datetime, + indicator-messages, + indicator-printers, + indicator-power, + indicator-session, + indicator-sync, + hud, +Breaks: unity-lens-applications (<< 5.12.0-0ubuntu2), + unity-lens-files (<< 5.10.0-0ubuntu2), + unity-lens-music (<< 6.0.0), + unity-lens-video (<< 0.3.6-0ubuntu2), +Description: Interface designed for efficiency of space and interaction. + Unity is a desktop experience that sings. Designed by Canonical and the Ayatana + community, Unity is all about the combination of familiarity and the future. We + bring together visual design, analysis of user experience testing, modern + graphics technologies and a deep understanding of the free software landscape + to produce what we hope will be the lightest, most elegant and most delightful + way to use your PC. + +Package: unity-services +Architecture: any +Depends: ${shlibs:Depends}, + ${misc:Depends}, + upstart, +Description: Services for the Unity interface + Unity is a desktop experience that sings. Designed by Canonical and the Ayatana + community, Unity is all about the combination of familiarity and the future. We + bring together visual design, analysis of user experience testing, modern + graphics technologies and a deep understanding of the free software landscape + to produce what we hope will be the lightest, most elegant and most delightful + way to use your PC. + . + This package contains the dbus service used for unity. + +Package: libunity-core-6.0-7 +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, + ${misc:Depends}, + unity-services (= ${binary:Version}), +Conflicts: unity-common, libunity-core-6.0-6 +Replaces: unity-common, libunity-core-6.0-6 +Provides: unity-common +Description: Core library for the Unity interface. + Unity is a desktop experience that sings. Designed by Canonical and the Ayatana + community, Unity is all about the combination of familiarity and the future. We + bring together visual design, analysis of user experience testing, modern + graphics technologies and a deep understanding of the free software landscape + to produce what we hope will be the lightest, most elegant and most delightful + way to use your PC. + . + This package contains shared libraries to be used by unity-3d. + +Package: libunity-core-6.0-dev +Section: libdevel +Architecture: any +Depends: ${misc:Depends}, + libunity-core-6.0-7 (= ${binary:Version}), + libglib2.0-dev, + libsigc++-2.0-dev, + libnux-4.0-dev (>= 4.0.2), + libunity-dev (>= 7.0.2~), + libdee-dev, +Description: Core library for the Unity interface - development files + Unity is a desktop experience that sings. Designed by Canonical and the Ayatana + community, Unity is all about the combination of familiarity and the future. We + bring together visual design, analysis of user experience testing, modern + graphics technologies and a deep understanding of the free software landscape + to produce what we hope will be the lightest, most elegant and most delightful + way to use your PC. + . + This package contains development files for libraries to be used by unity. + +Package: unity-autopilot +Section: python +Architecture: all +Depends: ${misc:Depends}, + ${python:Depends}, + autopilot-desktop, + python-windowmocker, + gir1.2-appindicator3-0.1, + gir1.2-dee-1.0, + gir1.2-glib-2.0, + gir1.2-ibus-1.0, + gir1.2-unity-5.0, + python-compizconfig, + python-dbus, + python-testtools, + python-xdg, + python-xlib, + libxpathselect1.3 (>= 1.3), +Description: Autopiloted tests for Unity + We test Unity automatically through autopilot, a framework which enables us + to trigger keyboard and mouse events on the fly as well as introspecting + objects. This package contains the specific unity introspection bindings + to be able to write tests in python as well as the full test suite for Unity. + +Package: unity-2d +Depends: unity, ${misc:Depends} +Architecture: all +Section: oldlibs +Description: transitional dummy package + This is a transitional dummy package for unity-2d -> unity migration. + It can safely be removed. + +Package: libunity-2d-private0 +Depends: unity, ${misc:Depends} +Architecture: all +Section: oldlibs +Description: transitional dummy package + This is a transitional dummy package for unity-2d -> unity migration. + It can safely be removed. + +Package: libunity-2d-private-dev +Depends: unity, ${misc:Depends} +Architecture: all +Section: oldlibs +Description: transitional dummy package + This is a transitional dummy package for unity-2d -> unity migration. + It can safely be removed. + +Package: unity-2d-panel +Depends: unity, ${misc:Depends} +Architecture: all +Section: oldlibs +Description: transitional dummy package + This is a transitional dummy package for unity-2d -> unity migration. + It can safely be removed. + +Package: unity-2d-spread +Depends: unity, ${misc:Depends} +Architecture: all +Section: oldlibs +Description: transitional dummy package + This is a transitional dummy package for unity-2d -> unity migration. + It can safely be removed. + +Package: unity-2d-common +Depends: unity, ${misc:Depends} +Architecture: all +Section: oldlibs +Description: transitional dummy package + This is a transitional dummy package for unity-2d -> unity migration. + It can safely be removed. + +Package: unity-2d-shell +Depends: unity, ${misc:Depends} +Architecture: all +Section: oldlibs +Description: transitional dummy package + This is a transitional dummy package for unity-2d -> unity migration. + It can safely be removed. + +Package: unity-2d-dbg +Priority: extra +Depends: unity, ${misc:Depends} +Architecture: all +Section: oldlibs +Description: transitional dummy package + This is a transitional dummy package for unity-2d -> unity migration. + It can safely be removed. + --- unity-7.0.2+13.10.20130705.1.orig/tests/CMakeLists.txt +++ unity-7.0.2+13.10.20130705.1/tests/CMakeLists.txt @@ -77,12 +77,10 @@ enable_testing() # :( -find_library (GMOCK_LIB gmock) -find_library (GMOCK_MAIN_LIB gmock_main) -find_path(GTEST_SRC_DIR gtest.cc PATHS /usr/src/gtest/src) - -if (GTEST_SRC_DIR AND - GMOCK_LIB AND +set(GMOCK_LIB gmock) +set(GMOCK_MAIN_LIB gmock_main) + +if (GMOCK_LIB AND GMOCK_MAIN_LIB) # MockWindowManager @@ -351,8 +349,7 @@ panel-lib) add_test(UnityGTest test-gtest) endif (ENABLE_X_SUPPORT) -endif (GTEST_SRC_DIR AND - GMOCK_LIB AND +endif (GMOCK_LIB AND GMOCK_MAIN_LIB) if(ENABLE_X_SUPPORT) @@ -388,7 +385,7 @@ #&& ${GTEST_TEST_COMMAND_DBUS} --gtest_output=xml:./ && echo "Warning, DBus test cases are disabled!!") -if (GTEST_SRC_DIR) +if (GTEST_ROOT_DIR) if (ENABLE_X_SUPPORT) add_custom_target (check COMMAND ${TEST_COMMAND} DEPENDS test-unit test-gtest test-gtest-slow test-gtest-xless test-gtest-dbus test-gestures) add_custom_target (check-headless COMMAND ${TEST_COMMAND_HEADLESS} DEPENDS test-gtest-xless test-gtest-dbus test-gestures) @@ -399,9 +396,9 @@ add_custom_target (gcheck COMMAND ${DBUS_TEST_COMMAND} DEPENDS test-gtest-xless) endif () add_custom_target (check-report COMMAND ${TEST_UNIT_COMMAND} && gtester-report ${TEST_RESULT_XML} > ${TEST_RESULT_HTML}) -else (GTEST_SRC_DIR) +else (GTEST_ROOT_DIR) add_custom_target (check COMMAND ${TEST_COMMAND} DEPENDS test-unit) -endif (GTEST_SRC_DIR) +endif (GTEST_ROOT_DIR) # make target to allow devs to run "make autopilot" from build dir: set (AUTOPILOTDIR "${CMAKE_CURRENT_SOURCE_DIR}/autopilot") # Rules to install autopilot files and executable script: --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/unity.egg-info/SOURCES.txt +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/unity.egg-info/SOURCES.txt @@ -0,0 +1,51 @@ +README +setup.py +unity/__init__.py +unity.egg-info/PKG-INFO +unity.egg-info/SOURCES.txt +unity.egg-info/dependency_links.txt +unity.egg-info/top_level.txt +unity/emulators/X11.py +unity/emulators/__init__.py +unity/emulators/compiz.py +unity/emulators/dash.py +unity/emulators/hud.py +unity/emulators/icons.py +unity/emulators/launcher.py +unity/emulators/panel.py +unity/emulators/quicklist.py +unity/emulators/screen.py +unity/emulators/shortcut_hint.py +unity/emulators/switcher.py +unity/emulators/tooltip.py +unity/emulators/unity.py +unity/emulators/window_manager.py +unity/emulators/workspace.py +unity/tests/__init__.py +unity/tests/test_command_lens.py +unity/tests/test_dash.py +unity/tests/test_gobject_introspection.py +unity/tests/test_home_lens.py +unity/tests/test_hud.py +unity/tests/test_ibus.py +unity/tests/test_panel.py +unity/tests/test_quicklist.py +unity/tests/test_search.py +unity/tests/test_shopping_lens.py +unity/tests/test_shortcut_hint.py +unity/tests/test_showdesktop.py +unity/tests/test_spread.py +unity/tests/test_switcher.py +unity/tests/test_unity_logging.py +unity/tests/launcher/__init__.py +unity/tests/launcher/test_capture.py +unity/tests/launcher/test_icon_behavior.py +unity/tests/launcher/test_keynav.py +unity/tests/launcher/test_reveal.py +unity/tests/launcher/test_scroll.py +unity/tests/launcher/test_shortcut.py +unity/tests/launcher/test_switcher.py +unity/tests/launcher/test_tooltips.py +unity/tests/launcher/test_visual.py +unity/tests/xim/__init__.py +unity/tests/xim/test_gcin.py \ No newline at end of file --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/unity.egg-info/PKG-INFO +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/unity.egg-info/PKG-INFO @@ -0,0 +1,10 @@ +Metadata-Version: 1.0 +Name: unity +Version: 1.0 +Summary: Unity autopilot tests. +Home-page: https://launchpad.net/unity +Author: Alex Launi +Author-email: alex.launi@canonical.com +License: GPLv3 +Description: UNKNOWN +Platform: UNKNOWN --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/unity.egg-info/dependency_links.txt +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/unity.egg-info/dependency_links.txt @@ -0,0 +1 @@ + --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/unity.egg-info/top_level.txt +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/unity.egg-info/top_level.txt @@ -0,0 +1 @@ +unity --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/tooltip.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/tooltip.py @@ -0,0 +1,16 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Andrea Azzarone +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. +# + +from __future__ import absolute_import + +from unity.emulators import UnityIntrospectionObject + + +class ToolTip(UnityIntrospectionObject): + """Represents a tooltip.""" --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/panel.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/panel.py @@ -0,0 +1,352 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Marco Trevisan (Treviño) +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. +# + +from __future__ import absolute_import + +import logging +from time import sleep + +from autopilot.input import Mouse +from autopilot.keybindings import KeybindingsHelper + +from unity.emulators import UnityIntrospectionObject +logger = logging.getLogger(__name__) + + +class PanelController(UnityIntrospectionObject): + """The PanelController class.""" + + def get_panel_for_monitor(self, monitor_num): + """Return an instance of panel for the specified monitor, or None.""" + panels = self.get_children_by_type(UnityPanel, monitor=monitor_num) + assert(len(panels) == 1) + return panels[0] + + def get_active_panel(self): + """Return the active panel, or None.""" + panels = self.get_children_by_type(UnityPanel, active=True) + assert(len(panels) == 1) + return panels[0] + + def get_active_indicator(self): + for panel in self.get_panels: + active = panel.get_active_indicator() + if active: + return active + + return None + + @property + def get_panels(self): + """Return the available panels, or None.""" + return self.get_children_by_type(UnityPanel) + + +class UnityPanel(UnityIntrospectionObject, KeybindingsHelper): + """An individual panel for a monitor.""" + + def __init__(self, *args, **kwargs): + super(UnityPanel, self).__init__(*args, **kwargs) + self._mouse = Mouse.create() + + def __get_menu_view(self): + """Return the menu view.""" + menus = self.get_children_by_type(MenuView) + assert(len(menus) == 1) + return menus[0] + + def __get_window_buttons(self): + """Return the window buttons view.""" + buttons = self.menus.get_children_by_type(WindowButtons) + assert(len(buttons) == 1) + return buttons[0] + + def __get_grab_area(self): + """Return the panel grab area.""" + grab_areas = self.menus.get_children_by_type(GrabArea) + assert(len(grab_areas) == 1) + return grab_areas[0] + + def __get_indicators_view(self): + """Return the menu view.""" + indicators = self.get_children_by_type(Indicators) + assert(len(indicators) == 1) + return indicators[0] + + def move_mouse_below_the_panel(self): + """Places the mouse to bottom of this panel.""" + (x, y, w, h) = self.geometry + target_x = x + w / 2 + target_y = y + h + 10 + + logger.debug("Moving mouse away from panel.") + self._mouse.move(target_x, target_y) + + def move_mouse_over_menus(self): + """Move the mouse over the menu area for this panel.""" + (x, y, w, h) = self.menus.geometry + target_x = x + w / 2 + target_y = y + h / 2 + + # The menu view has bigger geometry than the real layout + menu_entries = self.menus.get_entries() + if len(menu_entries) > 0: + first_x = menu_entries[0].x + last_x = menu_entries[-1].x + menu_entries[-1].width / 2 + + target_x = first_x + (last_x - first_x) / 2 + + logger.debug("Moving mouse to center of menu area.") + self._mouse.move(target_x, target_y) + + def move_mouse_over_grab_area(self): + """Move the mouse over the grab area for this panel.""" + (x, y, w, h) = self.grab_area.geometry + target_x = x + w / 2 + target_y = y + h / 2 + + logger.debug("Moving mouse to center of grab area.") + self._mouse.move(target_x, target_y) + + def move_mouse_over_window_buttons(self): + """Move the mouse over the center of the window buttons area for this panel.""" + (x, y, w, h) = self.window_buttons.geometry + target_x = x + w / 2 + target_y = y + h / 2 + + logger.debug("Moving mouse to center of the window buttons.") + self._mouse.move(target_x, target_y) + + def move_mouse_over_indicators(self): + """Move the mouse over the center of the indicators area for this panel.""" + (x, y, w, h) = self.indicators.geometry + target_x = x + w / 2 + target_y = y + h / 2 + + logger.debug("Moving mouse to center of the indicators area.") + self._mouse.move(target_x, target_y) + + def get_indicator_entries(self, visible_only=True, include_hidden_menus=False): + """Returns a list of entries for this panel including both menus and indicators""" + entries = [] + if include_hidden_menus or self.menus_shown: + entries = self.menus.get_entries() + entries += self.indicators.get_ordered_entries(visible_only) + return entries + + def get_active_indicator(self): + """Returns the indicator entry that is currently active""" + entries = self.get_indicator_entries(False, True) + entries = filter(lambda e: e.active == True, entries) + assert(len(entries) <= 1) + return entries[0] if entries else None + + def get_indicator_entry(self, entry_id): + """Returns the indicator entry for the given ID or None""" + entries = self.get_indicator_entries(False, True) + entries = filter(lambda e: e.entry_id == entry_id, entries) + assert(len(entries) <= 1) + return entries[0] if entries else None + + @property + def title(self): + return self.menus.panel_title + + @property + def desktop_is_active(self): + return self.menus.desktop_active + + @property + def menus_shown(self): + return self.active and self.menus.draw_menus + + @property + def window_buttons_shown(self): + return self.menus.draw_window_buttons + + @property + def window_buttons(self): + return self.__get_window_buttons() + + @property + def menus(self): + return self.__get_menu_view() + + @property + def grab_area(self): + return self.__get_grab_area() + + @property + def indicators(self): + return self.__get_indicators_view() + + @property + def geometry(self): + """Returns a tuple of (x,y,w,h) for the current panel.""" + return (self.x, self.y, self.width, self.height) + + +class MenuView(UnityIntrospectionObject): + """The Menu View class.""" + + def get_entries(self): + """Return a list of menu entries""" + entries = self.get_children_by_type(IndicatorEntry) + # We need to filter out empty entries, which are seperators - those + # are not valid, visible and working entries + # For instance, gedit adds some of those, breaking our tests + entries = [e for e in entries if (e.label != "")] + return entries + + def get_menu_by_label(self, entry_label): + """Return the first indicator entry found with the given label""" + indicators = self.get_children_by_type(IndicatorEntry, label=entry_label) + return indicators[0] if indicators else None + + @property + def geometry(self): + """Returns a tuple of (x,y,w,h) for the current menu view.""" + return (self.x, self.y, self.width, self.height) + + +class WindowButtons(UnityIntrospectionObject): + """The window buttons class""" + + def get_buttons(self, visible_only=True): + """Return a list of window buttons""" + if visible_only: + return self.get_children_by_type(WindowButton, visible=True) + else: + return self.get_children_by_type(WindowButton) + + def get_button(self, type): + buttons = self.get_children_by_type(WindowButton, type=type) + assert(len(buttons) == 1) + return buttons[0] + + @property + def visible(self): + return len(self.get_buttons()) != 0 + + @property + def close(self): + return self.get_button("Close") + + @property + def minimize(self): + return self.get_button("Minimize") + + @property + def unmaximize(self): + return self.get_button("Unmaximize") + + @property + def maximize(self): + return self.get_button("Maximize") + + @property + def geometry(self): + """Returns a tuple of (x,y,w,h) for the current panel.""" + return (self.x, self.y, self.width, self.height) + + +class WindowButton(UnityIntrospectionObject): + """The Window WindowButton class.""" + + def __init__(self, *args, **kwargs): + super(WindowButton, self).__init__(*args, **kwargs) + self._mouse = Mouse.create() + + def mouse_move_to(self): + target_x = self.x + self.width / 2 + target_y = self.y + self.height / 2 + self._mouse.move(target_x, target_y, rate=20, time_between_events=0.005) + + def mouse_click(self): + self.mouse_move_to() + sleep(.2) + self._mouse.click(press_duration=.1) + sleep(.01) + + @property + def geometry(self): + """Returns a tuple of (x,y,w,h) for the window button.""" + return (self.x, self.y, self.width, self.height) + + +class GrabArea(UnityIntrospectionObject): + """The grab area class""" + + @property + def geometry(self): + """Returns a tuple of (x,y,w,h) for the grab area.""" + return (self.x, self.y, self.width, self.height) + + +class Indicators(UnityIntrospectionObject): + """The Indicators View class.""" + + def get_ordered_entries(self, visible_only=True): + """Return a list of indicators, ordered by their priority""" + + if visible_only: + entries = self.get_children_by_type(IndicatorEntry, visible=True) + else: + entries = self.get_children_by_type(IndicatorEntry) + + return sorted(entries, key=lambda entry: entry.priority) + + def get_indicator_by_name_hint(self, name_hint): + """Return the IndicatorEntry with the name_hint""" + indicators = self.get_children_by_type(IndicatorEntry, name_hint=name_hint) + assert(len(indicators) == 1) + return indicators[0] + + @property + def geometry(self): + """Returns a tuple of (x,y,w,h) for the indicators area.""" + return (self.x, self.y, self.width, self.height) + + +class IndicatorEntry(UnityIntrospectionObject): + """The IndicatorEntry View class.""" + + def __init__(self, *args, **kwargs): + super(IndicatorEntry, self).__init__(*args, **kwargs) + self._mouse = Mouse.create() + + def mouse_move_to(self): + target_x = self.x + self.width / 2 + target_y = self.y + self.height / 2 + self._mouse.move(target_x, target_y, rate=20, time_between_events=0.005) + + def mouse_click(self, button=1): + self.mouse_move_to() + sleep(.2) + assert(self.visible) + self._mouse.click(press_duration=.1) + sleep(.01) + + @property + def geometry(self): + """Returns a tuple of (x,y,w,h) for the indicator entry.""" + return (self.x, self.y, self.width, self.height) + + @property + def menu_geometry(self): + """Returns a tuple of (x,y,w,h) for the opened menu geometry.""" + return (self.menu_x, self.menu_y, self.menu_width, self.menu_height) + + def __repr__(self): + with self.no_automatic_refreshing(): + return "" % (id(self), self.label) + + +class Tray(UnityIntrospectionObject): + """A panel tray object.""" --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/X11.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/X11.py @@ -0,0 +1,115 @@ +from __future__ import absolute_import + +from autopilot.utilities import Silence +from autopilot.display import Display +from autopilot.input import Mouse, Keyboard +from autopilot.process import Window + +import logging +import subprocess +from Xlib import X, display, protocol + + +logger = logging.getLogger(__name__) + +_display = None + +_blacklisted_drivers = ["NVIDIA"] + +def _get_display(): + """Get a Xlib display object. Creating the display prints garbage to stdout.""" + global _display + if _display is None: + with Silence(): + _display = display.Display() + return _display + +def _getProperty(_type, win=None): + if not win: + win = _get_display().screen().root + atom = win.get_full_property(_get_display().get_atom(_type), X.AnyPropertyType) + if atom: return atom.value + +def get_desktop_viewport(): + """Get the x,y coordinates for the current desktop viewport top-left corner.""" + return _getProperty('_NET_DESKTOP_VIEWPORT') + + +# Note: this use to exist within autopilot, moved here due to Autopilot 1.3 +# upgrade. +def drag_window_to_screen(window, screen): + """Drags *window* to *screen* + + :param autopilot.process.Window window: The window to drag + :param integer screen: The screen to drag the *window* to + :raises: **TypeError** if *window* is not a autopilot.process.Window + + """ + if not isinstance(window, Window): + raise TypeError("Window must be a autopilot.process.Window") + + if window.monitor == screen: + logger.debug("Window %r is already on screen %d." % (window.x_id, screen)) + return + + assert(not window.is_maximized) + (win_x, win_y, win_w, win_h) = window.geometry + (mx, my, mw, mh) = Display.create().get_screen_geometry(screen) + + logger.debug("Dragging window %r to screen %d." % (window.x_id, screen)) + + mouse = Mouse.create() + keyboard = Keyboard.create() + mouse.move(win_x + win_w/2, win_y + win_h/2) + keyboard.press("Alt") + mouse.press() + keyboard.release("Alt") + + # We do the movements in two steps, to reduce the risk of being + # blocked by the pointer barrier + target_x = mx + mw/2 + target_y = my + mh/2 + mouse.move(win_x, target_y, rate=20, time_between_events=0.005) + mouse.move(target_x, target_y, rate=20, time_between_events=0.005) + mouse.release() + + +# Note: this use to exist within autopilot, moved here due to Autopilot 1.3 +# upgrade. +def set_primary_monitor(monitor): + """Set *monitor* to be the primary monitor. + + :param int monitor: Must be between 0 and the number of configured + monitors. + :raises: **ValueError** if an invalid monitor is specified. + :raises: **BlacklistedDriverError** if your video driver does not + support this. + + """ + try: + glxinfo_out = subprocess.check_output("glxinfo") + except OSError, e: + raise OSError("Failed to run glxinfo: %s. (do you have mesa-utils installed?)" % e) + + for dri in _blacklisted_drivers: + if dri in glxinfo_out: + raise Display.BlacklistedDriverError('Impossible change the primary monitor for the given driver') + + num_monitors = Display.create().get_num_screens() + if monitor < 0 or monitor >= num_monitors: + raise ValueError('Monitor %d is not in valid range of 0 <= monitor < %d.' % (num_monitors)) + + default_screen = Gdk.Screen.get_default() + monitor_name = default_screen.get_monitor_plug_name(monitor) + + if not monitor_name: + raise ValueError('Could not get monitor name from monitor number %d.' % (monitor)) + + ret = os.spawnlp(os.P_WAIT, "xrandr", "xrandr", "--output", monitor_name, "--primary") + + if ret != 0: + raise RuntimeError('Xrandr can\'t set the primary monitor. error code: %d' % (ret)) + +def reset_display(): + from autopilot.input._X11 import reset_display + reset_display() --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/icons.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/icons.py @@ -0,0 +1,117 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Thomi Richards +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. +# + +from __future__ import absolute_import + +from unity.emulators import UnityIntrospectionObject +from unity.emulators.quicklist import Quicklist +from unity.emulators.tooltip import ToolTip + +class SimpleLauncherIcon(UnityIntrospectionObject): + """Holds information about a simple launcher icon. + + Do not instantiate an instance of this class yourself. Instead, use the + appropriate methods in the Launcher class instead. + + """ + + @property + def center_position(self): + """Get the center point of an icon, returns a tuple with (x, y, z).""" + return (self.center_x, self.center_y, self.center_z) + + def get_quicklist(self): + """Get the quicklist for this launcher icon. + + This may return None, if there is no quicklist associated with this + launcher icon. + + """ + matches = self.get_children_by_type(Quicklist) + return matches[0] if matches else None + + def get_tooltip(self): + """Get the tooltip for this launcher icon. + + This may return None, if there is no tooltip associated with this + launcher icon. + + """ + matches = self.get_children_by_type(ToolTip) + return matches[0] if matches else None + + def is_on_monitor(self, monitor): + """Returns True if the icon is available in the defined monitor.""" + if monitor >= 0 and monitor < len(self.monitors_visibility): + return self.monitors_visibility[monitor] + + return False + + def controls_window(self, xid): + """Returns true if the icon controls the specified xid.""" + + return self.xids.contains(xid) + + def __repr__(self): + with self.no_automatic_refreshing(): + return "<%s id=%d>" % (self.__class__.__name__, self.id) + + +class BFBLauncherIcon(SimpleLauncherIcon): + """Represents the BFB button in the launcher.""" + + +class ExpoLauncherIcon(SimpleLauncherIcon): + """Represents the Expo button in the launcher.""" + + +class HudLauncherIcon(SimpleLauncherIcon): + """Represents the HUD button in the launcher.""" + + +class ApplicationLauncherIcon(SimpleLauncherIcon): + """Represents a launcher icon with BAMF integration.""" + + def __repr__(self): + with self.no_automatic_refreshing(): + return "<%s %s id=%d>" % ( + self.__class__.__name__, + self.desktop_id, + self.id) + +class TrashLauncherIcon(SimpleLauncherIcon): + """Represents the trash launcher icon.""" + + +class DeviceLauncherIcon(SimpleLauncherIcon): + """Represents a device icon in the launcher.""" + + +class DesktopLauncherIcon(SimpleLauncherIcon): + """Represents an icon that may appear in the switcher.""" + + +class VolumeLauncherIcon(SimpleLauncherIcon): + """Represents a mounted disk icon in the launcher.""" + + +class SoftwareCenterLauncherIcon(ApplicationLauncherIcon): + """Represents a launcher icon of a Software Center app.""" + + +class HudEmbeddedIcon(UnityIntrospectionObject): + """Proxy object for the hud embedded icon child of the view.""" + + @property + def geometry(self): + return (self.x, self.y, self.width, self.height) + + +class LauncherEntry(UnityIntrospectionObject): + """Proxy for the LauncherEntryRemote instances in Unity.""" --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/shortcut_hint.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/shortcut_hint.py @@ -0,0 +1,59 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Marco Trevisan (Treviño) +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. +# + +from __future__ import absolute_import + +import logging + +from autopilot.keybindings import KeybindingsHelper + +from unity.emulators import UnityIntrospectionObject + +logger = logging.getLogger(__name__) + +class ShortcutView(UnityIntrospectionObject): + """Proxy object for the shortcut view child of the controller.""" + +class ShortcutController(UnityIntrospectionObject, KeybindingsHelper): + """ShortcutController proxy class.""" + + def get_shortcut_view(self): + views = self.get_children_by_type(ShortcutView) + return views[0] if views else None + + def show(self): + """Push the keys necessary to reveal the shortcut hint, but don't block.""" + logger.debug("Revealing shortcut hint with keyboard.") + self.keybinding_hold("shortcuthint/reveal") + + def ensure_visible(self): + """Block until the shortcut hint is visible.""" + if not self.visible: + logger.debug("Revealing shortcut hint with keyboard.") + self.keybinding_hold("shortcuthint/reveal") + self.visible.wait_for(True) + + def hide(self): + """Release the keys keeping the shortcut hint open, but don't block.""" + logger.debug("Un-revealing shortcut hint with keyboard.") + self.keybinding_release("shortcuthint/reveal") + + def ensure_hidden(self): + """Block until the shortcut hint is hidden.""" + if self.visible: + logger.debug("Un-revealing shortcut hint with keyboard.") + self.keybinding_release("shortcuthint/reveal") + self.visible.wait_for(False) + + def cancel(self): + logger.debug("Hide the shortcut hint with keyboard, without releasing the reveal key.") + self.keybinding("shortcuthint/cancel") + + def get_show_timeout(self): + return self.timeout_duration / 1000.0 --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/compiz.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/compiz.py @@ -0,0 +1,63 @@ +from __future__ import absolute_import + +"""Functions that wrap compizconfig to avoid some unpleasantness in that module.""" + +from __future__ import absolute_import + +from autopilot.utilities import Silence + +_global_context = None + +def get_global_context(): + """Get the compizconfig global context object.""" + global _global_context + if _global_context is None: + with Silence(): + from compizconfig import Context + _global_context = Context() + return _global_context + + +def _get_plugin(plugin_name): + """Get a compizconfig plugin with the specified name. + + Raises KeyError of the plugin named does not exist. + + """ + ctx = get_global_context() + with Silence(): + try: + return ctx.Plugins[plugin_name] + except KeyError: + raise KeyError("Compiz plugin '%s' does not exist." % (plugin_name)) + + +def get_compiz_setting(plugin_name, setting_name): + """Get a compiz setting object. + + *plugin_name* is the name of the plugin (e.g. 'core' or 'unityshell') + *setting_name* is the name of the setting (e.g. 'alt_tab_timeout') + + :raises: KeyError if the plugin or setting named does not exist. + + :returns: a compiz setting object. + + """ + plugin = _get_plugin(plugin_name) + with Silence(): + try: + return plugin.Screen[setting_name] + except KeyError: + raise KeyError("Compiz setting '%s' does not exist in plugin '%s'." % (setting_name, plugin_name)) + + +def get_compiz_option(plugin_name, setting_name): + """Get a compiz setting value. + + This is the same as calling: + + >>> get_compiz_setting(plugin_name, setting_name).Value + + """ + return get_compiz_setting(plugin_name, setting_name).Value + --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/workspace.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/workspace.py @@ -0,0 +1,89 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Thomi Richards +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. +# + +from __future__ import absolute_import + +from autopilot.keybindings import KeybindingsHelper +from autopilot.display import Display + +from unity.emulators.compiz import get_compiz_option +from unity.emulators.X11 import get_desktop_viewport + + +class WorkspaceManager(KeybindingsHelper): + """Class to manage switching to different workspaces.""" + + def __init__(self): + super(WorkspaceManager, self).__init__() + self.refresh_workspace_information() + + @property + def num_workspaces(self): + """The number of workspaces configured.""" + return self._workspaces_wide * self._workspaces_high + + @property + def current_workspace(self): + """The current workspace number. 0 <= x < num_workspaces.""" + vx,vy = get_desktop_viewport() + return self._coordinates_to_vp_number(vx, vy) + + def refresh_workspace_information(self): + """Re-read information about available workspaces from compiz and X11.""" + self._workspaces_wide = get_compiz_option("core", "hsize") + self._workspaces_high = get_compiz_option("core", "vsize") + # Note: only gets the viewport for the first monitor. + _, _, self._viewport_width, self._viewport_height = Display.create().get_screen_geometry(0) + + def switch_to(self, workspace_num): + """Switch to the workspace specified. + + ValueError is raised if workspace_num is outside 0<= workspace_num < num_workspaces. + + """ + if workspace_num < 0 or workspace_num >= self.num_workspaces: + raise ValueError("Workspace number must be between 0 and %d" % self.num_workspaces) + + current_row, current_col = self._vp_number_to_row_col(self.current_workspace) + target_row, target_col = self._vp_number_to_row_col(workspace_num) + lefts = rights = ups = downs = 0 + if current_col > target_col: + lefts = current_col - target_col + else: + rights = target_col - current_col + if current_row > target_row: + ups = current_row - target_row + else: + downs = target_row - current_row + + for i in range(lefts): + self.keybinding("workspace/move_left") + for i in range(rights): + self.keybinding("workspace/move_right") + for i in range(ups): + self.keybinding("workspace/move_up") + for i in range(downs): + self.keybinding("workspace/move_down") + + def _coordinates_to_vp_number(self, vx, vy): + """Translate viewport coordinates to a viewport number.""" + row,col = self._coordinates_to_row_col(vx, vy) + return (row * self._workspaces_wide) + col + + def _coordinates_to_row_col(self, vx, vy): + """Translate viewport coordinates to viewport row,col.""" + row = vy / self._viewport_height + col = vx / self._viewport_width + return (row,col) + + def _vp_number_to_row_col(self, vp_number): + """Translate a viewport number to a viewport row/col.""" + row = vp_number / self._workspaces_wide + col = vp_number % self._workspaces_wide + return (row,col) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/quicklist.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/quicklist.py @@ -0,0 +1,103 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Thomi Richards +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. +# + +from __future__ import absolute_import + +import logging + +from autopilot.input import Mouse + +from unity.emulators import UnityIntrospectionObject + +logger = logging.getLogger(__name__) + + +class Quicklist(UnityIntrospectionObject): + """Represents a quicklist.""" + + @property + def items(self): + """Individual items in the quicklist.""" + return self.get_children_by_type(QuicklistMenuItem, visible=True) + + @property + def selectable_items(self): + """Items that can be selected in the quicklist.""" + return self.get_children_by_type(QuicklistMenuItem, visible=True, selectable=True) + + def get_quicklist_item_by_text(self, text): + """Returns a QuicklistMenuItemLabel object with the given text, or None.""" + if not self.active: + raise RuntimeError("Cannot get quicklist items. Quicklist is inactive!") + + matches = self.get_children_by_type(QuicklistMenuItemLabel, text=text) + + return matches[0] if matches else None + + def get_quicklist_application_item(self, application_name): + """Returns the QuicklistMenuItemLabel for the given application_name""" + return self.get_quicklist_item_by_text(""+application_name+"") + + def click_item(self, item): + """Click one of the quicklist items.""" + if not isinstance(item, QuicklistMenuItem): + raise TypeError("Item must be a subclass of QuicklistMenuItem") + + item.mouse_click() + + def move_mouse_to_right(self): + """Moves the mouse outside the quicklist""" + logger.debug("Moving mouse outside the quicklist %r", self) + target_x = self.x + self.width + 10 + target_y = self.y + self.height / 2 + Mouse.create().move(target_x, target_y, animate=False) + + @property + def selected_item(self): + items = self.get_children_by_type(QuicklistMenuItem, selected=True) + assert(len(items) <= 1) + return items[0] if items else None + + @property + def geometry(self): + """Returns a tuple of (x,y,w,h) for the quicklist.""" + return (self.x, self.y, self.width, self.height) + + +class QuicklistMenuItem(UnityIntrospectionObject): + """Represents a single item in a quicklist.""" + + def __init__(self, *args, **kwargs): + super(QuicklistMenuItem, self).__init__(*args, **kwargs) + self._mouse = Mouse.create() + + @property + def geometry(self): + """Returns a tuple of (x,y,w,h) for the quicklist item.""" + return (self.x, self.y, self.width, self.height) + + def mouse_move_to(self): + assert(self.visible) + logger.debug("Moving mouse over quicklist item %r", self) + target_x = self.x + self.width / 2 + target_y = self.y + self.height / 2 + self._mouse.move(target_x, target_y, rate=20, time_between_events=0.005) + + def mouse_click(self, button=1): + logger.debug("Clicking on quicklist item %r", self) + self.mouse_move_to() + self._mouse.click() + + +class QuicklistMenuItemLabel(QuicklistMenuItem): + """Represents a text label inside a quicklist.""" + + +class QuicklistMenuItemSeparator(QuicklistMenuItem): + """Represents a separator in a quicklist.""" --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/dash.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/dash.py @@ -0,0 +1,609 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Thomi Richards +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. +# + +from __future__ import absolute_import + +from autopilot.input import Keyboard, Mouse + +from autopilot.keybindings import KeybindingsHelper +from testtools.matchers import GreaterThan + +from unity.emulators.panel import WindowButtons + +from unity.emulators import UnityIntrospectionObject +import logging +import dbus + +logger = logging.getLogger(__name__) + + +class DashController(UnityIntrospectionObject, KeybindingsHelper): + """The main dash controller object.""" + + def __init__(self, *args, **kwargs): + super(DashController, self).__init__(*args, **kwargs) + self.keyboard = Keyboard.create() + self.mouse = Mouse.create() + + def get_dash_view(self): + """Get the dash view that's attached to this controller.""" + return self.get_children_by_type(DashView)[0] + + def hide_dash_via_dbus(self): + """ Emulate a DBus call for dash hiding """ + dash_object = dbus.SessionBus().get_object('com.canonical.Unity', + '/com/canonical/Unity/Dash') + dash_iface = dbus.Interface(dash_object, 'com.canonical.Unity.Dash') + dash_iface.HideDash() + + @property + def view(self): + return self.get_dash_view() + + def toggle_reveal(self): + """ + Reveals the dash if it's currently hidden, hides it otherwise. + """ + old_state = self.visible + logger.debug("Toggling dash visibility with Super key.") + self.keybinding("dash/reveal", 0.1) + self.visible.wait_for(not old_state) + + def ensure_visible(self, clear_search=True): + """ + Ensures the dash is visible. + """ + if not self.visible: + self.toggle_reveal() + self.visible.wait_for(True) + if clear_search: + self.clear_search() + + def ensure_hidden(self): + """ + Ensures the dash is hidden. + """ + if self.visible: + self.toggle_reveal() + self.visible.wait_for(False) + + @property + def search_string(self): + return self.searchbar.search_string + + @property + def searchbar(self): + """Returns the searchbar attached to the dash.""" + return self.view.get_searchbar() + + @property + def preview_displaying(self): + """Returns true if the dash is currently displaying a preview""" + return self.view.preview_displaying; + + @property + def preview_animation(self): + """Returns the average progress of dash slip and animating a preview. + Between 0.0 and 1.0. + + """ + return self.view.preview_animation; + + def get_num_rows(self): + """Returns the number of displayed rows in the dash.""" + return self.view.num_rows + + def clear_search(self): + """Clear the contents of the search bar. + + Assumes dash is already visible, and search bar has keyboard focus. + + """ + self.keyboard.press_and_release("Ctrl+a") + self.keyboard.press_and_release("Delete") + self.search_string.wait_for("") + + def reveal_application_scope(self, clear_search=True): + """Reveal the application scope.""" + logger.debug("Revealing application scope with Super+a.") + self._reveal_scope("lens_reveal/apps", clear_search) + return self.view.get_scopeview_by_name("applications.scope") + + def reveal_music_scope(self, clear_search=True): + """Reveal the music scope.""" + logger.debug("Revealing music scope with Super+m.") + self._reveal_scope("lens_reveal/music", clear_search) + return self.view.get_scopeview_by_name("music.scope") + + def reveal_file_scope(self, clear_search=True): + """Reveal the file scope.""" + logger.debug("Revealing file scope with Super+f.") + self._reveal_scope("lens_reveal/files", clear_search) + return self.view.get_scopeview_by_name("files.scope") + + def reveal_video_scope(self, clear_search=True): + """Reveal the video scope""" + logger.debug("Revealing video scope with Super+v.") + self._reveal_scope("lens_reveal/video", clear_search) + return self.view.get_scopeview_by_name("video.scope") + + def reveal_command_scope(self, clear_search=True): + """Reveal the 'run command' scope.""" + logger.debug("Revealing command scope with Alt+F2.") + self._reveal_scope("lens_reveal/command", clear_search) + return self.view.get_scopeview_by_name("commands.scope") + + def _reveal_scope(self, binding_name, clear_search): + self.keybinding_hold(binding_name) + self.keybinding_tap(binding_name) + self.keybinding_release(binding_name) + self.visible.wait_for(True) + if clear_search: + self.clear_search() + + @property + def active_scope(self): + return self.view.get_scopebar().active_scope + + def get_current_scope(self): + """Get the currently-active ScopeView object.""" + active_scope_name = self.view.get_scopebar().active_scope + return self.view.get_scopeview_by_name(active_scope_name) + + @property + def geometry(self): + return (self.view.x, self.view.y, self.view.width, self.view.height) + + +class DashView(UnityIntrospectionObject): + """The dash view.""" + + def __get_window_buttons(self): + """Return the overlay window buttons view.""" + buttons = self.get_children_by_type(OverlayWindowButtons) + assert(len(buttons) == 1) + return buttons[0] + + def get_searchbar(self): + """Get the search bar attached to this dash view.""" + return self.get_children_by_type(SearchBar)[0] + + def get_scopebar(self): + """Get the scopebar attached to this dash view.""" + return self.get_children_by_type(ScopeBar)[0] + + def get_scopeview_by_name(self, scope_name): + """Get a ScopeView child object by it's name. For example, "home.scope".""" + scopes = self.get_children_by_type(ScopeView) + for scope in scopes: + if scope.name == scope_name: + return scope + + def get_preview_container(self): + """Get the preview container attached to this dash view.""" + preview_containers = self.get_children_by_type(PreviewContainer) + for preview_container in preview_containers: + return preview_container + return None + + @property + def window_buttons(self): + return self.__get_window_buttons().window_buttons() + + +class OverlayWindowButtons(UnityIntrospectionObject): + """The Overlay window buttons class""" + + def window_buttons(self): + buttons = self.get_children_by_type(WindowButtons) + assert(len(buttons) == 1) + return buttons[0] + +class SearchBar(UnityIntrospectionObject): + """The search bar for the dash view.""" + + +class ScopeBar(UnityIntrospectionObject): + """The bar of scope icons at the bottom of the dash.""" + def get_icon_by_name(self, name): + """Get a ScopeBarIcon child object by it's name. For example, 'home.scope'.""" + icons = self.get_children_by_type(ScopeBarIcon) + for icon in icons: + if icon.name == name: + return icon + +class ScopeBarIcon(UnityIntrospectionObject): + """A scope icon at the bottom of the dash.""" + + +class ScopeView(UnityIntrospectionObject): + """A Scope View.""" + + def get_groups(self): + """Get a list of all groups within this scopeview. May return an empty list.""" + groups = self.get_children_by_type(PlacesGroup) + return groups + + def get_focused_category(self): + """Return a PlacesGroup instance for the category whose header has keyboard focus. + + Returns None if no category headers have keyboard focus. + + """ + categories = self.get_children_by_type(PlacesGroup) + matches = [m for m in categories if m.header_has_keyfocus] + if matches: + return matches[0] + return None + + def get_category_by_name(self, category_name): + """Return a PlacesGroup instance with the given name, or None.""" + categories = self.get_children_by_type(PlacesGroup) + matches = [m for m in categories if m.name == category_name] + if matches: + return matches[0] + return None + + def get_num_visible_categories(self): + """Get the number of visible categories in this scope.""" + return len([c for c in self.get_children_by_type(PlacesGroup) if c.is_visible]) + + def get_filterbar(self): + """Get the filter bar for the current scope, or None if it doesn't have one.""" + bars = self.get_children_by_type(FilterBar) + if bars: + return bars[0] + return None + + +class PlacesGroup(UnityIntrospectionObject): + """A category in the scope view.""" + + def get_results(self): + """Get a list of all results within this category. May return an empty list.""" + result_view = self.get_children_by_type(ResultView)[0] + return result_view.get_children_by_type(Result) + + +class ResultView(UnityIntrospectionObject): + """Contains a list of Result objects.""" + + +class Result(UnityIntrospectionObject): + """A single result in the dash.""" + + def activate(self, double_click=True): + tx = self.x + (self.width / 2) + ty = self.y + (self.height / 2) + m = Mouse.create() + m.move(tx, ty) + m.click(1) + if double_click: + m.click(1) + + def preview(self, button=1): + tx = self.x + (self.width / 2) + ty = self.y + (self.height / 2) + m = Mouse.create() + m.move(tx, ty) + m.click(button) + + def preview_key(self): + tx = self.x + (self.width / 2) + ty = self.y + (self.height / 2) + m = Mouse.create() + m.move(tx, ty) + + k = Keyboard.create() + k.press_and_release('Menu') + +class FilterBar(UnityIntrospectionObject): + """A filterbar, as shown inside a lens.""" + + def get_num_filters(self): + """Get the number of filters in this filter bar.""" + filters = self.get_children_by_type(FilterExpanderLabel) + return len(filters) + + def get_focused_filter(self): + """Returns the id of the focused filter widget.""" + filters = self.get_children_by_type(FilterExpanderLabel) + for filter_label in filters: + if filter_label.expander_has_focus: + return filter_label + return None + + @property + def expanded(self): + """Return True if the filterbar on this scope is expanded, False otherwise. + """ + searchbar = self._get_searchbar() + return searchbar.showing_filters + + def ensure_expanded(self): + """Expand the filter bar, if it's not already.""" + if not self.expanded: + searchbar = self._get_searchbar() + tx = searchbar.filter_label_x + (searchbar.filter_label_width / 2) + ty = searchbar.filter_label_y + (searchbar.filter_label_height / 2) + m = Mouse.create() + m.move(tx, ty) + m.click() + self.expanded.wait_for(True) + + def ensure_collapsed(self): + """Collapse the filter bar, if it's not already.""" + if self.expanded: + searchbar = self._get_searchbar() + tx = searchbar.filter_label_x + (searchbar.filter_label_width / 2) + ty = searchbar.filter_label_y + (searchbar.filter_label_height / 2) + m = Mouse.create() + m.move(tx, ty) + m.click() + self.expanded.wait_for(False) + + def _get_searchbar(self): + """Get the searchbar. + + This hack exists because there's now more than one SearchBar in Unity, + and for some reason the FilterBar stuff is bundled in the SearchBar. + + """ + searchbar_state = self.get_state_by_path("//DashView/SearchBar") + assert(len(searchbar_state) == 1) + return self.make_introspection_object(searchbar_state[0]) + + +class FilterExpanderLabel(UnityIntrospectionObject): + """A label that expands into a filter within a filter bar.""" + + def ensure_expanded(self): + """Expand the filter expander label, if it's not already""" + if not self.expanded: + tx = self.x + self.width / 2 + ty = self.y + self.height / 2 + m = Mouse.create() + m.move(tx, ty) + m.click() + self.expanded.wait_for(True) + + def ensure_collapsed(self): + """Collapse the filter expander label, if it's not already""" + if self.expanded: + tx = self.x + self.width / 2 + ty = self.y + self.height / 2 + m = Mouse.create() + m.move(tx, ty) + m.click() + self.expanded.wait_for(False) + + +class CoverArt(UnityIntrospectionObject): + """A view which can be used to show a texture, or generate one using a thumbnailer.""" + + +class RatingsButton(UnityIntrospectionObject): + """A button which shows user rating as a function of stars.""" + + +class Preview(UnityIntrospectionObject): + """A preview of a dash scope result.""" + + def get_num_actions(self): + """Get the number of actions for the preview.""" + actions = self.get_children_by_type(ActionButton) + return len(actions) + + def get_action_by_id(self, action_id): + """Returns the action given it's action hint.""" + actions = self.get_children_by_type(ActionButton) + for action in actions: + if action.action == action_id: + return action + return None + + def execute_action_by_id(self, action_id): + """Executes an action given by the id.""" + action = self.get_action_by_id(action_id) + if action: + tx = action.x + (action.width / 2) + ty = action.y + (action.height / 2) + m = Mouse.create() + m.move(tx, ty) + m.click() + + @property + def cover_art(self): + return self.get_children_by_type(CoverArt) + + @property + def ratings_widget(self): + return self.get_children_by_type(PreviewRatingsWidget) + + @property + def info_hint_widget(self): + return self.get_children_by_type(PreviewInfoHintWidget) + + @property + def icon(self): + return self.get_children_by_type(IconTexture) + + @property + def text_boxes(self): + return self.get_children_by_type(StaticCairoText) + + +class ApplicationPreview(Preview): + """A application preview of a dash scope result.""" + +class GenericPreview(Preview): + """A generic preview of a dash scope result.""" + +class MusicPreview(Preview): + """A music preview of a dash scope result.""" + +class MoviePreview(Preview): + """A movie preview of a dash scope result.""" + +class PreviewContent(UnityIntrospectionObject): + """A preview content layout for the dash previews.""" + + def get_current_preview(self): + previews = self.get_children_by_type(Preview) + if len(previews) > 0: + return previews[0] + return None + + +class PreviewContainer(UnityIntrospectionObject): + """A container view for the main dash preview widget.""" + + @property + def content(self): + return self.get_content() + + def get_num_previews(self): + """Get the number of previews queued and current in the container.""" + previews = self.content.get_children_by_type(Preview) + return len(previews) + + def get_content(self): + """Get the preview content layout for the container.""" + return self.get_children_by_type(PreviewContent)[0] + + def get_left_navigator(self): + """Return the left navigator object""" + navigators = self.get_children_by_type(PreviewNavigator) + for nav in navigators: + if nav.direction == 2: + return nav + return None + + def get_right_navigator(self): + """Return the right navigator object""" + navigators = self.get_children_by_type(PreviewNavigator) + for nav in navigators: + if nav.direction == 3: + return nav + return None + + def navigate_left(self, count=1): + """Navigate preview left""" + navigator = self.get_left_navigator() + + tx = navigator.button_x + (navigator.button_width / 2) + ty = navigator.button_y + (navigator.button_height / 2) + m = Mouse.create() + m.move(tx, ty) + + old_preview_initiate_count = self.preview_initiate_count + + for i in range(count): + self.navigate_left_enabled.wait_for(True) + m.click() + self.preview_initiate_count.wait_for(GreaterThan(old_preview_initiate_count)) + old_preview_initiate_count = self.preview_initiate_count + + def navigate_right(self, count=1): + """Navigate preview right""" + navigator = self.get_right_navigator() + + tx = navigator.button_x + (navigator.button_width / 2) + ty = navigator.button_y + (navigator.button_height / 2) + m = Mouse.create() + m.move(tx, ty) + + old_preview_initiate_count = self.preview_initiate_count + + for i in range(count): + self.navigate_right_enabled.wait_for(True) + m.click() + self.preview_initiate_count.wait_for(GreaterThan(old_preview_initiate_count)) + old_preview_initiate_count = self.preview_initiate_count + + @property + def animating(self): + """Return True if the preview is animating, False otherwise.""" + return self.content.animating + + @property + def waiting_preview(self): + """Return True if waiting for a preview, False otherwise.""" + return self.content.waiting_preview + + @property + def animation_progress(self): + """Return the progress of the current preview animation.""" + return self.content.animation_progress + + @property + def current_preview(self): + """Return the current preview object.""" + return self.content.get_current_preview() + preview_initiate_count_ + + @property + def preview_initiate_count(self): + """Return the number of initiated previews since opened.""" + return self.content.preview_initiate_count + + @property + def navigation_complete_count(self): + """Return the number of completed previews since opened.""" + return self.content.navigation_complete_count + + @property + def relative_nav_index(self): + """Return the navigation position relative to the direction of movement.""" + return self.content.relative_nav_index + + @property + def navigate_right_enabled(self): + """Return True if right preview navigation is enabled, False otherwise.""" + return self.content.navigate_right_enabled + + @property + def navigate_left_enabled(self): + """Return True if left preview navigation is enabled, False otherwise.""" + return self.content.navigate_left_enabled + + +class PreviewNavigator(UnityIntrospectionObject): + """A view containing a button to nagivate between previews.""" + + def icon(self): + return self.get_children_by_type(IconTexture); + + +class PreviewInfoHintWidget(UnityIntrospectionObject): + """A view containing additional info for a preview.""" + + +class PreviewRatingsWidget(UnityIntrospectionObject): + """A view containing a rating button and user rating count.""" + + +class Tracks(UnityIntrospectionObject): + """A view containing music tracks.""" + + +class Track(UnityIntrospectionObject): + """A singular music track for dash prevews.""" + + +class ActionButton(UnityIntrospectionObject): + """A preview action button.""" + + +class IconTexture(UnityIntrospectionObject): + """An icon for the preview.""" + + +class StaticCairoText(UnityIntrospectionObject): + """Text boxes in the preview""" --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/launcher.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/launcher.py @@ -0,0 +1,532 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Thomi Richards +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. +# + +from __future__ import absolute_import + +from autopilot.input import Mouse +from autopilot.display import Display, move_mouse_to_screen +from autopilot.keybindings import KeybindingsHelper +import logging +from testtools.matchers import NotEquals +from time import sleep + +from unity.emulators import UnityIntrospectionObject +from unity.emulators.icons import ( + ApplicationLauncherIcon, + BFBLauncherIcon, + ExpoLauncherIcon, + SimpleLauncherIcon, + TrashLauncherIcon, + ) + +from unity.emulators.compiz import get_compiz_option + +logger = logging.getLogger(__name__) + + +class IconDragType: + """Define possible positions to drag an icon onto another""" + INSIDE = 0 + OUTSIDE = 1 + BEFORE = 3 + AFTER = 4 + + +class LauncherController(UnityIntrospectionObject): + """The LauncherController class.""" + + def get_launcher_for_monitor(self, monitor_num): + """Return an instance of Launcher for the specified monitor, or None.""" + launchers = self.get_children_by_type(Launcher, monitor=monitor_num) + return launchers[0] if launchers else None + + def get_launchers(self): + """Return the available launchers, or None.""" + return self.get_children_by_type(Launcher) + + @property + def model(self): + """Return the launcher model.""" + models = self.get_children_by_type(LauncherModel) + assert(len(models) == 1) + return models[0] + + +class Launcher(UnityIntrospectionObject, KeybindingsHelper): + """An individual launcher for a monitor.""" + + def __init__(self, *args, **kwargs): + super(Launcher, self).__init__(*args, **kwargs) + + self.show_timeout = 1 + self.hide_timeout = 1 + self.in_keynav_mode = False + self.in_switcher_mode = False + + self._mouse = Mouse.create() + self._display = Display.create() + + def _perform_key_nav_binding(self, keybinding): + if not self.in_keynav_mode: + raise RuntimeError("Cannot perform key navigation when not in kaynav mode.") + self.keybinding(keybinding) + + def _perform_key_nav_exit_binding(self, keybinding): + self._perform_key_nav_binding(keybinding) + self.in_keynav_mode = False + + def _perform_switcher_binding(self, keybinding): + if not self.in_switcher_mode: + raise RuntimeError("Cannot interact with launcher switcher when not in switcher mode.") + self.keybinding(keybinding) + + def _perform_switcher_exit_binding(self, keybinding): + # If we're doing a normal activation, all we need to do is release the + # keybinding. Otherwise, perform the keybinding specified *then* release + # the switcher keybinding. + if keybinding != "launcher/switcher": + self._perform_switcher_binding(keybinding) + self.keybinding_release("launcher/switcher") + self.in_switcher_mode = False + + def _get_controller(self): + """Get the launcher controller.""" + [controller] = LauncherController.get_all_instances() + return controller + + def move_mouse_to_right_of_launcher(self): + """Places the mouse to the right of this launcher.""" + move_mouse_to_screen(self.monitor) + (x, y, w, h) = self.geometry + target_x = x + w + 10 + target_y = y + h / 2 + + logger.debug("Moving mouse away from launcher.") + self._mouse.move(target_x, target_y, False) + sleep(self.show_timeout) + + def move_mouse_over_launcher(self): + """Move the mouse over this launcher.""" + move_mouse_to_screen(self.monitor) + (x, y, w, h) = self.geometry + target_x = x + w / 2 + target_y = y + h / 2 + + logger.debug("Moving mouse to center of launcher.") + self._mouse.move(target_x, target_y) + + def move_mouse_to_icon(self, icon): + # The icon may be off the bottom of screen, so we do this in a loop: + while 1: + target_x = icon.center_x + self.x + target_y = icon.center_y + if self._mouse.x == target_x and self._mouse.y == target_y: + break + self._mouse.move(target_x, target_y) + sleep(0.5) + + def mouse_reveal_launcher(self): + """Reveal this launcher with the mouse. + + If the launcher is already visible calling this method does nothing. + """ + if self.is_showing: + return + move_mouse_to_screen(self.monitor) + (x, y, w, h) = self.geometry + + target_x = x - 920 # this is the pressure we need to reveal the launcher. + target_y = y + h / 2 + logger.debug("Revealing launcher on monitor %d with mouse.", self.monitor) + self._mouse.move(target_x, target_y, True, 5, .002) + sleep(self.show_timeout) + + def keyboard_reveal_launcher(self): + """Reveal this launcher using the keyboard.""" + move_mouse_to_screen(self.monitor) + logger.debug("Revealing launcher with keyboard.") + self.keybinding_hold("launcher/reveal") + self.is_showing.wait_for(True) + + def keyboard_unreveal_launcher(self): + """Un-reveal this launcher using the keyboard.""" + move_mouse_to_screen(self.monitor) + logger.debug("Un-revealing launcher with keyboard.") + self.keybinding_release("launcher/reveal") + # only wait if the launcher is set to autohide + if self.hidemode == 1: + self.is_showing.wait_for(False) + + def keyboard_select_icon(self, **kwargs): + """Using either keynav mode or the switcher, select an icon in the launcher. + + The desired mode (keynav or switcher) must be started already before + calling this methods or a RuntimeError will be raised. + + This method won't activate the icon, it will only select it. + + Icons are selected by passing keyword argument filters to this method. + For example: + + >>> launcher.keyboard_select_icon(tooltip_text="Calculator") + + ...will select the *first* icon that has a 'tooltip_text' attribute equal + to 'Calculator'. If an icon is missing the attribute, it is treated as + not matching. + + If no icon is found, this method will raise a ValueError. + + """ + + if not self.in_keynav_mode and not self.in_switcher_mode: + raise RuntimeError("Launcher must be in keynav or switcher mode") + + [launcher_model] = LauncherModel.get_all_instances() + all_icons = launcher_model.get_launcher_icons() + logger.debug("all_icons = %r", [i.tooltip_text for i in all_icons]) + for icon in all_icons: + # can't iterate over the model icons directly since some are hidden + # from the user. + if not icon.visible: + continue + logger.debug("Selected icon = %s", icon.tooltip_text) + matches = True + for arg,val in kwargs.iteritems(): + if not hasattr(icon, arg) or getattr(icon, arg, None) != val: + matches = False + break + if matches: + return + if self.in_keynav_mode: + self.key_nav_next() + elif self.in_switcher_mode: + self.switcher_next() + raise ValueError("No icon found that matches: %r", kwargs) + + def key_nav_start(self): + """Start keyboard navigation mode by pressing Alt+F1.""" + move_mouse_to_screen(self.monitor) + logger.debug("Initiating launcher keyboard navigation with Alt+F1.") + self.keybinding("launcher/keynav") + self._get_controller().key_nav_is_active.wait_for(True) + self.in_keynav_mode = True + + def key_nav_cancel(self): + """End the key navigation.""" + logger.debug("Cancelling keyboard navigation mode.") + self._perform_key_nav_exit_binding("launcher/keynav/exit") + self._get_controller().key_nav_is_active.wait_for(False) + + def key_nav_activate(self): + """Activates the selected launcher icon. In the current implementation + this also exits key navigation""" + logger.debug("Ending keyboard navigation mode, activating icon.") + self._perform_key_nav_exit_binding("launcher/keynav/activate") + self._get_controller().key_nav_is_active.wait_for(False) + + def key_nav_next(self): + """Moves the launcher keynav focus to the next launcher icon""" + logger.debug("Selecting next item in keyboard navigation mode.") + old_selection = self._get_controller().key_nav_selection + self._perform_key_nav_binding("launcher/keynav/next") + self._get_controller().key_nav_selection.wait_for(NotEquals(old_selection)) + + def key_nav_prev(self): + """Moves the launcher keynav focus to the previous launcher icon""" + logger.debug("Selecting previous item in keyboard navigation mode.") + old_selection = self._get_controller().key_nav_selection + self._perform_key_nav_binding("launcher/keynav/prev") + self._get_controller().key_nav_selection.wait_for(NotEquals(old_selection)) + + def key_nav_enter_quicklist(self): + logger.debug("Opening quicklist for currently selected icon.") + self._perform_key_nav_binding("launcher/keynav/open-quicklist") + self.quicklist_open.wait_for(True) + + def key_nav_exit_quicklist(self): + logger.debug("Closing quicklist for currently selected icon.") + self._perform_key_nav_binding("launcher/keynav/close-quicklist") + self.quicklist_open.wait_for(False) + + def switcher_start(self): + """Start the super+Tab switcher on this launcher.""" + move_mouse_to_screen(self.monitor) + logger.debug("Starting Super+Tab switcher.") + self.keybinding_hold_part_then_tap("launcher/switcher") + self._get_controller().key_nav_is_active.wait_for(True) + self.in_switcher_mode = True + + def switcher_cancel(self): + """End the super+tab swithcer.""" + logger.debug("Cancelling keyboard navigation mode.") + self._perform_switcher_exit_binding("launcher/switcher/exit") + self._get_controller().key_nav_is_active.wait_for(False) + + def switcher_activate(self): + """Activates the selected launcher icon. In the current implementation + this also exits the switcher""" + logger.debug("Ending keyboard navigation mode.") + self._perform_switcher_exit_binding("launcher/switcher") + self._get_controller().key_nav_is_active.wait_for(False) + + def switcher_next(self): + logger.debug("Selecting next item in keyboard navigation mode.") + old_selection = self._get_controller().key_nav_selection + self._perform_switcher_binding("launcher/switcher/next") + self._get_controller().key_nav_selection.wait_for(NotEquals(old_selection)) + + def switcher_prev(self): + logger.debug("Selecting previous item in keyboard navigation mode.") + old_selection = self._get_controller().key_nav_selection + self._perform_switcher_binding("launcher/switcher/prev") + self._get_controller().key_nav_selection.wait_for(NotEquals(old_selection)) + + def switcher_up(self): + logger.debug("Selecting next item in keyboard navigation mode.") + old_selection = self._get_controller().key_nav_selection + self._perform_switcher_binding("launcher/switcher/up") + self._get_controller().key_nav_selection.wait_for(NotEquals(old_selection)) + + def switcher_down(self): + logger.debug("Selecting previous item in keyboard navigation mode.") + old_selection = self._get_controller().key_nav_selection + self._perform_switcher_binding("launcher/switcher/down") + self._get_controller().key_nav_selection.wait_for(NotEquals(old_selection)) + + def click_launcher_icon(self, icon, button=1, move_mouse_after=True): + """Move the mouse over the launcher icon, and click it. + `icon` must be an instance of SimpleLauncherIcon or it's descendants. + `move_mouse_after` moves the mouse outside the launcher if true. + """ + if not isinstance(icon, SimpleLauncherIcon): + raise TypeError("icon must be a LauncherIcon, not %s" % type(icon)) + + logger.debug("Clicking launcher icon %r on monitor %d with mouse button %d", + icon, self.monitor, button) + self.mouse_reveal_launcher() + + # The icon may be off the screen, so we do this in a loop: + while 1: + target_x = icon.center_x + self.x + target_y = icon.center_y + if self._mouse.x == target_x and self._mouse.y == target_y: + break + self._mouse.move(target_x, target_y ) + sleep(1) + self._mouse.click(button) + if (move_mouse_after): + self.move_mouse_to_right_of_launcher() + + def drag_icon_to_position(self, icon, pos, target, drag_type=IconDragType.INSIDE): + """Drag a launcher icon to a new position. + + 'icon' is the icon to move. It must be either a ApplicationLauncherIcon or an + ExpoLauncherIcon instance. Other values will result in a TypeError being + raised. + + 'pos' must be one of IconDragType.BEFORE or IconDragType.AFTER. If it is + not one of these, a ValueError will be raised. + + 'target' is the target icon. + + 'drag_type' must be one of IconDragType.INSIDE or IconDragType.OUTSIDE. + This specifies whether the icon is gragged inside the launcher, or to the + right of it. The default is to drag inside the launcher. If it is + specified, and not one of the allowed values, a ValueError will be raised. + + For example: + + >>> drag_icon_to_position(calc_icon, IconDragType.BEFORE, switcher_icon) + + This will drag the calculator icon to just before the switcher icon. + + Note: This method makes no attempt to sanity-check the requested move. + For example, it will happily try and move an icon to before the BFB icon, + if asked. + + """ + if not isinstance(icon, ApplicationLauncherIcon) \ + and not isinstance(icon, ExpoLauncherIcon): + raise TypeError("Icon to move must be a ApplicationLauncherIcon or ExpoLauncherIcon, not %s" + % type(icon).__name__) + + if pos not in (IconDragType.BEFORE, IconDragType.AFTER): + raise ValueError("'pos' parameter must be one of IconDragType.BEFORE, IconDragType.AFTER") + + if not isinstance(target, SimpleLauncherIcon): + raise TypeError("'target' must be a valid launcher icon, not %s" + % type(target).__name__) + + if drag_type not in (IconDragType.INSIDE, IconDragType.OUTSIDE): + raise ValueError("'drag_type' parameter must be one of IconDragType.INSIDE, IconDragType.OUTSIDE") + + icon_height = get_compiz_option("unityshell", "icon_size") + target_y = target.center_y + if target_y < icon.center_y: + target_y += icon_height / 2 + if pos == IconDragType.BEFORE: + target_y -= icon_height + + self.move_mouse_to_icon(icon) + self._mouse.press() + sleep(2) + + if drag_type == IconDragType.OUTSIDE: + shift_over = self._mouse.x + (icon_height * 2) + self._mouse.move(shift_over, self._mouse.y) + sleep(0.5) + + self._mouse.move(self._mouse.x, target_y) + sleep(0.5) + self._mouse.release() + self.move_mouse_to_right_of_launcher() + + def lock_to_launcher(self, icon): + """lock 'icon' to the launcher, if it's not already. + `icon` must be an instance of ApplicationLauncherIcon. + """ + if not isinstance(icon, ApplicationLauncherIcon): + raise TypeError("Can only lock instances of ApplicationLauncherIcon") + if icon.sticky: + # Nothing to do. + return + + logger.debug("Locking icon %r to launcher.", icon) + self.click_launcher_icon(icon, button=3) + quicklist = icon.get_quicklist() + pin_item = quicklist.get_quicklist_item_by_text('Lock to Launcher') + quicklist.click_item(pin_item) + + def unlock_from_launcher(self, icon): + """lock 'icon' to the launcher, if it's not already. + + `icon` must be an instance of ApplicationLauncherIcon. + + """ + if not isinstance(icon, ApplicationLauncherIcon): + raise TypeError("Can only unlock instances of ApplicationLauncherIcon, not %s" % type(icon).__name__) + if not icon.sticky: + # nothing to do. + return + + logger.debug("Unlocking icon %r from launcher.") + self.click_launcher_icon(icon, button=3) + quicklist = icon.get_quicklist() + pin_item = quicklist.get_quicklist_item_by_text('Unlock from Launcher') + quicklist.click_item(pin_item) + + def autoscroll_to_icon(self, icon, autoscroll_offset=0): + """Moves the mouse to the autoscroll zone to scroll the Launcher to the icon + in question. + + autoscroll_offet is the offset, in number of pixels, from the end of the + autoscroll zone where is the autoscroll zone is currently 24 pixels high. + """ + (x, y, w, h) = self.geometry + + while 1: + mouse_x = target_x = icon.center_x + self.x + mouse_y = target_y = icon.center_y + if target_y > h: + mouse_y = h + y - autoscroll_offset + elif target_y < 0: + mouse_y = y + autoscroll_offset + if self._mouse.x == target_x and self._mouse.y == target_y: + break + self._mouse.move(mouse_x, mouse_y) + sleep(0.5) + + @property + def geometry(self): + """Returns a tuple of (x,y,w,h) for the current launcher.""" + return (self.x, self.y, self.width, self.height) + + +class LauncherModel(UnityIntrospectionObject): + """The launcher model. Contains all launcher icons as children.""" + + def get_bfb_icon(self): + icons = BFBLauncherIcon.get_all_instances() + assert(len(icons) == 1) + return icons[0] + + def get_expo_icon(self): + icons = self.get_children_by_type(ExpoLauncherIcon) + assert(len(icons) == 1) + return icons[0] + + def get_trash_icon(self): + icons = self.get_children_by_type(TrashLauncherIcon) + assert(len(icons) == 1) + return icons[0] + + def get_launcher_icons(self, visible_only=True): + """Get a list of launcher icons in this launcher.""" + if visible_only: + return self.get_children_by_type(SimpleLauncherIcon, visible=True) + else: + return self.get_children_by_type(SimpleLauncherIcon) + + def get_bamf_launcher_icons(self, visible_only=True): + """Get a list of bamf launcher icons in this launcher.""" + if visible_only: + return self.get_children_by_type(ApplicationLauncherIcon, visible=True) + else: + return self.get_children_by_type(ApplicationLauncherIcon) + + def get_launcher_icons_for_monitor(self, monitor, visible_only=True): + """Get a list of launcher icons for provided monitor.""" + icons = [] + for icon in self.get_launcher_icons(visible_only): + if icon.is_on_monitor(monitor): + icons.append(icon) + + return icons + + def get_icon(self, **kwargs): + """Get a launcher icon from the model according to some filters. + + This method accepts keyword argument that are the filters to use when + looking for an icon. For example, to find an icon with a particular + desktop_id, one might do this from within a test: + + >>> self.launcher.model.get_icon(desktop_id="gcalctool.desktop") + + This method returns only one icon. It is the callers responsibility to + ensure that the filter matches only one icon. + + This method will attempt to get the launcher icon, and will retry several + times, so the caller can be assured that if this method doesn't find + the icon it really does not exist. + + If no keyword arguments are specified, ValueError will be raised. + + If no icons are matched, None is returned. + + """ + + if not kwargs: + raise ValueError("You must specify at least one keyword argument to ths method.") + + for i in range(10): + icons = self.get_children_by_type(SimpleLauncherIcon, **kwargs) + if len(icons) > 1: + logger.warning("Got more than one icon returned using filters=%r. Returning first one", kwargs) + if icons: + return icons[0] + sleep(1) + return None + + def num_launcher_icons(self): + """Get the number of icons in the launcher model.""" + return len(self.get_launcher_icons()) + + def num_bamf_launcher_icons(self, visible_only=True): + """Get the number of bamf icons in the launcher model.""" + return len(self.get_bamf_launcher_icons(visible_only)) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/__init__.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/__init__.py @@ -0,0 +1,46 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Thomi Richards +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. +# + +"""A collection of Unity-specific emulators.""" + +from time import sleep + +from autopilot.introspection.dbus import CustomEmulatorBase +from autopilot.introspection.backends import DBusAddress + +from dbus import DBusException + + +class UnityIntrospectionObject(CustomEmulatorBase): + + DBUS_SERVICE = "com.canonical.Unity" + DBUS_OBJECT = "/com/canonical/Unity/Debug" + + _Backend = DBusAddress.SessionBus(DBUS_SERVICE, DBUS_OBJECT) + + +def ensure_unity_is_running(timeout=300): + """Poll the unity debug interface, and return when it's ready for use. + + The default timeout is 300 seconds (5 minutes) to account for the case where + Unity has crashed and is taking a while to get restarted (on a slow VM for + example). + + If, after the timeout period, unity is still not up, this function raises a + RuntimeError exception. + + """ + sleep_period=10 + for i in range(0, timeout, sleep_period): + try: + UnityIntrospectionObject.get_state_by_path("/") + return True + except DBusException: + sleep(sleep_period) + raise RuntimeError("Unity debug interface is down after %d seconds of polling." % (timeout)) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/window_manager.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/window_manager.py @@ -0,0 +1,44 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Marco Trevisan (Treviño) +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. +# + +from __future__ import absolute_import + +import logging +from autopilot.keybindings import KeybindingsHelper + +from unity.emulators import UnityIntrospectionObject + +logger = logging.getLogger(__name__) + + +class WindowManager(UnityIntrospectionObject, KeybindingsHelper): + """The WindowManager class.""" + + @property + def screen_geometry(self): + """Returns a tuple of (x,y,w,h) for the screen.""" + return (self.x, self.y, self.width, self.height) + + def enter_show_desktop(self): + if not self.showdesktop_active: + logger.info("Entering show desktop mode.") + self.keybinding("window/show_desktop") + self.showdesktop_active.wait_for(True) + else: + logger.warning("Test tried to enter show desktop mode while already \ + in show desktop mode.") + + def leave_show_desktop(self): + if self.showdesktop_active: + logger.info("Leaving show desktop mode.") + self.keybinding("window/show_desktop") + self.showdesktop_active.wait_for(False) + else: + logger.warning("Test tried to leave show desktop mode while not in \ + show desktop mode.") --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/hud.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/hud.py @@ -0,0 +1,168 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Thomi Richards +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. +# + +from __future__ import absolute_import + +from logging import getLogger + +from autopilot.input import Keyboard +from autopilot.introspection.dbus import StateNotFoundError +from autopilot.keybindings import KeybindingsHelper +from HTMLParser import HTMLParser +import re + +from unity.emulators import UnityIntrospectionObject +from unity.emulators.dash import SearchBar +from unity.emulators.icons import HudEmbeddedIcon, HudLauncherIcon + +log = getLogger(__name__) + +class HudController(UnityIntrospectionObject, KeybindingsHelper): + """Proxy object for the Unity Hud Controller.""" + + def __init__(self, *args, **kwargs): + super(HudController, self).__init__(*args, **kwargs) + self.keyboard = Keyboard.create() + + def get_hud_view(self): + views = self.get_children_by_type(HudView) + return views[0] if views else None + + def ensure_hidden(self): + """Hides the hud if it's not already hidden.""" + if self.visible: + if self.search_string: + # need this to clear the search string, and then another to + # close the hud. + self.keyboard.press_and_release("Escape") + self.search_string.wait_for("") + self.keyboard.press_and_release("Escape") + self.visible.wait_for(False) + + def ensure_visible(self): + """Shows the hud if it's not already showing.""" + if not self.visible: + self.toggle_reveal() + self.visible.wait_for(True) + + def toggle_reveal(self, tap_delay=0.1): + """Tap the 'Alt' key to toggle the hud visibility.""" + old_state = self.visible + self.keybinding("hud/reveal", tap_delay) + self.visible.wait_for(not old_state) + + def get_embedded_icon(self): + """Returns the HUD view embedded icon or None if is not shown.""" + view = self.view + if (not view): + return None + + icons = view.get_children_by_type(HudEmbeddedIcon) + return icons[0] if icons else None + + def get_launcher_icon(self): + """Returns the HUD launcher icon""" + icons = HudLauncherIcon.get_all_instances() + assert(len(icons) == 1) + return icons[0] + + @property + def icon(self): + if self.is_locked_launcher: + return self.get_launcher_icon() + else: + return self.get_embedded_icon() + + @property + def view(self): + """Returns the HudView.""" + return self.get_hud_view() + + @property + def searchbar(self): + """Returns the searchbar attached to the hud.""" + return self.get_hud_view().searchbar + + @property + def search_string(self): + """Returns the searchbars' search string.""" + return self.searchbar.search_string + + @property + def is_locked_launcher(self): + return self.locked_to_launcher + + @property + def monitor(self): + return self.hud_monitor + + @property + def geometry(self): + return (self.x, self.y, self.width, self.height) + + @property + def selected_button(self): + view = self.get_hud_view() + if view: + return view.selected_button + else: + return 0 + + @property + def hud_buttons(self): + """Returns a list of current HUD buttons.""" + return self.view.hud_buttons + + @property + def selected_hud_button(self): + try: + if len(self.hud_buttons) is 0: + return 0 + [button] = filter(lambda x: x.focused, self.hud_buttons) + return button + except IndexError: + raise RuntimeError("No HUD buttons found, is hud active?") + except StateNotFoundError: + log.warning("StateNotFoundError has been raised by HudController") + return 0 + + @property + def num_buttons(self): + view = self.get_hud_view() + if view: + return view.num_buttons + else: + return 0 + + +class HudView(UnityIntrospectionObject): + """Proxy object for the hud view child of the controller.""" + + @property + def searchbar(self): + """Get the search bar attached to this hud view.""" + return self.get_children_by_type(SearchBar)[0] + + @property + def hud_buttons(self): + return self.get_children_by_type(HudButton) + + @property + def geometry(self): + return (self.x, self.y, self.width, self.height) + + +class HudButton(UnityIntrospectionObject): + """Proxy object for the hud buttons.""" + + @property + def label_no_formatting(self): + """Returns the label text with the formatting removed.""" + htmlparser = HTMLParser() + return htmlparser.unescape(re.sub("<[^>]*>", "", self.label)) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/unity.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/unity.py @@ -0,0 +1,106 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Thomi Richards +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. +# + +from __future__ import absolute_import + +from dbus import Interface, SessionBus + +from unity.emulators import UnityIntrospectionObject +from unity.emulators.dash import DashController +from unity.emulators.hud import HudController +from unity.emulators.launcher import LauncherController +from unity.emulators.panel import PanelController +from unity.emulators.screen import Screen +from unity.emulators.shortcut_hint import ShortcutController +from unity.emulators.switcher import SwitcherController +from unity.emulators.window_manager import WindowManager + + +# acquire the debugging dbus object +UNITY_BUS_NAME = 'com.canonical.Unity' +DEBUG_PATH = '/com/canonical/Unity/Debug' +LOGGING_IFACE = 'com.canonical.Unity.Debug.Logging' + + +def get_dbus_proxy_object(): + return SessionBus().get_object(UNITY_BUS_NAME, DEBUG_PATH) + + +def get_dbus_logging_interface(): + return Interface(get_dbus_proxy_object(), LOGGING_IFACE) + + +def start_log_to_file(file_path): + """Instruct Unity to start logging to the given file.""" + get_dbus_logging_interface().StartLogToFile(file_path) + + +def reset_logging(): + """Instruct Unity to stop logging to a file.""" + get_dbus_logging_interface().ResetLogging() + + +def set_log_severity(component, severity): + """Instruct Unity to set a log component's severity. + + 'component' is the unity logging component name. + + 'severity' is the severity name (like 'DEBUG', 'INFO' etc.) + + """ + get_dbus_logging_interface().SetLogSeverity(component, severity) + + +def log_unity_message(severity, message): + """Instruct unity to log a message for us. + + severity: one of ('TRACE', 'DEBUG', 'INFO', 'WARNING', 'ERROR'). + + message: The message to log. + + For debugging purposes only! If you want to log a message during an autopilot + test, use the python logging framework instead. + + """ + get_dbus_logging_interface().LogMessage(severity, message) + + +class Unity(UnityIntrospectionObject): + + @property + def screen(self): + return self.get_children_by_type(Screen)[0] + + @property + def dash(self): + return self.get_children_by_type(DashController)[0] + + @property + def hud(self): + return self.get_children_by_type(HudController)[0] + + @property + def launcher(self): + return self.get_children_by_type(LauncherController)[0] + + @property + def panels(self): + return self.get_children_by_type(PanelController)[0] + + @property + def switcher(self): + return self.get_children_by_type(SwitcherController)[0] + + @property + def shortcut_hint(self): + return self.get_children_by_type(ShortcutController)[0] + + @property + def window_manager(self): + return self.get_children_by_type(WindowManager)[0] --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/screen.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/screen.py @@ -0,0 +1,50 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Marco Trevisan (Treviño) +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. +# + +from __future__ import absolute_import + +import logging +from unity.emulators import UnityIntrospectionObject +logger = logging.getLogger(__name__) + + +class Screen(UnityIntrospectionObject): + """The Screen class.""" + + @property + def windows(self): + """Return the available windows, or None.""" + return self.get_children_by_type(Window) + + @property + def scaled_windows(self): + """Return the available scaled windows, or None.""" + return self.get_children_by_type(Window, scaled=True) + + def window(self, xid): + """Return the window with given xid.""" + windows = self.get_children_by_type(Window, xid=xid) + if len(windows): + return windows[0] + + return None + + +class Window(UnityIntrospectionObject): + """An individual window.""" + + @property + def geometry(self): + """Returns a tuple of (x,y,w,h) for the current window.""" + return (self.x, self.y, self.width, self.height) + + @property + def scale_close_geometry(self): + """Returns a tuple of (x,y,w,h) for the scale close button.""" + return (self.scaled_close_x, self.scaled_close_y, self.scaled_close_width, self.scaled_close_height) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/switcher.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/emulators/switcher.py @@ -0,0 +1,243 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Thomi Richards +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. +# + +from __future__ import absolute_import + +import logging + +from autopilot.input import Mouse +from autopilot.keybindings import KeybindingsHelper + +from unity.emulators import UnityIntrospectionObject +# even though we don't use these directly, we need to make sure they've been +# imported so the classes contained are registered with the introspection API. +from unity.emulators.icons import * + + +logger = logging.getLogger(__name__) + +class SwitcherMode(): + """Define the possible modes the switcher can be in""" + NORMAL = 0 + ALL = 1 + DETAIL = 2 + + +class SwitcherDirection(): + """Directions the switcher can switch in.""" + FORWARDS = 0 + BACKWARDS = 1 + + +class SwitcherController(UnityIntrospectionObject, KeybindingsHelper): + """A class for interacting with the switcher. + + Abstracts out switcher implementation, and makes the necessary functionality available + to consumer code. + + """ + + def __init__(self, *args, **kwargs): + super(SwitcherController, self).__init__(*args, **kwargs) + self._mouse = Mouse.create() + + def get_switcher_view(self): + views = self.get_children_by_type(SwitcherView) + return views[0] if views else None + + @property + def view(self): + """Returns the SwitcherView.""" + return self.get_switcher_view() + + @property + def model(self): + models = self.get_children_by_type(SwitcherModel) + return models[0] if models else None + + @property + def icons(self): + """The set of icons in the switcher model + + """ + return self.model.icons + + @property + def current_icon(self): + """The currently selected switcher icon""" + return self.icons[self.selection_index] + + @property + def selection_index(self): + """The index of the currently selected icon""" + return self.model.selection_index + + @property + def label(self): + """The current switcher label""" + return self.view.label + + @property + def label_visible(self): + """The switcher label visibility""" + return self.view.label_visible + + @property + def mode(self): + """Returns the SwitcherMode that the switcher is currently in.""" + if not self.visible: + return None + if self.model.detail_selection and not self.model.only_detail_on_viewport: + return SwitcherMode.DETAIL, SwitcherMode.ALL + elif self.model.detail_selection: + return SwitcherMode.DETAIL + elif not self.model.only_detail_on_viewport: + return SwitcherMode.ALL + else: + return SwitcherMode.NORMAL + + def initiate(self, mode=SwitcherMode.NORMAL): + """Initiates the switcher in designated mode. Defaults to NORMAL""" + if mode == SwitcherMode.NORMAL: + logger.debug("Initiating switcher with Alt+Tab") + self.keybinding_hold_part_then_tap("switcher/reveal_normal") + self.visible.wait_for(True) + elif mode == SwitcherMode.DETAIL: + logger.debug("Initiating switcher detail mode with Alt+`") + self.keybinding_hold_part_then_tap("switcher/reveal_details") + self.visible.wait_for(True) + elif mode == SwitcherMode.ALL: + logger.debug("Initiating switcher in 'all workspaces' mode. Ctrl+Alt+Tab") + self.keybinding_hold_part_then_tap("switcher/reveal_all") + self.model.only_detail_on_viewport.wait_for(False) + + def next_icon(self): + """Move to the next icon.""" + logger.debug("Selecting next item in switcher.") + self.keybinding("switcher/next") + + def previous_icon(self): + """Move to the previous icon.""" + logger.debug("Selecting previous item in switcher.") + self.keybinding("switcher/prev") + + def select_icon(self, direction, **kwargs): + """Select an icon in the switcher. + + direction must be one of SwitcherDirection.FORWARDS or SwitcherDirection.BACKWARDS. + + The keyword arguments are used to select an icon. For example, you might + do this to select the 'Show Desktop' icon: + + >>> self.switcher.select_icon(SwitcherDirection.BACKWARDS, tooltip_text="Show Desktop") + + The switcher must be initiated already, and must be in normal mode when + this method is called, or a RuntimeError will be raised. + + If no icon matches, a ValueError will be raised. + + """ + if self.mode == SwitcherMode.DETAIL: + raise RuntimeError("Switcher must be initiated in normal mode before calling this method.") + + if direction not in (SwitcherDirection.BACKWARDS, SwitcherDirection.FORWARDS): + raise ValueError("direction must be one of SwitcherDirection.BACKWARDS, SwitcherDirection.FORWARDS") + + for i in self.model.icons: + current_icon = self.current_icon + passed=True + for key,val in kwargs.iteritems(): + if not hasattr(current_icon, key) or getattr(current_icon, key) != val: + passed=False + if passed: + return + if direction == SwitcherDirection.FORWARDS: + self.next_icon() + elif direction == SwitcherDirection.BACKWARDS: + self.previous_icon() + raise ValueError("No icon found in switcher model that matches: %r" % kwargs) + + def cancel(self): + """Stop switcher without activating the selected icon and releasing the keys. + + NOTE: Does not release Alt. + + """ + logger.debug("Cancelling switcher.") + self.keybinding("switcher/cancel") + self.visible.wait_for(False) + + def terminate(self): + """Stop switcher without activating the selected icon.""" + logger.debug("Terminating switcher.") + self.keybinding("switcher/cancel") + self.keybinding_release("switcher/reveal_normal") + self.visible.wait_for(False) + + def select(self): + """Stop switcher and activate the selected icon.""" + logger.debug("Stopping switcher") + self.keybinding_release("switcher/reveal_normal") + self.visible.wait_for(False) + + def next_via_mouse(self): + """Move to the next icon using the mouse scroll wheel.""" + logger.debug("Selecting next item in switcher with mouse scroll wheel.") + self._mouse.press(6) + self._mouse.release(6) + + def previous_via_mouse(self): + """Move to the previous icon using the mouse scroll wheel.""" + logger.debug("Selecting previous item in switcher with mouse scroll wheel.") + self._mouse.press(7) + self._mouse.release(7) + + @property + def detail_selection_index(self): + """The index of the currently selected detail""" + return self.model.detail_selection_index + + @property + def detail_current_count(self): + """The number of shown details""" + return self.model.detail_current_count + + def show_details(self): + """Show detail mode.""" + logger.debug("Showing details view.") + self.keybinding("switcher/detail_start") + self.model.detail_selection.wait_for(True) + + def hide_details(self): + """Hide detail mode.""" + logger.debug("Hiding details view.") + self.keybinding("switcher/detail_stop") + self.model.detail_selection.wait_for(False) + + def next_detail(self): + """Move to next detail in the switcher.""" + logger.debug("Selecting next item in details mode.") + self.keybinding("switcher/detail_next") + + def previous_detail(self): + """Move to the previous detail in the switcher.""" + logger.debug("Selecting previous item in details mode.") + self.keybinding("switcher/detail_prev") + + +class SwitcherView(UnityIntrospectionObject): + """An emulator class for interacting with with SwitcherView.""" + + +class SwitcherModel(UnityIntrospectionObject): + """An emulator class for interacting with the SwitcherModel.""" + + @property + def icons(self): + return self.get_children_by_type(SimpleLauncherIcon) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_dash.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_dash.py @@ -0,0 +1,1307 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2010 Canonical +# Author: Alex Launi +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.clipboard import get_clipboard_contents +from autopilot.display import move_mouse_to_screen +from autopilot.matchers import Eventually +from testtools.matchers import Equals, NotEquals, GreaterThan +from time import sleep +from tempfile import mkstemp +from os import remove + +from unity.tests import UnityTestCase + +import gettext + +class DashTestCase(UnityTestCase): + def setUp(self): + super(DashTestCase, self).setUp() + self.set_unity_log_level("unity.shell.compiz", "DEBUG") + self.set_unity_log_level("unity.launcher", "DEBUG") + self.unity.dash.ensure_hidden() + # On shutdown, ensure hidden too. Also add a delay. Cleanup is LIFO. + self.addCleanup(self.unity.dash.ensure_hidden) + self.addCleanup(sleep, 1) + + def get_current_preview(self): + """Method to open the currently selected preview, if opened.""" + preview_fn = lambda: self.preview_container.current_preview + self.assertThat(preview_fn, Eventually(NotEquals(None))) + self.assertThat(self.unity.dash.preview_animation, Eventually(Equals(1.0))) + self.assertThat(self.preview_container.animating, Eventually(Equals(False))) + + return preview_fn() + + def wait_for_category(self, scope, group): + """Method to wait for a specific category""" + get_scope_fn = lambda: scope.get_category_by_name(group) + self.assertThat(get_scope_fn, Eventually(NotEquals(None), timeout=20)) + return get_scope_fn() + + def wait_for_result_settle(self): + """wait for row count to settle""" + old_row_count = -1 + new_row_count = self.unity.dash.get_num_rows() + while(old_row_count != new_row_count): + sleep(1) + old_row_count = new_row_count + new_row_count = self.unity.dash.get_num_rows() + + +class DashRevealTests(DashTestCase): + """Test the Unity dash Reveal.""" + + def test_dash_reveal(self): + """Ensure we can show and hide the dash.""" + self.unity.dash.ensure_visible() + self.unity.dash.ensure_hidden() + + def test_application_scope_shortcut(self): + """Application scope must reveal when Super+a is pressed.""" + self.unity.dash.reveal_application_scope() + self.assertThat(self.unity.dash.active_scope, Eventually(Equals('applications.scope'))) + + def test_music_scope_shortcut(self): + """Music scope must reveal when Super+w is pressed.""" + self.unity.dash.reveal_music_scope() + self.assertThat(self.unity.dash.active_scope, Eventually(Equals('music.scope'))) + + def test_file_scope_shortcut(self): + """File scope must reveal when Super+f is pressed.""" + self.unity.dash.reveal_file_scope() + self.assertThat(self.unity.dash.active_scope, Eventually(Equals('files.scope'))) + + def test_video_scope_shortcut(self): + """Video scope must reveal when super+v is pressed.""" + self.unity.dash.reveal_video_scope() + self.assertThat(self.unity.dash.active_scope, Eventually(Equals('video.scope'))) + + def test_command_scope_shortcut(self): + """Run Command scope must reveat on alt+F2.""" + self.unity.dash.reveal_command_scope() + self.assertThat(self.unity.dash.active_scope, Eventually(Equals('commands.scope'))) + + def test_can_go_from_dash_to_command_scope(self): + """Switch to command scope without closing the dash.""" + self.unity.dash.ensure_visible() + self.unity.dash.reveal_command_scope() + self.assertThat(self.unity.dash.active_scope, Eventually(Equals('commands.scope'))) + + def test_command_lens_can_close_itself(self): + """We must be able to close the Command lens with Alt+F2""" + self.unity.dash.reveal_command_scope() + self.assertThat(self.unity.dash.visible, Eventually(Equals(True))) + + self.keybinding("lens_reveal/command") + self.assertThat(self.unity.dash.visible, Eventually(Equals(False))) + + def test_alt_f4_close_dash(self): + """Dash must close on alt+F4.""" + self.unity.dash.ensure_visible() + self.keyboard.press_and_release("Alt+F4") + self.assertThat(self.unity.dash.visible, Eventually(Equals(False))) + + def test_alt_f4_close_dash_with_capslock_on(self): + """Dash must close on Alt+F4 even when the capslock is turned on.""" + self.keyboard.press_and_release("Caps_Lock") + self.addCleanup(self.keyboard.press_and_release, "Caps_Lock") + + self.unity.dash.ensure_visible() + self.keyboard.press_and_release("Alt+F4") + self.assertThat(self.unity.dash.visible, Eventually(Equals(False))) + + def test_closes_mouse_down_outside(self): + """Test that a mouse down outside of the dash closes the dash.""" + if (self.unity.dash.view.form_factor != "desktop"): + self.skip("Not in desktop form-factor.") + + self.unity.dash.ensure_visible() + current_monitor = self.unity.dash.monitor + + (x,y,w,h) = self.unity.dash.geometry + (screen_x,screen_y,screen_w,screen_h) = self.display.get_screen_geometry(current_monitor) + + self.mouse.move(x + w + (screen_w-((screen_x-x)+w))/2, y + h + (screen_h-((screen_y-y)+h))/2) + self.mouse.click() + + self.assertThat(self.unity.dash.visible, Eventually(Equals(False))) + + def test_closes_then_focuses_window_on_mouse_down(self): + """If 2 windows are open with 1 maximized and the non-maxmized + focused. Then from the Dash clicking on the maximized window + must focus that window and close the dash. + """ + if (self.unity.dash.view.form_factor != "desktop"): + self.skip("Not in desktop form-factor.") + + char_win = self.process_manager.start_app("Character Map") + self.keybinding("window/maximize") + self.process_manager.start_app("Calculator") + + self.unity.dash.ensure_visible() + + #Click bottom right of the screen + w = self.display.get_screen_width() + h = self.display.get_screen_height() + self.mouse.move(w,h) + self.mouse.click() + + self.assertProperty(char_win, is_active=True) + + +class DashRevealWithSpreadTests(DashTestCase): + """Test the interaction of the Dash with the Spead/Scale + + The Spread (or Scale) in Quantal is not activated if there is no active + apps. We use a place holder app so that it is activated as we require. + + """ + + def start_placeholder_app(self): + window_spec = { + "Title": "Placeholder application", + } + self.launch_test_window(window_spec) + + def test_dash_closes_on_spread(self): + """This test shows that when the spread is initiated, the dash closes.""" + self.start_placeholder_app() + self.unity.dash.ensure_visible() + self.addCleanup(self.keybinding, "spread/cancel") + self.keybinding("spread/start") + self.assertThat(self.unity.window_manager.scale_active, Eventually(Equals(True))) + self.assertThat(self.unity.dash.visible, Eventually(Equals(False))) + + def test_dash_opens_when_in_spread(self): + """This test shows the dash opens when in spread mode.""" + self.start_placeholder_app() + self.keybinding("spread/start") + self.assertThat(self.unity.window_manager.scale_active, Eventually(Equals(True))) + + self.unity.dash.ensure_visible() + self.assertThat(self.unity.dash.visible, Eventually(Equals(True))) + + def test_command_scope_opens_when_in_spread(self): + """This test shows the command scope opens when in spread mode.""" + self.start_placeholder_app() + self.keybinding("spread/start") + self.assertThat(self.unity.window_manager.scale_active, Eventually(Equals(True))) + + self.unity.dash.reveal_command_scope() + self.assertThat(self.unity.dash.active_scope, Eventually(Equals('commands.scope'))) + + def test_scope_opens_when_in_spread(self): + """This test shows that any scope opens when in spread mode.""" + self.start_placeholder_app() + self.keybinding("spread/start") + self.assertThat(self.unity.window_manager.scale_active, Eventually(Equals(True))) + + self.unity.dash.reveal_application_scope() + self.assertThat(self.unity.dash.active_scope, Eventually(Equals('applications.scope'))) + + +class DashSearchInputTests(DashTestCase): + """Test features involving input to the dash search""" + + def assertSearchText(self, text): + self.assertThat(self.unity.dash.search_string, Eventually(Equals(text))) + + def test_search_keyboard_focus(self): + """Dash must put keyboard focus on the search bar at all times.""" + self.unity.dash.ensure_visible() + self.keyboard.type("Hello") + self.assertSearchText("Hello") + + +class DashMultiKeyTests(DashSearchInputTests): + def setUp(self): + # set the multi key first so that we're not getting a new _DISPLAY while keys are held down. + old_value = self.call_gsettings_cmd('get', 'org.gnome.libgnomekbd.keyboard', 'options') + self.addCleanup(self.call_gsettings_cmd, 'set', 'org.gnome.libgnomekbd.keyboard', 'options', old_value) + self.call_gsettings_cmd('set', 'org.gnome.libgnomekbd.keyboard', 'options', "['Compose key\tcompose:caps']") + + super(DashMultiKeyTests, self).setUp() + + def test_multi_key(self): + """Pressing 'Multi_key' must not add any characters to the search.""" + self.unity.dash.reveal_application_scope() + self.keyboard.press_and_release('Multi_key') + self.keyboard.type("o") + self.assertSearchText("") + + def test_multi_key_o(self): + """Pressing the sequences 'Multi_key' + '^' + 'o' must produce 'ô'.""" + self.unity.dash.reveal_application_scope() + self.keyboard.press_and_release('Multi_key') + self.keyboard.type("^o") + self.assertSearchText(u'\xf4') + + def test_multi_key_copyright(self): + """Pressing the sequences 'Multi_key' + 'c' + 'o' must produce '©'.""" + self.unity.dash.reveal_application_scope() + self.keyboard.press_and_release('Multi_key') + self.keyboard.type("oc") + self.assertSearchText(u'\xa9') + + def test_multi_key_delete(self): + """Pressing 'Multi_key' must not get stuck looking for a sequence.""" + self.unity.dash.reveal_application_scope() + self.keyboard.type("dd") + self.keyboard.press_and_release('Multi_key') + self.keyboard.press_and_release('BackSpace') + self.keyboard.press_and_release('BackSpace') + self.assertSearchText("d") + + +class DashKeyNavTests(DashTestCase): + """Test the unity Dash keyboard navigation.""" + + def test_scopebar_gets_keyfocus(self): + """Test that the scopebar gets key focus after using Down keypresses.""" + self.unity.dash.ensure_visible() + self.wait_for_result_settle() + + # Make sure that the scope bar can get the focus + for i in range(self.unity.dash.get_num_rows()): + self.keyboard.press_and_release("Down") + scopebar = self.unity.dash.view.get_scopebar() + self.assertThat(scopebar.focused_scope_icon, Eventually(NotEquals(''))) + + def test_scopebar_focus_changes(self): + """Scopebar focused icon should change with Left and Right keypresses.""" + self.unity.dash.ensure_visible() + self.wait_for_result_settle() + + for i in range(self.unity.dash.get_num_rows()): + self.keyboard.press_and_release("Down") + scopebar = self.unity.dash.view.get_scopebar() + + current_focused_icon = scopebar.focused_scope_icon + + self.keyboard.press_and_release("Right") + self.assertThat(scopebar.focused_scope_icon, Eventually(NotEquals(current_focused_icon))) + + self.keyboard.press_and_release("Left") + self.assertThat(scopebar.focused_scope_icon, Eventually(Equals(current_focused_icon))) + + def test_scopebar_enter_activation(self): + """Must be able to activate ScopeBar icons that have focus with an Enter keypress.""" + self.unity.dash.ensure_visible() + self.wait_for_result_settle() + + for i in range(self.unity.dash.get_num_rows()): + self.keyboard.press_and_release("Down") + self.keyboard.press_and_release("Right") + scopebar = self.unity.dash.view.get_scopebar() + focused_icon = scopebar.focused_scope_icon + self.keyboard.press_and_release("Enter") + + self.assertThat(scopebar.active_scope, Eventually(Equals(focused_icon))) + + # scopebar should lose focus after activation. + self.assertThat(scopebar.focused_scope_icon, Eventually(Equals(""))) + + def test_focus_returns_to_searchbar(self): + """This test makes sure that the focus is returned to the searchbar of the newly + activated scope.""" + self.unity.dash.ensure_visible() + self.wait_for_result_settle() + + for i in range(self.unity.dash.get_num_rows()): + self.keyboard.press_and_release("Down") + self.keyboard.press_and_release("Right") + scopebar = self.unity.dash.view.get_scopebar() + focused_icon = scopebar.focused_scope_icon + self.keyboard.press_and_release("Enter") + + self.assertThat(scopebar.active_scope, Eventually(Equals(focused_icon))) + self.assertThat(scopebar.focused_scope_icon, Eventually(Equals(""))) + + # Now we make sure if the newly activated scope searchbar have the focus. + self.keyboard.type("HasFocus") + + self.assertThat(self.unity.dash.search_string, Eventually(Equals("HasFocus"))) + + def test_category_header_keynav(self): + """ Tests that a category header gets focus when 'down' is pressed after the + dash is opened + + OK important to note that this test only tests that A category is + focused, not the first and from doing this it seems that it's common + for a header other than the first to get focus. + """ + self.unity.dash.ensure_visible() + self.wait_for_result_settle() + # Make sure that a category have the focus. + self.keyboard.press_and_release("Down") + scope = self.unity.dash.get_current_scope() + category = scope.get_focused_category() + self.assertIsNot(category, None) + # Make sure that the category is highlighted. + self.assertTrue(category.header_is_highlighted) + + def test_control_tab_scope_cycle(self): + """This test makes sure that Ctrl+Tab cycles scopes.""" + self.unity.dash.ensure_visible() + self.wait_for_result_settle() + + self.keyboard.press('Control') + self.keyboard.press_and_release('Tab') + self.keyboard.release('Control') + + scopebar = self.unity.dash.view.get_scopebar() + self.assertEqual(scopebar.active_scope, u'applications.scope') + + self.keyboard.press('Control') + self.keyboard.press('Shift') + self.keyboard.press_and_release('Tab') + self.keyboard.release('Control') + self.keyboard.release('Shift') + + self.assertThat(scopebar.active_scope, Eventually(Equals('home.scope'))) + + def test_tab_cycle_category_headers(self): + """ Makes sure that pressing tab cycles through the category headers""" + self.unity.dash.ensure_visible() + self.wait_for_result_settle() + scope = self.unity.dash.get_current_scope() + + # Test that tab cycles through the categories. + # + 1 is the filter bar + for i in range(scope.get_num_visible_categories()): + self.keyboard.press_and_release('Tab') + category = scope.get_focused_category() + self.assertIsNot(category, None) + + def test_tab_with_filter_bar(self): + """ This test makes sure that Tab works well with the filter bara.""" + self.unity.dash.reveal_application_scope() + self.wait_for_result_settle() + scope = self.unity.dash.get_current_scope() + + # Tabs to last category + for i in range(scope.get_num_visible_categories()): + self.keyboard.press_and_release('Tab') + + self.keyboard.press_and_release('Tab') + self.assertThat(self.unity.dash.searchbar.expander_has_focus, Eventually(Equals(True))) + + filter_bar = scope.get_filterbar() + if not self.unity.dash.searchbar.showing_filters: + self.keyboard.press_and_release('Enter') + self.assertThat(self.unity.dash.searchbar.showing_filters, Eventually(Equals(True))) + self.addCleanup(filter_bar.ensure_collapsed) + + for i in range(filter_bar.get_num_filters()): + self.keyboard.press_and_release('Tab') + new_focused_filter = filter_bar.get_focused_filter() + self.assertIsNotNone(new_focused_filter) + + # Ensure that tab cycles back to a category header + self.keyboard.press_and_release('Tab') + category = scope.get_focused_category() + self.assertIsNot(category, None) + + def test_bottom_up_keynav_with_filter_bar(self): + """This test makes sure that bottom-up key navigation works well + in the dash filter bar. + """ + self.unity.dash.reveal_application_scope() + self.wait_for_result_settle() + scope = self.unity.dash.get_current_scope() + + filter_bar = scope.get_filterbar() + # Need to ensure the filter expander has focus, so if it's already + # expanded, we collapse it first: + filter_bar.ensure_collapsed() + filter_bar.ensure_expanded() + + # Tab to fist filter expander + self.keyboard.press_and_release('Tab') + self.assertThat(filter_bar.get_focused_filter, Eventually(NotEquals(None))) + old_focused_filter = filter_bar.get_focused_filter() + old_focused_filter.ensure_expanded() + + # Tab to the next filter expander + self.keyboard.press_and_release('Tab') + self.assertThat(filter_bar.get_focused_filter, Eventually(NotEquals(None))) + new_focused_filter = filter_bar.get_focused_filter() + self.assertNotEqual(old_focused_filter, new_focused_filter) + new_focused_filter.ensure_expanded() + + # Move the focus up. + self.keyboard.press_and_release("Up") + self.assertThat(filter_bar.get_focused_filter, Eventually(Equals(None))) + self.assertThat(old_focused_filter.content_has_focus, Eventually(Equals(True))) + + +class DashClipboardTests(DashTestCase): + """Test the Unity clipboard""" + + def test_ctrl_a(self): + """ This test if ctrl+a selects all text """ + self.unity.dash.ensure_visible() + + self.keyboard.type("SelectAll") + self.assertThat(self.unity.dash.search_string, Eventually(Equals("SelectAll"))) + + self.keyboard.press_and_release("Ctrl+a") + self.keyboard.press_and_release("Delete") + self.assertThat(self.unity.dash.search_string, Eventually(Equals(''))) + + def test_ctrl_c(self): + """ This test if ctrl+c copies text into the clipboard """ + self.unity.dash.ensure_visible() + + self.keyboard.type("Copy") + self.assertThat(self.unity.dash.search_string, Eventually(Equals("Copy"))) + + self.keyboard.press_and_release("Ctrl+a") + self.keyboard.press_and_release("Ctrl+c") + + self.assertThat(get_clipboard_contents, Eventually(Equals("Copy"))) + + def test_ctrl_x(self): + """ This test if ctrl+x deletes all text and copys it """ + self.unity.dash.ensure_visible() + + self.keyboard.type("Cut") + self.assertThat(self.unity.dash.search_string, Eventually(Equals("Cut"))) + + self.keyboard.press_and_release("Ctrl+a") + self.keyboard.press_and_release("Ctrl+x") + self.assertThat(self.unity.dash.search_string, Eventually(Equals(""))) + + self.assertThat(get_clipboard_contents, Eventually(Equals('Cut'))) + + def test_ctrl_c_v(self): + """ This test if ctrl+c and ctrl+v copies and pastes text""" + self.unity.dash.ensure_visible() + + self.keyboard.type("CopyPaste") + self.assertThat(self.unity.dash.search_string, Eventually(Equals("CopyPaste"))) + + self.keyboard.press_and_release("Ctrl+a") + self.keyboard.press_and_release("Ctrl+c") + self.keyboard.press_and_release("Ctrl+v") + self.keyboard.press_and_release("Ctrl+v") + + self.assertThat(self.unity.dash.search_string, Eventually(Equals('CopyPasteCopyPaste'))) + + def test_ctrl_x_v(self): + """ This test if ctrl+x and ctrl+v cuts and pastes text""" + self.unity.dash.ensure_visible() + + self.keyboard.type("CutPaste") + self.assertThat(self.unity.dash.search_string, Eventually(Equals("CutPaste"))) + + self.keyboard.press_and_release("Ctrl+a") + self.keyboard.press_and_release("Ctrl+x") + self.keyboard.press_and_release("Ctrl+v") + self.keyboard.press_and_release("Ctrl+v") + + self.assertThat(self.unity.dash.search_string, Eventually(Equals('CutPasteCutPaste'))) + + def test_middle_click_paste(self): + """Tests if Middle mouse button pastes into searchbar""" + + self.process_manager.start_app_window("Calculator", locale='C') + + self.keyboard.type("ThirdButtonPaste") + self.keyboard.press_and_release("Ctrl+a") + + self.unity.dash.ensure_visible() + + self.mouse.move(self.unity.dash.searchbar.x + self.unity.dash.searchbar.width / 2, + self.unity.dash.searchbar.y + self.unity.dash.searchbar.height / 2) + + self.mouse.click(button=2) + + self.assertThat(self.unity.dash.search_string, Eventually(Equals('ThirdButtonPaste'))) + + +class DashKeyboardFocusTests(DashTestCase): + """Tests that keyboard focus works.""" + + def assertSearchText(self, text): + self.assertThat(self.unity.dash.search_string, Eventually(Equals(text))) + + def test_filterbar_expansion_leaves_kb_focus(self): + """Expanding or collapsing the filterbar must keave keyboard focus in the + search bar. + """ + self.unity.dash.reveal_application_scope() + filter_bar = self.unity.dash.get_current_scope().get_filterbar() + filter_bar.ensure_collapsed() + + self.keyboard.type("hello") + filter_bar.ensure_expanded() + self.addCleanup(filter_bar.ensure_collapsed) + self.keyboard.type(" world") + self.assertSearchText("hello world") + + def test_keep_focus_on_application_opens(self): + """The Dash must keep key focus as well as stay open if an app gets opened from an external source. """ + + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden) + + self.process_manager.start_app_window("Calculator") + sleep(1) + + self.keyboard.type("HasFocus") + self.assertSearchText("HasFocus") + + +class DashScopeResultsTests(DashTestCase): + """Tests results from the scope view.""" + + def test_results_message_empty_search(self): + """This tests a message is not shown when there is no text.""" + self.unity.dash.reveal_application_scope() + scope = self.unity.dash.get_current_scope() + self.assertThat(scope.no_results_active, Eventually(Equals(False))) + + def test_results_message(self): + """This test no mesage will be shown when results are there.""" + self.unity.dash.reveal_application_scope() + self.keyboard.type("Terminal") + self.assertThat(self.unity.dash.search_string, Eventually(Equals("Terminal"))) + scope = self.unity.dash.get_current_scope() + self.assertThat(scope.no_results_active, Eventually(Equals(False))) + + def test_no_results_message(self): + """This test shows a message will appear in the scope.""" + self.unity.dash.reveal_application_scope() + self.keyboard.type("qwerlkjzvxc") + self.assertThat(self.unity.dash.search_string, Eventually(Equals("qwerlkjzvxc"))) + scope = self.unity.dash.get_current_scope() + self.assertThat(scope.no_results_active, Eventually(Equals(True))) + + def test_results_update_on_filter_changed(self): + """This test makes sure the results change when filters change.""" + gettext.install("unity-scope-applications") + self.unity.dash.reveal_application_scope() + scope = self.unity.dash.get_current_scope() + self.keyboard.type(" ") + self.assertThat(self.unity.dash.search_string, Eventually(Equals(" "))) + + # wait for "Installed" category + old_results_category = self.wait_for_category(scope, _("Installed")) + + self.assertThat(lambda: len(old_results_category.get_results()), Eventually(GreaterThan(0), timeout=20)) + old_results = old_results_category.get_results() + + # FIXME: This should be a method on the dash emulator perhaps, or + # maybe a proper method of this class. It should NOT be an inline + # function that is only called once! + def activate_filter(add_cleanup = False): + # Tabs to last category + for i in range(scope.get_num_visible_categories()): + self.keyboard.press_and_release('Tab') + + self.keyboard.press_and_release('Tab') + self.assertThat(self.unity.dash.searchbar.expander_has_focus, Eventually(Equals(True))) + + filter_bar = scope.get_filterbar() + if not self.unity.dash.searchbar.showing_filters: + self.keyboard.press_and_release('Enter') + self.assertThat(self.unity.dash.searchbar.showing_filters, Eventually(Equals(True))) + if add_cleanup: + self.addCleanup(filter_bar.ensure_collapsed) + + # Tab to the "Type" filter in apps scope + self.keyboard.press_and_release('Tab') + new_focused_filter = filter_bar.get_focused_filter() + self.assertIsNotNone(new_focused_filter) + + self.keyboard.press_and_release("Down") + self.keyboard.press_and_release("Down") + # We should be on the Customization category + self.keyboard.press_and_release('Enter') + sleep(2) + + activate_filter(True) + self.addCleanup(activate_filter) + + results_category = self.wait_for_category(scope, _("Installed")) + self.assertThat(lambda: len(results_category.get_results()), Eventually(GreaterThan(0), timeout=20)) + + results = results_category.get_results() + self.assertIsNot(results, old_results) + + # so we can clean up properly + self.keyboard.press_and_release('BackSpace') + + +class DashVisualTests(DashTestCase): + """Tests that the dash visual is correct.""" + + def test_closing_dash_hides_current_scope(self): + """When exiting from the dash the current scope must set it self to not visible.""" + + self.unity.dash.ensure_visible() + scope = self.unity.dash.get_current_scope() + self.unity.dash.ensure_hidden() + + self.assertThat(scope.visible, Eventually(Equals(False))) + + def test_dash_position_with_non_default_launcher_width(self): + """There should be no empty space between launcher and dash when the launcher + has a non-default width. + + """ + monitor = self.unity.dash.monitor + launcher = self.unity.launcher.get_launcher_for_monitor(monitor) + + self.set_unity_option('icon_size', 60) + self.assertThat(launcher.icon_size, Eventually(Equals(66))) + + self.unity.dash.ensure_visible() + + self.assertThat(self.unity.dash.geometry[0], Eventually(Equals(launcher.geometry[0] + launcher.geometry[2] - 1))) + + + def test_see_more_result_alignment(self): + """The see more results label should be baseline aligned + with the category name label. + """ + self.unity.dash.reveal_application_scope() + + scope = self.unity.dash.get_current_scope() + self.assertThat(lambda: len(scope.get_groups()), Eventually(GreaterThan(0), timeout=20)) + + groups = scope.get_groups() + + for group in groups: + if (group.is_visible and group.expand_label_is_visible): + expand_label_y = group.expand_label_y + group.expand_label_baseline + name_label_y = group.name_label_y + group.name_label_baseline + self.assertThat(expand_label_y, Equals(name_label_y)) + + +class DashScopeBarTests(DashTestCase): + """Tests that the scopebar works well.""" + + def setUp(self): + super(DashScopeBarTests, self).setUp() + self.unity.dash.ensure_visible() + self.scopebar = self.unity.dash.view.get_scopebar() + + def test_click_inside_highlight(self): + """Scope selection should work when clicking in + the rectangle outside of the icon. + """ + app_icon = self.scopebar.get_icon_by_name(u'applications.scope') + + self.mouse.move(app_icon.x + (app_icon.width / 2), + app_icon.y + (app_icon.height / 2)) + self.mouse.click() + + self.assertThat(self.scopebar.active_scope, Eventually(Equals('applications.scope'))) + + +class DashBorderTests(DashTestCase): + """Tests that the dash border works well. + """ + def setUp(self): + super(DashBorderTests, self).setUp() + self.unity.dash.ensure_visible() + + def test_click_right_border(self): + """Clicking on the right dash border should do nothing, + *NOT* close the dash. + """ + if (self.unity.dash.view.form_factor != "desktop"): + self.skip("Not in desktop form-factor.") + + x = self.unity.dash.view.x + self.unity.dash.view.width + self.unity.dash.view.right_border_width / 2 + y = self.unity.dash.view.y + self.unity.dash.view.height / 2 + + self.mouse.move(x, y) + self.mouse.click() + + self.assertThat(self.unity.dash.visible, Eventually(Equals(True))) + + def test_click_bottom_border(self): + """Clicking on the bottom dash border should do nothing, + *NOT* close the dash. + """ + if (self.unity.dash.view.form_factor != "desktop"): + self.skip("Not in desktop form-factor.") + + x = self.unity.dash.view.x + self.unity.dash.view.width / 2 + y = self.unity.dash.view.y + self.unity.dash.view.height + self.unity.dash.view.bottom_border_height / 2 + + self.mouse.move(x, y) + self.mouse.click() + + self.assertThat(self.unity.dash.visible, Eventually(Equals(True))) + + +class CategoryHeaderTests(DashTestCase): + """Tests that category headers work. + """ + def test_click_inside_highlight(self): + """Clicking into a category highlight must expand/collapse + the view. + """ + gettext.install("unity-scope-applications", unicode=True) + scope = self.unity.dash.reveal_application_scope() + self.addCleanup(self.unity.dash.ensure_hidden) + + # wait for "Installed" category + category = self.wait_for_category(scope, _("Installed")) + + is_expanded = category.is_expanded + + self.mouse.move(self.unity.dash.view.x + self.unity.dash.view.width / 2, + category.header_y + category.header_height / 2) + + self.mouse.click() + self.assertThat(category.is_expanded, Eventually(Equals(not is_expanded))) + + self.mouse.click() + self.assertThat(category.is_expanded, Eventually(Equals(is_expanded))) + + +class PreviewInvocationTests(DashTestCase): + """Tests that dash previews can be opened and closed in different + scopes. + """ + def test_app_scope_preview_open_close(self): + """Right-clicking on an application scope result must show + its preview. + + """ + gettext.install("unity-scope-applications", unicode=True) + scope = self.unity.dash.reveal_application_scope() + self.addCleanup(self.unity.dash.ensure_hidden) + + # wait for "More suggestions" category + category = self.wait_for_category(scope, _("Installed")) + + # wait for some results + self.assertThat(lambda: len(category.get_results()), Eventually(GreaterThan(0), timeout=20)) + results = category.get_results() + + result = results[0] + # result.preview handles finding xy co-ords and right mouse-click + result.preview() + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(True))) + + self.keyboard.press_and_release("Escape") + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_files_scope_preview_open_close(self): + """Right-clicking on a files scope result must show its + preview. + """ + gettext.install("unity-scope-files", unicode=True) + + # Instead of skipping the test, here we can create a dummy file to open and + # make sure the scope result is non-empty + (file_handle, file_path) = mkstemp() + self.addCleanup(remove, file_path) + gedit_win = self.process_manager.start_app_window('Text Editor', files=[file_path], locale='C') + self.assertProperty(gedit_win, is_focused=True) + + # immediately close gedit since we're only interested in getting ZG event when opening temp file. + # this way we avoid an issue with gedit popup dialog when temporary file gets removed by AP + # before closing gedit by AP cleanup code. + gedit_win.close() + + scope = self.unity.dash.reveal_file_scope() + self.addCleanup(self.unity.dash.ensure_hidden) + + # wait for "Recent" category + category = self.wait_for_category(scope, _("Recent")) + + # wait for some results + self.assertThat(lambda: len(category.get_results()), Eventually(GreaterThan(0), timeout=20)) + results = category.get_results() + + result = results[0] + # result.preview handles finding xy co-ords and right mouse-click + result.preview() + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(True))) + + self.keyboard.press_and_release("Escape") + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_music_scope_preview_open_close(self): + """Right-clicking on a music scope result must show its + preview. + """ + scope = self.unity.dash.reveal_music_scope() + self.addCleanup(self.unity.dash.ensure_hidden) + + category = scope.get_category_by_name("Songs") + # Incase there was no music ever played we skip the test instead + # of failing. + if category is None or not category.is_visible: + self.skipTest("This scope is probably empty") + + # wait for some results + self.assertThat(lambda: len(category.get_results()), Eventually(GreaterThan(0), timeout=20)) + results = category.get_results() + + result = results[0] + # result.preview handles finding xy co-ords and right mouse-click + result.preview() + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(True))) + + self.keyboard.press_and_release("Escape") + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_video_scope_preview_open_close(self): + """Right-clicking on a video scope result must show its + preview. + """ + gettext.install("unity-scope-video", unicode=True) + + def get_category(scope): + category = scope.get_category_by_name(_("Recently Viewed")) + # If there was no video played on this system this category is expected + # to be empty, if its empty we check if the 'Online' category have any + # contents, if not then we skip the test. + if category is None or not category.is_visible: + category = scope.get_category_by_name("Online") + if category is None or not category.is_visible: + self.skipTest("This scope is probably empty") + return category + + scope = self.unity.dash.reveal_video_scope() + self.addCleanup(self.unity.dash.ensure_hidden) + + # get category. might not be any. + category = get_category(scope) + + # wait for some results + self.assertThat(lambda: len(category.get_results()), Eventually(GreaterThan(0), timeout=20)) + results = category.get_results() + + result = results[0] + # result.preview handles finding xy co-ords and right mouse-click + result.preview() + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(True))) + + self.keyboard.press_and_release("Escape") + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_preview_key(self): + """Pressing menu key on a selected dash result must show + its preview. + """ + gettext.install("unity-scope-applications", unicode=True) + scope = self.unity.dash.reveal_application_scope() + self.addCleanup(self.unity.dash.ensure_hidden) + + # wait for "More suggestions" category + category = self.wait_for_category(scope, _("More suggestions")) + + # wait for results + self.assertThat(lambda: len(category.get_results()), Eventually(GreaterThan(0), timeout=20)) + results = category.get_results() + + result = results[0] + # result.preview_key() handles finding xy co-ords and key press + result.preview_key() + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(True))) + + +class PreviewNavigateTests(DashTestCase): + """Tests that mouse navigation works with previews.""" + + def setUp(self): + super(PreviewNavigateTests, self).setUp() + gettext.install("unity-scope-applications", unicode=True) + + scope = self.unity.dash.reveal_application_scope() + self.addCleanup(self.unity.dash.ensure_hidden) + + # wait for "More suggestions" category + category = self.wait_for_category(scope, _("More suggestions")) + + # wait for results (we need 4 results to perorm the multi-navigation tests) + self.assertThat(lambda: len(category.get_results()), Eventually(GreaterThan(4), timeout=20)) + + results = category.get_results() + result = results[2] # 2 so we can navigate left + result.preview() + self.assertThat(self.unity.dash.view.preview_displaying, Eventually(Equals(True))) + self.assertThat(self.unity.dash.view.get_preview_container, Eventually(NotEquals(None))) + + self.preview_container = self.unity.dash.view.get_preview_container() + + def test_navigate_left(self): + """Tests that left navigation works with previews.""" + + # wait until preview has finished animating + self.assertThat(self.preview_container.animating, Eventually(Equals(False))) + self.assertThat(self.preview_container.navigate_left_enabled, Eventually(Equals(True))) + + old_navigation_complete_count = self.preview_container.navigation_complete_count + old_relative_nav_index = self.preview_container.relative_nav_index + + self.preview_container.navigate_left(1) + + self.assertThat(self.preview_container.navigation_complete_count, Eventually(Equals(old_navigation_complete_count+1))) + self.assertThat(self.preview_container.relative_nav_index, Eventually(Equals(old_relative_nav_index-1))) + + # should be one more on the left + self.assertThat(self.preview_container.navigate_left_enabled, Eventually(Equals(True))) + # if we've navigated left, there should be at least one preview available on right. + self.assertThat(self.preview_container.navigate_right_enabled, Eventually(Equals(True))) + + # Test close preview after navigate + self.keyboard.press_and_release("Escape") + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_navigate_left_multi(self): + """Tests that multiple left navigation works with previews.""" + + # wait until preview has finished animating + self.assertThat(self.preview_container.animating, Eventually(Equals(False))) + self.assertThat(self.preview_container.navigate_left_enabled, Eventually(Equals(True))) + + old_navigation_complete_count = self.preview_container.navigation_complete_count + old_relative_nav_index = self.preview_container.relative_nav_index + + self.preview_container.navigate_left(2) + + self.assertThat(self.preview_container.navigation_complete_count, Eventually(Equals(old_navigation_complete_count+2))) + self.assertThat(self.preview_container.relative_nav_index, Eventually(Equals(old_relative_nav_index-2))) + + # shouldnt be any previews on left. + self.assertThat(self.preview_container.navigate_left_enabled, Eventually(Equals(False))) + # if we've navigated left, there should be at least one preview available on right. + self.assertThat(self.preview_container.navigate_right_enabled, Eventually(Equals(True))) + + + def test_navigate_right(self): + """Tests that right navigation works with previews.""" + + # wait until preview has finished animating + self.assertThat(self.preview_container.animating, Eventually(Equals(False))) + self.assertThat(self.preview_container.navigate_left_enabled, Eventually(Equals(True))) + + old_navigation_complete_count = self.preview_container.navigation_complete_count + old_relative_nav_index = self.preview_container.relative_nav_index + + self.preview_container.navigate_right(1) + + self.assertThat(self.preview_container.navigation_complete_count, Eventually(Equals(old_navigation_complete_count+1))) + self.assertThat(self.preview_container.relative_nav_index, Eventually(Equals(old_relative_nav_index+1))) + + # should be at least one more on the left + self.assertThat(self.preview_container.navigate_left_enabled, Eventually(Equals(True))) + # if we've navigated right, there should be at least one preview available on left. + self.assertThat(self.preview_container.navigate_right_enabled, Eventually(Equals(True))) + + # Test close preview after navigate + self.keyboard.press_and_release("Escape") + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_navigate_right_multi(self): + """Tests that multiple right navigation works with previews.""" + + # wait until preview has finished animating + self.assertThat(self.preview_container.animating, Eventually(Equals(False))) + self.assertThat(self.preview_container.navigate_left_enabled, Eventually(Equals(True))) + + old_navigation_complete_count = self.preview_container.navigation_complete_count + old_relative_nav_index = self.preview_container.relative_nav_index + + self.preview_container.navigate_right(2) + + self.assertThat(self.preview_container.navigation_complete_count, Eventually(Equals(old_navigation_complete_count+2))) + self.assertThat(self.preview_container.relative_nav_index, Eventually(Equals(old_relative_nav_index+2))) + + # if we've navigated right, there should be at least one preview available on left. + self.assertThat(self.preview_container.navigate_left_enabled, Eventually(Equals(True))) + + def test_preview_refocus_close(self): + """Clicking on a preview element must not lose keyboard focus.""" + cover_art = self.get_current_preview().cover_art[0] + + # click the cover-art (this will set focus) + tx = cover_art.x + (cover_art.width / 2) + ty = cover_art.y + (cover_art.height / 2) + self.mouse.move(tx, ty) + self.mouse.click() + + self.keyboard.press_and_release("Escape") + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_overlay_text(self): + """Fallback overlay text is internationalized, should always be valid.""" + cover_art = self.get_current_preview().cover_art[0] + self.assertThat(cover_art.overlay_text, + Eventually(Equals("No Image Available"))) + + +class PreviewClickCancelTests(DashTestCase): + """Tests that the preview closes when left, middle, and right clicking in the preview""" + + def setUp(self): + super(PreviewClickCancelTests, self).setUp() + gettext.install("unity-scope-applications") + scope = self.unity.dash.reveal_application_scope() + self.addCleanup(self.unity.dash.ensure_hidden) + # Only testing an application preview for this test. + self.keyboard.type("Software Updater") + + # wait for "Installed" category + category = self.wait_for_category(scope, _("Installed")) + + # wait for results + self.assertThat(lambda: len(category.get_results()), Eventually(GreaterThan(0), timeout=20)) + results = category.get_results() + + result = results[0] + result.preview() + self.assertThat(self.unity.dash.view.preview_displaying, Eventually(Equals(True))) + + self.preview_container = self.unity.dash.view.get_preview_container() + + def test_left_click_on_preview_icon_cancel_preview(self): + """Left click on preview icon must close preview.""" + icon = self.get_current_preview().icon[0] + self.assertThat(icon, NotEquals(None)) + + tx = icon.x + icon.width + ty = icon.y + (icon.height / 2) + self.mouse.move(tx, ty) + self.mouse.click(button=1) + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_middle_click_on_preview_icon_cancel_preview(self): + """Middle click on preview icon must close preview.""" + icon = self.get_current_preview().icon[0] + self.assertThat(icon, NotEquals(None)) + + tx = icon.x + icon.width + ty = icon.y + (icon.height / 2) + self.mouse.move(tx, ty) + self.mouse.click(button=2) + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_right_click_on_preview_icon_cancel_preview(self): + """Right click on preview icon must close preview.""" + icon = self.get_current_preview().icon[0] + self.assertThat(icon, NotEquals(None)) + + tx = icon.x + icon.width + ty = icon.y + (icon.height / 2) + self.mouse.move(tx, ty) + self.mouse.click(button=3) + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_left_click_on_preview_image_cancel_preview(self): + """Left click on preview image must cancel the preview.""" + cover_art = self.get_current_preview().cover_art[0] + self.assertThat(cover_art, NotEquals(None)) + + tx = cover_art.x + (cover_art.width / 2) + ty = cover_art.y + (cover_art.height / 2) + self.mouse.move(tx, ty) + self.mouse.click(button=1) + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_middle_click_on_preview_image_cancel_preview(self): + """Middle click on preview image must cancel the preview.""" + cover_art = self.get_current_preview().cover_art[0] + self.assertThat(cover_art, NotEquals(None)) + + tx = cover_art.x + (cover_art.width / 2) + ty = cover_art.y + (cover_art.height / 2) + self.mouse.move(tx, ty) + self.mouse.click(button=2) + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_right_click_on_preview_image_cancel_preview(self): + """Right click on preview image must cancel the preview.""" + cover_art = self.get_current_preview().cover_art[0] + self.assertThat(cover_art, NotEquals(None)) + + tx = cover_art.x + (cover_art.width / 2) + ty = cover_art.y + (cover_art.height / 2) + self.mouse.move(tx, ty) + self.mouse.click(button=3) + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_left_click_on_preview_text_cancel_preview(self): + """Left click on some preview text must cancel the preview.""" + text = self.get_current_preview().text_boxes[0] + self.assertThat(text, NotEquals(None)) + + tx = text.x + (text.width / 2) + ty = text.y + (text.height / 2) + self.mouse.move(tx, ty) + self.mouse.click(button=1) + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_middle_click_on_preview_text_cancel_preview(self): + """Middle click on some preview text must cancel the preview.""" + text = self.get_current_preview().text_boxes[0] + self.assertThat(text, NotEquals(None)) + + tx = text.x + (text.width / 2) + ty = text.y + (text.height / 2) + self.mouse.move(tx, ty) + self.mouse.click(button=2) + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_right_click_on_preview_text_cancel_preview(self): + """Right click on some preview text must cancel the preview.""" + text = self.get_current_preview().text_boxes[0] + self.assertThat(text, NotEquals(None)) + + tx = text.x + (text.width / 2) + ty = text.y + (text.height / 2) + self.mouse.move(tx, ty) + self.mouse.click(button=3) + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_left_click_on_preview_ratings_widget_cancel_preview(self): + """Left click on the ratings widget must cancel the preview.""" + ratings_widget = self.get_current_preview().ratings_widget[0] + self.assertThat(ratings_widget, NotEquals(None)) + + tx = ratings_widget.x + (ratings_widget.width / 2) + ty = ratings_widget.y + (ratings_widget.height / 2) + self.mouse.move(tx, ty) + self.mouse.click(button=1) + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_middle_click_on_preview_ratings_widget_cancel_preview(self): + """Middle click on the ratings widget must cancel the preview.""" + ratings_widget = self.get_current_preview().ratings_widget[0] + self.assertThat(ratings_widget, NotEquals(None)) + + tx = ratings_widget.x + (ratings_widget.width / 2) + ty = ratings_widget.y + (ratings_widget.height / 2) + self.mouse.move(tx, ty) + self.mouse.click(button=2) + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_right_click_on_preview_ratings_widget_cancel_preview(self): + """Right click on the ratings widget must cancel the preview.""" + ratings_widget = self.get_current_preview().ratings_widget[0] + self.assertThat(ratings_widget, NotEquals(None)) + + tx = ratings_widget.x + (ratings_widget.width / 2) + ty = ratings_widget.y + (ratings_widget.height / 2) + self.mouse.move(tx, ty) + self.mouse.click(button=3) + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_left_click_on_preview_info_hint_cancel_preview(self): + """Left click on the info hint must cancel the preview.""" + info_hint = self.get_current_preview().info_hint_widget[0] + self.assertThat(info_hint, NotEquals(None)) + + tx = info_hint.x + (info_hint.width / 2) + ty = info_hint.y + (info_hint.height / 8) + self.mouse.move(tx, ty) + self.mouse.click(button=1) + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_middle_click_on_preview_info_hint_cancel_preview(self): + """Middle click on the info hint must cancel the preview.""" + info_hint = self.get_current_preview().info_hint_widget[0] + self.assertThat(info_hint, NotEquals(None)) + + tx = info_hint.x + (info_hint.width / 2) + ty = info_hint.y + (info_hint.height / 8) + self.mouse.move(tx, ty) + self.mouse.click(button=2) + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + def test_right_click_on_preview_info_hint_cancel_preview(self): + """Right click on the info hint must cancel the preview.""" + info_hint = self.get_current_preview().info_hint_widget[0] + self.assertThat(info_hint, NotEquals(None)) + + tx = info_hint.x + (info_hint.width / 2) + ty = info_hint.y + (info_hint.height / 8) + self.mouse.move(tx, ty) + self.mouse.click(button=3) + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(False))) + + +class DashDBusIfaceTests(DashTestCase): + """Test the Unity dash DBus interface.""" + + def test_dash_hide(self): + """Ensure we can hide the dash via HideDash() dbus method.""" + self.unity.dash.ensure_visible() + self.unity.dash.hide_dash_via_dbus() + self.assertThat(self.unity.dash.visible, Eventually(Equals(False))) + self.unity.dash.ensure_hidden() + + +class DashCrossMonitorsTests(DashTestCase): + """Multi-monitor dash tests.""" + + def setUp(self): + super(DashCrossMonitorsTests, self).setUp() + if self.display.get_num_screens() < 2: + self.skipTest("This test requires more than 1 monitor.") + + def test_dash_stays_on_same_monitor(self): + """If the dash is opened, then the mouse is moved to another monitor and + the keyboard is used. The Dash must not move to that monitor. + """ + current_monitor = self.unity.dash.ideal_monitor + + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + + move_mouse_to_screen((current_monitor + 1) % self.display.get_num_screens()) + self.keyboard.type("abc") + + self.assertThat(self.unity.dash.ideal_monitor, Eventually(Equals(current_monitor))) + + def test_dash_close_on_cross_monitor_click(self): + """Dash must close when clicking on a window in a different screen.""" + + self.addCleanup(self.unity.dash.ensure_hidden) + + for monitor in range(self.display.get_num_screens()-1): + move_mouse_to_screen(monitor) + self.unity.dash.ensure_visible() + + move_mouse_to_screen(monitor+1) + sleep(.5) + self.mouse.click() + + self.assertThat(self.unity.dash.visible, Eventually(Equals(False))) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_hud.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_hud.py @@ -0,0 +1,812 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Alex Launi, +# Marco Trevisan +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.matchers import Eventually +from autopilot.display import Display, move_mouse_to_screen, is_rect_on_screen +from autopilot.testcase import multiply_scenarios +from autopilot.introspection.dbus import StateNotFoundError +from os import remove, environ +from os.path import exists +from tempfile import mktemp +from testtools.matchers import ( + Equals, + EndsWith, + GreaterThan, + LessThan, + NotEquals, + ) +from testtools.matchers import MismatchError +from time import sleep + +from unity.emulators.icons import HudLauncherIcon +from unity.tests import UnityTestCase + + +def _make_monitor_scenarios(): + num_monitors = Display.create().get_num_screens() + scenarios = [] + + if num_monitors == 1: + scenarios = [('Single Monitor', {'hud_monitor': 0})] + else: + for i in range(num_monitors): + scenarios += [('Monitor %d' % (i), {'hud_monitor': i})] + + return scenarios + + +class HudTestsBase(UnityTestCase): + + def setUp(self): + super(HudTestsBase, self).setUp() + + def tearDown(self): + self.unity.hud.ensure_hidden() + super(HudTestsBase, self).tearDown() + + def get_num_active_launcher_icons(self): + num_active = 0 + for icon in self.unity.launcher.model.get_launcher_icons(): + if icon.active and icon.visible: + num_active += 1 + return num_active + + # Unable to exit SDM without any active apps, need a placeholder. + # See bug LP:1079460 + def start_placeholder_app(self): + window_spec = { + "Title": "Placeholder application", + } + self.launch_test_window(window_spec) + + def start_menu_app(self): + window_spec = { + "Title": "Test menu application", + "Menu": ["Entry 1", "Entry 2", "Entry 3", "Entry 4", "Entry 5", "Quit"], + } + self.launch_test_window(window_spec) + + def hud_query_check(self): + try: + button = self.unity.hud.selected_hud_button + if not button: + return + return button.label_no_formatting + except StateNotFoundError: + return + + +class HudBehaviorTests(HudTestsBase): + + def setUp(self): + super(HudBehaviorTests, self).setUp() + + if not environ.get('UBUNTU_MENUPROXY', ''): + self.patch_environment('UBUNTU_MENUPROXY', 'libappmenu.so') + self.hud_monitor = self.display.get_primary_screen() + move_mouse_to_screen(self.hud_monitor) + + def test_no_initial_values(self): + self.unity.hud.ensure_visible() + self.assertThat(self.unity.hud.num_buttons, Equals(0)) + self.assertThat(self.unity.hud.selected_button, Equals(0)) + + def test_check_a_values(self): + self.start_menu_app() + self.unity.hud.ensure_visible() + self.keyboard.type('e') + self.assertThat(self.unity.hud.search_string, Eventually(Equals('e'))) + self.assertThat(self.unity.hud.num_buttons, Eventually(Equals(5))) + self.assertThat(self.unity.hud.selected_button, Eventually(Equals(1))) + + def test_up_down_arrows(self): + self.start_menu_app() + self.unity.hud.ensure_visible() + self.keyboard.type('e') + self.assertThat(self.unity.hud.search_string, Eventually(Equals('e'))) + self.assertThat(self.unity.hud.num_buttons, Eventually(Equals(5))) + + self.keyboard.press_and_release('Down') + self.assertThat(self.unity.hud.selected_button, Eventually(Equals(2))) + self.keyboard.press_and_release('Down') + self.assertThat(self.unity.hud.selected_button, Eventually(Equals(3))) + self.keyboard.press_and_release('Down') + self.assertThat(self.unity.hud.selected_button, Eventually(Equals(4))) + self.keyboard.press_and_release('Down') + self.assertThat(self.unity.hud.selected_button, Eventually(Equals(5))) + # Down again stays on 5. + self.keyboard.press_and_release('Down') + self.assertThat(self.unity.hud.selected_button, Eventually(Equals(5))) + self.keyboard.press_and_release('Up') + self.assertThat(self.unity.hud.selected_button, Eventually(Equals(4))) + self.keyboard.press_and_release('Up') + self.assertThat(self.unity.hud.selected_button, Eventually(Equals(3))) + self.keyboard.press_and_release('Up') + self.assertThat(self.unity.hud.selected_button, Eventually(Equals(2))) + self.keyboard.press_and_release('Up') + self.assertThat(self.unity.hud.selected_button, Eventually(Equals(1))) + # Up again stays on 1. + self.keyboard.press_and_release('Up') + self.assertThat(self.unity.hud.selected_button, Eventually(Equals(1))) + + def test_no_reset_selected_button(self): + """Hud must not change selected button when results update over time.""" + # TODO - this test doesn't test anything. Onmy system the results never update. + # ideally we'd send artificial results to the hud from the test. + self.skipTest("This test makes no sense in its current state, needs reworking.") + + self.unity.hud.ensure_visible() + self.keyboard.type('is') + self.assertThat(self.unity.hud.search_string, Eventually(Equals('is'))) + self.keyboard.press_and_release('Down') + self.assertThat(self.unity.hud.selected_button, Eventually(Equals(2))) + # long sleep to let the service send updated results + sleep(10) + self.assertThat(self.unity.hud.selected_button, Equals(2)) + + def test_slow_tap_not_reveal_hud(self): + """A slow tap must not reveal the HUD.""" + self.keybinding("hud/reveal", 0.3) + # need a long sleep to ensure that we test after the hud controller has + # seen the keypress. + sleep(5) + self.assertThat(self.unity.hud.visible, Equals(False)) + + def test_alt_f4_doesnt_show_hud(self): + self.process_manager.start_app('Calculator') + sleep(1) + # Do a very fast Alt+F4 + self.keyboard.press_and_release("Alt+F4", 0.05) + sleep(1) + self.assertFalse(self.unity.hud.visible) + + def test_reveal_hud_with_no_apps(self): + """Hud must show even with no visible applications. + + This used to cause unity to crash (hence the lack of assertion in this test). + + """ + self.start_placeholder_app() + self.unity.window_manager.enter_show_desktop() + self.addCleanup(self.unity.window_manager.leave_show_desktop) + + self.unity.hud.ensure_visible() + self.unity.hud.ensure_hidden() + + def test_restore_focus(self): + """Ensures that once the hud is dismissed, the same application + that was focused before hud invocation is refocused. + """ + calc = self.process_manager.start_app("Calculator") + + # first ensure that the application has started and is focused + self.assertEqual(calc.is_active, True) + + self.unity.hud.ensure_visible() + self.unity.hud.ensure_hidden() + + # again ensure that the application we started is focused + self.assertEqual(calc.is_active, True) + + self.unity.hud.ensure_visible() + self.unity.hud.ensure_hidden() + # why do we do this: ??? + self.keyboard.press_and_release('Return') + sleep(1) + + self.assertEqual(calc.is_active, True) + + def test_gedit_save(self): + """Test that the 'save' action in the Hud works with GEdit.""" + + file_path = mktemp() + self.addCleanup(remove, file_path) + gedit_win = self.process_manager.start_app_window('Text Editor', files=[file_path], locale='C') + self.addCleanup(self.process_manager.close_all_app, 'Text Editor') + self.assertProperty(gedit_win, is_focused=True) + + self.keyboard.type("Test") + + self.unity.hud.ensure_visible() + + self.keyboard.type("save") + + self.assertThat(self.hud_query_check, + Eventually(Equals(u'Save\u2002(File)'))) + self.keyboard.press_and_release('Return') + self.addCleanup(self.keyboard.press_and_release, "Ctrl+s") + self.assertThat(self.unity.hud.visible, Eventually(Equals(False), timeout=30)) + + self.assertProperty(gedit_win, is_focused=True) + self.assertThat(lambda: exists(file_path), Eventually(Equals(True), timeout=30)) + + def test_hud_to_dash_has_key_focus(self): + """When switching from the hud to the dash you don't lose key focus.""" + self.unity.hud.ensure_visible() + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + self.keyboard.type('focus1') + self.assertThat(self.unity.dash.search_string, Eventually(Equals('focus1'))) + + def test_dash_to_hud_has_key_focus(self): + """When switching from the dash to the hud you don't lose key focus.""" + self.unity.dash.ensure_visible() + self.unity.hud.ensure_visible() + self.keyboard.type('focus2') + self.assertThat(self.unity.hud.search_string, Eventually(Equals('focus2'))) + + def test_hud_closes_on_workspace_switch(self): + """This test shows that when you switch to another workspace the hud closes.""" + if self.workspace.num_workspaces <= 1: + self.skipTest("This test requires enabled more than one workspace.") + initial_workspace = self.workspace.current_workspace + self.addCleanup(self.workspace.switch_to, initial_workspace) + self.unity.hud.ensure_visible() + self.workspace.switch_to((initial_workspace + 1) % self.workspace.num_workspaces) + self.assertThat(self.unity.hud.visible, Eventually(Equals(False))) + + def test_hud_closes_on_spread(self): + """This test shows that when the spread is initiated, the hud closes.""" + # Need at least one application open for the spread to work. + self.process_manager.start_app_window("Calculator") + self.unity.hud.ensure_visible() + self.addCleanup(self.keybinding, "spread/cancel") + self.keybinding("spread/start") + self.assertThat(self.unity.window_manager.scale_active, Eventually(Equals(True))) + self.assertThat(self.unity.hud.visible, Eventually(Equals(False))) + + def test_hud_closes_click_outside_geo_shrunk(self): + """ + Clicking outside the hud when it is shurnk will make it close. + Shurnk is when the hud has no results and is much smaller then normal. + """ + + self.unity.hud.ensure_visible() + (x,y,w,h) = self.unity.hud.view.geometry + self.mouse.move(w/2, h-50) + self.mouse.click() + + self.assertThat(self.unity.hud.visible, Eventually(Equals(False))) + + def test_hud_closes_click_outside_geo(self): + """Clicking outside of the hud will make it close.""" + + self.unity.hud.ensure_visible() + self.keyboard.type("Test") + + (x,y,w,h) = self.unity.hud.view.geometry + self.mouse.move(w/2, h+50) + self.mouse.click() + + self.assertThat(self.unity.hud.visible, Eventually(Equals(False))) + + def test_hud_closes_click_after_text_removed(self): + """Clicking outside of the hud after a search text has been entered and + then removed from the searchbox will make it close.""" + + self.unity.hud.ensure_visible() + self.keyboard.type("Test") + self.keyboard.press_and_release("Escape") + + (x,y,w,h) = self.unity.hud.view.geometry + self.mouse.move(w/2, h+50) + self.mouse.click() + + self.assertThat(self.unity.hud.visible, Eventually(Equals(False))) + + def test_alt_f4_close_hud(self): + """Hud must close on alt+F4.""" + self.unity.hud.ensure_visible() + self.keyboard.press_and_release("Alt+F4") + self.assertThat(self.unity.hud.visible, Eventually(Equals(False))) + + def test_alt_f4_close_hud_with_capslock_on(self): + """Hud must close on Alt+F4 even when the capslock is turned on.""" + self.keyboard.press_and_release("Caps_Lock") + self.addCleanup(self.keyboard.press_and_release, "Caps_Lock") + + self.unity.hud.ensure_visible() + self.keyboard.press_and_release("Alt+F4") + self.assertThat(self.unity.hud.visible, Eventually(Equals(False))) + + def test_app_activate_on_enter(self): + """Hud must close after activating a search item with Enter.""" + self.process_manager.start_app('Text Editor', locale='C') + self.addCleanup(self.process_manager.close_all_app, "Text Editor") + + self.unity.hud.ensure_visible() + + self.keyboard.type("Quit") + self.assertThat(self.unity.hud.search_string, Eventually(Equals("Quit"))) + self.assertThat(self.hud_query_check, + Eventually(Equals(u'Quit\u2002(File)'), timeout=30)) + + self.keyboard.press_and_release("Enter") + + is_running = lambda: self.process_manager.app_is_running("Text Editor") + self.assertThat(is_running, Eventually(Equals(False))) + + self.assertThat(self.unity.hud.visible, Eventually(Equals(False), timeout=30)) + + def test_hud_closes_on_escape(self): + """Hud must close on escape after searchbox is cleared""" + self.unity.hud.ensure_visible() + + self.keyboard.type("ThisText") + self.keyboard.press_and_release("Escape") + self.keyboard.press_and_release("Escape") + + self.assertThat(self.unity.hud.visible, Eventually(Equals(False))) + + def test_hud_closes_on_escape_shrunk(self): + """Hud must close when escape key is pressed""" + self.unity.hud.ensure_visible() + self.keyboard.press_and_release("Escape") + + self.assertThat(self.unity.hud.visible, Eventually(Equals(False))) + + def test_alt_arrow_keys_not_eaten(self): + """Tests that Alt+ArrowKey events are correctly passed to the + active window when Unity is not responding to them.""" + + term_win = self.process_manager.start_app_window("Terminal") + self.assertProperty(term_win, is_focused=True) + + # Here we anyway need a sleep, since even though the terminal can have + # keyboard focus, the shell inside might not be completely loaded yet + # and keystrokes might not get registered + sleep(1) + + #There's no easy way to read text from terminal, writing input + #to a text file and then reading from there works. + self.keyboard.type('echo "') + + #Terminal is receiving input with Alt+Arrowkeys + self.keyboard.press("Alt") + self.keyboard.press_and_release("Up") + self.keyboard.press_and_release("Down") + self.keyboard.press_and_release("Right") + self.keyboard.press_and_release("Left") + self.keyboard.release("Alt") + + self.keyboard.type('" > /tmp/ap_test_alt_keys') + self.addCleanup(remove, '/tmp/ap_test_alt_keys') + self.keyboard.press_and_release("Enter") + + file_contents = open('/tmp/ap_test_alt_keys', 'r').read().strip() + + self.assertThat(file_contents, Equals('ABCD')) + + def test_mouse_changes_selected_hud_button(self): + """This tests moves the mouse from the top of the screen to the bottom, this must + change the selected button from 1 to 5. + """ + self.start_menu_app() + self.unity.hud.ensure_visible() + + self.keyboard.type("e") + self.assertThat(self.unity.hud.num_buttons, Eventually(Equals(5))) + (x,y,w,h) = self.unity.hud.view.geometry + + # Specify a slower rate so that HUD can register the mouse movement properly + self.mouse.move(w/2, 0, rate=5) + self.assertThat(self.unity.hud.view.selected_button, Eventually(Equals(1))) + + self.mouse.move(w/2, h, rate=5) + self.assertThat(self.unity.hud.view.selected_button, Eventually(Equals(5))) + + def test_keyboard_steals_focus_from_mouse(self): + """This tests moves the mouse from the top of the screen to the bottom, + then it presses the keyboard up 5 times, this must change the selected button from 5 to 1. + """ + self.start_menu_app() + self.unity.hud.ensure_visible() + + self.keyboard.type("e") + self.assertThat(self.unity.hud.num_buttons, Eventually(Equals(5))) + (x,y,w,h) = self.unity.hud.view.geometry + + self.mouse.move(w/2, 0) + self.mouse.move(w/2, h) + self.assertThat(self.unity.hud.view.selected_button, Eventually(Equals(5))) + + for i in range(5): + self.keyboard.press_and_release('Up') + + self.assertThat(self.unity.hud.view.selected_button, Eventually(Equals(1))) + + def test_keep_focus_on_application_opens(self): + """The Hud must keep key focus as well as stay open if an app gets opened from an external source. """ + + self.unity.hud.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden) + + self.process_manager.start_app_window("Calculator") + sleep(1) + + self.keyboard.type("HasFocus") + self.assertThat(self.unity.hud.search_string, Eventually(Equals("HasFocus"))) + + def test_closes_mouse_down_outside(self): + """Test that a mouse down outside of the hud closes the hud.""" + + self.unity.hud.ensure_visible() + current_monitor = self.unity.hud.monitor + + (x,y,w,h) = self.unity.hud.geometry + (screen_x,screen_y,screen_w,screen_h) = self.display.get_screen_geometry(current_monitor) + + self.mouse.move(x + w + (screen_w-((screen_x-x)+w))/2, y + h + (screen_h-((screen_y-y)+h))/2) + self.mouse.click() + + self.assertThat(self.unity.hud.visible, Eventually(Equals(False))) + + def test_closes_then_focuses_window_on_mouse_down(self): + """If 2 windows are open with 1 maximized and the non-maxmized + focused. Then from the Hud clicking on the maximized window + must focus that window and close the hud. + """ + char_win = self.process_manager.start_app("Character Map") + self.assertProperty(char_win, is_active=True) + self.keybinding("window/maximize") + self.process_manager.start_app("Calculator") + + self.unity.hud.ensure_visible() + + #Click bottom right of the screen + w = self.display.get_screen_width() + h = self.display.get_screen_height() + self.mouse.move(w,h) + self.mouse.click() + + self.assertProperty(char_win, is_active=True) + + def test_hud_does_not_focus_wrong_window_after_alt_tab(self): + """Test the Hud focuses the correct window after an Alt+Tab.""" + + char_win = self.process_manager.start_app('Character Map') + self.process_manager.start_app('Calculator') + + self.keybinding("switcher/reveal_normal") + self.assertProperty(char_win, is_active=True) + + self.unity.hud.ensure_visible() + self.unity.hud.ensure_hidden() + + self.assertProperty(char_win, is_active=True) + + def test_mouse_does_not_steal_button_focus(self): + """When typing in the hud the mouse must not steal button focus.""" + self.start_menu_app() + self.unity.hud.ensure_visible() + + (x,y,w,h) = self.unity.hud.view.geometry + self.mouse.move(w/4, h/4) + + self.keyboard.type("e") + self.assertThat(self.unity.hud.view.selected_button, Eventually(Equals(1))) + + +class HudLauncherInteractionsTests(HudTestsBase): + + launcher_modes = [('Launcher autohide', {'launcher_autohide': False}), + ('Launcher never hide', {'launcher_autohide': True})] + + scenarios = multiply_scenarios(_make_monitor_scenarios(), launcher_modes) + + def setUp(self): + super(HudLauncherInteractionsTests, self).setUp() + # Launchers on all monitors + self.set_unity_option('num_launchers', 0) + self.set_unity_option('launcher_hide_mode', int(self.launcher_autohide)) + + move_mouse_to_screen(self.hud_monitor) + sleep(0.5) + + def test_multiple_hud_reveal_does_not_break_launcher(self): + """Multiple Hud reveals must not cause the launcher to set multiple + apps as active. + + """ + launcher = self.unity.launcher.get_launcher_for_monitor(self.hud_monitor) + + # We need an app to switch to: + self.process_manager.start_app('Character Map') + # We need an application to play with - I'll use the calculator. + self.process_manager.start_app('Calculator') + sleep(1) + + # before we start, make sure there's zero or one active icon: + num_active = self.get_num_active_launcher_icons() + self.assertThat(num_active, LessThan(2), "Invalid number of launcher icons active before test has run!") + + # reveal and hide hud several times over: + for i in range(3): + self.unity.hud.ensure_visible() + self.unity.hud.ensure_hidden() + + # click application icons for running apps in the launcher: + icon = self.unity.launcher.model.get_icon(desktop_id="gucharmap.desktop") + launcher.click_launcher_icon(icon) + + # see how many apps are marked as being active: + num_active = self.get_num_active_launcher_icons() + self.assertLessEqual(num_active, 1, "More than one launcher icon active after test has run!") + + def test_hud_does_not_change_launcher_status(self): + """Opening the HUD must not change the launcher visibility.""" + + launcher = self.unity.launcher.get_launcher_for_monitor(self.hud_monitor) + + launcher_shows_pre = launcher.is_showing + self.unity.hud.ensure_visible() + launcher_shows_post = launcher.is_showing + self.assertThat(launcher_shows_pre, Equals(launcher_shows_post)) + + +class HudLockedLauncherInteractionsTests(HudTestsBase): + + scenarios = _make_monitor_scenarios() + + def setUp(self): + super(HudLockedLauncherInteractionsTests, self).setUp() + # Locked Launchers on all monitors + self.set_unity_option('num_launchers', 0) + self.set_unity_option('launcher_hide_mode', 0) + + move_mouse_to_screen(self.hud_monitor) + sleep(0.5) + + def test_hud_launcher_icon_hides_bfb(self): + """BFB icon must be hidden when the HUD launcher icon is shown.""" + + hud_icon = self.unity.hud.get_launcher_icon() + bfb_icon = self.unity.launcher.model.get_bfb_icon() + + self.assertThat(bfb_icon.visible, Eventually(Equals(True))) + self.assertTrue(bfb_icon.is_on_monitor(self.hud_monitor)) + self.assertThat(hud_icon.visible, Eventually(Equals(False))) + + self.unity.hud.ensure_visible() + + self.assertThat(hud_icon.visible, Eventually(Equals(True))) + self.assertTrue(hud_icon.is_on_monitor(self.hud_monitor)) + # For some reason the BFB icon is always visible :-/ + #bfb_icon.visible, Eventually(Equals(False) + + def test_hud_desaturates_launcher_icons(self): + """Launcher icons must desaturate when the HUD is opened.""" + + self.unity.hud.ensure_visible() + + for icon in self.unity.launcher.model.get_launcher_icons_for_monitor(self.hud_monitor): + if isinstance(icon, HudLauncherIcon): + self.assertThat(icon.desaturated, Eventually(Equals(False))) + else: + self.assertThat(icon.desaturated, Eventually(Equals(True))) + + def test_hud_launcher_icon_click_hides_hud(self): + """Clicking the Hud Icon should hide the HUD""" + + hud_icon = self.unity.hud.get_launcher_icon() + self.unity.hud.ensure_visible() + + launcher = self.unity.launcher.get_launcher_for_monitor(self.hud_monitor) + launcher.click_launcher_icon(hud_icon) + + self.assertThat(self.unity.hud.visible, Eventually(Equals(False))) + self.assertThat(hud_icon.visible, Eventually(Equals(False))) + + +class HudVisualTests(HudTestsBase): + + launcher_modes = [('Launcher autohide', {'launcher_autohide': False}), + ('Launcher never hide', {'launcher_autohide': True})] + + launcher_screen = [('Launcher on primary monitor', {'launcher_primary_only': False}), + ('Launcher on all monitors', {'launcher_primary_only': True})] + + scenarios = multiply_scenarios(_make_monitor_scenarios(), launcher_modes, launcher_screen) + + def setUp(self): + super(HudVisualTests, self).setUp() + move_mouse_to_screen(self.hud_monitor) + self.set_unity_option('launcher_hide_mode', int(self.launcher_autohide)) + self.set_unity_option('num_launchers', int(self.launcher_primary_only)) + self.hud_monitor_is_primary = (self.display.get_primary_screen() == self.hud_monitor) + self.hud_locked = (not self.launcher_autohide and (not self.launcher_primary_only or self.hud_monitor_is_primary)) + sleep(0.5) + + def test_initially_hidden(self): + self.assertFalse(self.unity.hud.visible) + + def test_hud_is_on_right_monitor(self): + """HUD must be drawn on the monitor where the mouse is.""" + self.unity.hud.ensure_visible() + self.assertThat(self.unity.hud.monitor, Eventually(Equals(self.hud_monitor))) + self.assertTrue(is_rect_on_screen(self.unity.hud.monitor, self.unity.hud.geometry)) + + def test_hud_geometries(self): + """Tests the HUD geometries for the given monitor and status.""" + self.unity.hud.ensure_visible() + monitor_geo = self.display.get_screen_geometry(self.hud_monitor) + monitor_x = monitor_geo[0] + monitor_w = monitor_geo[2] + hud_x = self.unity.hud.geometry[0] + hud_w = self.unity.hud.geometry[2] + + if self.hud_locked: + self.assertThat(hud_x, GreaterThan(monitor_x)) + self.assertThat(hud_x, LessThan(monitor_x + monitor_w)) + self.assertThat(hud_w, Equals(monitor_x + monitor_w - hud_x)) + else: + self.assertThat(hud_x, Equals(monitor_x)) + self.assertThat(hud_w, Equals(monitor_w)) + + def test_hud_is_locked_to_launcher(self): + """Tests if the HUD is locked to launcher as we expect or not.""" + self.unity.hud.ensure_visible() + self.assertThat(self.unity.hud.is_locked_launcher, Eventually(Equals(self.hud_locked))) + + def test_hud_icon_is_shown(self): + """Tests that the correct HUD icon is shown.""" + self.unity.hud.ensure_visible() + hud_launcher_icon = self.unity.hud.get_launcher_icon() + hud_embedded_icon = self.unity.hud.get_embedded_icon() + + if self.unity.hud.is_locked_launcher: + self.assertThat(hud_launcher_icon.visible, Eventually(Equals(True))) + self.assertTrue(hud_launcher_icon.is_on_monitor(self.hud_monitor)) + self.assertTrue(hud_launcher_icon.active) + self.assertThat(hud_launcher_icon.monitor, Equals(self.hud_monitor)) + self.assertFalse(hud_launcher_icon.desaturated) + self.assertThat(hud_embedded_icon, Equals(None)) + else: + self.assertThat(hud_launcher_icon.visible, Eventually(Equals(False))) + self.assertFalse(hud_launcher_icon.active) + # the embedded icon has no visible property. + self.assertThat(hud_embedded_icon, NotEquals(None)) + + def test_hud_icon_shows_the_focused_application_emblem(self): + """Tests that the correct HUD icon is shown.""" + self.process_manager.close_all_app("Calculator") + calc = self.process_manager.start_app("Calculator") + self.assertTrue(calc.is_active) + self.unity.hud.ensure_visible() + + self.assertThat(self.unity.hud.icon.icon_name, Eventually(Equals(calc.icon))) + + def test_hud_icon_shows_the_ubuntu_emblem_on_empty_desktop(self): + """When in 'show desktop' mode the hud icon must be the BFB icon.""" + self.start_placeholder_app() + self.unity.window_manager.enter_show_desktop() + self.addCleanup(self.unity.window_manager.leave_show_desktop) + self.unity.hud.ensure_visible() + + self.assertThat(self.unity.hud.icon.icon_name, Eventually(EndsWith("launcher_bfb.png"))) + + def test_switch_dash_hud_does_not_break_the_focused_application_emblem(self): + """Switching from Dash to HUD must still show the correct HUD icon.""" + self.process_manager.close_all_app("Calculator") + calc = self.process_manager.start_app("Calculator") + self.assertTrue(calc.is_active) + + self.unity.dash.ensure_visible() + self.unity.hud.ensure_visible() + + self.assertThat(self.unity.hud.icon.icon_name, Eventually(Equals(calc.icon))) + + def test_switch_hud_dash_does_not_break_the_focused_application_emblem(self): + """Switching from HUD to Dash and back must still show the correct HUD icon.""" + self.process_manager.close_all_app("Calculator") + calc = self.process_manager.start_app("Calculator") + self.assertTrue(calc.is_active) + + self.unity.hud.ensure_visible() + self.unity.dash.ensure_visible() + self.unity.hud.ensure_visible() + self.assertThat(self.unity.hud.icon.icon_name, Eventually(Equals(calc.icon))) + + def test_dash_hud_only_uses_icon_from_current_desktop(self): + """ + Switching from the dash to Hud must pick an icon from applications + from the current desktop. As the Hud must go through the entire window + stack to find the top most window. + """ + if self.workspace.num_workspaces <= 1: + self.skipTest("This test requires enabled more than one workspace.") + self.start_placeholder_app() + initial_workspace = self.workspace.current_workspace + self.addCleanup(self.workspace.switch_to, initial_workspace) + self.unity.window_manager.enter_show_desktop() + self.addCleanup(self.unity.window_manager.leave_show_desktop) + + calc = self.process_manager.start_app("Calculator") + self.assertTrue(calc.is_active) + self.workspace.switch_to((initial_workspace + 1) % self.workspace.num_workspaces) + self.unity.dash.ensure_visible() + self.unity.hud.ensure_visible() + + self.assertThat(self.unity.hud.icon.icon_name, Eventually(EndsWith("launcher_bfb.png"))) + + +class HudAlternativeKeybindingTests(HudTestsBase): + + def alternateCheck(self, keybinding="Alt", hide=False): + """Nasty workaround for LP: #1157738""" + # So, since we have no way of making sure that after changing the unity option + # the change will be already 'applied' on the system, let's try the keybinding + # a few times before deciding that it does not work and we have a regression + # Seems better than a sleep(some_value_here) + for i in range(1, 4): + try: + self.keyboard.press_and_release(keybinding) + self.assertThat(self.unity.hud.visible, Eventually(Equals(True), timeout=3)) + break + except MismatchError: + continue + if hide: + self.unity.hud.ensure_hidden() + + def test_super_h(self): + """Test hud reveal on h.""" + self.addCleanup(self.alternateCheck, hide=True) + self.set_unity_option("show_hud", "h") + # Don't use reveal_hud, but be explicit in the keybindings. + self.alternateCheck("Super+h") + self.assertThat(self.unity.hud.visible, Eventually(Equals(True))) + + def test_ctrl_alt_h(self): + """Test hud reveal on h.""" + self.addCleanup(self.alternateCheck, hide=True) + self.set_unity_option("show_hud", "h") + # Don't use reveal_hud, but be explicit in the keybindings. + self.alternateCheck("Ctrl+Alt+h") + self.assertThat(self.unity.hud.visible, Eventually(Equals(True))) + + +class HudCrossMonitorsTests(HudTestsBase): + """Multi-monitor hud tests.""" + + def setUp(self): + super(HudCrossMonitorsTests, self).setUp() + if self.display.get_num_screens() < 2: + self.skipTest("This test requires more than 1 monitor.") + + def test_hud_stays_on_same_monitor(self): + """If the hud is opened, then the mouse is moved to another monitor and + the keyboard is used. The hud must not move to that monitor. + """ + + current_monitor = self.unity.hud.ideal_monitor + + self.unity.hud.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden) + + move_mouse_to_screen((current_monitor + 1) % self.display.get_num_screens()) + self.keyboard.type("abc") + + self.assertThat(self.unity.hud.ideal_monitor, Eventually(Equals(current_monitor))) + + def test_hud_close_on_cross_monitor_click(self): + """Hud must close when clicking on a window in a different screen.""" + + self.addCleanup(self.unity.hud.ensure_hidden) + + for monitor in range(self.display.get_num_screens()-1): + move_mouse_to_screen(monitor) + self.unity.hud.ensure_visible() + + move_mouse_to_screen(monitor+1) + sleep(.5) + self.mouse.click() + + self.assertThat(self.unity.hud.visible, Eventually(Equals(False))) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_panel.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_panel.py @@ -0,0 +1,1290 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Marco Trevisan (Treviño) +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.display import Display +#from autopilot.emulators.bamf import BamfWindow +from autopilot.process import Window +from autopilot.matchers import Eventually +import logging +import os +from testtools.matchers import Equals, GreaterThan, NotEquals +from time import sleep + +from unity.emulators.panel import IndicatorEntry +from unity.emulators.X11 import drag_window_to_screen +from unity.tests import UnityTestCase + +import gettext + +logger = logging.getLogger(__name__) + + +def _make_monitor_scenarios(): + num_monitors = Display.create().get_num_screens() + scenarios = [] + + if num_monitors == 1: + scenarios = [('Single Monitor', {'panel_monitor': 0})] + else: + for i in range(num_monitors): + scenarios += [('Monitor %d' % (i), {'panel_monitor': i})] + + return scenarios + + +class PanelTestsBase(UnityTestCase): + + panel_monitor = 0 + + def setUp(self): + super(PanelTestsBase, self).setUp() + self.panel = self.unity.panels.get_panel_for_monitor(self.panel_monitor) + self.panel.move_mouse_below_the_panel() + self.addCleanup(self.panel.move_mouse_below_the_panel) + + def open_new_application_window(self, app_name, maximized=False, move_to_monitor=True): + """Opens a new instance of the requested application, ensuring that only + one window is opened. + + Returns the opened BamfWindow + + """ + self.process_manager.close_all_app(app_name) + app_win = self.process_manager.start_app_window(app_name, locale="C") + app = app_win.application + + app_win.set_focus() + self.assertTrue(app.is_active) + self.assertTrue(app_win.is_focused) + self.assertThat(app.desktop_file, Equals(app_win.application.desktop_file)) + + if move_to_monitor: + self.move_window_to_panel_monitor(app_win) + + if maximized and not app_win.is_maximized: + self.keybinding("window/maximize") + self.addCleanup(self.keybinding, "window/restore") + elif not maximized and app_win.is_maximized: + self.keybinding("window/restore") + self.addCleanup(self.keybinding, "window/maximize") + + app_win.set_focus() + sleep(.25) + + self.assertThat(app_win.is_maximized, Equals(maximized)) + + return app_win + + def move_window_to_panel_monitor(self, window, restore_position=False): + """Drags a window to another monitor, eventually restoring it before""" + if not isinstance(window, Window): + raise TypeError("Window must be a autopilot.process.Window") + + if window.monitor == self.panel_monitor: + return + + if window.is_maximized: + self.keybinding("window/restore") + self.addCleanup(self.keybinding, "window/maximize") + sleep(.1) + + if restore_position: + self.addCleanup(drag_window_to_screen, window, window.monitor) + + drag_window_to_screen(window, self.panel_monitor) + sleep(.25) + self.assertThat(window.monitor, Equals(self.panel_monitor)) + + def mouse_open_indicator(self, indicator): + """This is an utility function that safely opens an indicator, + ensuring that it is closed at the end of the test and that the pointer + is moved outside the panel area (to make the panel hide the menus) + """ + if not isinstance(indicator, IndicatorEntry): + raise TypeError("Window must be a IndicatorEntry") + + indicator.mouse_click() + self.addCleanup(self.panel.move_mouse_below_the_panel) + self.addCleanup(self.keyboard.press_and_release, "Escape") + self.assertThat(indicator.active, Eventually(Equals(True))) + + def assertWinButtonsInOverlayMode(self, overlay_mode): + """Assert that there are three panel window buttons and all of them are + in the specified overlay mode. + + """ + if type(overlay_mode) is not bool: + raise TypeError("overlay_mode must be True or False") + + buttons = self.panel.window_buttons.get_buttons() + self.assertThat(len(buttons), Equals(3)) + for button in buttons: + self.assertThat(button.overlay_mode, Eventually(Equals(overlay_mode))) + + def assertNoWindowOpenWithXid(self, x_id): + """Assert that Bamf doesn't know of any open windows with the given xid.""" + # We can't check text_win.closed since we've just destroyed the window. + # Instead we make sure no window with it's x_id exists. + refresh_fn = lambda: [w for w in self.process_manager.get_open_windows() if w.x_id == x_id] + self.assertThat(refresh_fn, Eventually(Equals([]))) + + def sleep_menu_settle_period(self): + """Sleep long enough for the menus to fade in and fade out again.""" + sleep(self.panel.menus.fadein_duration / 1000.0) + sleep(self.panel.menus.discovery_duration) + sleep(self.panel.menus.fadeout_duration / 1000.0) + + # Unable to exit SDM without any active apps, need a placeholder. + # See bug LP:1079460 + def start_placeholder_app(self): + window_spec = { + "Title": "Placeholder application", + } + self.launch_test_window(window_spec) + + +class PanelTitleTests(PanelTestsBase): + + scenarios = _make_monitor_scenarios() + + def test_panel_title_on_empty_desktop(self): + """With no windows shown, the panel must display the default title.""" + gettext.install("unity", unicode=True) + self.start_placeholder_app() + self.unity.window_manager.enter_show_desktop() + self.addCleanup(self.unity.window_manager.leave_show_desktop) + + self.assertThat(self.panel.desktop_is_active, Eventually(Equals(True))) + self.assertThat(self.panel.title, Equals(_("Ubuntu Desktop"))) + + def test_panel_title_with_restored_application(self): + """Panel must display application name for a non-maximised application.""" + calc_win = self.open_new_application_window("Calculator", maximized=False) + + self.assertThat(self.panel.title, Eventually(Equals(calc_win.application.name))) + + def test_panel_title_with_maximized_application(self): + """Panel must display application name for a maximised application.""" + text_win = self.open_new_application_window("Text Editor", maximized=True) + + self.assertThat(self.panel.title, Eventually(Equals(text_win.title))) + + def test_panel_title_with_maximized_window_restored_child(self): + """Tests the title shown in the panel when opening the restored child of + a maximized application. + """ + text_win = self.open_new_application_window("Text Editor", maximized=True) + + # Ctrl+h opens the replace dialog. + self.keyboard.press_and_release("Ctrl+h") + self.addCleanup(self.keyboard.press_and_release, "Escape") + + self.assertThat(lambda: len(text_win.application.get_windows()), + Eventually(Equals(2))) + self.assertThat(self.panel.title, Equals(text_win.application.name)) + + def test_panel_shows_app_title_with_maximised_app(self): + """Tests app titles are shown in the panel with a non-focused maximized application.""" + self.open_new_application_window("Text Editor", maximized=True) + calc_win = self.open_new_application_window("Calculator", maximized=False) + + self.assertThat(self.panel.title, Eventually(Equals(calc_win.application.name))) + + def test_panel_title_updates_when_switching_to_maximized_app(self): + """Switching to a maximised app from a restored one must update the panel title.""" + text_win = self.open_new_application_window("Text Editor", maximized=True) + self.open_new_application_window("Calculator", maximized=False) + + icon = self.unity.launcher.model.get_icon(desktop_id=text_win.application.desktop_file) + launcher = self.unity.launcher.get_launcher_for_monitor(self.panel_monitor) + launcher.click_launcher_icon(icon) + + self.assertProperty(text_win, is_focused=True) + self.assertThat(self.panel.title, Eventually(Equals(text_win.title))) + + def test_panel_title_updates_on_maximized_window_title_changes(self): + """Panel title must change when the title of a maximized application changes.""" + text_win = self.open_new_application_window("Text Editor", maximized=True) + old_title = text_win.title + + text_win.set_focus() + self.keyboard.press_and_release("Ctrl+n") + + self.assertThat(lambda: text_win.title, Eventually(NotEquals(old_title))) + self.assertThat(self.panel.title, Eventually(Equals(text_win.title))) + + def test_panel_title_doesnt_change_with_switcher(self): + """Switching between apps must not change the Panels title.""" + calc_win = self.open_new_application_window("Calculator") + text_win = self.open_new_application_window("Text Editor") + current_title = self.panel.title + + self.unity.switcher.initiate() + self.addCleanup(self.unity.switcher.terminate) + self.unity.switcher.next_icon() + + self.assertThat(self.panel.title, + Eventually(Equals(current_title))) + + +class PanelWindowButtonsTests(PanelTestsBase): + + scenarios = _make_monitor_scenarios() + + def setUp(self): + super(PanelWindowButtonsTests, self).setUp() + # Locked Launchers on all monitors + self.set_unity_option('num_launchers', 0) + self.set_unity_option('launcher_hide_mode', 0) + + def test_window_buttons_dont_show_on_empty_desktop(self): + """Tests that the window buttons are not shown on clean desktop.""" + self.start_placeholder_app() + self.unity.window_manager.enter_show_desktop() + self.addCleanup(self.unity.window_manager.leave_show_desktop) + + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(False))) + + self.panel.move_mouse_over_window_buttons() + # Sleep twice as long as the timeout, just to be sure. timeout is in + # mS, we need seconds, hence the divide by 500.0 + sleep(self.panel.menus.fadein_duration / 500.0) + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(False))) + + def test_window_buttons_dont_show_for_restored_window(self): + """Window buttons must not show for a restored window.""" + self.open_new_application_window("Calculator") + self.panel.move_mouse_below_the_panel() + + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(False))) + + def test_window_buttons_dont_show_for_restored_window_with_mouse_in_panel(self): + """Window buttons must not show for a restored window with the mouse in + the panel.""" + self.open_new_application_window("Calculator") + self.panel.move_mouse_over_window_buttons() + + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(False))) + + def test_window_buttons_dont_show_for_maximized_window_on_mouse_out(self): + """Window buttons must not show for a maximized window when the mouse is + outside the panel. + """ + self.open_new_application_window("Text Editor", maximized=True) + + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(False))) + + def test_window_buttons_show_for_maximized_window_on_mouse_in(self): + """Window buttons must show when a maximized window is focused and the + mouse is over the menu-view panel areas. + + """ + self.open_new_application_window("Text Editor", maximized=True) + self.panel.move_mouse_over_window_buttons() + + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(True))) + self.assertWinButtonsInOverlayMode(False) + + def test_window_buttons_show_with_dash(self): + """Window buttons must be shown when the dash is open.""" + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + + self.assertThat(self.unity.dash.view.overlay_window_buttons_shown, Eventually(Equals(True))) + + def test_window_buttons_work_in_dash_after_launcher_resize(self): + """When the launcher icons are resized, the window + buttons must still work in the dash.""" + + self.set_unity_option("icon_size", 25) + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + + desired_max = not self.unity.dash.view.dash_maximized + if desired_max: + self.panel.window_buttons.maximize.mouse_click() + else: + self.panel.window_buttons.unmaximize.mouse_click() + + self.assertThat(self.unity.dash.view.dash_maximized, Eventually(Equals(desired_max))) + + def test_window_buttons_show_with_hud(self): + """Window buttons must be shown when the HUD is open.""" + self.unity.hud.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden) + + self.assertThat(self.unity.hud.view.overlay_window_buttons_shown, Eventually(Equals(True))) + + def test_window_buttons_update_visual_state(self): + """Window button must update its state in response to mouse events.""" + self.open_new_application_window("Text Editor", maximized=True, move_to_monitor=True) + self.panel.move_mouse_over_window_buttons() + button = self.panel.window_buttons.unmaximize + + self.assertThat(button.visual_state, Eventually(Equals("normal"))) + + button.mouse_move_to() + self.assertThat(button.visual_state, Eventually(Equals("prelight"))) + + self.mouse.press() + self.addCleanup(self.mouse.release) + self.assertThat(button.visual_state, Eventually(Equals("pressed"))) + + def test_window_buttons_cancel(self): + """Window buttons must ignore clicks when the mouse released outside + their area. + """ + win = self.open_new_application_window("Text Editor", maximized=True, move_to_monitor=True) + self.panel.move_mouse_over_window_buttons() + + button = self.panel.window_buttons.unmaximize + button.mouse_move_to() + self.mouse.press() + self.assertThat(button.visual_state, Eventually(Equals("pressed"))) + self.panel.move_mouse_below_the_panel() + self.mouse.release() + + self.assertThat(win.is_maximized, Equals(True)) + + def test_window_buttons_close_button_works_for_window(self): + """Close window button must actually closes a window.""" + text_win = self.open_new_application_window("Text Editor", + maximized=True, + move_to_monitor=True) + win_xid = text_win.x_id + + self.panel.window_buttons.close.mouse_click() + self.assertNoWindowOpenWithXid(win_xid) + + def test_window_buttons_close_follows_fitts_law(self): + """Tests that the 'Close' button is activated when clicking at 0,0. + + See bug #839690 + """ + text_win = self.open_new_application_window("Text Editor", + maximized=True, + move_to_monitor=True) + win_xid = text_win.x_id + + self.panel.move_mouse_over_window_buttons() + screen_x, screen_y = self.display.get_screen_geometry(self.panel_monitor)[:2] + self.mouse.move(screen_x, screen_y) + self.mouse.click() + + self.assertNoWindowOpenWithXid(win_xid) + + def test_window_buttons_minimize_button_works_for_window(self): + """Tests that the window button 'Minimize' actually minimizes a window.""" + text_win = self.open_new_application_window("Text Editor", + maximized=True, + move_to_monitor=True) + + self.panel.window_buttons.minimize.mouse_click() + + self.assertProperty(text_win, is_hidden=True) + + def test_window_buttons_minimize_follows_fitts_law(self): + """Tests that the 'Minimize' button is conform to Fitts's Law. + + See bug #839690 + """ + text_win = self.open_new_application_window("Text Editor", + maximized=True, + move_to_monitor=True) + + self.panel.move_mouse_over_window_buttons() + button = self.panel.window_buttons.minimize + target_x = button.x + button.width / 2 + target_y = self.display.get_screen_geometry(self.panel_monitor)[1] + self.mouse.move(target_x, target_y) + self.mouse.click() + + self.assertProperty(text_win, is_hidden=True) + + def test_window_buttons_unmaximize_button_works_for_window(self): + """Tests that the window button 'Unmaximize' actually unmaximizes a window.""" + text_win = self.open_new_application_window("Text Editor", + maximized=True, + move_to_monitor=True) + + self.panel.window_buttons.unmaximize.mouse_click() + + self.assertProperties(text_win, is_maximized=False, is_focused=True) + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(False))) + + def test_window_buttons_unmaximize_follows_fitts_law(self): + """Tests that the 'Unmaximize' button is conform to Fitts's Law. + + See bug #839690 + """ + text_win = self.open_new_application_window("Text Editor", + maximized=True, + move_to_monitor=True) + + button = self.panel.window_buttons.unmaximize + button.mouse_move_to() + target_x = button.x + button.width / 2 + target_y = self.display.get_screen_geometry(self.panel_monitor)[1] + self.mouse.move(target_x, target_y) + sleep(1) + self.mouse.click() + + self.assertProperty(text_win, is_maximized=False) + + def test_window_buttons_close_button_works_for_hud(self): + """Tests that the window 'Close' actually closes the HUD.""" + self.unity.hud.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden) + + self.panel.window_buttons.close.mouse_click() + self.assertThat(self.unity.hud.visible, Eventually(Equals(False))) + + def test_minimize_button_disabled_for_hud(self): + """Minimize button must be disabled for the HUD.""" + self.unity.hud.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden) + + self.assertThat(self.panel.window_buttons.minimize.enabled, Eventually(Equals(False))) + + def test_minimize_button_does_nothing_for_hud(self): + """Minimize button must not affect the Hud.""" + self.unity.hud.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden) + + self.panel.window_buttons.minimize.mouse_click() + + self.assertThat(self.unity.hud.visible, Eventually(Equals(True))) + + def test_maximize_button_disabled_for_hud(self): + """Maximize button must be disabled for the HUD.""" + self.unity.hud.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden) + + self.assertThat(self.panel.window_buttons.maximize.enabled, Eventually(Equals(False))) + + def test_maximize_button_does_nothing_for_hud(self): + """Maximize button must not affect the Hud.""" + self.unity.hud.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden) + + self.panel.window_buttons.maximize.mouse_click() + + self.assertThat(self.unity.hud.visible, Eventually(Equals(True))) + + def test_hud_maximize_button_does_not_change_dash_form_factor(self): + """Clicking on the 'Maximize' button of the HUD must not change the dash + layout. + + See bug #939054 + """ + inital_form_factor = self.unity.dash.view.form_factor + self.unity.hud.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden) + + self.panel.window_buttons.maximize.mouse_click() + # long sleep here to make sure that any change that might happen will + # have already happened. + sleep(5) + self.assertThat(self.unity.dash.view.form_factor, Equals(inital_form_factor)) + + def test_window_buttons_close_button_works_for_dash(self): + """Tests that the window 'Close' actually closes the Dash.""" + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + self.panel.window_buttons.close.mouse_click() + + self.assertThat(self.unity.dash.visible, Eventually(Equals(False))) + + def test_minimize_button_disabled_for_dash(self): + """Tests that the 'Minimize' button is disabled for the dash.""" + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + + self.assertThat(self.panel.window_buttons.minimize.enabled, Eventually(Equals(False))) + + def test_minimize_button_does_nothing_for_dash(self): + """Tests that the 'Minimize' button is disabled for the dash.""" + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + + self.panel.window_buttons.minimize.mouse_click() + sleep(5) + self.assertThat(self.unity.dash.visible, Eventually(Equals(True))) + + def test_window_buttons_maximize_or_restore_dash(self): + """Tests that the Maximize/Restore button works for the dash.""" + + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + + desired_max = not self.unity.dash.view.dash_maximized + if desired_max: + self.panel.window_buttons.maximize.mouse_click() + else: + self.panel.window_buttons.unmaximize.mouse_click() + + self.assertThat(self.unity.dash.view.dash_maximized, Eventually(Equals(desired_max))) + + def test_window_buttons_active_inactive_states(self): + """Tests that the maximized/restore buttons are in the correct state when the + dash is open. Asserting states: visible, sensitive, enabled. + """ + + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + + unmaximize = self.unity.dash.view.window_buttons.unmaximize + maximize = self.unity.dash.view.window_buttons.maximize + + desired_max = not self.unity.dash.view.dash_maximized + if desired_max: + active = maximize + inactive = unmaximize + else: + active = unmaximize + inactive = maximize + + self.assertThat(active.visible, Eventually(Equals(True))) + self.assertThat(active.sensitive, Eventually(Equals(True))) + self.assertThat(active.enabled, Eventually(Equals(True))) + self.assertThat(inactive.visible, Eventually(Equals(False))) + + def test_window_buttons_state_switch_on_click(self): + """Tests that when clicking the maximize/restore window button it + switchs its state from either maximize to restore, or restore to + maximize. + """ + + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + + unmaximize = self.unity.dash.view.window_buttons.unmaximize + maximize = self.unity.dash.view.window_buttons.maximize + + desired_max = not self.unity.dash.view.dash_maximized + if desired_max: + active = maximize + inactive = unmaximize + else: + active = unmaximize + inactive = maximize + + active.mouse_click() + + self.assertThat(inactive.visible, Eventually(Equals(True))) + self.assertThat(inactive.sensitive, Eventually(Equals(True))) + self.assertThat(inactive.enabled, Eventually(Equals(True))) + self.assertThat(active.visible, Eventually(Equals(False))) + self.assertThat(self.unity.dash.view.dash_maximized, Eventually(Equals(desired_max))) + + def test_minimize_button_disabled_for_non_minimizable_windows(self): + """Minimize button must be disabled for windows that don't support minimization.""" + text_win = self.open_new_application_window("Text Editor", + maximized=False, + move_to_monitor=True) + + self.keyboard.press_and_release("Ctrl+S") + self.addCleanup(self.keyboard.press_and_release, "Escape") + + wins = text_win.application.get_windows() + self.assertThat(len(wins), Equals(2)) + [target_win] = [w for w in wins if w.x_id != text_win.x_id] + self.move_window_to_panel_monitor(target_win, restore_position=False) + + self.keybinding("window/maximize") + self.assertProperty(target_win, is_maximized=True) + + self.assertThat(self.panel.window_buttons.close.enabled, Eventually(Equals(True))) + self.assertThat(self.panel.window_buttons.minimize.enabled, Eventually(Equals(False))) + + def test_window_buttons_show_when_indicator_active_and_mouse_over_panel(self): + """Window buttons must be shown when mouse is over panel area with an + indicator open. + """ + self.open_new_application_window("Text Editor", + maximized=True, + move_to_monitor=True) + + indicator = self.panel.indicators.get_indicator_by_name_hint("indicator-session") + self.mouse_open_indicator(indicator) + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(False))) + + self.panel.move_mouse_below_the_panel() + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(False))) + + self.panel.move_mouse_over_grab_area() + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(True))) + + def test_window_buttons_show_when_holding_show_menu_key(self): + """Window buttons must show when we press the show-menu keybinding.""" + self.open_new_application_window("Text Editor", + maximized=True, + move_to_monitor=True) + + self.sleep_menu_settle_period() + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(False))) + + self.keybinding_hold("panel/show_menus") + self.addCleanup(self.keybinding_release, "panel/show_menus") + + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(True))) + + self.keybinding_release("panel/show_menus") + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(False))) + + def test_window_buttons_cant_accept_keynav_focus(self): + """On a mouse down event over the window buttons + you must still be able to type into the Hud. + + """ + self.unity.hud.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden) + + self.keyboard.type("Hello") + self.panel.window_buttons.minimize.mouse_click() + self.keyboard.type("World") + + self.assertThat(self.unity.hud.search_string, Eventually(Equals("HelloWorld"))) + + def test_double_click_unmaximize_window(self): + """Double clicking the grab area must unmaximize a maximized window.""" + gedit_win = self.open_new_application_window("Text Editor", maximized=True) + + self.panel.move_mouse_over_grab_area() + self.mouse.click() + self.mouse.click() + + self.assertThat(self.panel.title, Eventually(Equals(gedit_win.application.name))) + + +class PanelHoverTests(PanelTestsBase): + """Tests with the mouse pointer hovering the panel area.""" + + scenarios = _make_monitor_scenarios() + + def test_only_menus_show_for_restored_window_on_mouse_in_window_btn_area(self): + """Restored windows should only show menus when the mouse is in the window + button area. + """ + self.open_new_application_window("Calculator", + maximized=False, + move_to_monitor=True) + self.sleep_menu_settle_period() + + self.panel.move_mouse_over_window_buttons() + + self.assertThat(self.panel.menus_shown, Eventually(Equals(True))) + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(False))) + + def test_only_menus_show_for_restored_window_on_mouse_in_menu_area(self): + """Restored windows should only show menus when the mouse is in the window + menu area. + """ + self.open_new_application_window("Calculator", + maximized=False, + move_to_monitor=True) + self.sleep_menu_settle_period() + + self.panel.move_mouse_over_menus() + + self.assertThat(self.panel.menus_shown, Eventually(Equals(True))) + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(False))) + + def test_only_menus_show_for_restored_window_on_mouse_in_grab_area(self): + """Restored windows should only show menus when the mouse is in the panel + grab area. + """ + self.open_new_application_window("Calculator", + maximized=False, + move_to_monitor=True) + self.sleep_menu_settle_period() + + if self.panel.grab_area.width <= 0: + self.skipTest("Grab area is too small to run test!") + + self.panel.move_mouse_over_grab_area() + + self.assertThat(self.panel.menus_shown, Eventually(Equals(True))) + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(False))) + + def test_hovering_over_indicators_does_not_show_app_menus(self): + """Hovering the mouse over the indicators must not show app menus.""" + self.open_new_application_window("Calculator", + maximized=False, + move_to_monitor=True) + self.sleep_menu_settle_period() + + self.panel.move_mouse_over_menus() + # This assert is repeated from above, but we use it to make sure that + # the menus are shown before we move over the indicators. + self.assertThat(self.panel.menus_shown, Eventually(Equals(True))) + + self.panel.move_mouse_over_indicators() + + self.assertThat(self.panel.menus_shown, Eventually(Equals(False))) + + def test_menus_show_for_maximized_window_on_mouse_in_btn_area(self): + """Menus and window buttons must be shown when the mouse is in the window + button area for a maximised application. + """ + self.open_new_application_window("Text Editor", + maximized=True, + move_to_monitor=True) + self.sleep_menu_settle_period() + + self.panel.move_mouse_over_window_buttons() + + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(True))) + self.assertThat(self.panel.menus_shown, Eventually(Equals(True))) + + def test_menus_show_for_maximized_window_on_mouse_in_menu_area(self): + """Menus and window buttons must be shown when the mouse is in the menu + area for a maximised application. + """ + self.open_new_application_window("Text Editor", + maximized=True, + move_to_monitor=True) + self.sleep_menu_settle_period() + + self.panel.move_mouse_over_menus() + + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(True))) + self.assertThat(self.panel.menus_shown, Eventually(Equals(True))) + + def test_menus_show_for_maximized_window_on_mouse_in_grab_area(self): + """Menus and window buttons must be shown when the mouse is in the grab + area for a maximised application. + """ + if self.panel.grab_area.width <= 0: + self.skipTest("Grab area is too small to run this test!") + + self.open_new_application_window("Text Editor", + maximized=True, + move_to_monitor=True) + self.sleep_menu_settle_period() + + self.panel.move_mouse_over_grab_area() + + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(True))) + self.assertTrue(self.panel.menus_shown, Eventually(Equals(True))) + + def test_menus_and_btns_hidden_with_mouse_over_indicators(self): + """Hovering the mouse over the indicators must hide the menus and window + buttons. + """ + self.open_new_application_window("Text Editor", + maximized=True, + move_to_monitor=True) + self.sleep_menu_settle_period() + + self.panel.move_mouse_over_menus() + # We use this assert to make sure that the menus are visible before we + # move the mouse: + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(True))) + + self.panel.move_mouse_over_indicators() + + self.assertThat(self.panel.window_buttons_shown, Eventually(Equals(False))) + self.assertThat(self.panel.menus_shown, Eventually(Equals(False))) + + def test_hovering_indicators_open_menus(self): + """Opening an indicator entry, and then hovering on other entries must + open them. + """ + self.open_new_application_window("Text Editor") + entries = self.panel.get_indicator_entries(include_hidden_menus=True) + + self.assertThat(len(entries), GreaterThan(0)) + self.mouse_open_indicator(entries[0]) + + for entry in entries: + entry.mouse_move_to() + self.assertThat(entry.active, Eventually(Equals(True))) + self.assertThat(entry.menu_y, Eventually(NotEquals(0))) + + +class PanelMenuTests(PanelTestsBase): + + scenarios = _make_monitor_scenarios() + + def start_test_app_with_menus(self): + window_spec = { + "Title": "Test Application with Menus", + "Menu": [ + { + "Title": "&File", + "Menu": ["Open", "Save", "Save As", "Quit"] + }, + {"Title": "&Edit"}, + {"Title": "&Quit"} + ] + } + self.launch_test_window(window_spec) + + def test_menus_are_added_on_new_application(self): + """Tests that menus are added when a new application is opened.""" + self.start_test_app_with_menus() + + refresh_fn = lambda: len(self.panel.menus.get_entries()) + self.assertThat(refresh_fn, Eventually(Equals(3))) + + menu_view = self.panel.menus + self.assertThat(lambda: menu_view.get_menu_by_label("_File"), Eventually(NotEquals(None))) + self.assertThat(lambda: menu_view.get_menu_by_label("_Edit"), Eventually(NotEquals(None))) + self.assertThat(lambda: menu_view.get_menu_by_label("_Quit"), Eventually(NotEquals(None))) + + def test_menus_are_not_shown_if_the_application_has_no_menus(self): + """Applications with no menus must not show menus in the panel.""" + + test_win = self.launch_test_window() + + self.assertThat( + lambda: len(self.panel.menus.get_entries()), + Eventually(Equals(0)), + "Current panel entries are: %r" % self.panel.menus.get_entries()) + + self.panel.move_mouse_over_grab_area() + self.assertThat(self.panel.title, Eventually(Equals(test_win.application.name))) + + def test_menus_shows_when_new_application_is_opened(self): + """When starting a new application, menus must first show, then hide.""" + + self.start_test_app_with_menus() + + self.assertThat(self.panel.menus_shown, Eventually(Equals(True))) + self.sleep_menu_settle_period() + self.assertThat(self.panel.menus_shown, Eventually(Equals(False))) + + def test_menus_dont_show_if_a_new_application_window_is_opened(self): + """This tests the menu discovery feature on new window for a know application.""" + self.open_new_application_window("Character Map") + self.sleep_menu_settle_period() + + self.process_manager.start_app("Character Map") + sleep(self.panel.menus.fadein_duration / 1000.0) + # Not using Eventually here since this is time-critical. Need to work + # out a better way to do this. + self.assertThat(self.panel.menus_shown, Equals(False)) + + def test_menus_dont_show_for_restored_window_on_mouse_out(self): + """Restored window menus must not show when the mouse is outside the + panel menu area. + """ + self.open_new_application_window("Calculator") + self.sleep_menu_settle_period() + + self.assertThat(self.panel.menus_shown, Eventually(Equals(False))) + + def test_menus_show_for_restored_window_on_mouse_in(self): + """Restored window menus must show only when the mouse is over the panel + menu area. + """ + self.open_new_application_window("Calculator") + self.sleep_menu_settle_period() + + self.panel.move_mouse_over_menus() + + self.assertThat(self.panel.menus_shown, Eventually(Equals(True))) + + def test_menus_dont_show_for_maximized_window_on_mouse_out(self): + """Maximized window menus must not show when the mouse is outside the + panel menu area. + """ + self.open_new_application_window("Text Editor", maximized=True) + + self.assertThat(self.panel.menus_shown, Eventually(Equals(False))) + + def test_menus_show_for_maximized_window_on_mouse_in(self): + """Maximized window menus must only show when the mouse is over the + panel menu area. + """ + self.open_new_application_window("Text Editor", maximized=True) + self.sleep_menu_settle_period() + + self.panel.move_mouse_over_menus() + self.assertThat(self.panel.menus_shown, Eventually(Equals(True))) + + def test_menus_dont_show_with_dash(self): + """Tests that menus are not showing when opening the dash.""" + self.open_new_application_window("Text Editor", maximized=True) + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + + self.assertThat(self.panel.menus_shown, Eventually(Equals(False))) + + + def test_menus_dont_show_with_hud(self): + """Tests that menus are not showing when opening the HUD.""" + self.open_new_application_window("Text Editor", maximized=True) + self.unity.hud.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden) + + self.assertThat(self.panel.menus_shown, Eventually(Equals(False))) + + +class PanelIndicatorEntryTests(PanelTestsBase): + """Tests for the indicator entries, including both menu and indicators.""" + + scenarios = _make_monitor_scenarios() + + def open_app_and_get_menu_entry(self): + """Open the test app and wait for the menu entry to appear.""" + self.open_new_application_window("Calculator") + refresh_fn = lambda: len(self.panel.menus.get_entries()) + self.assertThat(refresh_fn, Eventually(GreaterThan(0))) + menu_entry = self.panel.menus.get_entries()[0] + return menu_entry + + def test_menu_opens_on_click(self): + """Tests that clicking on a menu entry, opens a menu.""" + menu_entry = self.open_app_and_get_menu_entry() + self.mouse_open_indicator(menu_entry) + + self.assertThat(menu_entry.active, Eventually(Equals(True))) + self.assertThat(menu_entry.menu_x, Eventually(Equals(menu_entry.x))) + self.assertThat(menu_entry.menu_y, Eventually(Equals(self.panel.height))) + + def test_menu_opens_closes_on_click(self): + """Clicking on an open menu entru must close it again.""" + menu_entry = self.open_app_and_get_menu_entry() + self.mouse_open_indicator(menu_entry) + + # This assert is for timing purposes only: + self.assertThat(menu_entry.active, Eventually(Equals(True))) + # Make sure we wait at least enough time that the menu appeared as well + sleep(self.panel.menus.fadein_duration / 1000.0) + self.mouse.click() + + self.assertThat(menu_entry.active, Eventually(Equals(False))) + self.assertThat(menu_entry.menu_x, Eventually(Equals(0))) + self.assertThat(menu_entry.menu_y, Eventually(Equals(0))) + + def test_menu_closes_on_click_outside(self): + """Clicking outside an open menu must close it.""" + menu_entry = self.open_app_and_get_menu_entry() + self.mouse_open_indicator(menu_entry) + + # This assert is for timing purposes only: + self.assertThat(menu_entry.active, Eventually(Equals(True))) + target_x = menu_entry.menu_x + menu_entry.menu_width/2 + target_y = menu_entry.menu_y + menu_entry.menu_height + 10 + self.mouse.move(target_x, target_y) + self.mouse.click() + + self.assertThat(menu_entry.active, Eventually(Equals(False))) + self.assertThat(menu_entry.menu_x, Eventually(Equals(0))) + self.assertThat(menu_entry.menu_y, Eventually(Equals(0))) + + def test_indicator_opens_when_dash_is_open(self): + """When the dash is open and a click is on an indicator the dash + must close and the indicator must open. + """ + self.unity.dash.ensure_visible() + + indicator = self.panel.indicators.get_indicator_by_name_hint("indicator-session") + self.mouse_open_indicator(indicator) + + self.assertThat(indicator.active, Eventually(Equals(True))) + self.assertThat(self.unity.dash.visible, Eventually(Equals(False))) + + +class PanelKeyNavigationTests(PanelTestsBase): + + scenarios = _make_monitor_scenarios() + + def get_active_indicator(self): + """Get the active indicator in a safe manner. + + This method will wait until the active indicator has been set. + + """ + self.assertThat(self.panel.get_active_indicator, Eventually(NotEquals(None))) + return self.panel.get_active_indicator() + + def test_panel_first_menu_show_works(self): + """Pressing the open-menus keybinding must open the first indicator.""" + self.open_new_application_window("Calculator") + sleep(1) + self.keybinding("panel/open_first_menu") + self.addCleanup(self.keyboard.press_and_release, "Escape") + + open_indicator = self.get_active_indicator() + expected_indicator = self.panel.get_indicator_entries(include_hidden_menus=True)[0] + self.assertThat(open_indicator.entry_id, Eventually(Equals(expected_indicator.entry_id))) + + self.keybinding("panel/open_first_menu") + self.assertThat(self.panel.get_active_indicator, Eventually(Equals(None))) + + def test_panel_menu_accelerators_work(self): + """Pressing a valid menu accelerator must open the correct menu item.""" + self.open_new_application_window("Text Editor") + sleep(1) + self.keyboard.press_and_release("Alt+f") + self.addCleanup(self.keyboard.press_and_release, "Escape") + + open_indicator = self.get_active_indicator() + self.assertThat(open_indicator.label, Eventually(Equals("_File"))) + + def test_panel_indicators_key_navigation_next_works(self): + """Right arrow key must open the next menu.""" + calc_win = self.open_new_application_window("Calculator") + self.assertProperty(calc_win, is_focused=True) + + available_indicators = self.panel.get_indicator_entries(include_hidden_menus=True) + + self.keybinding("panel/open_first_menu") + self.addCleanup(self.keyboard.press_and_release, "Escape") + + self.keybinding("panel/next_indicator") + open_indicator = self.get_active_indicator() + expected_indicator = available_indicators[1] + self.assertThat(open_indicator.entry_id, Eventually(Equals(expected_indicator.entry_id))) + + def test_panel_indicators_key_navigation_prev_works(self): + """Left arrow key must open the previous menu.""" + calc_win = self.open_new_application_window("Calculator") + self.assertProperty(calc_win, is_focused=True) + + available_indicators = self.panel.get_indicator_entries(include_hidden_menus=True) + + self.keybinding("panel/open_first_menu") + self.addCleanup(self.keyboard.press_and_release, "Escape") + + self.keybinding("panel/prev_indicator") + open_indicator = self.get_active_indicator() + expected_indicator = available_indicators[-1] + + self.assertThat(open_indicator.entry_id, Eventually(Equals(expected_indicator.entry_id))) + + def test_mouse_does_not_break_key_navigation(self): + """Must be able to use the mouse to open indicators after they've been + opened with the keyboard. + """ + self.open_new_application_window("Calculator") + available_indicators = self.panel.get_indicator_entries(include_hidden_menus=True) + + self.keybinding("panel/open_first_menu") + self.addCleanup(self.keyboard.press_and_release, "Escape") + + available_indicators[2].mouse_move_to() + self.addCleanup(self.panel.move_mouse_below_the_panel) + + self.assertThat(available_indicators[2].active, Eventually(Equals(True))) + + self.keybinding("panel/prev_indicator") + self.assertThat(available_indicators[1].active, Eventually(Equals(True))) + + +class PanelGrabAreaTests(PanelTestsBase): + """Panel grab area tests.""" + + scenarios = _make_monitor_scenarios() + + def move_mouse_over_grab_area(self): + self.panel.move_mouse_over_grab_area() + self.addCleanup(self.panel.move_mouse_below_the_panel) + sleep(.1) + + def test_unmaximize_from_grab_area_works(self): + """Dragging a window down from the panel must unmaximize it.""" + text_win = self.open_new_application_window("Text Editor", maximized=True) + + self.move_mouse_over_grab_area() + self.mouse.press() + self.panel.move_mouse_below_the_panel() + self.mouse.release() + + self.assertProperty(text_win, is_maximized=False) + + def test_focus_the_maximized_window_works(self): + """Clicking on the grab area must put a maximized window in focus.""" + text_win = self.open_new_application_window("Text Editor", maximized=True) + calc_win = self.open_new_application_window("Calculator") + + self.assertProperty(text_win, is_focused=False) + self.assertProperty(calc_win, is_focused=True) + + self.move_mouse_over_grab_area() + self.mouse.click() + + self.assertProperty(text_win, is_focused=True) + + def test_lower_the_maximized_window_works(self): + """Middle-clicking on the panel grab area must lower a maximized window.""" + calc_win = self.open_new_application_window("Calculator") + text_win = self.open_new_application_window("Text Editor", maximized=True) + + self.assertProperty(text_win, is_focused=True) + self.assertProperty(calc_win, is_focused=False) + + self.move_mouse_over_grab_area() + self.mouse.click(2) + + self.assertProperty(calc_win, is_focused=True) + + def test_panels_dont_steal_keynav_foucs_from_hud(self): + """On a mouse click event on the panel you must still be able to type into the Hud.""" + self.unity.hud.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden) + + self.keyboard.type("Hello") + self.move_mouse_over_grab_area() + self.mouse.click() + self.keyboard.type("World") + + self.assertThat(self.unity.hud.search_string, Eventually(Equals("HelloWorld"))) + + +class PanelCrossMonitorsTests(PanelTestsBase): + """Multimonitor panel tests.""" + + def setUp(self): + super(PanelCrossMonitorsTests, self).setUp() + if self.display.get_num_screens() < 2: + self.skipTest("This test requires a multimonitor setup") + + def test_panel_title_updates_moving_window(self): + """Panel must show the title of a restored window when moved to it's monitor.""" + calc_win = self.open_new_application_window("Calculator") + + prev_monitor = None + for monitor in range(0, self.display.get_num_screens()): + if calc_win.monitor != monitor: + drag_window_to_screen(calc_win, monitor) + + if prev_monitor: + prev_panel = self.unity.panels.get_panel_for_monitor(prev_monitor) + self.assertThat(prev_panel.active, Eventually(Equals(False))) + + panel = self.unity.panels.get_panel_for_monitor(monitor) + self.assertThat(panel.active, Eventually(Equals(True))) + self.assertThat(panel.title, Eventually(Equals(calc_win.application.name))) + + prev_monitor = monitor + + def test_window_buttons_dont_show_for_maximized_window_on_mouse_in(self): + """Window buttons must not show when the mouse is hovering the panel in + other monitors. + """ + self.open_new_application_window("Text Editor", maximized=True) + self.sleep_menu_settle_period() + + for monitor in range(0, self.display.get_num_screens()): + panel = self.unity.panels.get_panel_for_monitor(monitor) + panel.move_mouse_over_window_buttons() + + self.sleep_menu_settle_period() + + if self.panel_monitor == monitor: + self.assertThat(panel.window_buttons_shown, Eventually(Equals(True))) + else: + self.assertThat(panel.window_buttons_shown, Eventually(Equals(False))) + + def test_window_buttons_dont_show_in_other_monitors_when_dash_is_open(self): + """Window buttons must not show on the panels other than the one where + the dash is opened. + """ + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + + for monitor in range(0, self.display.get_num_screens()): + panel = self.unity.panels.get_panel_for_monitor(monitor) + + if self.unity.dash.monitor == monitor: + self.assertThat(panel.window_buttons_shown, Eventually(Equals(True))) + else: + self.assertThat(panel.window_buttons_shown, Eventually(Equals(False))) + + def test_window_buttons_dont_show_in_other_monitors_when_hud_is_open(self): + """Window buttons must not show on the panels other than the one where + the hud is opened. + """ + self.unity.hud.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden) + + for monitor in range(0, self.display.get_num_screens()): + panel = self.unity.panels.get_panel_for_monitor(monitor) + + if self.unity.hud.monitor == monitor: + self.assertThat(panel.window_buttons_shown, Eventually(Equals(True))) + else: + self.assertThat(panel.window_buttons_shown, Eventually(Equals(False))) + + def test_window_buttons_close_inactive_when_clicked_in_another_monitor(self): + """Clicking the close button must not affect the active maximized window + on another monitor. + + See bug #865701 + """ + text_win = self.open_new_application_window("Text Editor", maximized=True) + + for monitor in range(self.display.get_num_screens()): + panel = self.unity.panels.get_panel_for_monitor(monitor) + + if monitor != text_win.monitor: + panel.window_buttons.close.mouse_move_to() + panel.window_buttons.close.mouse_click() + self.assertThat(text_win.closed, Equals(False)) + + def test_window_buttons_minimize_inactive_when_clicked_in_another_monitor(self): + """Clicking the minimise button must not affect the active maximized + window on another monitor. + + See bug #865701 + """ + text_win = self.open_new_application_window("Text Editor", maximized=True) + + for monitor in range(self.display.get_num_screens()): + panel = self.unity.panels.get_panel_for_monitor(monitor) + + if monitor != text_win.monitor: + panel.window_buttons.minimize.mouse_click() + self.assertThat(text_win.is_hidden, Equals(False)) + + def test_window_buttons_unmaximize_inactive_when_clicked_in_another_monitor(self): + """Clicking the restore button must not affect the active maximized + window on another monitor. + + See bug #865701 + """ + text_win = self.open_new_application_window("Text Editor", maximized=True) + + for monitor in range(0, self.display.get_num_screens()): + panel = self.unity.panels.get_panel_for_monitor(monitor) + + if monitor != text_win.monitor: + panel.window_buttons.unmaximize.mouse_click() + self.assertThat(text_win.is_maximized, Equals(True)) + + def test_hovering_indicators_on_multiple_monitors(self): + """Opening an indicator entry and then hovering others entries must open them.""" + text_win = self.open_new_application_window("Text Editor") + panel = self.unity.panels.get_panel_for_monitor(text_win.monitor) + indicator = panel.indicators.get_indicator_by_name_hint("indicator-session") + self.mouse_open_indicator(indicator) + + for monitor in range(0, self.display.get_num_screens()): + panel = self.unity.panels.get_panel_for_monitor(monitor) + + entries = panel.get_indicator_entries(include_hidden_menus=True) + self.assertThat(len(entries), GreaterThan(0)) + + for entry in entries: + entry.mouse_move_to() + + if monitor != self.panel_monitor and entry.type == "menu": + # we're on the "other" monitor, so the menu should be hidden. + self.assertThat(entry.active, Eventually(Equals(False))) + self.assertThat(entry.visible, Eventually(Equals(False))) + self.assertThat(entry.menu_y, Eventually(Equals(0))) + else: + self.assertThat(entry.visible, Eventually(Equals(True))) + self.assertThat(entry.active, Eventually(Equals(True))) + self.assertThat(entry.menu_y, Eventually(NotEquals(0))) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_command_lens.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_command_lens.py @@ -0,0 +1,96 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Thomi Richards +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.matchers import Eventually +from testtools.matchers import Equals, NotEquals, GreaterThan, MatchesPredicate +from time import sleep + +from unity.tests import UnityTestCase + +import gettext + +class CommandScopeSearchTests(UnityTestCase): + """Test the command scope search bahavior.""" + + def setUp(self): + super(CommandScopeSearchTests, self).setUp() + gettext.install("unity-scope-applications") + + def tearDown(self): + self.unity.dash.ensure_hidden() + super(CommandScopeSearchTests, self).tearDown() + + def wait_for_category(self, scope, group): + """Method to wait for a specific category""" + get_scope_fn = lambda: scope.get_category_by_name(group) + self.assertThat(get_scope_fn, Eventually(NotEquals(None), timeout=20)) + return get_scope_fn() + + def test_no_results(self): + """An empty string should get no results.""" + self.unity.dash.reveal_command_scope() + command_scope = self.unity.dash.get_current_scope() + + if self.unity.dash.search_string != "": + self.keyboard.press_and_release("Delete") + + self.assertThat(self.unity.dash.search_string, Eventually(Equals(""))) + + results_category = self.wait_for_category(command_scope, _("Results")) + self.assertThat(results_category.is_visible, Eventually(Equals(False))) + + def test_results_category_appears(self): + """Results category must appear when there are some results.""" + self.unity.dash.reveal_command_scope() + command_scope = self.unity.dash.get_current_scope() + # lots of apps start with 'a'... + self.keyboard.type("a") + self.assertThat(self.unity.dash.search_string, Eventually(Equals("a"))) + + results_category = self.wait_for_category(command_scope, _("Results")) + self.assertThat(results_category.is_visible, Eventually(Equals(True))) + + def test_result_category_actually_contains_results(self): + """With a search string of 'a', the results category must contain some results.""" + self.unity.dash.reveal_command_scope() + command_scope = self.unity.dash.get_current_scope() + # lots of apps start with 'a'... + self.keyboard.type("a") + self.assertThat(self.unity.dash.search_string, Eventually(Equals("a"))) + + results_category = self.wait_for_category(command_scope, _("Results")) + self.assertThat(lambda: len(results_category.get_results()), Eventually(GreaterThan(0), timeout=20)) + + def test_run_before_refresh(self): + """Hitting enter before view has updated results must run the correct command.""" + if self.process_manager.app_is_running("Text Editor"): + self.process_manager.close_all_app("Text Editor") + sleep(1) + + self.unity.dash.reveal_command_scope() + self.keyboard.type("g") + sleep(1) + self.keyboard.type("edit", 0.1) + self.keyboard.press_and_release("Enter", 0.1) + self.addCleanup(self.process_manager.close_all_app, "Text Editor") + app_found = self.process_manager.wait_until_application_is_running("gedit.desktop", 5) + self.assertTrue(app_found) + + def test_ctrl_tab_switching(self): + """Pressing Ctrl+Tab after launching command scope must switch to Home scope.""" + self.unity.dash.reveal_command_scope() + self.keybinding("dash/lens/next") + self.assertThat(self.unity.dash.active_scope, Eventually(Equals("home.scope"))) + + def test_ctrl_shift_tab_switching(self): + """Pressing Ctrl+Shift+Tab after launching command scope must switch to Photos or Social scope (Social can be hidden by default).""" + self.unity.dash.reveal_command_scope() + self.keybinding("dash/lens/prev") + self.assertThat(self.unity.dash.active_scope, Eventually(MatchesPredicate(lambda x: x in ["photos.scope", "social.scope"], '%s is not last scope'))) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_unity_logging.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_unity_logging.py @@ -0,0 +1,69 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Thomi Richards +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from os import remove +from os.path import exists +from tempfile import mktemp +from testtools.matchers import Contains, Not +from time import sleep + + +from unity.emulators.unity import ( + start_log_to_file, + reset_logging, + set_log_severity, + log_unity_message, + ) +from unity.tests import UnityTestCase + + +class UnityLoggingTests(UnityTestCase): + """Tests for Unity's debug logging framework.""" + + def start_new_log_file(self): + fpath = mktemp() + start_log_to_file(fpath) + return fpath + + def test_new_file_created(self): + """Unity must create log file when we call start_log_to_file. + """ + fpath = self.start_new_log_file() + self.addCleanup(remove, fpath) + self.addCleanup(reset_logging) + sleep(1) + self.assertTrue(exists(fpath)) + + def test_messages_arrive_in_file(self): + fpath = self.start_new_log_file() + log_unity_message("WARNING", "This is a warning of things to come") + sleep(1) + reset_logging() + + with open(fpath, 'r') as f: + self.assertThat(f.read(), Contains("This is a warning of things to come")) + + def test_default_log_level_unchanged(self): + fpath = self.start_new_log_file() + log_unity_message("DEBUG", "This is some INFORMATION") + sleep(1) + reset_logging() + with open(fpath, 'r') as f: + self.assertThat(f.read(), Not(Contains("This is some INFORMATION"))) + + def test_can_change_log_level(self): + fpath = self.start_new_log_file() + set_log_severity("", "DEBUG") + self.addCleanup(set_log_severity, "", "INFO") + log_unity_message("DEBUG", "This is some more INFORMATION") + sleep(1) + reset_logging() + with open(fpath, 'r') as f: + self.assertThat(f.read(), Contains("This is some more INFORMATION")) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_shopping_lens.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_shopping_lens.py @@ -0,0 +1,114 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Brandon Schaefer +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.matchers import Eventually +from testtools.matchers import Equals, GreaterThan +from time import sleep +import urllib2 +import gettext + +from unity.tests import UnityTestCase + + +class ShoppingScopeTests(UnityTestCase): + """Test the shopping scope bahavior.""" + + def setUp(self): + super(ShoppingScopeTests, self).setUp() + try: + urllib2.urlopen("http://www.google.com", timeout=2) + except urllib2.URLError, e: + self.skip("Skipping test, no internet connection") + gettext.install("unity-scope-shopping") + + def tearDown(self): + self.unity.dash.ensure_hidden() + super(ShoppingScopeTests, self).tearDown() + + def test_no_results_in_home_scope_if_empty_search(self): + """Test that the home scope contains no results if the search bar is empty.""" + self.unity.dash.ensure_visible() + scope = self.unity.dash.get_current_scope() + + results_category = scope.get_category_by_name(_("More suggestions")) + refresh_results_fn = lambda: len(results_category.get_results()) + self.assertThat(refresh_results_fn, Eventually(Equals(0))) + + def test_home_scope_has_shopping_results(self): + """Test that the home scope contains results.""" + self.unity.dash.ensure_visible() + scope = self.unity.dash.get_current_scope() + + self.keyboard.type("playstation") + results_category = scope.get_category_by_name(_("More suggestions")) + + refresh_results_fn = lambda: len(results_category.get_results()) + self.assertThat(refresh_results_fn, Eventually(GreaterThan(1), timeout=25)) + + def test_application_scope_has_shopping_results(self): + """Test that the application scope contains results.""" + self.unity.dash.reveal_application_scope() + scope = self.unity.dash.get_current_scope() + + self.keyboard.type("Text Editor") + results_category = scope.get_category_by_name(_("More suggestions")) + + refresh_results_fn = lambda: len(results_category.get_results()) + self.assertThat(refresh_results_fn, Eventually(GreaterThan(1), timeout=25)) + + def test_music_scope_has_shopping_results(self): + """Test that the music scope contains results.""" + self.unity.dash.reveal_music_scope() + scope = self.unity.dash.get_current_scope() + + self.keyboard.type("megadeth") + results_category = scope.get_category_by_name(_("More suggestions")) + + refresh_results_fn = lambda: len(results_category.get_results()) + self.assertThat(refresh_results_fn, Eventually(GreaterThan(1), timeout=25)) + + def test_preview_works_with_shopping_scope(self): + """This test shows the dash preview works with shopping scope results.""" + self.unity.dash.ensure_visible() + scope = self.unity.dash.get_current_scope() + + self.keyboard.type("playstation") + results_category = scope.get_category_by_name(_("More suggestions")) + + refresh_results_fn = lambda: len(results_category.get_results()) + self.assertThat(refresh_results_fn, Eventually(GreaterThan(1), timeout=25)) + + results = results_category.get_results() + results[0].preview() + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(True))) + + def test_shopping_scope_preview_navigate_right(self): + """This test shows that shopping scope results can open previews, + then move to the next shopping result. + """ + self.unity.dash.ensure_visible() + scope = self.unity.dash.get_current_scope() + + self.keyboard.type("playstation") + results_category = scope.get_category_by_name(_("More suggestions")) + + refresh_results_fn = lambda: len(results_category.get_results()) + self.assertThat(refresh_results_fn, Eventually(GreaterThan(2), timeout=25)) + + results = results_category.get_results() + results[0].preview() + + self.assertThat(self.unity.dash.preview_displaying, Eventually(Equals(True))) + self.preview_container = self.unity.dash.view.get_preview_container() + start_index = self.preview_container.relative_nav_index + self.preview_container.navigate_right() + + self.assertThat(self.preview_container.relative_nav_index, Eventually(Equals(start_index+1))) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_switcher.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_switcher.py @@ -0,0 +1,514 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2010 Canonical +# Author: Thomi Richards +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.display import move_mouse_to_screen +from autopilot.matchers import Eventually +from autopilot.testcase import multiply_scenarios +import logging +from testtools.matchers import Equals, Contains, Not +from time import sleep + +from unity.emulators.switcher import SwitcherDirection, SwitcherMode +from unity.tests import UnityTestCase + +logger = logging.getLogger(__name__) + +class SwitcherTestCase(UnityTestCase): + + scenarios = [ + ('show_desktop_icon_true', {'show_desktop_option': True}), + ('show_desktop_icon_false', {'show_desktop_option': False}), + ] + + def setUp(self): + super(SwitcherTestCase, self).setUp() + self.set_show_desktop(self.show_desktop_option) + + def set_show_desktop(self, state): + if type(state) is not bool: + raise TypeError("'state' must be boolean, not %r" % type(state)) + self.set_unity_option("disable_show_desktop", state) + self.assertThat(self.unity.switcher.show_desktop_disabled, Eventually(Equals(state))) + + def set_timeout_setting(self, state): + if type(state) is not bool: + raise TypeError("'state' must be boolean, not %r" % type(state)) + self.set_unity_option("alt_tab_timeout", state) + sleep(1) + + def start_applications(self, *args): + """Start some applications, returning their windows. + + If no applications are specified, the following will be started: + * Calculator + * Character Map + * Character Map + + Windows are always started in the order that they are specified (which + means the last specified application will *probably* be at the top of the + window stack after calling this method). Windows are returned in the same + order they are specified in. + + """ + if len(args) == 0: + args = ('Calculator', 'Character Map', 'Character Map') + windows = [] + for app in args: + windows.append(self.process_manager.start_app_window(app)) + + return windows + + +class SwitcherTests(SwitcherTestCase): + """Test the switcher.""" + + def setUp(self): + super(SwitcherTests, self).setUp() + self.set_timeout_setting(False) + + def tearDown(self): + super(SwitcherTests, self).tearDown() + + def test_switcher_starts_in_normal_mode(self): + """Switcher must start in normal (i.e.- not details) mode.""" + self.process_manager.start_app("Character Map") + + self.unity.switcher.initiate() + self.addCleanup(self.unity.switcher.terminate) + self.assertProperty(self.unity.switcher, mode=SwitcherMode.NORMAL) + + def test_label_matches_application_name(self): + """The switcher label must match the selected application name in normal mode.""" + windows = self.start_applications() + self.unity.switcher.initiate() + self.addCleanup(self.unity.switcher.terminate) + + for win in windows: + app_name = win.application.name + self.unity.switcher.select_icon(SwitcherDirection.FORWARDS, tooltip_text=app_name) + self.assertThat(self.unity.switcher.label_visible, Eventually(Equals(True))) + self.assertThat(self.unity.switcher.label, Eventually(Equals(app_name))) + + def test_application_window_is_fake_decorated(self): + """When the switcher is in details mode must not show the focused window title.""" + window = self.process_manager.start_app_window("Text Editor") + self.unity.switcher.initiate() + self.addCleanup(self.unity.switcher.terminate) + + self.unity.switcher.select_icon(SwitcherDirection.BACKWARDS, tooltip_text=window.application.name) + + self.unity.switcher.show_details() + self.assertThat(self.unity.switcher.label_visible, Eventually(Equals(False))) + self.assertThat(self.unity.screen.window(window.x_id).fake_decorated, Eventually(Equals(True))) + + def test_application_window_is_fake_decorated_in_detail_mode(self): + """Starting switcher in details mode must not show the focused window title.""" + window = self.process_manager.start_app_window("Text Editor") + self.unity.switcher.initiate(SwitcherMode.DETAIL) + self.addCleanup(self.unity.switcher.terminate) + + self.assertThat(self.unity.switcher.label_visible, Eventually(Equals(False))) + self.assertThat(self.unity.screen.window(window.x_id).fake_decorated, Eventually(Equals(True))) + + def test_switcher_move_next(self): + """Test that pressing the next icon binding moves to the next icon""" + self.start_applications() + self.unity.switcher.initiate() + self.addCleanup(self.unity.switcher.terminate) + + start = self.unity.switcher.selection_index + self.unity.switcher.next_icon() + # Allow for wrap-around to first icon in switcher + next_index = (start + 1) % len(self.unity.switcher.icons) + + self.assertThat(self.unity.switcher.selection_index, Eventually(Equals(next_index))) + + def test_switcher_move_prev(self): + """Test that pressing the previous icon binding moves to the previous icon""" + self.start_applications() + self.unity.switcher.initiate() + self.addCleanup(self.unity.switcher.terminate) + + start = self.unity.switcher.selection_index + self.unity.switcher.previous_icon() + # Allow for wrap-around to last icon in switcher + prev_index = (start - 1) % len(self.unity.switcher.icons) + + self.assertThat(self.unity.switcher.selection_index, Eventually(Equals(prev_index))) + + def test_switcher_scroll_next(self): + """Test that scrolling the mouse wheel down moves to the next icon""" + self.start_applications() + self.unity.switcher.initiate() + self.addCleanup(self.unity.switcher.terminate) + + start = self.unity.switcher.selection_index + self.unity.switcher.next_via_mouse() + # Allow for wrap-around to first icon in switcher + next_index = (start + 1) % len(self.unity.switcher.icons) + + self.assertThat(self.unity.switcher.selection_index, Eventually(Equals(next_index))) + + def test_switcher_scroll_prev(self): + """Test that scrolling the mouse wheel up moves to the previous icon""" + self.start_applications() + self.unity.switcher.initiate() + self.addCleanup(self.unity.switcher.terminate) + + start = self.unity.switcher.selection_index + self.unity.switcher.previous_via_mouse() + # Allow for wrap-around to last icon in switcher + prev_index = (start - 1) % len(self.unity.switcher.icons) + + self.assertThat(self.unity.switcher.selection_index, Eventually(Equals(prev_index))) + + def test_switcher_arrow_key_does_not_init(self): + """Ensure that Alt+Right does not initiate switcher. + + Regression test for LP:?????? + + """ + self.keyboard.press_and_release('Alt+Right') + self.assertThat(self.unity.switcher.visible, Equals(False)) + + def test_lazy_switcher_initiate(self): + """Inserting a long delay between the Alt press and the Tab tab must still + open the switcher. + + """ + self.process_manager.start_app("Character Map") + + self.keybinding_hold("switcher/reveal_normal") + self.addCleanup(self.keybinding_release, "switcher/reveal_normal") + self.assertThat(self.unity.switcher.visible, Eventually(Equals(False))) + sleep(5) + self.keybinding_tap("switcher/reveal_normal") + self.addCleanup(self.keybinding, "switcher/cancel") + self.assertThat(self.unity.switcher.visible, Eventually(Equals(True))) + + def test_switcher_cancel(self): + """Pressing the switcher cancel keystroke must cancel the switcher.""" + self.process_manager.start_app("Character Map") + + self.unity.switcher.initiate() + self.addCleanup(self.unity.switcher.terminate) + + self.assertThat(self.unity.switcher.visible, Eventually(Equals(True))) + self.unity.switcher.cancel() + self.assertThat(self.unity.switcher.visible, Eventually(Equals(False))) + + def test_lazy_switcher_cancel(self): + """Must be able to cancel the switcher after a 'lazy' initiation.""" + self.process_manager.start_app("Character Map") + + self.keybinding_hold("switcher/reveal_normal") + self.addCleanup(self.keybinding_release, "switcher/reveal_normal") + self.assertThat(self.unity.switcher.visible, Eventually(Equals(False))) + sleep(5) + self.keybinding_tap("switcher/reveal_normal") + self.assertThat(self.unity.switcher.visible, Eventually(Equals(True))) + self.unity.switcher.cancel() + self.assertThat(self.unity.switcher.visible, Eventually(Equals(False))) + + def test_switcher_appears_on_monitor_with_mouse(self): + """Tests that the switches appears on the correct monitor. + + This is defined as the monitor with the mouse. + + """ + # TODO - this test fails in multi-monitor setups. You can't use addCleanup + # a better way would be to have a scenario'd class for multi-monitor + # switcher tests. + num_monitors = self.display.get_num_screens() + if num_monitors == 1: + self.skip("No point testing this on one monitor") + + charmap, calc, mahjongg = self.start_applications() + + for monitor in range(num_monitors): + move_mouse_to_screen(monitor) + self.unity.switcher.initiate() + self.addCleanup(self.unity.switcher.terminate) + self.assertThat(self.unity.switcher.monitor, Eventually(Equals(monitor))) + + def test_switcher_alt_f4_is_disabled(self): + """Tests that alt+f4 does not work while switcher is active.""" + + win = self.process_manager.start_app_window("Text Editor") + + self.unity.switcher.initiate() + self.addCleanup(self.unity.switcher.terminate) + self.assertThat(self.unity.switcher.visible, Eventually(Equals(True))) + + self.keyboard.press_and_release("Alt+F4") + # Need the sleep to allow the window time to close, for jenkins! + sleep(10) + self.assertProperty(win, is_valid=True) + + +class SwitcherWindowsManagementTests(SwitcherTestCase): + """Test the switcher window management.""" + + def test_switcher_raises_only_last_focused_window(self): + """Tests that when we do an alt+tab only the previously focused window is raised. + + This is tests by opening 2 Calculators and a Mahjongg. + Then we do a quick alt+tab twice. + Then we close the currently focused window. + + """ + char_win1, calc_win, char_win2 = self.start_applications("Character Map", "Calculator", "Character Map") + self.assertVisibleWindowStack([char_win2, calc_win, char_win1]) + + self.keybinding("switcher/reveal_normal") + self.assertProperty(calc_win, is_focused=True) + self.assertVisibleWindowStack([calc_win, char_win2, char_win1]) + + self.keybinding("switcher/reveal_normal") + self.assertProperty(char_win2, is_focused=True) + self.assertVisibleWindowStack([char_win2, calc_win, char_win1]) + + self.keybinding("window/close") + self.assertProperty(calc_win, is_focused=True) + self.assertVisibleWindowStack([calc_win, char_win1]) + + def test_switcher_rises_next_window_of_same_application(self): + """Tests if alt+tab invoked normally switches to the next application + window of the same type. + + """ + char_win1, char_win2 = self.start_applications("Character Map", "Character Map") + self.assertVisibleWindowStack([char_win2, char_win1]) + + self.keybinding("switcher/reveal_normal") + self.assertProperty(char_win1, is_focused=True) + + def test_switcher_rises_other_application(self): + """Tests if alt+tab invoked normally switches correctly to the other + application window when the last focused application had 2 windows + + """ + char_win1, char_win2, calc_win = self.start_applications("Character Map", "Character Map", "Calculator") + self.assertVisibleWindowStack([calc_win, char_win2, char_win1]) + + self.keybinding("switcher/reveal_normal") + self.assertProperty(char_win2, is_focused=True) + + self.keybinding("switcher/reveal_normal") + self.assertProperty(calc_win, is_focused=True) + + +class SwitcherDetailsTests(SwitcherTestCase): + """Test the details mode for the switcher.""" + + def setUp(self): + super(SwitcherDetailsTests, self).setUp() + self.set_timeout_setting(True) + + def test_details_mode_on_delay(self): + """Test that details mode activates on a timeout.""" + if self.workspace.num_workspaces <= 1: + self.skipTest("This test requires enabled more than one workspace.") + initial_workspace = self.workspace.current_workspace + self.addCleanup(self.workspace.switch_to, initial_workspace) + self.workspace.switch_to((initial_workspace + 1) % self.workspace.num_workspaces) + self.start_applications("Character Map", "Character Map", "Mahjongg") + + self.unity.switcher.initiate() + self.addCleanup(self.unity.switcher.terminate) + # Wait longer than details mode. + sleep(3) + self.assertProperty(self.unity.switcher, mode=SwitcherMode.DETAIL) + + def test_no_details_for_apps_on_different_workspace(self): + """Tests that details mode does not initiates when there are multiple windows + + of an application spread across different workspaces. + Regression test for LP:933406. + + """ + if self.workspace.num_workspaces <= 1: + self.skipTest("This test requires enabled more than one workspace.") + initial_workspace = self.workspace.current_workspace + self.addCleanup(self.workspace.switch_to, initial_workspace) + self.process_manager.start_app_window("Character Map") + self.workspace.switch_to((initial_workspace + 1) % self.workspace.num_workspaces) + self.start_applications("Character Map", "Mahjongg") + + self.unity.switcher.initiate() + self.addCleanup(self.unity.switcher.terminate) + # Wait longer than details mode. + sleep(3) + self.assertProperty(self.unity.switcher, mode=SwitcherMode.NORMAL) + + +class SwitcherDetailsModeTests(SwitcherTestCase): + """Tests for the details mode of the switcher. + + Tests for initiation with both grave (`) and Down arrow. + + """ + + scenarios = multiply_scenarios(SwitcherTestCase.scenarios, + [ + ('initiate_with_grave', {'initiate_keycode': '`'}), + ('initiate_with_down', {'initiate_keycode': 'Down'}), + ] + ) + + def setUp(self): + super(SwitcherDetailsModeTests, self).setUp() + self.set_timeout_setting(False) + + def test_can_start_details_mode(self): + """Must be able to switch to details mode using selected scenario keycode. + + """ + self.process_manager.start_app_window("Character Map") + self.unity.switcher.initiate() + self.addCleanup(self.unity.switcher.terminate) + + self.keyboard.press_and_release(self.initiate_keycode) + + self.assertProperty(self.unity.switcher, mode=SwitcherMode.DETAIL) + + def test_next_icon_from_last_detail_works(self): + """Pressing next while showing last switcher item in details mode + must select first item in the model in non-details mode. + + """ + self.process_manager.start_app("Character Map") + self.unity.switcher.initiate() + self.addCleanup(self.unity.switcher.terminate) + while self.unity.switcher.selection_index < len(self.unity.switcher.icons) - 1: + self.unity.switcher.next_icon() + self.keyboard.press_and_release(self.initiate_keycode) + sleep(0.5) + # Make sure we're at the end of the details list for this icon + possible_details = self.unity.switcher.detail_current_count - 1 + while self.unity.switcher.detail_selection_index < possible_details: + self.unity.switcher.next_detail() + + self.unity.switcher.next_icon() + self.assertThat(self.unity.switcher.selection_index, Eventually(Equals(0))) + + def test_detail_mode_selects_last_active_window(self): + """The active selection in detail mode must be the last focused window. + If it was the currently active application type. + """ + char_win1, char_win2 = self.start_applications("Character Map", "Character Map") + self.assertVisibleWindowStack([char_win2, char_win1]) + + self.unity.switcher.initiate() + while self.unity.switcher.current_icon.tooltip_text != char_win2.application.name: + self.unity.switcher.next_icon() + self.keyboard.press_and_release(self.initiate_keycode) + sleep(0.5) + self.unity.switcher.select() + + self.assertProperty(char_win1, is_focused=True) + + def test_detail_mode_selects_third_window(self): + """Pressing Alt+` twice must select the third last used window. + LP:1061229 + """ + char_win1, char_win2, char_win3 = self.start_applications("Character Map", "Character Map", "Character Map") + self.assertVisibleWindowStack([char_win3, char_win2, char_win1]) + + self.unity.switcher.initiate(SwitcherMode.DETAIL) + self.unity.switcher.next_detail() + + self.unity.switcher.select() + self.assertVisibleWindowStack([char_win1, char_win3, char_win2]) + + +class SwitcherWorkspaceTests(SwitcherTestCase): + """Test Switcher behavior with respect to multiple workspaces.""" + + def setUp(self): + super(SwitcherWorkspaceTests, self).setUp() + if self.workspace.num_workspaces <= 1: + self.skipTest("This test requires enabled more than one workspace.") + + def test_switcher_shows_current_workspace_only(self): + """Switcher must show apps from the current workspace only.""" + initial_workspace = self.workspace.current_workspace + self.addCleanup(self.workspace.switch_to, initial_workspace) + + calc = self.process_manager.start_app("Calculator") + self.workspace.switch_to((initial_workspace + 1) % self.workspace.num_workspaces) + char_map = self.process_manager.start_app("Character Map") + + self.unity.switcher.initiate() + self.addCleanup(self.unity.switcher.terminate) + + get_icon_names = lambda: [i.tooltip_text for i in self.unity.switcher.icons] + self.assertThat(get_icon_names, Eventually(Contains(char_map.name))) + self.assertThat(get_icon_names, Eventually(Not(Contains(calc.name)))) + + def test_switcher_all_mode_shows_all_apps(self): + """Test switcher 'show_all' mode shows apps from all workspaces.""" + initial_workspace = self.workspace.current_workspace + self.addCleanup(self.workspace.switch_to, initial_workspace) + + calc = self.process_manager.start_app("Calculator") + self.workspace.switch_to((initial_workspace + 1) % self.workspace.num_workspaces) + char_map = self.process_manager.start_app("Character Map") + + self.unity.switcher.initiate(SwitcherMode.ALL) + self.addCleanup(self.unity.switcher.terminate) + + get_icon_names = lambda: [i.tooltip_text for i in self.unity.switcher.icons] + self.assertThat(get_icon_names, Eventually(Contains(calc.name))) + self.assertThat(get_icon_names, Eventually(Contains(char_map.name))) + + def test_switcher_can_switch_to_minimised_window(self): + """Switcher must be able to switch to a minimised window when there's + + another instance of the same application on a different workspace. + + """ + initial_workspace = self.workspace.current_workspace + self.addCleanup(self.workspace.switch_to, initial_workspace) + + # disable automatic gridding of the switcher after a timeout, since it makes + # it harder to write the tests. + self.set_unity_option("alt_tab_timeout", False) + + self.process_manager.start_app("Character Map") + + self.workspace.switch_to((initial_workspace + 1) % self.workspace.num_workspaces) + char_win2 = self.process_manager.start_app_window("Character Map") + self.keybinding("window/minimize") + self.assertProperty(char_win2, is_hidden=True) + + self.process_manager.start_app("Calculator") + + self.unity.switcher.initiate() + while self.unity.switcher.current_icon.tooltip_text != char_win2.application.name: + self.unity.switcher.next_icon() + self.unity.switcher.select() + + self.assertProperty(char_win2, is_hidden=False) + + def test_switcher_is_disabled_when_wall_plugin_active(self): + """The switcher must not open when the wall plugin is active using ctrl+alt+.""" + initial_workspace = self.workspace.current_workspace + self.addCleanup(self.workspace.switch_to, initial_workspace) + + self.workspace.switch_to(0) + sleep(1) + self.keyboard.press("Ctrl+Alt+Right") + self.addCleanup(self.keyboard.release, "Ctrl+Alt+Right") + sleep(1) + self.keybinding_hold_part_then_tap("switcher/reveal_normal") + self.addCleanup(self.unity.switcher.terminate) + + self.assertThat(self.unity.switcher.visible, Eventually(Equals(False))) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_spread.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_spread.py @@ -0,0 +1,122 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Marco Trevisan (Treviño) +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.matchers import Eventually +from testtools.matchers import Equals, NotEquals +from time import sleep + +from unity.tests import UnityTestCase + + +class SpreadTests(UnityTestCase): + """Spread tests""" + + def start_test_application_windows(self, app_name, num_windows=2): + """Start a given number of windows of the requested application""" + self.process_manager.close_all_app(app_name) + windows = [] + + for i in range(num_windows): + win = self.process_manager.start_app_window(app_name) + if windows: + self.assertThat(win.application, Equals(windows[-1].application)) + + windows.append(win) + + self.assertThat(len(windows), Equals(num_windows)) + + return windows + + def initiate_spread_for_screen(self): + """Initiate the Spread for all windows""" + self.addCleanup(self.keybinding, "spread/cancel") + self.keybinding("spread/start") + self.assertThat(self.unity.window_manager.scale_active, Eventually(Equals(True))) + + def initiate_spread_for_application(self, desktop_id): + """Initiate the Spread for windows of the given app""" + icon = self.unity.launcher.model.get_icon(desktop_id=desktop_id) + self.assertThat(icon, NotEquals(None)) + launcher = self.unity.launcher.get_launcher_for_monitor(self.display.get_primary_screen()) + + self.addCleanup(self.keybinding, "spread/cancel") + launcher.click_launcher_icon(icon) + self.assertThat(self.unity.window_manager.scale_active_for_group, Eventually(Equals(True))) + + def assertWindowIsNotScaled(self, xid): + """Assert that a window is not scaled""" + refresh_fn = lambda: xid in [w.xid for w in self.unity.screen.scaled_windows] + self.assertThat(refresh_fn, Eventually(Equals(False))) + + def assertWindowIsClosed(self, xid): + """Assert that a window is not in the list of the open windows""" + refresh_fn = lambda: xid in [w.x_id for w in self.process_manager.get_open_windows()] + self.assertThat(refresh_fn, Eventually(Equals(False))) + + def test_scale_application_windows(self): + """All the windows of an application must be scaled when application + spread is initiated + + """ + [win1, win2] = self.start_test_application_windows("Calculator") + self.initiate_spread_for_application(win1.application.desktop_file) + + self.assertThat(lambda: len(self.unity.screen.scaled_windows), Eventually(Equals(2))) + self.assertThat(lambda: (win1.x_id and win2.x_id) in [w.xid for w in self.unity.screen.scaled_windows], + Eventually(Equals(True))) + + def test_scaled_window_is_focused_on_click(self): + """Test that a window is focused when clicked in spread""" + windows = self.start_test_application_windows("Calculator", 3) + self.initiate_spread_for_application(windows[0].application.desktop_file) + + not_focused = [w for w in windows if not w.is_focused][0] + + target_xid = not_focused.x_id + [target_win] = [w for w in self.unity.screen.scaled_windows if w.xid == target_xid] + + (x, y, w, h) = target_win.geometry + self.mouse.move(x + w / 2, y + h / 2) + sleep(.5) + self.mouse.click() + + self.assertThat(lambda: not_focused.is_focused, Eventually(Equals(True))) + + def test_scaled_window_closes_on_middle_click(self): + """Test that a window is closed when middle-clicked in spread""" + win = self.start_test_application_windows("Calculator", 2)[0] + self.initiate_spread_for_application(win.application.desktop_file) + + target_xid = win.x_id + [target_win] = [w for w in self.unity.screen.scaled_windows if w.xid == target_xid] + + (x, y, w, h) = target_win.geometry + self.mouse.move(x + w / 2, y + h / 2) + sleep(.5) + self.mouse.click(button=2) + + self.assertWindowIsNotScaled(target_xid) + self.assertWindowIsClosed(target_xid) + + def test_scaled_window_closes_on_close_button_click(self): + """Test that a window is closed when its close button is clicked in spread""" + win = self.start_test_application_windows("Calculator", 1)[0] + self.initiate_spread_for_screen() + + target_xid = win.x_id + [target_win] = [w for w in self.unity.screen.scaled_windows if w.xid == target_xid] + + (x, y, w, h) = target_win.scale_close_geometry + self.mouse.move(x + w / 2, y + h / 2) + sleep(.5) + self.mouse.click() + + self.assertWindowIsNotScaled(target_xid) + self.assertWindowIsClosed(target_xid) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_gobject_introspection.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_gobject_introspection.py @@ -0,0 +1,66 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2013 Canonical +# Author: Iain Lane +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from testtools import TestCase + +class GirTests(TestCase): + + """ Test that GOBject Intospection bindings can imported """ + + def setUp(self): + super(GirTests, self).setUp() + + def test_appindicator_import(self): + imported = False + + try: + from gi.repository import AppIndicator3 + imported = True + except ImportError: + # failed + pass + + self.assertTrue(imported) + + def test_dbusmenu_import(self): + imported = False + + try: + from gi.repository import Dbusmenu + imported = True + except ImportError: + # failed + pass + + self.assertTrue(imported) + + def test_dee_import(self): + imported = False + + try: + from gi.repository import Dee + imported = True + except ImportError: + # failed + pass + + self.assertTrue(imported) + + def test_unity_import(self): + imported = False + + try: + from gi.repository import Unity + imported = True + except ImportError: + # failed + pass + + self.assertTrue(imported) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_ibus.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_ibus.py @@ -0,0 +1,360 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Authors: Thomi Richards, Martin Mrazik, Łukasz 'sil2100' Zemczak +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +"""Tests to ensure unity is compatible with ibus input method.""" + +from __future__ import absolute_import + +from autopilot.ibus import ( + get_active_input_engines, + set_active_engines, + get_available_input_engines, + get_gconf_option, + set_gconf_option, + get_ibus_bus, + ) +from autopilot.matchers import Eventually +from autopilot.testcase import multiply_scenarios +from testtools.matchers import Equals, NotEquals + +from unity.tests import UnityTestCase + +from gi.repository import GLib +from gi.repository import IBus +import time +import dbus +import threading + + +# See lp:ibus-query +class IBusQuery: + """A simple class allowing string queries to the IBus engine.""" + + def __init__(self): + self._bus = IBus.Bus() + self._dbusconn = dbus.connection.Connection(IBus.get_address()) + + # XXX: the new IBus bindings do not export create_input_context for + # introspection. This is troublesome - so, to workaround this problem + # we're directly fetching a new input context manually + ibus_obj = self._dbusconn.get_object(IBus.SERVICE_IBUS, IBus.PATH_IBUS) + self._test = dbus.Interface(ibus_obj, dbus_interface="org.freedesktop.IBus") + path = self._test.CreateInputContext("IBusQuery") + self._context = IBus.InputContext.new(path, self._bus.get_connection(), None) + + self._glibloop = GLib.MainLoop() + + self._context.connect("commit-text", self.__commit_text_cb) + self._context.connect("update-preedit-text", self.__update_preedit_cb) + self._context.connect("disabled", self.__disabled_cb) + + self._context.set_capabilities (9) + + def __commit_text_cb(self, context, text): + self.result += text.text + self._preedit = '' + + def __update_preedit_cb(self, context, text, cursor_pos, visible): + if visible: + self._preedit = text.text + + def __disabled_cb(self, a): + self.result += self._preedit + self._glibloop.quit() + + def __abort(self): + self._abort = True + + def poll(self, engine, ibus_input): + if len(ibus_input) <= 0: + return None + + self.result = '' + self._preedit = '' + self._context.focus_in() + self._context.set_engine(engine) + + # Timeout in case of the engine not being installed + self._abort = False + timeout = threading.Timer(4.0, self.__abort) + timeout.start() + while self._context.get_engine() is None: + if self._abort is True: + print "Error! Could not set the engine correctly." + return None + continue + timeout.cancel() + + for c in ibus_input: + self._context.process_key_event(ord(c), 0, 0) + + self._context.set_engine('') + self._context.focus_out() + + GLib.timeout_add_seconds(5, lambda *args: self._glibloop.quit()) + self._glibloop.run() + + return unicode(self.result, "UTF-8") + + + +class IBusTests(UnityTestCase): + """Base class for IBus tests.""" + + def setUp(self): + super(IBusTests, self).setUp() + self.set_correct_ibus_trigger_keys() + self._ibus_query = None + + def set_correct_ibus_trigger_keys(self): + """Set the correct keys to trigger IBus. + + This method configures the ibus trigger keys inside gconf, and also sets + self.activate_binding and self.activate_release_binding. + + This method adds a cleanUp to reset the old keys once the test is done. + + """ + # get the existing keys: + trigger_hotkey_path = '/desktop/ibus/general/hotkey/trigger' + old_keys = get_gconf_option(trigger_hotkey_path) + + self.activate_binding = 'Control+space' + activate_release_binding_option = 'Alt+Release+Control_L' + new_keys = [self.activate_binding, activate_release_binding_option] + + if new_keys != old_keys: + set_gconf_option(trigger_hotkey_path, new_keys) + self.addCleanup(set_gconf_option, trigger_hotkey_path, old_keys) + self.activate_release_binding = 'Alt+Control_L' + + @classmethod + def setUpClass(cls): + cls._old_engines = None + + @classmethod + def tearDownClass(cls): + if cls._old_engines is not None: + set_active_engines(cls._old_engines) + + def activate_input_engine_or_skip(self, engine_name): + """Activate the input engine 'engine_name', or skip the test if the + engine name is not avaialble (probably because it's not been installed). + + """ + available_engines = get_available_input_engines() + if engine_name in available_engines: + if get_active_input_engines() != [engine_name]: + IBusTests._old_engines = set_active_engines([engine_name]) + else: + self.skip("This test requires the '%s' engine to be installed." % (engine_name)) + + def activate_ibus(self, widget): + """Activate IBus, and wait till it's actived on 'widget'.""" + self.assertThat(widget.im_active, Equals(False)) + self.keyboard.press_and_release(self.activate_binding) + self.assertThat(widget.im_active, Eventually(Equals(True))) + + def deactivate_ibus(self, widget): + """Deactivate ibus, and wait till it's inactive on 'widget'.""" + self.assertThat(widget.im_active, Equals(True)) + self.keyboard.press_and_release(self.activate_binding) + self.assertThat(widget.im_active, Eventually(Equals(False))) + + +class IBusWidgetScenariodTests(IBusTests): + """A class that includes scenarios for the hud and dash widgets.""" + + # Use lambdas here so we don't require DBus service at module import time. + scenarios = [ + ('dash', {'widget': 'dash'}), + ('hud', {'widget': 'hud'}) + ] + + def try_ibus_query(self): + """This helper method tries to query ibus, and if it has connection problems, + it restarts the ibus connection. + It is to be used in a loop until it returns True, which means we probably + got a proper result - stored in self.result + + """ + self.result = None + try: + self._ibus_query = IBusQuery() + except: + # Here is a tricky situation. Probably for some reason the ibus connection + # got busted. In this case, restarting the connection from IBusQuery is not + # enough. We have to restart the global ibus connection to be sure + self._ibus_query = None + get_ibus_bus() + return False + self.result = self._ibus_query.poll(self.engine_name, self.input) + return self.result is not None + + + def do_ibus_test(self): + """Do the basic IBus test on self.widget using self.input and self.result.""" + try: + result = self.result + except: + self.assertThat(self.try_ibus_query, Eventually(Equals(True))) + result = self.result + + widget = getattr(self.unity, self.widget) + widget.ensure_visible() + self.addCleanup(widget.ensure_hidden) + self.activate_ibus(widget.searchbar) + self.keyboard.type(self.input) + commit_key = getattr(self, 'commit_key', None) + if commit_key: + self.keyboard.press_and_release(commit_key) + self.deactivate_ibus(widget.searchbar) + self.assertThat(widget.search_string, Eventually(Equals(result))) + + + +class IBusTestsPinyin(IBusWidgetScenariodTests): + """Tests for the Pinyin(Chinese) input engine.""" + + engine_name = "pinyin" + + scenarios = multiply_scenarios( + IBusWidgetScenariodTests.scenarios, + [ + ('basic', {'input': 'abc1'}), + ('photo', {'input': 'zhaopian '}), + ('internet', {'input': 'hulianwang '}), + ('disk', {'input': 'cipan '}), + ('disk_management', {'input': 'cipan guanli '}), + ] + ) + + def setUp(self): + super(IBusTestsPinyin, self).setUp() + self.activate_input_engine_or_skip(self.engine_name) + + def test_pinyin(self): + self.do_ibus_test() + + +class IBusTestsHangul(IBusWidgetScenariodTests): + """Tests for the Hangul(Korean) input engine.""" + + engine_name = "hangul" + + scenarios = multiply_scenarios( + IBusWidgetScenariodTests.scenarios, + [ + ('transmission', {'input': 'xmfostmaltus ', 'result': u'\ud2b8\ub79c\uc2a4\ubbf8\uc158 '}), + ('social', {'input': 'httuf ', 'result': u'\uc18c\uc15c '}), + ('document', {'input': 'anstj ', 'result': u'\ubb38\uc11c '}), + ] + ) + + def setUp(self): + super(IBusTestsHangul, self).setUp() + self.activate_input_engine_or_skip(self.engine_name) + + def test_hangul(self): + self.do_ibus_test() + + +class IBusTestsAnthy(IBusWidgetScenariodTests): + """Tests for the Anthy(Japanese) input engine.""" + + engine_name = "anthy" + + scenarios = multiply_scenarios( + IBusWidgetScenariodTests.scenarios, + [ + ('system', {'input': 'shisutemu '}), + ('game', {'input': 'ge-mu '}), + ('user', {'input': 'yu-za- '}), + ], + [ + ('commit_j', {'commit_key': 'Ctrl+j'}), + ('commit_enter', {'commit_key': 'Enter'}), + ] + ) + + def setUp(self): + super(IBusTestsAnthy, self).setUp() + self.activate_input_engine_or_skip(self.engine_name) + + def test_anthy(self): + self.do_ibus_test() + + +class IBusTestsPinyinIgnore(IBusTests): + """Tests for ignoring key events while the Pinyin input engine is active.""" + + engine_name = "pinyin" + + def setUp(self): + super(IBusTestsPinyinIgnore, self).setUp() + self.activate_input_engine_or_skip(self.engine_name) + + def test_ignore_key_events_on_dash(self): + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + self.activate_ibus(self.unity.dash.searchbar) + self.keyboard.type("cipan") + self.keyboard.press_and_release("Tab") + self.keyboard.type(" ") + self.deactivate_ibus(self.unity.dash.searchbar) + self.assertThat(self.unity.dash.search_string, Eventually(NotEquals(" "))) + + def test_ignore_key_events_on_hud(self): + self.unity.hud.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden) + + self.keyboard.type("a") + self.activate_ibus(self.unity.hud.searchbar) + self.keyboard.type("riqi") + old_selected = self.unity.hud.selected_button + self.keyboard.press_and_release("Down") + new_selected = self.unity.hud.selected_button + self.deactivate_ibus(self.unity.hud.searchbar) + + self.assertEqual(old_selected, new_selected) + + +class IBusTestsAnthyIgnore(IBusTests): + """Tests for ignoring key events while the Anthy input engine is active.""" + + scenarios = None + engine_name = "anthy" + + def setUp(self): + super(IBusTestsAnthyIgnore, self).setUp() + self.activate_input_engine_or_skip(self.engine_name) + + def test_ignore_key_events_on_dash(self): + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + self.activate_ibus(self.unity.dash.searchbar) + self.keyboard.type("shisutemu ") + self.keyboard.press_and_release("Tab") + self.keyboard.press_and_release("Ctrl+j") + self.deactivate_ibus(self.unity.dash.searchbar) + dash_search_string = self.unity.dash.search_string + + self.assertNotEqual("", dash_search_string) + + def test_ignore_key_events_on_hud(self): + self.unity.hud.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden) + self.keyboard.type("a") + self.activate_ibus(self.unity.hud.searchbar) + self.keyboard.type("hiduke") + old_selected = self.unity.hud.selected_button + self.keyboard.press_and_release("Down") + new_selected = self.unity.hud.selected_button + self.deactivate_ibus(self.unity.hud.searchbar) + + self.assertEqual(old_selected, new_selected) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/__init__.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/__init__.py @@ -0,0 +1,307 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Thomi Richards +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +"""Autopilot test case class for Unity-specific tests.""" + +from __future__ import absolute_import + + +from codecs import open +from autopilot.matchers import Eventually +from autopilot.testcase import AutopilotTestCase +from dbus import DBusException +from logging import getLogger +import os +import sys +from tempfile import mktemp +from time import sleep +try: + import windowmocker + import json + HAVE_WINDOWMOCKER=True +except ImportError: + HAVE_WINDOWMOCKER=False +from subprocess import check_output +import time +import tempfile +from testtools.content import text_content +from testtools.matchers import Equals +from unittest.case import SkipTest + +from unity.emulators import ensure_unity_is_running +from unity.emulators.workspace import WorkspaceManager +from unity.emulators.compiz import get_compiz_setting, get_global_context +from unity.emulators.unity import ( + set_log_severity, + start_log_to_file, + reset_logging, + Unity + ) +from unity.emulators.X11 import reset_display + +from Xlib import display +from Xlib import Xutil + +from gi.repository import Gio + +log = getLogger(__name__) + + +class UnityTestCase(AutopilotTestCase): + """Unity test case base class, with improvments specific to Unity tests.""" + + def setUp(self): + super(UnityTestCase, self).setUp() + try: + ensure_unity_is_running() + except RuntimeError: + log.error("Unity doesn't appear to be running, exiting.") + sys.exit(1) + + self._setUpUnityLogging() + self._initial_workspace_num = self.workspace.current_workspace + self.addCleanup(self.check_test_behavior) + # + # Setting this here since the show desktop feature seems to be a bit + # ropey. Once it's been proven to work reliably we can remove this line: + self.set_unity_log_level("unity.wm.compiz", "DEBUG") + + # For the length of the test, disable screen locking + self._desktop_settings = Gio.Settings.new("org.gnome.desktop.lockdown") + lock_state = self._desktop_settings.get_boolean("disable-lock-screen") + self._desktop_settings.set_boolean("disable-lock-screen", True) + self.addCleanup(self._desktop_settings.set_boolean, "disable-lock-screen", lock_state) + + def check_test_behavior(self): + """Fail the test if it did something naughty. + + This includes leaving the dash or the hud open, changing the current + workspace, or leaving the system in show_desktop mode. + + """ + well_behaved = True + reasons = [] + log.info("Checking system state for badly behaving test...") + + # Have we switched workspace? + if not self.well_behaved(self.workspace, current_workspace=self._initial_workspace_num): + well_behaved = False + reasons.append("The test changed the active workspace from %d to %d." \ + % (self._initial_workspace_num, self.workspace.current_workspace)) + log.warning("Test changed the active workspace, changing it back...") + self.workspace.switch_to(self._initial_workspace_num) + # Have we left the dash open? + if not self.well_behaved(self.unity.dash, visible=False): + well_behaved = False + reasons.append("The test left the dash open.") + log.warning("Test left the dash open, closing it...") + self.unity.dash.ensure_hidden() + # ... or the hud? + if not self.well_behaved(self.unity.hud, visible=False): + well_behaved = False + reasons.append("The test left the hud open.") + log.warning("Test left the hud open, closing it...") + self.unity.hud.ensure_hidden() + # Are we in show desktop mode? + if not self.well_behaved(self.unity.window_manager, showdesktop_active=False): + well_behaved = False + reasons.append("The test left the system in show_desktop mode.") + log.warning("Test left the system in show desktop mode, exiting it...") + # It is not possible to leave show desktop mode if there are no + # app windows. So, just open a window and perform the show + # desktop action until the desired state is acheived, then close + # the window. The showdesktop_active state will persist. + # + # In the event that this doesn't work, wait_for will throw an + # exception. + win = self.process_manager.start_app_window('Calculator', locale='C') + count = 1 + while self.unity.window_manager.showdesktop_active: + self.keybinding("window/show_desktop") + sleep(count) + count+=1 + if count > 10: + break + win.close() + self.unity.window_manager.showdesktop_active.wait_for(False) + for launcher in self.unity.launcher.get_launchers(): + if not self.well_behaved(launcher, in_keynav_mode=False): + well_behaved = False + reasons.append("The test left the launcher keynav mode enabled.") + log.warning("Test left the launcher in keynav mode, exiting it...") + launcher.key_nav_cancel() + if not self.well_behaved(launcher, in_switcher_mode=False): + well_behaved = False + reasons.append("The test left the launcher in switcher mode.") + log.warning("Test left the launcher in switcher mode, exiting it...") + launcher.switcher_cancel() + if not self.well_behaved(launcher, quicklist_open=False): + well_behaved = False + reasons.append("The test left a quicklist open.") + log.warning("The test left a quicklist open.") + self.keyboard.press_and_release('Escape') + + if not well_behaved: + self.fail("/n".join(reasons)) + else: + log.info("Test was well behaved.") + + def well_behaved(self, object, **kwargs): + try: + self.assertProperty(object, **kwargs) + except AssertionError: + return False + return True + + @property + def unity(self): + return Unity.get_root_instance() + + @property + def workspace(self): + if not getattr(self, '__workspace', None): + self.__workspace = WorkspaceManager() + return self.__workspace + + def _setUpUnityLogging(self): + self._unity_log_file_name = mktemp(prefix=self.shortDescription()) + start_log_to_file(self._unity_log_file_name) + self.addCleanup(self._tearDownUnityLogging) + + def _tearDownUnityLogging(self): + # If unity dies, our dbus interface has gone, and reset_logging will fail + # but we still want our log, so we ignore any errors. + try: + reset_logging() + except DBusException: + pass + with open(self._unity_log_file_name, encoding='utf-8') as unity_log: + self.addDetail('unity-log', text_content(unity_log.read())) + os.remove(self._unity_log_file_name) + self._unity_log_file_name = "" + + def set_unity_log_level(self, component, level): + """Set the unity log level for 'component' to 'level'. + + Valid levels are: TRACE, DEBUG, INFO, WARNING and ERROR. + + Components are dotted unity component names. The empty string specifies + the root logging component. + """ + valid_levels = ('TRACE', 'DEBUG', 'INFO', 'WARN', 'WARNING', 'ERROR') + if level not in valid_levels: + raise ValueError("Log level '%s' must be one of: %r" % (level, valid_levels)) + set_log_severity(component, level) + + def assertNumberWinsIsEventually(self, app, num): + """Asserts that 'app' eventually has 'num' wins. Waits up to 10 seconds.""" + + self.assertThat(lambda: len(app.get_windows()), Eventually(Equals(num))) + + def launch_test_window(self, window_spec={}): + """Launch a test window, for the duration of this test only. + + This uses the 'window-mocker' application, which is not part of the + python-autopilot or unity-autopilot packages. To use this method, you + must have python-windowmocker installed. If the package is not installed, + this method will raise a SkipTest exception, causing the calling test + to be silently skipped. + + window_spec is a list or dictionary that conforms to the window-mocker + specification. + + """ + if not HAVE_WINDOWMOCKER: + raise SkipTest("The python-windowmocker package is required to run this test.") + + if 'Window Mocker' not in self.process_manager.KNOWN_APPS: + self.process_manager.register_known_application( + 'Window Mocker', + 'window-mocker.desktop', + 'window-mocker' + ) + if window_spec: + file_path = tempfile.mktemp() + json.dump(window_spec, open(file_path, 'w')) + self.addCleanup(os.remove, file_path) + return self.process_manager.start_app_window('Window Mocker', [file_path]) + else: + return self.process_manager.start_app_window('Window Mocker') + + def close_all_windows(self, application_name): + for w in self.process_manager.get_open_windows_by_application(application_name): + w.close() + + self.assertThat(lambda: len(self.process_manager.get_open_windows_by_application(application_name)), Eventually(Equals(0))) + + def register_nautilus(self): + self.addCleanup(self.process_manager.unregister_known_application, "Nautilus") + self.process_manager.register_known_application("Nautilus", "nautilus.desktop", "nautilus") + + def get_startup_notification_timestamp(self, bamf_window): + atom = display.Display().intern_atom('_NET_WM_USER_TIME') + atom_type = display.Display().intern_atom('CARDINAL') + return bamf_window.x_win.get_property(atom, atom_type, 0, 1024).value[0] + + def call_gsettings_cmd(self, command, schema, *args): + """Set a desktop wide gsettings option + + Using the gsettings command because there is a bug with importing + from gobject introspection and pygtk2 simultaneously, and the Xlib + keyboard layout bits are very unwieldy. This seems like the best + solution, even a little bit brutish. + """ + cmd = ['gsettings', command, schema] + list(args) + # strip to remove the trailing \n. + ret = check_output(cmd).strip() + time.sleep(5) + reset_display() + return ret + + def set_unity_option(self, option_name, option_value): + """Set an option in the unity compiz plugin options. + + .. note:: The value will be set for the current test only, and + automatically undone when the test ends. + + :param option_name: The name of the unity option. + :param option_value: The value you want to set. + :raises: **KeyError** if the option named does not exist. + + """ + self.set_compiz_option("unityshell", option_name, option_value) + + def set_compiz_option(self, plugin_name, option_name, option_value): + """Set a compiz option for the duration of this test only. + + .. note:: The value will be set for the current test only, and + automatically undone when the test ends. + + :param plugin_name: The name of the compiz plugin where the option is + registered. If the option is not in a plugin, the string "core" should + be used as the plugin name. + :param option_name: The name of the unity option. + :param option_value: The value you want to set. + :raises: **KeyError** if the option named does not exist. + + """ + old_value = self._set_compiz_option(plugin_name, option_name, option_value) + # Cleanup is LIFO, during clean-up also allow unity to respond + self.addCleanup(time.sleep, 0.5) + self.addCleanup(self._set_compiz_option, plugin_name, option_name, old_value) + # Allow unity time to respond to the new setting. + time.sleep(0.5) + + def _set_compiz_option(self, plugin_name, option_name, option_value): + log.info("Setting compiz option '%s' in plugin '%s' to %r", + option_name, plugin_name, option_value) + setting = get_compiz_setting(plugin_name, option_name) + old_value = setting.Value + setting.Value = option_value + get_global_context().Write() + return old_value --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_shortcut_hint.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_shortcut_hint.py @@ -0,0 +1,174 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Authors: Marco Trevisan (Treviño) +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.matchers import Eventually +from testtools.matchers import Equals +from time import sleep + +from unity.emulators.shortcut_hint import ShortcutController +from unity.tests import UnityTestCase + + +class BaseShortcutHintTests(UnityTestCase): + """Base class for the shortcut hint tests""" + + def setUp(self): + super(BaseShortcutHintTests, self).setUp() + + self.DEFAULT_WIDTH = 970; + self.DEFAULT_HEIGHT = 680; + + #self.shortcut_hint = self.get_shortcut_controller() + self.set_unity_option('shortcut_overlay', True) + self.set_unity_log_level("unity.shell.compiz", "DEBUG") + self.skip_if_monitor_too_small() + sleep(1) + + def skip_if_monitor_too_small(self): + monitor = self.display.get_primary_screen() + monitor_geo = self.display.get_screen_geometry(monitor) + monitor_w = monitor_geo[2] + monitor_h = monitor_geo[3] + launcher_width = self.unity.launcher.get_launcher_for_monitor(monitor).geometry[2] + panel_height = self.unity.panels.get_panel_for_monitor(monitor).geometry[3] + + if ((monitor_w - launcher_width) <= self.DEFAULT_WIDTH or + (monitor_h - panel_height) <= self.DEFAULT_HEIGHT): + self.skipTest("This test requires a bigger screen, to show the ShortcutHint") + + # def get_shortcut_controller(self): + # controllers = ShortcutController.get_all_instances() + # self.assertThat(len(controllers), Equals(1)) + # return controllers[0] + + def get_launcher(self): + # We could parameterise this so all tests run on both monitors (if MM is + # set up), but I think it's fine to just always use monitor primary monitor: + monitor = self.display.get_primary_screen() + return self.unity.launcher.get_launcher_for_monitor(monitor) + + +class ShortcutHintTests(BaseShortcutHintTests): + """Tests for the shortcut hint functionality in isolation.""" + + def test_shortcut_hint_reveal(self): + """Test that the shortcut hint is shown.""" + self.unity.shortcut_hint.show() + self.addCleanup(self.unity.shortcut_hint.ensure_hidden) + self.assertThat(self.unity.shortcut_hint.visible, Eventually(Equals(True))) + + def test_shortcut_hint_reveal_timeout(self): + """Shortcut hint must be shown after a sufficient timeout.""" + timeout = self.unity.shortcut_hint.get_show_timeout() + self.unity.shortcut_hint.show() + self.addCleanup(self.unity.shortcut_hint.ensure_hidden) + + sleep(timeout/2.0) + self.assertThat(self.unity.shortcut_hint.visible, Equals(False)) + # This should happen after 3/4 of 'timeout': + self.assertThat(self.unity.shortcut_hint.visible, Eventually(Equals(True))) + + def test_shortcut_hint_unreveal(self): + """Shortcut hint must hide when keys are released.""" + self.unity.shortcut_hint.ensure_visible() + self.unity.shortcut_hint.hide() + self.assertThat(self.unity.shortcut_hint.visible, Eventually(Equals(False))) + + def test_shortcut_hint_cancel(self): + """Shortcut hint must hide when cancelled.""" + self.unity.shortcut_hint.ensure_visible() + self.unity.shortcut_hint.cancel() + self.assertThat(self.unity.shortcut_hint.visible, Eventually(Equals(False))) + + def test_shortcut_hint_no_blur(self): + """""" + self.unity.shortcut_hint.ensure_visible() + self.addCleanup(self.unity.shortcut_hint.ensure_hidden) + + self.assertThat(self.unity.shortcut_hint.get_shortcut_view().bg_texture_is_valid, Eventually(Equals(True))) + + +class ShortcutHintInteractionsTests(BaseShortcutHintTests): + """Test the shortcuthint interactions with other Unity parts.""" + + def test_shortcut_hint_hide_using_unity_shortcuts(self): + """Unity shortcuts (like expo) must hide the shortcut hint.""" + self.unity.shortcut_hint.ensure_visible() + self.addCleanup(self.unity.shortcut_hint.ensure_hidden) + + self.keybinding_tap("expo/start") + self.addCleanup(self.keybinding, "expo/cancel") + + def test_shortcut_hint_hide_pressing_modifiers(self): + """Pressing a modifer key must hide the shortcut hint.""" + self.unity.shortcut_hint.ensure_visible() + self.addCleanup(self.unity.shortcut_hint.ensure_hidden) + + self.keyboard.press('Control') + + self.assertThat(self.unity.shortcut_hint.visible, Eventually(Equals(False))) + + def test_launcher_switcher_next_doesnt_show_shortcut_hint(self): + """Super+Tab switcher cycling forward must not show shortcut hint.""" + switcher_timeout = self.unity.shortcut_hint.get_show_timeout() + self.unity.shortcut_hint.show() + self.addCleanup(self.unity.dash.ensure_hidden) + self.addCleanup(self.unity.shortcut_hint.ensure_hidden) + + self.addCleanup(self.keyboard.press_and_release, "Escape") + self.keybinding("launcher/switcher/next") + self.keybinding("launcher/switcher/next") + + sleep(switcher_timeout * 2) + + self.assertThat(self.unity.shortcut_hint.visible, Equals(False)) + + self.keybinding("launcher/switcher/prev") + + def test_launcher_switcher_prev_doesnt_show_shortcut_hint(self): + """Super+Tab switcher cycling backwards must not show shortcut hint.""" + switcher_timeout = self.unity.shortcut_hint.get_show_timeout() + self.unity.shortcut_hint.show() + self.addCleanup(self.unity.dash.ensure_hidden) + self.addCleanup(self.unity.shortcut_hint.ensure_hidden) + + self.addCleanup(self.keyboard.press_and_release, "Escape") + self.keybinding("launcher/switcher/prev") + self.keybinding("launcher/switcher/prev") + + sleep(switcher_timeout * 2) + + self.assertThat(self.unity.shortcut_hint.visible, Equals(False)) + + self.keybinding("launcher/switcher/next") + + def test_launcher_icons_hints_show_with_shortcut_hint(self): + """When the shortcut hint is shown also the launcer's icons hints should + be shown. + + """ + launcher = self.get_launcher() + self.unity.shortcut_hint.ensure_visible() + self.addCleanup(self.unity.shortcut_hint.ensure_hidden) + + self.assertThat(self.unity.shortcut_hint.visible, Equals(True)) + self.assertThat(launcher.shortcuts_shown, Equals(True)) + + def test_shortcut_hint_shows_with_launcher_icons_hints(self): + """When the launcher icons hints are shown also the shortcut hint should + be shown. + + """ + launcher = self.get_launcher() + launcher.keyboard_reveal_launcher() + self.addCleanup(launcher.keyboard_unreveal_launcher) + + self.assertThat(launcher.shortcuts_shown, Eventually(Equals(True))) + self.assertThat(self.unity.shortcut_hint.visible, Eventually(Equals(True))) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_home_lens.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_home_lens.py @@ -0,0 +1,45 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Michal Hruby +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.matchers import Eventually +from testtools.matchers import Equals +from time import sleep + +from unity.tests import UnityTestCase + + +class HomeScopeSearchTests(UnityTestCase): + """Test the command scope search bahavior.""" + + def setUp(self): + super(HomeScopeSearchTests, self).setUp() + + def tearDown(self): + self.unity.dash.ensure_hidden() + super(HomeScopeSearchTests, self).tearDown() + + def test_quick_run_app(self): + """Hitting enter runs an application even though a search might not have fully + finished yet. + + """ + if self.process_manager.app_is_running("Text Editor"): + self.process_manager.close_all_app("Text Editor") + sleep(1) + + kb = self.keyboard + self.unity.dash.ensure_visible() + kb.type("g") + self.assertThat(self.unity.dash.search_string, Eventually(Equals("g"))) + kb.type("edit", 0.1) + kb.press_and_release("Enter", 0.1) + self.addCleanup(self.process_manager.close_all_app, "Text Editor") + app_found = self.process_manager.wait_until_application_is_running("gedit.desktop", 5) + self.assertTrue(app_found) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_showdesktop.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_showdesktop.py @@ -0,0 +1,106 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2010 Canonical +# Author: Thomi Richards +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from testtools import skip +from time import sleep + +from unity.emulators.switcher import SwitcherDirection +from unity.tests import UnityTestCase + + +class ShowDesktopTests(UnityTestCase): + """Test the 'Show Desktop' functionality.""" + + def setUp(self): + super(ShowDesktopTests, self).setUp() + self.set_unity_log_level("unity.wm.compiz", "DEBUG") + # we need this to let the unity models update after we shutdown apps + # before we start the next test. + sleep(2) + + def launch_test_apps(self): + """Launch character map and calculator apps, and return their windows.""" + char_win = self.process_manager.start_app_window('Character Map', locale='C') + calc_win = self.process_manager.start_app_window('Calculator', locale='C') + return (char_win, calc_win) + + def test_showdesktop_hides_apps(self): + """Show Desktop keyboard shortcut must hide applications.""" + test_windows = self.launch_test_apps() + + # show desktop, verify all windows are hidden: + self.unity.window_manager.enter_show_desktop() + self.addCleanup(self.unity.window_manager.leave_show_desktop) + + for win in test_windows: + self.assertProperty(win, is_valid=True) + self.assertProperty(win, is_hidden=True) + + def test_showdesktop_unhides_apps(self): + """Show desktop shortcut must re-show all hidden apps.""" + test_windows = self.launch_test_apps() + + # show desktop, verify all windows are hidden: + self.unity.window_manager.enter_show_desktop() + self.addCleanup(self.unity.window_manager.leave_show_desktop) + + for win in test_windows: + self.assertProperty(win, is_valid=True) + self.assertProperty(win, is_hidden=True) + + # un-show desktop, verify all windows are shown: + self.unity.window_manager.leave_show_desktop() + + for win in test_windows: + self.assertProperty(win, is_valid=True) + self.assertProperty(win, is_hidden=False) + + def test_unhide_single_app(self): + """Un-hide a single app from launcher after hiding all apps.""" + charmap, calc = self.launch_test_apps() + + # show desktop, verify all windows are hidden: + self.unity.window_manager.enter_show_desktop() + self.addCleanup(self.unity.window_manager.leave_show_desktop) + + for win in (charmap, calc): + self.assertProperty(win, is_valid=True) + self.assertProperty(win, is_hidden=True) + + # We'll un-minimise the character map - find it's launcherIcon in the launcher: + charmap_icon = self.unity.launcher.model.get_icon(desktop_id="gucharmap.desktop") + if charmap_icon: + self.unity.launcher.get_launcher_for_monitor(0).click_launcher_icon(charmap_icon) + else: + self.fail("Could not find launcher icon in launcher.") + + self.assertProperty(charmap, is_hidden=False) + self.assertProperty(calc, is_hidden=True) + + # hide desktop - now all windows should be visible: + self.unity.window_manager.leave_show_desktop() + + for win in (charmap, calc): + self.assertProperty(win, is_hidden=False) + + @skip("Breaks following tests due to SDM bug") + def test_showdesktop_switcher(self): + """Show desktop item in switcher should hide all hidden apps.""" + test_windows = self.launch_test_apps() + + # show desktop, verify all windows are hidden: + self.unity.switcher.initiate() + self.unity.switcher.select_icon(SwitcherDirection.BACKWARDS, tooltip_text="Show Desktop") + self.addCleanup(self.unity.window_manager.leave_show_desktop) + self.switcher.select() + + for win in test_windows: + self.assertProperty(win, is_valid=True) + self.assertProperty(win, is_hidden=True) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_search.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_search.py @@ -0,0 +1,196 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2013 Canonical +# Author: Łukasz 'sil2100' Zemczak +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.matchers import Eventually +from testtools.matchers import ( + Equals, + GreaterThan, + ) + +from unity.tests import UnityTestCase + +import gettext + +# XXX: Ugly workaround for a really annoying bug (LP: #1152517) which breaks +# this test suite. So, to workaround, we toggle the dash once before doing any +# app scope search tests +workaround_scopes_load_done = False + +class SearchTestsBase(UnityTestCase): + """Base class for testing searching in search fields. + + Each deriving class should define the self.input_and_check_result() + method that takes 2 arguments: the input string and the expected + string. This method will be used during self.do_search_test(), which + should be called for every defined scenario of input and result. + """ + + def setUp(self): + super(SearchTestsBase, self).setUp() + + def start_test_app(self): + """Start the window mocker for our search testing. + + This method creates a windowmocker application with a custom name and + custom menu. We want it to have a locale-independent menu with a + more-or-less unique menu entry for HUD testing. Also, the name of + the application is rather unique too. + """ + window_spec = { + "Title": "Test menu application", + "Menu": ["Search entry", "Quit"], + } + self.launch_test_window(window_spec) + + def do_search_test(self): + """Use the input_and_check_result method for a given scenario. + + This method uses the self.input_and_check_result() method which + needs to be defined for the given test sub-class. It uses the + self.input and self.result strings as defined by a scenario. + """ + self.input_and_check_result(self.input, self.result) + + +# Scope tests + +class ApplicationScopeSearchTestBase(SearchTestsBase): + """Common class for all tests for searching in the application scope.""" + + def setUp(self): + super(ApplicationScopeSearchTestBase, self).setUp() + # XXX: Temporary workaround for LP: #1152517 + global workaround_scopes_load_done + if not workaround_scopes_load_done: + self.unity.dash.ensure_visible() + self.unity.dash.ensure_hidden() + workaround_scopes_load_done = True + + self.app_scope = self.unity.dash.reveal_application_scope() + self.addCleanup(self.unity.dash.ensure_hidden) + gettext.install("unity-lens-applications", unicode=True) + + def input_and_check_result(self, string, expected): + self.keyboard.type(string) + self.assertThat(self.unity.dash.search_string, Eventually(Equals(string))) + category = self.app_scope.get_category_by_name(_("Installed")) + refresh_results_fn = lambda: len(category.get_results()) + self.assertThat(refresh_results_fn, Eventually(GreaterThan(0))) + results = category.get_results() + found = False + for r in results: + if r.name == expected: + found = True + break + self.assertTrue(found) + + +class ApplicationScopeSearchTests(ApplicationScopeSearchTestBase): + """Simple search tests for the application scope.""" + + scenarios = [ + ('basic', {'input': 'Window Mocker', 'result': 'Window Mocker'}), + ('lowercase', {'input': 'window mocker', 'result': 'Window Mocker'}), + ('uppercase', {'input': 'WINDOW MOCKER', 'result': 'Window Mocker'}), + ('partial', {'input': 'Window Mock', 'result': 'Window Mocker'}), + ('keyword', {'input': 'arithmetic', 'result': 'Calculator'}), + ] + + def setUp(self): + super(ApplicationScopeSearchTests, self).setUp() + + def test_application_scope_search(self): + self.do_search_test() + + +class ApplicationScopeFuzzySearchTests(ApplicationScopeSearchTestBase): + """Fuzzy, erroneous search tests for the application scope. + This checks if the application scope will find the searched application + (windowmocker here, since we want some app that has the name + locale-independent) when small spelling errors are made. + """ + + scenarios = [ + ('transposition', {'input': 'Wnidow Mocker', 'result': 'Window Mocker'}), + ('duplication', {'input': 'Wiindow Mocker', 'result': 'Window Mocker'}), + ('insertion', {'input': 'Wiondow Mocker', 'result': 'Window Mocker'}), + ('deletion', {'input': 'Wndow Mocker', 'result': 'Window Mocker'}), + ] + + def setUp(self): + super(ApplicationScopeFuzzySearchTests, self).setUp() + + def test_application_scope_fuzzy_search(self): + self.do_search_test() + + + +# HUD tests + +class HudSearchTestBase(SearchTestsBase): + """Common class for all tests for searching in the HUD.""" + + def setUp(self): + super(HudSearchTestBase, self).setUp() + self.start_test_app() + self.unity.hud.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden); + + def input_and_check_result(self, string, expected): + self.keyboard.type(string) + self.assertThat(self.unity.hud.search_string, Eventually(Equals(string), timeout=30)) + def hud_query_check(): + try: + button = self.unity.hud.selected_hud_button + if not button: + return + return button.label_no_formatting + except StateNotFoundError: + return + + self.assertThat(hud_query_check, Eventually(Equals(expected), timeout=30)) + + +class HudSearchTests(HudSearchTestBase): + """Simple search tests for the HUD.""" + + scenarios = [ + ('basic', {'input': 'Search entry', 'result': 'Search entry'}), + ('lowercase', {'input': 'search entry', 'result': 'Search entry'}), + ('uppercase', {'input': 'SEARCH ENTRY', 'result': 'Search entry'}), + ('partial', {'input': 'Search ', 'result': 'Search entry'}), + ] + + def setUp(self): + super(HudSearchTests, self).setUp() + + def test_hud_search(self): + self.do_search_test() + + +class HudFuzzySearchTests(HudSearchTestBase): + """Fuzzy, erroneous search tests for the HUD. + This checks if the HUD will find the searched menu entry from our application + (windowmocker here, since we want to have unique, locale-independent menu + entries) when small spelling errors are made. + """ + + scenarios = [ + ('transposition', {'input': 'Saerch entry', 'result': 'Search entry'}), + ('duplication', {'input': 'Seearch entry', 'result': 'Search entry'}), + ('insertion', {'input': 'Seasrch entry ', 'result': 'Search entry'}), + ('deletion', {'input': 'Serch entry', 'result': 'Search entry'}), + ] + + def setUp(self): + super(HudFuzzySearchTests, self).setUp() + + def test_hud_fuzzy_search(self): + self.do_search_test() --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_quicklist.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/test_quicklist.py @@ -0,0 +1,435 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Thomi Richards, +# Marco Trevisan (Treviño) +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.display import move_mouse_to_screen +from autopilot.matchers import Eventually +import os.path +from testtools.matchers import Contains, Equals, NotEquals +from time import sleep +from xdg.DesktopEntry import DesktopEntry + +from unity.emulators.quicklist import QuicklistMenuItemLabel +from unity.tests import UnityTestCase + + +class QuicklistActionTests(UnityTestCase): + """Tests for quicklist actions.""" + + scenarios = [ + ('remmina', {'app_name': 'Remmina'}), + ] + + def open_quicklist_for_icon(self, launcher_icon): + """Open the quicklist for the given launcher icon. + + Returns the quicklist that was opened. + + """ + launcher = self.unity.launcher.get_launcher_for_monitor(0) + launcher.click_launcher_icon(launcher_icon, button=3) + self.addCleanup(self.keyboard.press_and_release, "Escape") + self.assertThat(launcher_icon.get_quicklist, Eventually(NotEquals(None))) + return launcher_icon.get_quicklist() + + def get_desktop_entry(self, application): + # load the desktop file from disk: + desktop_id = self.process_manager.KNOWN_APPS[application]['desktop-file'] + desktop_file = os.path.join('/usr/share/applications', desktop_id) + return DesktopEntry(desktop_file) + + def test_quicklist_actions(self): + """Test that all actions present in the destop file are shown in the quicklist.""" + app = self.process_manager.start_app(self.app_name) + + # get the launcher icon from the launcher: + launcher_icon = self.unity.launcher.model.get_icon(desktop_id=app.desktop_file) + self.assertThat(launcher_icon, NotEquals(None)) + + # open the icon quicklist, and get all the text labels: + de = self.get_desktop_entry(self.app_name) + ql = self.open_quicklist_for_icon(launcher_icon) + ql_item_texts = [i.text for i in ql.items if type(i) is QuicklistMenuItemLabel] + + # iterate over all the actions from the desktop file, make sure they're + # present in the quicklist texts. + for action in de.getActions(): + key = 'Desktop Action ' + action + self.assertThat(de.content, Contains(key)) + name = de.get('Name', group=key, locale=True) + self.assertThat(ql_item_texts, Contains(name)) + + def test_quicklist_action_uses_startup_notification(self): + """Tests that quicklist uses startup notification protocol.""" + self.register_nautilus() + self.addCleanup(self.close_all_windows, "Nautilus") + + self.process_manager.start_app_window("Calculator") + self.process_manager.start_app(self.app_name) + + nautilus_icon = self.unity.launcher.model.get_icon(desktop_id="nautilus.desktop") + ql = self.open_quicklist_for_icon(nautilus_icon) + de = self.get_desktop_entry("Nautilus") + + new_window_action_name = de.get("Name", group="Desktop Action Window", locale=True) + self.assertThat(new_window_action_name, NotEquals(None)) + new_win_ql_item_fn = lambda : ql.get_quicklist_item_by_text(new_window_action_name) + self.assertThat(new_win_ql_item_fn, Eventually(NotEquals(None))) + new_win_ql_item = new_win_ql_item_fn() + + ql.click_item(new_win_ql_item) + + nautilus_windows_fn = lambda: self.process_manager.get_open_windows_by_application("Nautilus") + self.assertThat(lambda: len(nautilus_windows_fn()), Eventually(Equals(1))) + [nautilus_window] = nautilus_windows_fn() + + self.assertThat(lambda: self.get_startup_notification_timestamp(nautilus_window), + Eventually(Equals(new_win_ql_item.activate_timestamp))) + + def test_quicklist_application_item_focus_last_active_window(self): + """This tests shows that when you activate a quicklist application item + only the last focused instance of that application is rasied. + + This is tested by opening 2 Mahjongg and a Calculator. + Then we activate the Calculator quicklist item. + Then we actiavte the Mahjongg launcher icon. + """ + char_win1 = self.process_manager.start_app_window("Character Map") + calc_win = self.process_manager.start_app_window("Calculator") + char_win2 = self.process_manager.start_app_window("Character Map") + + self.assertVisibleWindowStack([char_win2, calc_win, char_win1]) + + char_icon = self.unity.launcher.model.get_icon( + desktop_id=char_win1.application.desktop_file) + calc_icon = self.unity.launcher.model.get_icon( + desktop_id=calc_win.application.desktop_file) + + calc_ql = self.open_quicklist_for_icon(calc_icon) + calc_ql.get_quicklist_application_item(calc_win.application.name).mouse_click() + + self.assertProperty(calc_win, is_focused=True) + self.assertVisibleWindowStack([calc_win, char_win2, char_win1]) + + char_ql = self.open_quicklist_for_icon(char_icon) + char_ql.get_quicklist_application_item(char_win1.application.name).mouse_click() + + self.assertProperty(char_win2, is_focused=True) + self.assertVisibleWindowStack([char_win2, calc_win, char_win1]) + + def test_quicklist_application_item_initiate_spread(self): + """This tests shows that when you activate a quicklist application item + when an application window is focused, the spread is initiated. + """ + char_win1 = self.process_manager.start_app_window("Character Map") + char_win2 = self.process_manager.start_app_window("Character Map") + char_app = char_win1.application + + self.assertVisibleWindowStack([char_win2, char_win1]) + self.assertProperty(char_win2, is_focused=True) + + char_icon = self.unity.launcher.model.get_icon(desktop_id=char_app.desktop_file) + + char_ql = self.open_quicklist_for_icon(char_icon) + app_item = char_ql.get_quicklist_application_item(char_app.name) + + self.addCleanup(self.keybinding, "spread/cancel") + app_item.mouse_click() + self.assertThat(self.unity.window_manager.scale_active, Eventually(Equals(True))) + self.assertThat(self.unity.window_manager.scale_active_for_group, Eventually(Equals(True))) + + def test_quicklist_item_triggered_closes_dash(self): + """When any quicklist item is triggered it must close the dash.""" + + calc_win = self.process_manager.start_app_window("Calculator") + self.assertProperty(calc_win, is_focused=True) + + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + + calc_icon = self.unity.launcher.model.get_icon( + desktop_id=calc_win.application.desktop_file) + self.open_quicklist_for_icon(calc_icon) + + self.keyboard.press_and_release("Down") + self.keyboard.press_and_release("Enter") + self.assertThat(self.unity.dash.visible, Eventually(Equals(False))) + + def test_quicklist_closes_when_hud_opens(self): + """When a quicklist is open you must still be able to open the Hud.""" + calc = self.process_manager.start_app("Calculator") + + calc_icon = self.unity.launcher.model.get_icon(desktop_id=calc.desktop_file) + self.open_quicklist_for_icon(calc_icon) + + self.unity.hud.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden) + self.assertThat(self.unity.hud.visible, Eventually(Equals(True))) + + def test_quicklist_closes_when_dash_opens(self): + """When the quicklist is open you must still be able to open the dash.""" + calc = self.process_manager.start_app("Calculator") + + calc_icon = self.unity.launcher.model.get_icon(desktop_id=calc.desktop_file) + self.open_quicklist_for_icon(calc_icon) + + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + self.assertThat(self.unity.dash.visible, Eventually(Equals(True))) + + def test_right_click_opens_quicklist_if_already_open(self): + """A right click to another icon in the launcher must + close the current open quicklist and open the other + icons quicklist. + lp:890991 + """ + + calc_win = self.process_manager.start_app_window("Calculator") + mahj_win = self.process_manager.start_app_window("Mahjongg") + + calc_icon = self.unity.launcher.model.get_icon( + desktop_id=calc_win.application.desktop_file) + mahj_icon = self.unity.launcher.model.get_icon( + desktop_id=mahj_win.application.desktop_file) + + calc_ql = self.open_quicklist_for_icon(calc_icon) + self.assertThat(calc_ql.active, Eventually(Equals(True))) + + mahj_ql = self.open_quicklist_for_icon(mahj_icon) + self.assertThat(mahj_ql.active, Eventually(Equals(True))) + self.assertThat(calc_ql.active, Eventually(Equals(False))) + + def test_right_clicking_same_icon_doesnt_reopen_ql(self): + """A right click to the same icon in the launcher must + not re-open the quicklist if already open. It must hide. + """ + + calc_win = self.process_manager.start_app_window("Calculator") + + calc_icon = self.unity.launcher.model.get_icon( + desktop_id=calc_win.application.desktop_file) + + calc_ql = self.open_quicklist_for_icon(calc_icon) + self.assertThat(calc_ql.active, Eventually(Equals(True))) + + calc_ql = self.open_quicklist_for_icon(calc_icon) + self.assertThat(calc_ql.active, Eventually(Equals(False))) + + +class QuicklistKeyNavigationTests(UnityTestCase): + """Tests for the quicklist key navigation.""" + + def setUp(self): + super(QuicklistKeyNavigationTests, self).setUp() + + desktop_file = self.process_manager.KNOWN_APPS["Text Editor"]["desktop-file"] + icon_refresh_fn = lambda : self.unity.launcher.model.get_icon( + desktop_id=desktop_file) + + self.ql_app = self.process_manager.start_app("Text Editor") + + self.assertThat(icon_refresh_fn, Eventually(NotEquals(None))) + self.ql_launcher_icon = icon_refresh_fn() + + self.ql_launcher = self.unity.launcher.get_launcher_for_monitor(0) + + def open_quicklist_with_mouse(self): + """Opens a quicklist with the mouse.""" + self.ql_launcher.click_launcher_icon(self.ql_launcher_icon, button=3) + self.addCleanup(self.keyboard.press_and_release, "Escape") + self.assertThat(self.ql_launcher_icon.get_quicklist, + Eventually(NotEquals(None))) + self.quicklist = self.ql_launcher_icon.get_quicklist() + self.quicklist.move_mouse_to_right() + self.assertThat(lambda: self.quicklist.selected_item, + Eventually(Equals(None))) + + def open_quicklist_with_keyboard(self): + """Opens a quicklist using the keyboard.""" + move_mouse_to_screen(0) + self.ql_launcher.key_nav_start() + self.addCleanup(self.ql_launcher.key_nav_cancel) + + self.ql_launcher.keyboard_select_icon(tooltip_text=self.ql_app.name) + self.keybinding("launcher/keynav/open-quicklist") + self.addCleanup(self.keybinding, "launcher/keynav/close-quicklist") + + self.assertThat(self.ql_launcher_icon.get_quicklist, + Eventually(NotEquals(None))) + self.quicklist = self.ql_launcher_icon.get_quicklist() + self.assertThat(lambda: self.quicklist.selected_item, + Eventually(NotEquals(None))) + + def assertCorrectItemSelected(self, item): + """Ensure the item considers itself selected and that quicklist agrees.""" + self.assertThat(item.selected, Eventually(Equals(True))) + self.assertThat(self.quicklist.selected_item.id, Equals(item.id)) + + def test_keynav_selects_first_item_when_unselected(self): + """Home key MUST select the first selectable item in a quicklist.""" + self.open_quicklist_with_mouse() + + self.keybinding("quicklist/keynav/first") + + expected_item = self.quicklist.selectable_items[0] + self.assertCorrectItemSelected(expected_item) + + def test_keynav_selects_first_item_when_selected(self): + """Home key MUST select the first selectable item in a quicklist when + another item is selected. + """ + self.open_quicklist_with_mouse() + mouse_item = self.quicklist.selectable_items[-1] + mouse_item.mouse_move_to() + self.assertThat(mouse_item.selected, Eventually(Equals(True))) + + self.keybinding("quicklist/keynav/first") + + expected_item = self.quicklist.selectable_items[0] + self.assertCorrectItemSelected(expected_item) + + def test_keynav_next_selects_first_item_when_unselected(self): + """Down key MUST select the first valid item when nothing is selected.""" + self.open_quicklist_with_mouse() + + self.keybinding("quicklist/keynav/next") + + expected_item = self.quicklist.selectable_items[0] + self.assertCorrectItemSelected(expected_item) + + def test_keynav_selects_last_item_when_unselected(self): + """End key MUST select the last selectable item in a quicklist.""" + self.open_quicklist_with_mouse() + + self.keybinding("quicklist/keynav/last") + + expected_item = self.quicklist.selectable_items[-1] + self.assertCorrectItemSelected(expected_item) + + def test_keynav_selects_last_item_when_selected(self): + """End key MUST select the last selectable item in a quicklist when + another item is selected. + """ + self.open_quicklist_with_mouse() + mouse_item = self.quicklist.selectable_items[0] + mouse_item.mouse_move_to() + self.assertThat(mouse_item.selected, Eventually(Equals(True))) + + self.keybinding("quicklist/keynav/last") + + expected_item = self.quicklist.selectable_items[-1] + self.assertCorrectItemSelected(expected_item) + + def test_keynav_prev_selects_last_item_when_unselected(self): + """Up key MUST select the last valid item when nothing is selected.""" + self.open_quicklist_with_mouse() + + self.keybinding("quicklist/keynav/prev") + + expected_item = self.quicklist.selectable_items[-1] + self.assertCorrectItemSelected(expected_item) + + def test_launcher_keynav_selects_first_item(self): + """The first selectable item of the quicklist must be selected when + opening the quicklist using the launcher key navigation. + """ + self.open_quicklist_with_keyboard() + + expected_item = self.quicklist.selectable_items[0] + self.assertCorrectItemSelected(expected_item) + + def test_keynav_next_selection_works(self): + """Down key MUST select the next valid item.""" + self.open_quicklist_with_mouse() + + for item in self.quicklist.selectable_items: + self.keybinding("quicklist/keynav/next") + self.assertCorrectItemSelected(item) + + def test_keynav_prev_selection_works(self): + """Up key MUST select the previous valid item.""" + self.open_quicklist_with_mouse() + + for item in reversed(self.quicklist.selectable_items): + self.keybinding("quicklist/keynav/prev") + self.assertCorrectItemSelected(item) + + def test_keynav_prev_is_cyclic(self): + """Up key MUST select the last item, when the first one is selected.""" + self.open_quicklist_with_mouse() + + mouse_item = self.quicklist.selectable_items[0] + mouse_item.mouse_move_to() + self.assertThat(mouse_item.selected, Eventually(Equals(True))) + + self.keybinding("quicklist/keynav/prev") + expected_item = self.quicklist.selectable_items[-1] + self.assertCorrectItemSelected(expected_item) + + def test_keynav_next_is_cyclic(self): + """Down key MUST select the first item, when the last one is selected.""" + self.open_quicklist_with_mouse() + + mouse_item = self.quicklist.selectable_items[-1] + mouse_item.mouse_move_to() + self.assertThat(mouse_item.selected, Eventually(Equals(True))) + + self.keybinding("quicklist/keynav/next") + expected_item = self.quicklist.selectable_items[0] + self.assertCorrectItemSelected(expected_item) + + def test_keynav_mouse_interaction(self): + """Tests that the interaction between key-navigation and mouse works as + expected. See bug #911561. + """ + self.open_quicklist_with_mouse() + mouse_item = self.quicklist.selectable_items[-1] + mouse_item.mouse_move_to() + self.assertThat(mouse_item.selected, Eventually(Equals(True))) + + self.keybinding("quicklist/keynav/prev") + sleep(.1) + self.keybinding("quicklist/keynav/prev") + + key_item = self.quicklist.selectable_items[-3] + self.assertCorrectItemSelected(key_item) + + # Moving the mouse horizontally doesn't change the selection + self.mouse.move(mouse_item.x + mouse_item.width - 10, mouse_item.y + mouse_item.height / 2) + self.assertThat(self.quicklist.selected_item.id, Equals(key_item.id)) + + # Moving the mouse outside doesn't change the selection + self.mouse.move(mouse_item.x + mouse_item.width + 50, mouse_item.y + mouse_item.height / 2) + self.assertThat(self.quicklist.selected_item.id, Equals(key_item.id)) + + # Moving the mouse to another entry, changes the selection + mouse_item = self.quicklist.selectable_items[-2] + mouse_item.mouse_move_to() + self.assertCorrectItemSelected(mouse_item) + + def test_moving_mouse_during_grab_select_correct_menuitem(self): + """Test that moving the mouse during grabbing selects the + correct menu item. See bug #1027955. + """ + self.open_quicklist_with_mouse() + mouse_item = self.quicklist.selectable_items[0] + mouse_item.mouse_move_to() + self.assertThat(mouse_item.selected, Eventually(Equals(True))) + + # Dragging the mouse horizontally doesn't change the selection + self.mouse.press() + self.addCleanup(self.mouse.release) + self.mouse.move(mouse_item.x + mouse_item.width - 10, mouse_item.y + mouse_item.height / 2) + self.assertThat(mouse_item.selected, Eventually(Equals(True))) + + # Moving the mouse down selects the next item + mouse_item = self.quicklist.selectable_items[1] + mouse_item.mouse_move_to() + self.assertThat(mouse_item.selected, Eventually(Equals(True))) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/xim/test_gcin.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/xim/test_gcin.py @@ -0,0 +1,72 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Brandon Schaefer +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.matchers import Eventually +from os import environ +import subprocess +from testtools.matchers import Equals +from testtools import skip +from unity.tests import UnityTestCase + + +class GcinTestCase(UnityTestCase): + """Tests the Input Method gcin.""" + + def setUp(self): + super(GcinTestCase, self).setUp() + + # Check that gcin is set as the active IM through im-switch + if environ.get('XMODIFIERS', '') != "@im=gcin": + self.skip("Please make sure XMODIFIERS is set to @im=gcin. Set it using 'im-switch'.") + + running_process = subprocess.check_output('ps -e', shell=True) + if 'gcin' not in running_process: + self.skip("gcin is not an active process, please start 'gcin' before running these tests.") + + if 'ibus' in running_process: + self.skip("IBus is currently running, please close 'ibus-daemon' before running these tests.") + + +class GcinTestHangul(GcinTestCase): + """Tests the Dash and Hud with gcin in hangul mode.""" + + scenarios = [ + ('hangul', {'input': 'han geul ', 'result': u'\ud55c\uae00'}), + ('morning letters', {'input': 'a chimgeul ', 'result': u'\uc544\uce68\uae00'}), + ('national script', {'input': 'gug mun ', 'result': u'\uad6d\ubb38'}), + ] + + def setUp(self): + super(GcinTestHangul, self).setUp() + + def enter_hangul_mode(self): + """Ctrl+Space turns gcin on, Ctrl+Alt+/ turns hangul on.""" + self.keyboard.press_and_release("Ctrl+Space") + self.keyboard.press_and_release("Ctrl+Alt+/") + + def test_dash_input(self): + """Entering an input string through gcin will result in a Korean string result in the dash.""" + + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + self.enter_hangul_mode() + + self.keyboard.type(self.input) + self.assertThat(self.unity.dash.search_string, Eventually(Equals(self.result))) + + def test_hud_input(self): + """Entering an input string through gcin will result in a Korean string result in the hud.""" + + self.unity.hud.ensure_visible() + self.addCleanup(self.unity.hud.ensure_hidden) + self.enter_hangul_mode() + + self.keyboard.type(self.input) + self.assertThat(self.unity.hud.search_string, Eventually(Equals(self.result))) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/test_keynav.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/test_keynav.py @@ -0,0 +1,246 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Authors: Thomi Richards, +# Marco Trevisan (Treviño) +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.matchers import Eventually +import logging +from testtools.matchers import Equals, GreaterThan + +from unity.tests.launcher import LauncherTestCase + +logger = logging.getLogger(__name__) + + +class LauncherKeyNavTests(LauncherTestCase): + """Test the launcher key navigation""" + + def start_keynav_with_cleanup_cancel(self): + """Start keynav mode safely. + + This adds a cleanup action that cancels keynav mode at the end of the + test if it's still running (but does nothing otherwise). + + """ + self.launcher_instance.key_nav_start() + self.addCleanup(self.safe_quit_keynav) + + def safe_quit_keynav(self): + """Quit the keynav mode if it's engaged.""" + if self.unity.launcher.key_nav_is_active: + self.launcher_instance.key_nav_cancel() + + def test_launcher_keynav_initiate(self): + """Tests we can initiate keyboard navigation on the launcher.""" + self.start_keynav_with_cleanup_cancel() + self.assertThat(self.unity.launcher.key_nav_is_active, Eventually(Equals(True))) + self.assertThat(self.unity.launcher.key_nav_is_grabbed, Eventually(Equals(True))) + + def test_launcher_keynav_cancel(self): + """Test that we can exit keynav mode.""" + self.launcher_instance.key_nav_start() + self.launcher_instance.key_nav_cancel() + self.assertThat(self.unity.launcher.key_nav_is_active, Eventually(Equals(False))) + self.assertThat(self.unity.launcher.key_nav_is_grabbed, Eventually(Equals(False))) + + def test_launcher_keynav_cancel_resume_focus(self): + """Test that ending the launcher keynav resume the focus.""" + calc = self.process_manager.start_app("Calculator") + self.assertTrue(calc.is_active) + + self.start_keynav_with_cleanup_cancel() + self.assertFalse(calc.is_active) + + self.launcher_instance.key_nav_cancel() + self.assertTrue(calc.is_active) + + def test_launcher_keynav_starts_at_index_zero(self): + """Test keynav mode starts at index 0.""" + self.start_keynav_with_cleanup_cancel() + self.assertThat(self.unity.launcher.key_nav_selection, Eventually(Equals(0))) + + def test_launcher_keynav_forward(self): + """Must be able to move forwards while in keynav mode.""" + self.start_keynav_with_cleanup_cancel() + self.launcher_instance.key_nav_next() + # The launcher model has hidden items, so the keynav indexes do not + # increase by 1 each time. This test was failing because the 2nd icon + # had an index of 2, not 1 as expected. The best we can do here is to + # make sure that the index has increased. This opens us to the + # possibility that the launcher really is skipping forward more than one + # icon at a time, but we can't do much about that. + self.assertThat(self.unity.launcher.key_nav_selection, Eventually(GreaterThan(0))) + + def test_launcher_keynav_prev_works(self): + """Must be able to move backwards while in keynav mode.""" + self.start_keynav_with_cleanup_cancel() + self.launcher_instance.key_nav_next() + self.assertThat(self.unity.launcher.key_nav_selection, Eventually(GreaterThan(0))) + self.launcher_instance.key_nav_prev() + self.assertThat(self.unity.launcher.key_nav_selection, Eventually(Equals(0))) + + def test_launcher_keynav_cycling_forward(self): + """Launcher keynav must loop through icons when cycling forwards""" + self.start_keynav_with_cleanup_cancel() + prev_icon = 0 + for icon in range(1, self.unity.launcher.model.num_launcher_icons()): + self.launcher_instance.key_nav_next() + # FIXME We can't directly check for selection/icon number equalty + # since the launcher model also contains "hidden" icons that aren't + # shown, so the selection index can increment by more than 1. + self.assertThat(self.unity.launcher.key_nav_selection, Eventually(GreaterThan(prev_icon))) + prev_icon = self.unity.launcher.key_nav_selection + + self.launcher_instance.key_nav_next() + self.assertThat(self.unity.launcher.key_nav_selection, Eventually(Equals(0))) + + def test_launcher_keynav_cycling_backward(self): + """Launcher keynav must loop through icons when cycling backwards""" + self.start_keynav_with_cleanup_cancel() + self.launcher_instance.key_nav_prev() + # FIXME We can't directly check for self.unity.launcher.num_launcher_icons - 1 + self.assertThat(self.unity.launcher.key_nav_selection, Eventually(GreaterThan(1))) + + def test_launcher_keynav_can_open_and_close_quicklist(self): + """Tests that we can open and close a quicklist from keynav mode.""" + self.start_keynav_with_cleanup_cancel() + self.launcher_instance.key_nav_next() + self.launcher_instance.key_nav_enter_quicklist() + self.assertThat(self.launcher_instance.quicklist_open, Eventually(Equals(True))) + self.launcher_instance.key_nav_exit_quicklist() + self.assertThat(self.launcher_instance.quicklist_open, Eventually(Equals(False))) + self.assertThat(self.unity.launcher.key_nav_is_active, Eventually(Equals(True))) + self.assertThat(self.unity.launcher.key_nav_is_grabbed, Eventually(Equals(True))) + + def test_launcher_keynav_mode_toggles(self): + """Tests that keynav mode toggles with Alt+F1.""" + # was initiated in setup. + self.start_keynav_with_cleanup_cancel() + self.keybinding("launcher/keynav") + self.assertThat(self.unity.launcher.key_nav_is_active, Eventually(Equals(False))) + + def test_launcher_keynav_activate_keep_focus(self): + """Activating a running launcher icon must focus it.""" + calc = self.process_manager.start_app("Calculator") + mahjongg = self.process_manager.start_app("Mahjongg") + self.assertTrue(mahjongg.is_active) + self.assertFalse(calc.is_active) + + self.start_keynav_with_cleanup_cancel() + + self.launcher_instance.keyboard_select_icon(tooltip_text=calc.name) + self.launcher_instance.key_nav_activate() + + self.assertTrue(calc.is_active) + self.assertFalse(mahjongg.is_active) + + def test_launcher_keynav_expo_focus(self): + """When entering expo mode from KeyNav the Desktop must get focus.""" + if self.workspace.num_workspaces < 2: + self.skipTest("This test requires enabled more than one workspace.") + + self.start_keynav_with_cleanup_cancel() + + self.launcher_instance.keyboard_select_icon(tooltip_text="Workspace Switcher") + self.launcher_instance.key_nav_activate() + self.addCleanup(self.keybinding, "expo/cancel") + + self.assertThat(self.unity.panels.get_active_panel().title, Eventually(Equals("Ubuntu Desktop"))) + + def test_launcher_keynav_expo_exit_on_esc(self): + """Esc should quit expo when entering it from KeyNav.""" + if self.workspace.num_workspaces < 2: + self.skipTest("This test requires enabled more than one workspace.") + self.start_keynav_with_cleanup_cancel() + + self.launcher_instance.keyboard_select_icon(tooltip_text="Workspace Switcher") + self.launcher_instance.key_nav_activate() + + self.keyboard.press_and_release("Escape") + self.assertThat(self.unity.window_manager.expo_active, Eventually(Equals(False))) + + def test_launcher_keynav_alt_tab_quits(self): + """Tests that alt+tab exits keynav mode.""" + self.start_keynav_with_cleanup_cancel() + + self.keybinding("switcher/reveal_normal") + self.addCleanup(self.unity.switcher.terminate) + self.assertThat(self.unity.launcher.key_nav_is_active, Eventually(Equals(False))) + + def test_launcher_keynav_alt_grave_quits(self): + """Tests that alt+` exits keynav mode.""" + self.start_keynav_with_cleanup_cancel() + # Can't use switcher emulat here since the switcher won't appear. + self.keybinding("switcher/reveal_details") + self.assertThat(self.unity.launcher.key_nav_is_active, Eventually(Equals(False))) + + def test_launcher_keynav_cancel_doesnt_activate_icon(self): + """This tests when canceling keynav the current icon doesnt activate.""" + self.start_keynav_with_cleanup_cancel() + self.keyboard.press_and_release("Escape") + self.assertThat(self.unity.dash.visible, Eventually(Equals(False))) + + def test_alt_f1_closes_dash(self): + """Pressing Alt+F1 when the Dash is open must close the Dash and start keynav.""" + self.unity.dash.ensure_visible() + + self.start_keynav_with_cleanup_cancel() + + self.assertThat(self.unity.dash.visible, Equals(False)) + self.assertThat(self.unity.launcher.key_nav_is_active, Equals(True)) + + def test_alt_f1_closes_hud(self): + """Pressing Alt+F1 when the HUD is open must close the HUD and start keynav.""" + self.unity.hud.ensure_visible() + + self.start_keynav_with_cleanup_cancel() + + self.assertThat(self.unity.hud.visible, Equals(False)) + self.assertThat(self.unity.launcher.key_nav_is_active, Equals(True)) + + def test_launcher_keynav_cancel_on_click_outside(self): + """A single click outside of launcher must cancel keynav.""" + self.start_keynav_with_cleanup_cancel() + + self.launcher_instance.move_mouse_to_right_of_launcher() + self.mouse.click() + + self.assertThat(self.unity.launcher.key_nav_is_active, Eventually(Equals(False))) + + def test_launcher_keynav_cancel_on_click_icon(self): + """A single click on a launcher icon must cancel keynav.""" + calc_win = self.process_manager.start_app_window('Calculator', locale = 'C') + calc_app = calc_win.application + calc_icon = self.unity.launcher.model.get_icon(desktop_id=calc_app.desktop_file) + + self.start_keynav_with_cleanup_cancel() + + self.launcher_instance.click_launcher_icon(calc_icon) + + self.assertThat(self.unity.launcher.key_nav_is_active, Eventually(Equals(False))) + + def test_launcher_keynav_cancel_on_quicklist_activate(self): + """A single click on a quicklist item must cancel keynav.""" + self.start_keynav_with_cleanup_cancel() + self.launcher_instance.key_nav_enter_quicklist() + + bfb_icon = self.unity.launcher.model.get_bfb_icon() + bfb_ql = bfb_icon.get_quicklist() + + bfb_ql.click_item(bfb_ql.selected_item) + self.addCleanup(self.unity.dash.ensure_hidden) + + self.assertThat(self.unity.dash.visible, Eventually(Equals(True))) + self.assertThat(self.unity.launcher.key_nav_is_active, Eventually(Equals(False))) + + def test_launcher_keynav_changes_panel(self): + """The panel title must change when in key nav mode.""" + + self.start_keynav_with_cleanup_cancel() + self.assertThat(self.unity.panels.get_active_panel().title, Eventually(Equals("Search your computer and online sources"))) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/test_scroll.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/test_scroll.py @@ -0,0 +1,99 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2013 Canonical +# Authors: Chris Townsend +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.matchers import Eventually +import logging +from testtools.matchers import Equals, GreaterThan, LessThan +from time import sleep + +from unity.tests.launcher import LauncherTestCase + +logger = logging.getLogger(__name__) + +class LauncherScrollTests(LauncherTestCase): + """Tests for scrolling behavior of the Launcher""" + + def open_apps_in_launcher(self): + """Opens some apps in order to get icon stacking in the Launcher""" + + # Add some additional applications, since we need a lot of those on big screens + if "System Monitor" not in self.process_manager.KNOWN_APPS: + self.process_manager.register_known_application("System Monitor", "gnome-system-monitor.desktop", "gnome-system-monitor") + if "Archive Manager" not in self.process_manager.KNOWN_APPS: + self.process_manager.register_known_application("Archive Manager", "file-roller.desktop", "file-roller") + + apps = ("Calculator", "Mahjongg", "Text Editor", "Character Map", "Terminal", "Remmina", "System Monitor", "Archive Manager") + + for app in apps: + self.process_manager.start_app_window(app) + + def test_autoscrolling_from_bottom(self): + """Tests the autoscrolling from the bottom of the Launcher""" + self.open_apps_in_launcher() + + # Set the autoscroll_offset to 10 (this is arbitrary for this test). + autoscroll_offset = 10 + + launcher_instance = self.get_launcher() + (x, y, w, h) = launcher_instance.geometry + + icons = self.unity.launcher.model.get_launcher_icons() + num_icons = self.unity.launcher.model.num_launcher_icons() + + last_icon = icons[num_icons - 1] + + # Move mouse to the middle of the Launcher in order to expand all + # of the icons for scrolling + launcher_instance.move_mouse_over_launcher() + + # Make sure the last icon is off the screen or else there is no + # scrolling. + self.assertThat(last_icon.center_y, Eventually(GreaterThan(h))) + + # Autoscroll to the last icon + launcher_instance.autoscroll_to_icon(last_icon, autoscroll_offset) + + (x_fin, y_fin) = self.mouse.position() + + # Make sure we ended up in the center of the last icon + self.assertThat(x_fin, Equals(last_icon.center_x)) + self.assertThat(y_fin, Equals(last_icon.center_y)) + + def test_autoscrolling_from_top(self): + """Test the autoscrolling from the top of the Launcher""" + self.open_apps_in_launcher() + + # Set the autoscroll_offset to 10 (this is arbitrary for this test). + autoscroll_offset = 10 + + launcher_instance = self.get_launcher() + (x, y, w, h) = launcher_instance.geometry + + icons = self.unity.launcher.model.get_launcher_icons() + num_icons = self.unity.launcher.model.num_launcher_icons() + + first_icon = icons[0] + last_icon = icons[num_icons - 1] + + # Move to the last icon in order to expand the top of the Launcher + launcher_instance.move_mouse_to_icon(last_icon) + + # Make sure the first icon is off the screen or else there is no + # scrolling. + self.assertThat(first_icon.center_y, Eventually(LessThan(y))) + + # Autoscroll to the first icon + launcher_instance.autoscroll_to_icon(first_icon, autoscroll_offset) + + (x_fin, y_fin) = self.mouse.position() + + # Make sure we ended up in the center of the first icon + self.assertThat(x_fin, Equals(first_icon.center_x)) + self.assertThat(y_fin, Equals(first_icon.center_y)) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/test_visual.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/test_visual.py @@ -0,0 +1,76 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Authors: Thomi Richards, +# Marco Trevisan (Treviño) +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.matchers import Eventually +import logging +from testtools.matchers import Equals +from time import sleep + +from unity.emulators.icons import BFBLauncherIcon +from unity.tests.launcher import LauncherTestCase + +logger = logging.getLogger(__name__) + + +class LauncherVisualTests(LauncherTestCase): + """Tests for visual aspects of the launcher (icon saturation etc.).""" + + def test_keynav_from_dash_saturates_icons(self): + """Starting super+tab switcher from the dash must resaturate launcher icons. + + Tests fix for bug #913569. + """ + bfb = self.unity.launcher.model.get_bfb_icon() + self.mouse.move(bfb.center_x, bfb.center_y) + self.unity.dash.ensure_visible() + sleep(1) + # We can't use 'launcher_instance.switcher_start()' since it moves the mouse. + self.keybinding_hold_part_then_tap("launcher/switcher") + self.addCleanup(self.keybinding_release, "launcher/switcher") + self.addCleanup(self.keybinding, "launcher/switcher/exit") + + self.keybinding_tap("launcher/switcher/next") + for icon in self.unity.launcher.model.get_launcher_icons(): + self.assertThat(icon.desaturated, Eventually(Equals(False))) + + def test_opening_dash_desaturates_icons(self): + """Opening the dash must desaturate all the launcher icons.""" + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + + for icon in self.unity.launcher.model.get_launcher_icons(): + if isinstance(icon, BFBLauncherIcon): + self.assertThat(icon.desaturated, Eventually(Equals(False))) + else: + self.assertThat(icon.desaturated, Eventually(Equals(True))) + + def test_opening_dash_with_mouse_over_launcher_keeps_icon_saturation(self): + """Opening dash with mouse over launcher must not desaturate icons.""" + launcher_instance = self.get_launcher() + x,y,w,h = launcher_instance.geometry + self.mouse.move(x + w/2, y + h/2) + sleep(.5) + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + for icon in self.unity.launcher.model.get_launcher_icons(): + self.assertThat(icon.desaturated, Eventually(Equals(False))) + + def test_mouse_over_with_dash_open_desaturates_icons(self): + """Moving mouse over launcher with dash open must saturate icons.""" + launcher_instance = self.get_launcher() + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + sleep(.5) + x,y,w,h = launcher_instance.geometry + self.mouse.move(x + w/2, y + h/2) + sleep(.5) + for icon in self.unity.launcher.model.get_launcher_icons(): + self.assertThat(icon.desaturated, Eventually(Equals(False))) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/test_capture.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/test_capture.py @@ -0,0 +1,126 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Authors: Thomi Richards, +# Marco Trevisan (Treviño) +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.matchers import Eventually +import logging +from testtools.matchers import Equals, LessThan, GreaterThan +from time import sleep + +from unity.tests import UnityTestCase + +logger = logging.getLogger(__name__) + + +class LauncherCaptureTests(UnityTestCase): + """Test the launchers ability to capture/not capture the mouse.""" + + def setUp(self): + super(LauncherCaptureTests, self).setUp() + + if self.display.get_num_screens() <= 1: + self.skipTest("This test requires two or more monitors.") + + self.set_unity_option('launcher_capture_mouse', True) + self.set_unity_option('num_launchers', 0) + self.setHideMode(0) + + def setHideMode(self, mode): + self.set_unity_option('launcher_hide_mode', mode) + launcher = self.unity.launcher.get_launcher_for_monitor(0) + self.assertThat(launcher.hidemode, Eventually(Equals(mode))) + + def leftMostMonitor(self): + x1, y1, width, height = self.display.get_screen_geometry(0) + x2, y2, width, height = self.display.get_screen_geometry(1) + + if x1 < x2: + return 0 + return 1 + + def rightMostMonitor(self): + # TODO: This will break setups with 3 or more monitors. + return 1 - self.leftMostMonitor() + + + def test_launcher_captures_while_sticky_and_revealed(self): + """Tests that the launcher captures the mouse when moving between monitors + while revealed. + """ + x, y, width, height = self.display.get_screen_geometry(self.rightMostMonitor()) + self.mouse.move(x + width / 2, y + height / 2, False) + self.mouse.move(x - width / 2, y + height / 2, True, 5, .002) + + x_fin, y_fin = self.mouse.position() + # The launcher should have held the mouse a little bit + self.assertThat(x_fin, GreaterThan(x - width / 2)) + + def test_launcher_not_capture_while_not_sticky_and_revealed(self): + """Tests that the launcher doesn't captures the mouse when moving between monitors + while revealed and stick is off. + """ + + self.set_unity_option('launcher_capture_mouse', False) + + x, y, width, height = self.display.get_screen_geometry(self.rightMostMonitor()) + self.mouse.move(x + width / 2, y + height / 2, False) + self.mouse.move(x - width / 2, y + height / 2, True, 5, .002) + + x_fin, y_fin = self.mouse.position() + # The launcher should have held the mouse a little bit + self.assertThat(x_fin, Equals(x - width / 2)) + + def test_launcher_capture_while_not_sticky_and_hidden(self): + """Tests that the launcher captures the mouse when moving between monitors + while hidden and sticky is off. (moving left) + """ + + self.set_unity_option('launcher_capture_mouse', False) + self.setHideMode(1) + + x, y, width, height = self.display.get_screen_geometry(self.rightMostMonitor()) + self.mouse.move(x + width / 2, y + height / 2, False) + self.mouse.move(x - width / 2, y + height / 2, True, 5, .002) + + x_fin, y_fin = self.mouse.position() + # The launcher should have held the mouse a little bit + self.assertThat(x_fin, GreaterThan(x - width / 2)) + + def test_launcher_not_capture_while_not_sticky_and_hidden_moving_right(self): + """Tests that the launcher doesn't capture the mouse when moving between monitors + while hidden and sticky is off (moving right). + """ + + self.set_unity_option('launcher_capture_mouse', False) + self.setHideMode(1) + + x, y, width, height = self.display.get_screen_geometry(self.leftMostMonitor()) + self.mouse.move(x + width / 2, y + height / 2, False) + sleep(1.5) + self.mouse.move(x + width * 1.5, y + height / 2, True, 5, .002) + + x_fin, y_fin = self.mouse.position() + # The launcher should have held the mouse a little bit + self.assertThat(x_fin, Equals(x + width * 1.5)) + + def test_launcher_capture_while_sticky_and_hidden_moving_right(self): + """Tests that the launcher captures the mouse when moving between monitors + while hidden. + """ + self.setHideMode(1) + + x, y, width, height = self.display.get_screen_geometry(self.leftMostMonitor()) + self.mouse.move(x + width / 2, y + height / 2, False) + sleep(1.5) + self.mouse.move(x + width * 1.5, y + height / 2, True, 5, .002) + + x_fin, y_fin = self.mouse.position() + # The launcher should have held the mouse a little bit + self.assertThat(x_fin, LessThan(x + width * 1.5)) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/test_switcher.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/test_switcher.py @@ -0,0 +1,168 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Authors: Thomi Richards, +# Marco Trevisan (Treviño) +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.matchers import Eventually + +import logging +from testtools.matchers import Equals, NotEquals, GreaterThan +from time import sleep + +from unity.tests.launcher import LauncherTestCase + + +logger = logging.getLogger(__name__) + + +class LauncherSwitcherTests(LauncherTestCase): + """ Tests the functionality of the launcher's switcher capability""" + + def start_switcher_with_cleanup_cancel(self): + """Start switcher mode safely. + + This adds a cleanup action that cancels keynav mode at the end of the + test if it's still running (but does nothing otherwise). + + """ + self.launcher_instance.switcher_start() + self.addCleanup(self.safe_quit_switcher) + + def safe_quit_switcher(self): + """Quit the keynav mode if it's engaged.""" + if self.unity.launcher.key_nav_is_active: + self.launcher_instance.switcher_cancel() + + def test_launcher_switcher_cancel(self): + """Test that ending the launcher switcher actually works.""" + self.launcher_instance.switcher_start() + self.launcher_instance.switcher_cancel() + self.assertThat(self.unity.launcher.key_nav_is_active, Eventually(Equals(False))) + + def test_launcher_switcher_cancel_resume_focus(self): + """Test that ending the launcher switcher resume the focus.""" + self.process_manager.close_all_app("Calculator") + calc = self.process_manager.start_app("Calculator") + self.assertTrue(calc.is_active) + + self.start_switcher_with_cleanup_cancel() + sleep(.5) + self.assertFalse(calc.is_active) + + self.launcher_instance.switcher_cancel() + sleep(.5) + self.assertTrue(calc.is_active) + + def test_launcher_switcher_starts_at_index_zero(self): + """Test that starting the Launcher switcher puts the keyboard focus on item 0.""" + self.start_switcher_with_cleanup_cancel() + + self.assertThat(self.unity.launcher.key_nav_is_active, Eventually(Equals(True))) + self.assertThat(self.unity.launcher.key_nav_is_grabbed, Eventually(Equals(False))) + self.assertThat(self.unity.launcher.key_nav_selection, Eventually(Equals(0))) + + def test_launcher_switcher_next(self): + """Moving to the next launcher item while switcher is activated must work.""" + self.start_switcher_with_cleanup_cancel() + self.launcher_instance.switcher_next() + # The launcher model has hidden items, so the keynav indexes do not + # increase by 1 each time. This test was failing because the 2nd icon + # had an index of 2, not 1 as expected. The best we can do here is to + # make sure that the index has increased. This opens us to the + # possibility that the launcher really is skipping forward more than one + # icon at a time, but we can't do much about that. + self.assertThat(self.unity.launcher.key_nav_selection, Eventually(GreaterThan(0))) + + def test_launcher_switcher_prev(self): + """Moving to the previous launcher item while switcher is activated must work.""" + self.start_switcher_with_cleanup_cancel() + self.launcher_instance.switcher_prev() + self.assertThat(self.unity.launcher.key_nav_selection, Eventually(NotEquals(0))) + + def test_launcher_switcher_down(self): + """Pressing the down arrow key while switcher is activated must work.""" + self.start_switcher_with_cleanup_cancel() + self.launcher_instance.switcher_down() + # The launcher model has hidden items, so the keynav indexes do not + # increase by 1 each time. This test was failing because the 2nd icon + # had an index of 2, not 1 as expected. The best we can do here is to + # make sure that the index has increased. This opens us to the + # possibility that the launcher really is skipping forward more than one + # icon at a time, but we can't do much about that. + self.assertThat(self.unity.launcher.key_nav_selection, Eventually(GreaterThan(0))) + + def test_launcher_switcher_up(self): + """Pressing the up arrow key while switcher is activated must work.""" + self.start_switcher_with_cleanup_cancel() + self.launcher_instance.switcher_up() + self.assertThat(self.unity.launcher.key_nav_selection, Eventually(NotEquals(0))) + + def test_launcher_switcher_next_doesnt_show_shortcuts(self): + """Moving forward in launcher switcher must not show launcher shortcuts.""" + self.start_switcher_with_cleanup_cancel() + self.launcher_instance.switcher_next() + # sleep so that the shortcut timeout could be triggered + sleep(2) + self.assertThat(self.launcher_instance.shortcuts_shown, Eventually(Equals(False))) + + def test_launcher_switcher_prev_doesnt_show_shortcuts(self): + """Moving backward in launcher switcher must not show launcher shortcuts.""" + self.start_switcher_with_cleanup_cancel() + self.launcher_instance.switcher_prev() + # sleep so that the shortcut timeout could be triggered + sleep(2) + self.assertThat(self.launcher_instance.shortcuts_shown, Eventually(Equals(False))) + + def test_launcher_switcher_cycling_forward(self): + """Launcher Switcher must loop through icons when cycling forwards""" + self.start_switcher_with_cleanup_cancel() + prev_icon = 0 + num_icons = self.unity.launcher.model.num_launcher_icons() + logger.info("This launcher has %d icons", num_icons) + for icon in range(1, num_icons): + self.launcher_instance.switcher_next() + # FIXME We can't directly check for selection/icon number equalty + # since the launcher model also contains "hidden" icons that aren't + # shown, so the selection index can increment by more than 1. + self.assertThat(self.unity.launcher.key_nav_selection, Eventually(GreaterThan(prev_icon))) + prev_icon = self.unity.launcher.key_nav_selection + + self.launcher_instance.switcher_next() + self.assertThat(self.unity.launcher.key_nav_selection, Eventually(Equals(0))) + + def test_launcher_switcher_cycling_backward(self): + """Launcher Switcher must loop through icons when cycling backwards""" + self.start_switcher_with_cleanup_cancel() + self.launcher_instance.switcher_prev() + # FIXME We can't directly check for self.unity.launcher.num_launcher_icons - 1 + self.assertThat(self.unity.launcher.key_nav_selection, Eventually(GreaterThan(1))) + + def test_launcher_switcher_activate_keep_focus(self): + """Activating a running launcher icon should focus the application.""" + calc = self.process_manager.start_app("Calculator") + mahjongg = self.process_manager.start_app("Mahjongg") + self.assertTrue(mahjongg.is_active) + self.assertFalse(calc.is_active) + + self.start_switcher_with_cleanup_cancel() + + self.launcher_instance.keyboard_select_icon(tooltip_text=calc.name) + self.launcher_instance.switcher_activate() + + self.assertThat(lambda: calc.is_active, Eventually(Equals(True))) + self.assertThat(lambda: mahjongg.is_active, Eventually(Equals(False))) + + def test_launcher_switcher_using_shorcuts(self): + """Using some other shortcut while switcher is active must cancel switcher.""" + self.start_switcher_with_cleanup_cancel() + self.keyboard.press_and_release("s") + sleep(.25) + self.keyboard.press_and_release("Escape") + sleep(.25) + self.assertThat(self.unity.launcher.key_nav_is_active, Eventually(Equals(False))) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/test_reveal.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/test_reveal.py @@ -0,0 +1,116 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Authors: Thomi Richards, +# Marco Trevisan (Treviño) +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.display import move_mouse_to_screen +from autopilot.matchers import Eventually +import logging +from testtools.matchers import Equals, GreaterThan +from time import sleep + +from unity.tests.launcher import LauncherTestCase + +logger = logging.getLogger(__name__) + + +class LauncherRevealTests(LauncherTestCase): + """Test the launcher reveal behavior when in autohide mode.""" + + def setUp(self): + super(LauncherRevealTests, self).setUp() + # these automatically reset to the original value, as implemented in AutopilotTestCase + self.set_unity_option('launcher_capture_mouse', True) + self.set_unity_option('launcher_hide_mode', 1) + launcher = self.get_launcher() + self.assertThat(launcher.hidemode, Eventually(Equals(1))) + + def test_launcher_keyboard_reveal_works(self): + """Revealing launcher with keyboard must work.""" + self.launcher_instance.keyboard_reveal_launcher() + self.addCleanup(self.launcher_instance.keyboard_unreveal_launcher) + self.assertThat(self.launcher_instance.is_showing, Eventually(Equals(True))) + + def test_reveal_on_mouse_to_edge(self): + """Tests reveal of launchers by mouse pressure.""" + self.launcher_instance.move_mouse_to_right_of_launcher() + self.launcher_instance.mouse_reveal_launcher() + self.assertThat(self.launcher_instance.is_showing, Eventually(Equals(True))) + + def test_reveal_with_mouse_under_launcher(self): + """The Launcher must hide properly if the mouse is under the launcher.""" + + self.launcher_instance.move_mouse_over_launcher() + # we can't use "launcher_instance.keyboard_reveal_launcher()" + # since it moves the mouse out of the way, invalidating the test. + self.keybinding_hold("launcher/reveal") + sleep(1) + self.keybinding_release("launcher/reveal") + self.assertThat(self.launcher_instance.is_showing, Eventually(Equals(False))) + + def test_reveal_does_not_hide_again(self): + """Tests reveal of launchers by mouse pressure to ensure it doesn't + automatically hide again. + """ + self.launcher_instance.move_mouse_to_right_of_launcher() + self.launcher_instance.mouse_reveal_launcher() + self.assertThat(self.launcher_instance.is_showing, Eventually(Equals(True))) + + def test_launcher_does_not_reveal_with_mouse_down(self): + """Launcher must not reveal if have mouse button 1 down.""" + move_mouse_to_screen(self.launcher_instance.monitor) + self.mouse.press(1) + self.addCleanup(self.mouse.release, 1) + #FIXME: This is really bad API. it says reveal but it's expected to fail. bad bad bad!! + self.launcher_instance.mouse_reveal_launcher() + # Need a sleep here otherwise this test would pass even if the code failed. + # THis test needs to be rewritten... + sleep(5) + self.assertThat(self.launcher_instance.is_showing, Equals(False)) + + def test_launcher_stays_open_after_spread(self): + """Clicking on the launcher to close an active spread must not hide the launcher.""" + char_win1 = self.process_manager.start_app_window("Character Map") + char_win2 = self.process_manager.start_app_window("Character Map") + char_app = char_win1.application + + char_icon = self.unity.launcher.model.get_icon(desktop_id=char_app.desktop_file) + + self.launcher_instance.click_launcher_icon(char_icon, move_mouse_after=False) + self.assertThat(self.unity.window_manager.scale_active, Eventually(Equals(True))) + self.launcher_instance.click_launcher_icon(char_icon, move_mouse_after=False) + + self.assertThat(self.launcher_instance.is_showing, Eventually(Equals(True))) + self.assertThat(self.unity.window_manager.scale_active, Eventually(Equals(False))) + + def test_launcher_stays_open_after_icon_click(self): + """Clicking on a launcher icon must not hide the launcher.""" + char_win = self.process_manager.start_app_window("Character Map") + char_app = char_win.application + + char_icon = self.unity.launcher.model.get_icon(desktop_id=char_app.desktop_file) + self.launcher_instance.click_launcher_icon(char_icon, move_mouse_after=False) + + # Have to sleep to give the launcher time to hide (what the old behavior was) + sleep(5) + + self.assertThat(self.launcher_instance.is_showing, Eventually(Equals(True))) + + def test_new_icon_has_the_shortcut(self): + """New icons should have an associated shortcut""" + if self.unity.launcher.model.num_bamf_launcher_icons() >= 10: + self.skip("There are already more than 9 icons in the launcher") + + desktop_file = self.process_manager.KNOWN_APPS['Calculator']['desktop-file'] + if self.unity.launcher.model.get_icon(desktop_id=desktop_file) != None: + self.skip("Calculator icon is already on the launcher.") + + self.process_manager.start_app('Calculator') + icon = self.unity.launcher.model.get_icon(desktop_id=desktop_file) + self.assertThat(icon.shortcut, GreaterThan(0)) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/test_shortcut.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/test_shortcut.py @@ -0,0 +1,61 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Authors: Thomi Richards, +# Marco Trevisan (Treviño) +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.matchers import Eventually +import logging +from testtools.matchers import Equals +from time import sleep + +from unity.tests.launcher import LauncherTestCase + +logger = logging.getLogger(__name__) + + +class LauncherShortcutTests(LauncherTestCase): + """Tests for the shortcut hint window.""" + + def setUp(self): + super(LauncherShortcutTests, self).setUp() + self.launcher_instance.keyboard_reveal_launcher() + self.addCleanup(self.launcher_instance.keyboard_unreveal_launcher) + sleep(2) + + def test_launcher_keyboard_reveal_shows_shortcut_hints(self): + """Launcher icons must show shortcut hints after revealing with keyboard.""" + self.assertThat(self.launcher_instance.shortcuts_shown, Eventually(Equals(True))) + + def test_launcher_switcher_keeps_shorcuts(self): + """Initiating launcher switcher after showing shortcuts must not hide shortcuts""" + self.launcher_instance.switcher_start() + self.addCleanup(self.launcher_instance.switcher_cancel) + + self.assertThat(self.unity.launcher.key_nav_is_active, Eventually(Equals(True))) + self.assertThat(self.launcher_instance.shortcuts_shown, Eventually(Equals(True))) + + def test_launcher_switcher_next_keeps_shortcuts(self): + """Launcher switcher next action must keep shortcuts after they've been shown.""" + self.launcher_instance.switcher_start() + self.addCleanup(self.launcher_instance.switcher_cancel) + self.launcher_instance.switcher_next() + self.assertThat(self.launcher_instance.shortcuts_shown, Eventually(Equals(True))) + + def test_launcher_switcher_prev_keeps_shortcuts(self): + """Launcher switcher prev action must keep shortcuts after they've been shown.""" + self.launcher_instance.switcher_start() + self.addCleanup(self.launcher_instance.switcher_cancel) + self.launcher_instance.switcher_prev() + self.assertThat(self.launcher_instance.shortcuts_shown, Eventually(Equals(True))) + + def test_tooltip_not_shown(self): + """Tooltip must not be shown after revealing the launcher with keyboard + and mouse is not on the launcher. + """ + self.assertThat(self.launcher_instance.tooltip_shown, Eventually(Equals(False))) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/__init__.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/__init__.py @@ -0,0 +1,58 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Author: Thomi Richards +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +"""Autopilot test case class for all Launcher tests""" + +from autopilot.display import Display +from autopilot.testcase import multiply_scenarios + +from unity.tests import UnityTestCase +from unity.emulators.X11 import set_primary_monitor + + +def _make_scenarios(): + """Make scenarios for launcher test cases based on the number of configured + monitors. + """ + num_monitors = Display.create().get_num_screens() + + # it doesn't make sense to set only_primary when we're running in a single-monitor setup. + if num_monitors == 1: + return [('Single Monitor', {'launcher_monitor': 0, 'only_primary': False})] + + monitor_scenarios = [('Monitor %d' % (i), {'launcher_monitor': i}) for i in range(num_monitors)] + launcher_mode_scenarios = [('launcher_on_primary', {'only_primary': True}), + ('launcher on all', {'only_primary': False})] + return multiply_scenarios(monitor_scenarios, launcher_mode_scenarios) + + +class LauncherTestCase(UnityTestCase): + """A base class for all launcher tests that uses scenarios to run on + each launcher (for multi-monitor setups). + """ + scenarios = _make_scenarios() + + def setUp(self): + super(LauncherTestCase, self).setUp() + self.set_unity_log_level("unity.launcher", "DEBUG") + self.addCleanup(self.set_unity_log_level, "unity.launcher", "INFO") + + self.set_unity_option('num_launchers', int(self.only_primary)) + self.launcher_instance = self.get_launcher() + + if self.only_primary: + try: + old_primary_screen = self.display.get_primary_screen() + set_primary_monitor(self.launcher_monitor) + self.addCleanup(set_primary_monitor, old_primary_screen) + except autopilot.display.BlacklistedDriverError: + self.skipTest("Impossible to set the monitor %d as primary" % self.launcher_monitor) + + def get_launcher(self): + """Get the launcher for the current scenario.""" + return self.unity.launcher.get_launcher_for_monitor(self.launcher_monitor) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/test_icon_behavior.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/test_icon_behavior.py @@ -0,0 +1,400 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2012 Canonical +# Authors: Thomi Richards, +# Marco Trevisan (Treviño) +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from __future__ import absolute_import + +from autopilot.matchers import Eventually +from autopilot.testcase import multiply_scenarios +import logging +from testtools.matchers import Equals, NotEquals, GreaterThan +from time import sleep + +from unity.emulators.icons import ApplicationLauncherIcon, ExpoLauncherIcon +from unity.emulators.launcher import IconDragType +from unity.tests.launcher import LauncherTestCase, _make_scenarios + +from Xlib import Xutil + +logger = logging.getLogger(__name__) + + +class LauncherIconsTests(LauncherTestCase): + """Test the launcher icons interactions""" + + def setUp(self): + super(LauncherIconsTests, self).setUp() + self.set_unity_option('launcher_hide_mode', 0) + + def ensure_expo_launcher_icon(self): + EXPO_URI = "'unity://expo-icon'" + old_fav = self.call_gsettings_cmd('get', 'com.canonical.Unity.Launcher', 'favorites') + + if not EXPO_URI in old_fav: + if old_fav[:-2] == "[]": + new_fav = "["+EXPO_URI+"]" + else: + new_fav = old_fav[:-1]+", "+EXPO_URI+"]" + + self.addCleanup(self.call_gsettings_cmd, 'set', 'com.canonical.Unity.Launcher', 'favorites', old_fav) + self.call_gsettings_cmd('set', 'com.canonical.Unity.Launcher', 'favorites', new_fav) + + icon = self.unity.launcher.model.get_children_by_type(ExpoLauncherIcon)[0] + self.assertThat(icon, NotEquals(None)) + self.assertThat(icon.visible, Eventually(Equals(True))) + + return icon + + def ensure_calculator_in_launcher_and_not_running(self): + calc = self.process_manager.start_app("Calculator") + calc_icon = self.unity.launcher.model.get_icon(desktop_id=calc.desktop_file) + self.addCleanup(self.launcher_instance.unlock_from_launcher, calc_icon) + self.launcher_instance.lock_to_launcher(calc_icon) + self.process_manager.close_all_app("Calculator") + self.assertThat(lambda: self.process_manager.app_is_running("Calculator"), Eventually(Equals(False))) + return calc_icon + + def test_bfb_tooltip_disappear_when_dash_is_opened(self): + """Tests that the bfb tooltip disappear when the dash is opened.""" + bfb = self.unity.launcher.model.get_bfb_icon() + self.mouse.move(bfb.center_x, bfb.center_y) + + self.assertThat(lambda: bfb.get_tooltip(), Eventually(NotEquals(None))) + self.assertThat(bfb.get_tooltip().active, Eventually(Equals(True))) + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + + self.assertThat(bfb.get_tooltip().active, Eventually(Equals(False))) + + def test_bfb_tooltip_is_disabled_when_dash_is_open(self): + """Tests the that bfb tooltip is disabled when the dash is open.""" + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + + bfb = self.unity.launcher.model.get_bfb_icon() + self.mouse.move(bfb.center_x, bfb.center_y) + + # Tooltips are lazy-created in Unity, so if the BFB tooltip has never + # been shown before, get_tooltip will return None. If that happens, then + # this test should pass. + tooltip = bfb.get_tooltip() + if tooltip is not None: + self.assertThat(tooltip.active, Eventually(Equals(False))) + + def test_shift_click_opens_new_application_instance(self): + """Shift+Clicking MUST open a new instance of an already-running application.""" + app = self.process_manager.start_app("Calculator") + icon = self.unity.launcher.model.get_icon(desktop_id=app.desktop_file) + launcher_instance = self.unity.launcher.get_launcher_for_monitor(0) + + self.keyboard.press("Shift") + self.addCleanup(self.keyboard.release, "Shift") + launcher_instance.click_launcher_icon(icon) + + self.assertNumberWinsIsEventually(app, 2) + + def test_launcher_activate_last_focused_window(self): + """Activating a launcher icon must raise only the last focused instance + of that application. + + """ + char_win1 = self.process_manager.start_app_window("Character Map") + calc_win = self.process_manager.start_app_window("Calculator") + char_win2 = self.process_manager.start_app_window("Character Map") + + self.assertVisibleWindowStack([char_win2, calc_win, char_win1]) + + char_icon = self.unity.launcher.model.get_icon( + desktop_id=char_win2.application.desktop_file) + calc_icon = self.unity.launcher.model.get_icon( + desktop_id=calc_win.application.desktop_file) + + self.launcher_instance.click_launcher_icon(calc_icon) + self.assertProperty(calc_win, is_focused=True) + self.assertVisibleWindowStack([calc_win, char_win2, char_win1]) + + self.launcher_instance.click_launcher_icon(char_icon) + self.assertProperty(char_win2, is_focused=True) + self.assertVisibleWindowStack([char_win2, calc_win, char_win1]) + + self.keybinding("window/minimize") + + self.assertThat(lambda: char_win2.is_hidden, Eventually(Equals(True))) + self.assertProperty(calc_win, is_focused=True) + self.assertVisibleWindowStack([calc_win, char_win1]) + + self.launcher_instance.click_launcher_icon(char_icon) + self.assertProperty(char_win1, is_focused=True) + self.assertThat(lambda: char_win2.is_hidden, Eventually(Equals(True))) + self.assertVisibleWindowStack([char_win1, calc_win]) + + def test_launcher_uses_startup_notification(self): + """Tests that unity uses startup notification protocol.""" + calc_icon = self.ensure_calculator_in_launcher_and_not_running() + self.addCleanup(self.process_manager.close_all_app, "Calculator") + self.launcher_instance.click_launcher_icon(calc_icon) + + calc_app = self.process_manager.get_running_applications_by_desktop_file(calc_icon.desktop_id)[0] + calc_window = calc_app.get_windows()[0] + + self.assertThat(lambda: self.get_startup_notification_timestamp(calc_window), Eventually(Equals(calc_icon.startup_notification_timestamp))) + + def test_trash_icon_refocus_opened_instance(self): + """Tests that when the trash is opened, clicking on the icon re-focus the trash again""" + self.register_nautilus() + self.addCleanup(self.close_all_windows, "Nautilus") + self.addCleanup(self.process_manager.close_all_app, "Calculator") + self.close_all_windows("Nautilus") + + trash_icon = self.unity.launcher.model.get_trash_icon() + self.launcher_instance.click_launcher_icon(trash_icon) + self.assertThat(lambda: len(self.process_manager.get_open_windows_by_application("Nautilus")), Eventually(Equals(1))) + [trash_window] = self.process_manager.get_open_windows_by_application("Nautilus") + self.assertThat(lambda: trash_window.is_focused, Eventually(Equals(True))) + + calc_win = self.process_manager.start_app_window("Calculator") + self.assertThat(lambda: calc_win.is_focused, Eventually(Equals(True))) + self.assertThat(lambda: trash_window.is_focused, Eventually(Equals(False))) + + self.launcher_instance.click_launcher_icon(trash_icon) + self.assertThat(lambda: trash_window.is_focused, Eventually(Equals(True))) + + def test_trash_open_does_not_prevent_nautilus_to_run(self): + """Tests that when the trash is opened, launching still opens a new window""" + self.register_nautilus() + self.addCleanup(self.close_all_windows, "Nautilus") + self.close_all_windows("Nautilus") + + trash_icon = self.unity.launcher.model.get_trash_icon() + self.launcher_instance.click_launcher_icon(trash_icon) + self.assertThat(lambda: len(self.process_manager.get_open_windows_by_application("Nautilus")), Eventually(Equals(1))) + + nautilus_app = self.process_manager.get_app_instances("Nautilus") + nautilus_icon = self.unity.launcher.model.get_icon(desktop_id="nautilus.desktop") + self.launcher_instance.click_launcher_icon(nautilus_icon) + self.assertThat(lambda: len(self.process_manager.get_open_windows_by_application("Nautilus")), Eventually(Equals(2))) + + def test_super_number_shortcut_focuses_new_windows(self): + """Windows launched using super+number must have + keyboard focus. + + """ + bfb_icon = self.unity.launcher.model.get_bfb_icon() + calc_icon = self.ensure_calculator_in_launcher_and_not_running() + self.addCleanup(self.process_manager.close_all_app, "Calculator") + + self.launcher_instance.drag_icon_to_position( + calc_icon, + IconDragType.AFTER, + bfb_icon) + + self.launcher_instance.keyboard_reveal_launcher() + self.addCleanup(self.launcher_instance.keyboard_unreveal_launcher) + self.keyboard.press_and_release("1"); + + calc_app = self.process_manager.get_running_applications_by_desktop_file(calc_icon.desktop_id)[0] + calc_window = calc_app.get_windows()[0] + + self.assertThat(lambda: calc_window.is_focused, Eventually(Equals(True))) + + def test_clicking_icon_twice_initiates_spread(self): + """This tests shows that when you click on a launcher icon twice, + when an application window is focused, the spread is initiated. + """ + char_win1 = self.process_manager.start_app_window("Character Map") + char_win2 = self.process_manager.start_app_window("Character Map") + char_app = char_win1.application + + self.assertVisibleWindowStack([char_win2, char_win1]) + self.assertProperty(char_win2, is_focused=True) + + char_icon = self.unity.launcher.model.get_icon(desktop_id=char_app.desktop_file) + self.addCleanup(self.keybinding, "spread/cancel") + self.launcher_instance.click_launcher_icon(char_icon) + + self.assertThat(self.unity.window_manager.scale_active, Eventually(Equals(True))) + self.assertThat(self.unity.window_manager.scale_active_for_group, Eventually(Equals(True))) + + def test_while_in_scale_mode_the_dash_will_still_open(self): + """If scale is initiated through the laucher pressing super must close + scale and open the dash. + """ + char_win1 = self.process_manager.start_app_window("Character Map") + char_win2 = self.process_manager.start_app_window("Character Map") + char_app = char_win1.application + + self.assertVisibleWindowStack([char_win2, char_win1]) + self.assertProperty(char_win2, is_focused=True) + + char_icon = self.unity.launcher.model.get_icon(desktop_id=char_app.desktop_file) + self.launcher_instance.click_launcher_icon(char_icon) + self.assertThat(self.unity.window_manager.scale_active, Eventually(Equals(True))) + + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + + self.assertThat(self.unity.dash.visible, Eventually(Equals(True))) + self.assertThat(self.unity.window_manager.scale_active, Eventually(Equals(False))) + + def test_icon_shows_on_quick_application_reopen(self): + """Icons must stay on launcher when an application is quickly closed/reopened.""" + calc = self.process_manager.start_app("Calculator") + desktop_file = calc.desktop_file + calc_icon = self.unity.launcher.model.get_icon(desktop_id=desktop_file) + self.assertThat(calc_icon.visible, Eventually(Equals(True))) + + self.process_manager.close_all_app("Calculator") + calc = self.process_manager.start_app("Calculator") + sleep(2) + + calc_icon = self.unity.launcher.model.get_icon(desktop_id=desktop_file) + self.assertThat(calc_icon, NotEquals(None)) + self.assertThat(calc_icon.visible, Eventually(Equals(True))) + + def test_right_click_on_icon_ends_expo(self): + """Right click on a launcher icon in expo mode must end the expo + and show the quicklist. + + """ + if self.workspace.num_workspaces <= 1: + self.skipTest("This test requires enabled workspaces.") + + self.keybinding("expo/start") + self.assertThat(self.unity.window_manager.expo_active, Eventually(Equals(True))) + self.addCleanup(self.keybinding, "expo/cancel") + + bfb = self.unity.launcher.model.get_bfb_icon() + self.mouse.move(bfb.center_x, bfb.center_y) + self.mouse.click(button=3) + + self.assertThat(self.launcher_instance.quicklist_open, Eventually(Equals(True))) + self.assertThat(self.unity.window_manager.expo_active, Eventually(Equals(False))) + + def test_expo_launcher_icon_initiates_expo(self): + """Clicking on the expo launcher icon must start the expo.""" + if self.workspace.num_workspaces <= 1: + self.skipTest("This test requires enabled workspaces.") + + expo = self.ensure_expo_launcher_icon() + self.addCleanup(self.keybinding, "expo/cancel") + self.launcher_instance.click_launcher_icon(expo) + + self.assertThat(self.unity.window_manager.expo_active, Eventually(Equals(True))) + + def test_expo_launcher_icon_terminates_expo(self): + """Clicking on the expo launcher icon when expo is active must close it.""" + if self.workspace.num_workspaces <= 1: + self.skipTest("This test requires enabled workspaces.") + + self.keybinding("expo/start") + self.assertThat(self.unity.window_manager.expo_active, Eventually(Equals(True))) + self.addCleanup(self.keybinding, "expo/cancel") + + expo = self.ensure_expo_launcher_icon() + self.launcher_instance.click_launcher_icon(expo) + + self.assertThat(self.unity.window_manager.expo_active, Eventually(Equals(False))) + + def test_unminimize_initially_minimized_windows(self): + """Make sure initially minimized windows can be unminimized.""" + window_spec = { + "Title": "Hello", + "Minimized": True + } + + window = self.launch_test_window(window_spec) + icon = self.unity.launcher.model.get_icon(desktop_id=window.application.desktop_file) + + self.launcher_instance.click_launcher_icon(icon) + self.assertThat(lambda: window.x_win.get_wm_state()['state'], Eventually(Equals(Xutil.NormalState))) + + def test_unminimize_minimized_immediately_after_show_windows(self): + """Make sure minimized-immediately-after-show windows can be unminimized.""" + window_spec = { + "Title": "Hello", + "MinimizeImmediatelyAfterShow": True + } + + window = self.launch_test_window(window_spec) + icon = self.unity.launcher.model.get_icon(desktop_id=window.application.desktop_file) + + self.launcher_instance.click_launcher_icon(icon) + self.assertThat(lambda: window.x_win.get_wm_state()['state'], Eventually(Equals(Xutil.NormalState))) + +class LauncherDragIconsBehavior(LauncherTestCase): + """Tests dragging icons around the Launcher.""" + + scenarios = multiply_scenarios(_make_scenarios(), + [ + ('inside', {'drag_type': IconDragType.INSIDE}), + ('outside', {'drag_type': IconDragType.OUTSIDE}), + ]) + + def setUp(self): + super(LauncherDragIconsBehavior, self).setUp() + self.set_unity_option('launcher_hide_mode', 0) + + def ensure_calc_icon_not_in_launcher(self): + """Wait until the launcher model updates and removes the calc icon.""" + # Normally we'd use get_icon(desktop_id="...") but we're expecting it to + # not exist, and we don't want to wait for 10 seconds, so we do this + # the old fashioned way. + get_icon_fn = lambda: self.unity.launcher.model.get_children_by_type( + ApplicationLauncherIcon, desktop_id="gcalctool.desktop") + calc_icon = get_icon_fn() + if calc_icon: + self.launcher_instance.unlock_from_launcher(calc_icon[0]) + + self.assertThat(get_icon_fn, Eventually(Equals([]))) + + def test_can_drag_icon_below_bfb(self): + """Application icons must be draggable to below the BFB.""" + + self.ensure_calc_icon_not_in_launcher() + calc = self.process_manager.start_app("Calculator") + calc_icon = self.unity.launcher.model.get_icon(desktop_id=calc.desktop_file) + bfb_icon = self.unity.launcher.model.get_bfb_icon() + + self.launcher_instance.drag_icon_to_position( + calc_icon, + IconDragType.AFTER, + bfb_icon, + self.drag_type) + moved_icon = self.unity.launcher.model.\ + get_launcher_icons_for_monitor(self.launcher_monitor)[1] + self.assertThat(moved_icon.id, Equals(calc_icon.id)) + + def test_can_drag_icon_below_window_switcher(self): + """Application icons must be dragable to below the workspace switcher icon.""" + + self.ensure_calc_icon_not_in_launcher() + calc = self.process_manager.start_app("Calculator") + calc_icon = self.unity.launcher.model.get_icon(desktop_id=calc.desktop_file) + bfb_icon = self.unity.launcher.model.get_bfb_icon() + trash_icon = self.unity.launcher.model.get_trash_icon() + + # Move a known icon to the top as it needs to be more than 2 icon + # spaces away for this test to actually do anything + self.launcher_instance.drag_icon_to_position( + calc_icon, + IconDragType.AFTER, + bfb_icon, + self.drag_type) + + sleep(1) + self.launcher_instance.drag_icon_to_position( + calc_icon, + IconDragType.BEFORE, + trash_icon, + self.drag_type) + + # Must be the last bamf icon - not necessarily the third-from-end icon. + refresh_fn = lambda: self.unity.launcher.model.get_launcher_icons()[-2].id + self.assertThat(refresh_fn, + Eventually(Equals(calc_icon.id)), + "Launcher icons are: %r" % self.unity.launcher.model.get_launcher_icons()) --- unity-7.0.2+13.10.20130705.1.orig/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/test_tooltips.py +++ unity-7.0.2+13.10.20130705.1/tests/autopilot/build/lib.linux-x86_64-2.7/unity/tests/launcher/test_tooltips.py @@ -0,0 +1,89 @@ +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- +# Copyright 2013 Canonical +# Authors: Jacob Edwards +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 3, as published +# by the Free Software Foundation. + +from autopilot.matchers import Eventually +from testtools.matchers import Equals, NotEquals +from time import sleep + +from unity.tests.launcher import LauncherTestCase, _make_scenarios + +class LauncherTooltipTests(LauncherTestCase): + """Tests whether tooltips display only at appropriate times.""" + + def setUp(self): + super(LauncherTooltipTests, self).setUp() + self.set_unity_option('launcher_hide_mode', 0) + self.launcher_instance.move_mouse_to_right_of_launcher() + self.icons = self.unity.launcher.model.get_launcher_icons(visible_only=True) + + def test_launcher_tooltip_show(self): + """Tests whether icon tooltips delay showing themselves and, + once shown, whether subsequent icons show them instantly.""" + for i in self.icons: + tooltip = i.get_tooltip() + if not tooltip: + continue + self.assertThat(tooltip.active, Eventually(Equals(False))) + + # only reveal tooltips after short wait + self.assertEqual(self.get_reveal_behavior(self.icons[0]), self.DELAYED) + + # subsequent tooltips reveal instantly, but hide on exit + a, b = 0, 1 + while b < len(self.icons): + self.mouse.move(self.icons[b].center_x, self.icons[b].center_y) + self.assertThat(lambda: self.icons[b].get_tooltip(), Eventually(NotEquals(None))) + self.assertThat(self.icons[b].get_tooltip().active, Eventually(Equals(True))) + self.assertThat(lambda: self.icons[a].get_tooltip(), Eventually(NotEquals(None))) + self.assertThat(self.icons[a].get_tooltip().active, Eventually(Equals(False))) + a, b = a + 1, b + 1 + b -= 1 + + # leaving launcher clears tooltips, and instant reveal + self.launcher_instance.move_mouse_to_right_of_launcher() + self.assertEqual(self.get_reveal_behavior(self.icons[b]), self.DELAYED) + + def test_launcher_tooltip_disabling(self): + """Tests whether clicking on an icon hides its tooltip.""" + bfb, other = self.icons[0], self.icons[1] + self.assertEqual(self.get_reveal_behavior(bfb), self.DELAYED) + + # clicking icon hides its launcher until further input + self.mouse.click() + self.assertEqual(self.get_reveal_behavior(bfb), self.NEVER) + self.mouse.click() + + # normal behavior resumes on moving away from icon + self.assertEqual(self.get_reveal_behavior(other), self.DELAYED) + self.assertEqual(self.get_reveal_behavior(bfb), self.INSTANT) + + def test_launcher_bfb_tooltip_when_open(self): + """Tests whether hovering over the active BFB starts a tooltip timer""" + self.unity.dash.ensure_visible() + self.addCleanup(self.unity.dash.ensure_hidden) + bfb, other = self.icons[0], self.icons[1] + + # hovering an open dash's BFB does not show a tooltip ... + self.assertEqual(self.get_reveal_behavior(bfb), self.NEVER) + + # ... nor did it timeout instant tooltips for other icons + self.assertEqual(self.get_reveal_behavior(other), self.DELAYED) + + # Tooltip reveal types + (INSTANT, DELAYED, NEVER) = range(3) + + def get_reveal_behavior(self, icon): + self.mouse.move(icon.center_x, icon.center_y) + tooltip = icon.get_tooltip() + if tooltip and tooltip.active: + return self.INSTANT + sleep(1.2) + tooltip = icon.get_tooltip() + if tooltip and tooltip.active: + return self.DELAYED + return self.NEVER --- unity-7.0.2+13.10.20130705.1.orig/tests/test-gestures/CMakeLists.txt +++ unity-7.0.2+13.10.20130705.1/tests/test-gestures/CMakeLists.txt @@ -1,4 +1,4 @@ -if (GTEST_SRC_DIR) +if (GTEST_ROOT_DIR) set(UNITY_SRC ${CMAKE_SOURCE_DIR}/plugins/unityshell/src) add_custom_command(OUTPUT CompoundGestureRecognizer.cpp @@ -33,6 +33,11 @@ remove_definitions(${CFLAGS}) set_directory_properties(PROPERTY INCLUDE_DIRECTORIES "") + include_directories ( + ${GMOCK_INCLUDE_DIR} + ${GTEST_INCLUDE_DIR} + ) + include_directories (${CMAKE_SOURCE_DIR}) include_directories (${CMAKE_SOURCE_DIR}/unity-shared) @@ -71,4 +76,4 @@ add_dependencies(test-gestures gtest unity-core-${UNITY_API_VERSION}) add_custom_target (check-gestures COMMAND ./test-gestures DEPENDS test-gestures) -endif (GTEST_SRC_DIR) +endif (GTEST_ROOT_DIR)