#256 Create a test suite for Gnome Software.
Opened 3 years ago by lruzicka. Modified 2 years ago

file modified
+12
@@ -130,6 +130,18 @@ 

      testliterals.append(f"maps_info_{location}")

  # variable-y in custom_change_device but we only have one value

  testliterals.append("anaconda_part_device_sda")

+ # For various application needles used by installation, removal, and

+ # checking methods.

+ for application in ("mahjongg","gvim","emacs","inkscape"):

+     testliterals.append(f"software_{application}-found")

+     testliterals.append(f"software_{application}-found_installed")

+     testliterals.append(f"software_{application}-listed")

+     testliterals.append(f"software_{application}-install_pane")

+     testliterals.append(f"apps_run_{application}")

+ # For RPM and Flatpak source used by installation methods.

+ for source in ("rpm", "flatpak"):

+     testliterals.append(f"software_source_available_{source}")

+     testliterals.append(f"software_source_fedora_{source}")

  # for Anaconda help related needles.

  testliterals.extend(f"anaconda_help_{fsys}" for fsys in ('install_destination',

  'installation_progress', 'keyboard_layout', 'language_support', 'network_host_name',

file added
+177
@@ -0,0 +1,177 @@ 

+ package desktoptools;

+ 

+ use strict;

+ 

+ use base 'Exporter';

+ use Exporter;

+ 

+ use testapi;

+ use utils;

+ 

+ our @EXPORT = qw/find_application install_application check_application_information start_application_via_packagemanager check_app_installed remove_application restart_application/;

+ 

+ # This subroutine searches for the application using the package manager's

+ # search method. Currently, the routine is only available for Gnome Software.

+ sub find_application {

+     my $application = shift;

+     assert_and_click("gnome_search_button");

+     wait_still_screen(2);

+     type_safely($application);

+     # Confirm that the application has been found and shown

+     # in the overview, click on it to enter the installation

+     # tab and confirm it has opened.

+     assert_and_click("software_$application-found");

+     wait_still_screen(2);

+     assert_screen("software_$application-install_pane");

+ }

+ 

+ # This subroutine checks that the application shows appropriate

+ # information.

+ sub check_application_information {

+     my $application = shift;

+     # The logo, the screenshot, and the description should be visible

+     # without any intervention needed.

+     assert_screen("software_logo_$application");

+     assert_screen("software_screenshot_$application");

+     assert_screen("software_description_$application");

+ 

+     # Other elements are placed below the visible area

+     # so we need to move there, if we want to see it.

+     # The safest option is to hit the tab key until

+     # we reach that element.

+     send_key_until_needlematch("software_download_size_$application", "tab");

+     # Now, other metadata should be visible two, so let's check them

+     assert_screen("software_safestatus_$application");

+     assert_screen("software_usage_$application");

+     assert_screen("software_rating_$application");

+     

+     # Again, let's move a bit down

+     send_key_until_needlematch("software_website_$application", "tab");

+     # Let's click on the link to open the website

+     click_lastmatch();

+ 

+     # Check, that the webpage has opened with correct information.

+     assert_screen("software_weblink_$application");

+     assert_screen("software_webcontent_$application");

+ 

+     # Close the browser

+     send_key("alt-f4");

+     wait_still_screen(2);

+ }

+ 

+ # This subroutine installs an application via the

+ # GUI application, such as Gnome Software, or Discover.

+ # Currently, only Gnome Software is supported.

+ # The $application takes the name of the application, while

+ # $source takes the installation source, rpm or flatpak.

+ # The subroutine does not start the application itself,

+ # you need to start it before running this.

+ sub install_application {

+     my ($application, $source) = @_;

+     # For some applications, there are more installation sources

+     # available. Pick the desired one.

+     if (check_screen("software_sources_available", timeout => 5)) {

+         click_lastmatch();

+         wait_still_screen(2);

+         assert_and_click("software_source_fedora_$source");

+         wait_still_screen(2);

+         # Confirm that the source is indeed correctly selected.

+         assert_screen("software_sources_available_$source");

+     }

+     # Click the Install button to start the installation.

+     assert_and_click("gnome_install_button");

+     # When the installation is finished, the Open button

+     # will be shown. We are going to wait for this for

+     # a certain time. In case of Flatpak, this should be longer.

+     my $wait_time = 180;

+     if ($source eq "flatpak") {

+         $wait_time = 1200;

+     }

+     assert_screen("gnome_button_open", timeout => $wait_time);

+     # After the installation, return to the previous page.

+     if (check_screen("software_back_button")) {

+         click_lastmatch();

+     }

+ }

+ 

+ # This subroutine opens the $application using Gnome Software.

+ # It is useful to check that the installed application can

+ # be run immediately from withing the application.

+ sub start_application_via_packagemanager {

+     my $application = shift;

+     # We do not have to be on the application tab, so let's

+     # start over and navigate there from scratch if needed -

+     # if no Open button is visible.

+     unless (check_screen("gnome_button_open")) {

+         assert_and_click("gnome_search_button");

+         wait_still_screen(2);

+         type_safely($application);

+         assert_and_click("software_$application-found");

+         wait_still_screen(2);

+         assert_screen("software_$application-install_pane");

+     }

+     # An Open button must be visible now, if the application

+     # has been installed, otherwise the command will fail.

+     assert_and_click("gnome_button_open");

+     wait_still_screen(3);

+     assert_screen("apps_run_$application");

+ }

+ 

+ # This subroutine checks that the $application has been found

+ # in the list of installed applications.

+ # It will send a key and circle through the GUI list until the

+ # application has been found (or it will fail).

+ sub check_app_installed {

+     my $application = shift;

+     # Look for the application and confirm that it is listed as installed

+     # in the application overview.

+     assert_and_click("gnome_search_button");

+     type_safely($application);

+     send_key("ret");

+     assert_screen("software_$application-found_installed");

+ 

+     # Enter the Installed application view and circle through the items

+     # until the desired application has been found.

+     assert_and_click("software_installed_button");

+     send_key_until_needlematch("software_$application-listed", "tab", 70);

+ }

+ 

+ # This subroutine removes the application using a default package manager.

+ # This will not start the package manager application, you need to start

+ # it manualy or using a different subroutine.

+ # Currently only works for Software.

+ sub remove_application {

+     my $application = shift;

+ 

+     # Find the application.

+     assert_and_click("gnome_search_button");

+     wait_still_screen(2);

+     type_safely($application);

+ 

+     assert_and_click("software_$application-found_installed");

+     wait_still_screen(2);

+     assert_screen("software_$application-install_pane");

+ 

+     # Click the Delete button to delete the application.

+     assert_and_click("software_remove_button");

+ 

+     # Confirm to progress with the removal

+     assert_and_click("gnome_uninstall_button");

+ 

+     # Wait until the Open button changes to Install to indicate

+     # that the application has been removed.

+     assert_screen("gnome_install_button", timeout => 180);

+ }

+ 

+ # This routine records a soft failure and starts the application.

+ # We have identified tests where the tested application crashes

+ # after the VM has been rolled back, probably due to changes

+ # to the underlying system, such as in Software.

+ sub restart_application {

+     my $application = shift;

+ 

+     record_soft_failure("$application crashed and had to be restarted to continue the tests.");

+     menu_launch_type($application);

+     wait_still_screen(2);

+     assert_screen("apps_run_$application");

+ }

file modified
+1 -1
@@ -101,7 +101,7 @@ 

  sub become_root {

      # If ROOT_PASSWORD exists, it means that the root account exists, too.

      # To become root, we will use the real root account and we'll switch to it.

-     if (check_var("ROOT_PASSWORD")) {

+     if (get_var("ROOT_PASSWORD")) {

          my $password = get_var("ROOT_PASSWORD");

          enter_cmd("su -", max_interval => 15, wait_screen_changes => 3);

          type_password($password, max_interval => 15);

file modified
+43 -1
@@ -7,7 +7,7 @@ 

  

  use lockapi;

  use testapi;

- our @EXPORT = qw/run_with_error_check type_safely type_very_safely desktop_vt boot_to_login_screen console_login console_switch_layout desktop_switch_layout console_loadkeys_us do_bootloader boot_decrypt check_release menu_launch_type repo_setup setup_workaround_repo disable_updates_repos cleanup_workaround_repo console_initial_setup handle_welcome_screen gnome_initial_setup anaconda_create_user check_desktop download_modularity_tests quit_firefox advisory_get_installed_packages advisory_check_nonmatching_packages start_with_launcher quit_with_shortcut disable_firefox_studies select_rescue_mode copy_devcdrom_as_isofile get_release_number check_left_bar check_top_bar check_prerelease check_version spell_version_number _assert_and_click is_branched rec_log click_unwanted_notifications repos_mirrorlist register_application get_registered_applications solidify_wallpaper check_and_install_git download_testdata make_serial_writable/;

+ our @EXPORT = qw/run_with_error_check type_safely type_very_safely desktop_vt boot_to_login_screen console_login console_switch_layout desktop_switch_layout console_loadkeys_us do_bootloader boot_decrypt check_release menu_launch_type repo_setup setup_workaround_repo cleanup_workaround_repo console_initial_setup handle_welcome_screen gnome_initial_setup anaconda_create_user check_desktop download_modularity_tests quit_firefox advisory_get_installed_packages advisory_check_nonmatching_packages start_with_launcher quit_with_shortcut disable_firefox_studies select_rescue_mode copy_devcdrom_as_isofile get_release_number check_left_bar check_top_bar check_prerelease check_version spell_version_number _assert_and_click is_branched rec_log click_unwanted_notifications repos_mirrorlist register_application get_registered_applications solidify_wallpaper check_and_install_git download_testdata make_serial_writable start_gnome_software/;

  

  # We introduce this global variable to hold the list of applications that have

  # registered during the apps_startstop_test when they have sucessfully run.
@@ -1618,7 +1618,25 @@ 

  # We agree that this is not the "correct" way, to enable users to type onto serial console

  # and that it correctly should be done via groups (dialout) but that would require rebooting

  # the virtual machine. Therefore we do it this way, which has immediate effect.

+ #

+ # Use "cli" or "desktop" as an argument to use this either from CLI or desktop.

  sub make_serial_writable {

+     my $env = shift;

+     # Get the name of the desktop

+     my $desktop = get_var("DESKTOP");

+     # If we are running it from the desktop

+     if ($env eq "desktop") {

+         # The default terminal  application is gnome-terminal

+         my $term = "gnome-terminal";

+         # On KDE, change this to konsole

+         if ($desktop eq "kde") {

+             $term = "konsole";

+         }

+         # Run the terminal application

+         menu_launch_type($term);

+         wait_still_screen(3);

+     }

+     # Become root

      become_root();

      sleep 2;

      # Make serial console writable for everyone.
@@ -1627,6 +1645,30 @@ 

      # Exit the root account

      enter_cmd("exit");

      sleep 2;

+     # If we are on the desktop, than a terminal was

+     # started for us. Leave it now.

+     if ($env eq "desktop") {

+         # Exit the terminal

+         enter_cmd("exit");

+         sleep 2;

+     }

+ }

+ 

+ # This subroutine start Gnome Software and deals with

+ # the welcome dialogue and checks that the application

+ # has started successfully. If 'started' is true, skip

+ # actually running the app and just do the welcome

+ # screen check.

+ # FIXME: the welcome screen was removed upstream between

+ # F35 and F36. When F35 goes EOL we can just drop this

+ # whole thing and have things that call it just launch the

+ # app and do `assert_screen "apps_run_software";`

+ sub start_gnome_software {

+     my %args = @_;

+     $args{started} //= 0;

+     menu_launch_type "gnome-software" unless $args{started};

+     click_lastmatch if (check_screen "gnome_software_welcome", timeout => 15);

+     assert_screen "apps_run_software";

  }

  

  1;

needles/gnome/apps/apps_run_inkscape.json needles/gnome/apps/nautilus/nautilus_star_selected_file-20220811.json
file renamed
+5 -5
@@ -1,15 +1,15 @@ 

  {

    "area": [

      {

-       "xpos": 971,

-       "ypos": 191,

-       "width": 19,

-       "height": 18,

+       "xpos": 211,

+       "ypos": 122,

+       "width": 250,

+       "height": 65,

        "type": "match"

      }

    ],

    "properties": [],

    "tags": [

-     "nautilus_star_selected_file"

+     "apps_run_inkscape"

    ]

  } 

\ No newline at end of file

empty or binary file added
@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 115,

+       "ypos": 5,

+       "width": 98,

+       "height": 23,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "apps_run_mahjongg"

+   ]

+ } 

\ No newline at end of file

empty or binary file added
@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "width": 29,

+       "type": "match",

+       "ypos": 41,

+       "height": 28,

+       "xpos": 9

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "gnome_search_button"

+   ]

+ } 

\ No newline at end of file

empty or binary file added
needles/gnome/apps/gnome_uninstall_button.json needles/gnome/gnome_button_credits-eog-dark.json
file renamed
+6 -6
@@ -1,15 +1,15 @@ 

  {

    "area": [

      {

-       "xpos": 543,

-       "ypos": 227,

-       "width": 56,

-       "height": 15,

+       "xpos": 602,

+       "ypos": 441,

+       "width": 72,

+       "height": 25,

        "type": "match"

      }

    ],

    "properties": [],

    "tags": [

-     "gnome_button_credits"

+     "gnome_uninstall_button"

    ]

- }

+ } 

\ No newline at end of file

empty or binary file added
@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 481,

+       "ypos": 321,

+       "width": 62,

+       "height": 64,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_about"

+   ]

+ } 

\ No newline at end of file

empty or binary file added
@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 94,

+       "ypos": 510,

+       "width": 140,

+       "height": 24,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_application_amarok"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 393,

+       "ypos": 613,

+       "width": 181,

+       "height": 29,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_application_chess"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 398,

+       "ypos": 498,

+       "width": 121,

+       "height": 25,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_application_clocks"

+   ]

+ } 

\ No newline at end of file

needles/gnome/apps/software/software_automatic_disabled.json needles/gnome/apps/evince/evince_search_button-20220219.json
file renamed
+5 -5
@@ -1,15 +1,15 @@ 

  {

    "area": [

      {

-       "xpos": 897,

-       "width": 26,

+       "width": 511,

        "type": "match",

-       "ypos": 42,

-       "height": 24

+       "xpos": 265,

+       "ypos": 411,

+       "height": 25

      }

    ],

    "properties": [],

    "tags": [

-     "evince_search_button"

+     "software_automatic_disabled"

    ]

  } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "ypos": 411,

+       "height": 23,

+       "xpos": 264,

+       "width": 129,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_automatic_updates"

+   ]

+ } 

\ No newline at end of file

needles/gnome/apps/software/software_back_button.json needles/gnome/apps/evince/evince_search_button.json
file renamed
+5 -5
@@ -1,15 +1,15 @@ 

  {

    "area": [

      {

-       "xpos": 897,

        "type": "match",

-       "ypos": 42,

-       "width": 26,

-       "height": 24

+       "width": 24,

+       "xpos": 13,

+       "height": 20,

+       "ypos": 45

      }

    ],

    "properties": [],

    "tags": [

-     "evince_search_button"

+     "software_back_button"

    ]

  } 

\ No newline at end of file

empty or binary file added
@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 209,

+       "ypos": 478,

+       "width": 61,

+       "height": 22,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_category_create"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 503,

+       "ypos": 560,

+       "width": 58,

+       "height": 24,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_category_learn"

+   ]

+ } 

\ No newline at end of file

empty or binary file added
needles/gnome/apps/software/software_category_play.json needles/gnome/apps/weather/weather_report_hourly_later.json
file renamed
+14 -14
@@ -1,15 +1,15 @@ 

- {

-   "area": [

-     {

-       "xpos": 707,

-       "ypos": 221,

-       "width": 45,

-       "height": 21,

-       "type": "match"

-     }

-   ],

-   "properties": [],

-   "tags": [

-     "weather_report_hourly"

-   ]

+ {

+   "area": [

+     {

+       "xpos": 803,

+       "ypos": 478,

+       "width": 45,

+       "height": 22,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_category_play"

+   ]

  } 

\ No newline at end of file

empty or binary file added
@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 505,

+       "ypos": 473,

+       "width": 58,

+       "height": 29,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_category_work"

+   ]

+ } 

\ No newline at end of file

empty or binary file added
@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "width": 160,

+       "type": "match",

+       "xpos": 338,

+       "ypos": 201,

+       "height": 20

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_credits"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 422,

+       "ypos": 461,

+       "height": 20,

+       "width": 160,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_credits"

+   ]

+ } 

\ No newline at end of file

empty or binary file added
@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 97,

+       "ypos": 726,

+       "width": 349,

+       "height": 23,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_description_amarok"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 98,

+       "ypos": 723,

+       "width": 255,

+       "height": 23,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_description_chess"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 98,

+       "ypos": 726,

+       "width": 252,

+       "height": 26,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_description_clocks"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 148,

+       "ypos": 641,

+       "width": 107,

+       "height": 70,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_download_size_amarok"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 144,

+       "ypos": 634,

+       "width": 114,

+       "height": 76,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_download_size_chess"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 154,

+       "ypos": 640,

+       "width": 96,

+       "height": 70,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_download_size_clocks"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 248,

+       "ypos": 164,

+       "width": 149,

+       "height": 27,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_emacs-found"

+   ]

+ } 

\ No newline at end of file

empty or binary file added
@@ -0,0 +1,22 @@ 

+ {

+   "area": [

+     {

+       "xpos": 248,

+       "ypos": 165,

+       "width": 147,

+       "height": 24,

+       "type": "match"

+     },

+     {

+       "xpos": 700,

+       "ypos": 183,

+       "width": 80,

+       "height": 27,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_emacs-found_installed"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 121,

+       "ypos": 134,

+       "width": 281,

+       "height": 42,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_emacs-install_pane"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "height": 30,

+       "width": 537,

+       "type": "match",

+       "ypos": 602,

+       "xpos": 249

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_emacs-listed"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 249,

+       "ypos": 695,

+       "type": "match",

+       "height": 30,

+       "width": 537

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_emacs-listed"

+   ]

+ } 

\ No newline at end of file

empty or binary file added
@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 238,

+       "ypos": 163,

+       "width": 120,

+       "height": 26,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_gvim-found"

+   ]

+ } 

\ No newline at end of file

empty or binary file added
@@ -0,0 +1,22 @@ 

+ {

+   "area": [

+     {

+       "xpos": 242,

+       "ypos": 168,

+       "width": 118,

+       "height": 21,

+       "type": "match"

+     },

+     {

+       "xpos": 702,

+       "ypos": 185,

+       "width": 77,

+       "height": 24,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_gvim-found_installed"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 113,

+       "ypos": 116,

+       "width": 210,

+       "height": 58,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_gvim-install_pane"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 242,

+       "ypos": 232,

+       "width": 548,

+       "height": 26,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_gvim-listed"

+   ]

+ } 

\ No newline at end of file

empty or binary file added
@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 246,

+       "ypos": 166,

+       "width": 128,

+       "height": 24,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_inkscape-found"

+   ]

+ } 

\ No newline at end of file

empty or binary file added
@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 312,

+       "ypos": 170,

+       "width": 468,

+       "height": 40,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_inkscape-found_installed"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "height": 43,

+       "width": 245,

+       "xpos": 123,

+       "type": "match",

+       "ypos": 120

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_inkscape-install_pane"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 122,

+       "ypos": 120,

+       "height": 43,

+       "width": 245,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_inkscape-install_pane"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 123,

+       "ypos": 131,

+       "width": 245,

+       "height": 43,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_inkscape-install_pane"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 245,

+       "ypos": 508,

+       "height": 31,

+       "type": "match",

+       "width": 547

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_inkscape-listed"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 245,

+       "ypos": 322,

+       "width": 547,

+       "height": 31,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_inkscape-listed"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "width": 92,

+       "type": "match",

+       "xpos": 463,

+       "ypos": 40,

+       "height": 27

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_installed_button"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "ypos": 41,

+       "height": 27,

+       "xpos": 463,

+       "type": "match",

+       "width": 92

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_installed_button"

+   ]

+ } 

\ No newline at end of file

needles/gnome/apps/software/software_installed_button_active.json needles/gnome/apps/weather/weather_report_hourly_later-20220820.json
file renamed
+4 -4
@@ -1,15 +1,15 @@ 

  {

    "area": [

      {

-       "xpos": 403,

+       "width": 85,

        "height": 21,

-       "ypos": 221,

        "type": "match",

-       "width": 45

+       "ypos": 44,

+       "xpos": 470

      }

    ],

    "properties": [],

    "tags": [

-     "weather_report_hourly"

+     "software_installed_button"

    ]

  } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 99,

+       "ypos": 103,

+       "width": 128,

+       "height": 131,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_logo_amarok"

+   ]

+ } 

\ No newline at end of file

empty or binary file added
@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 109,

+       "ypos": 109,

+       "width": 101,

+       "height": 117,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_logo_chess"

+   ]

+ } 

\ No newline at end of file

empty or binary file added
@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 106,

+       "ypos": 109,

+       "width": 118,

+       "height": 119,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_logo_clocks"

+   ]

+ } 

\ No newline at end of file

empty or binary file added
@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "type": "match",

+       "height": 40,

+       "xpos": 241,

+       "ypos": 165,

+       "width": 545

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_mahjongg-found"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "type": "match",

+       "ypos": 158,

+       "height": 40,

+       "xpos": 241,

+       "width": 545

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_mahjongg-found"

+   ]

+ } 

\ No newline at end of file

needles/gnome/apps/software/software_mahjongg-found-20230322.json needles/gnome/apps/evince/evince_search_button-20210916.json
file renamed
+4 -4
@@ -1,15 +1,15 @@ 

  {

    "area": [

      {

-       "width": 26,

+       "width": 211,

        "type": "match",

-       "ypos": 42,

+       "ypos": 165,

        "height": 24,

-       "xpos": 897

+       "xpos": 235

      }

    ],

    "properties": [],

    "tags": [

-     "evince_search_button"

+     "software_mahjongg-found"

    ]

  } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "type": "match",

+       "width": 545,

+       "height": 37,

+       "ypos": 165,

+       "xpos": 240

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_mahjongg-found"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "xpos": 243,

+       "ypos": 168,

+       "width": 545,

+       "height": 40,

+       "type": "match"

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_mahjongg-found"

+   ]

+ } 

\ No newline at end of file

empty or binary file added
@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "ypos": 160,

+       "type": "match",

+       "xpos": 241,

+       "width": 546,

+       "height": 42

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_mahjongg-found_installed"

+   ]

+ } 

\ No newline at end of file

@@ -0,0 +1,15 @@ 

+ {

+   "area": [

+     {

+       "type": "match",

+       "width": 546,

+       "xpos": 239,

+       "height": 42,

+       "ypos": 163

+     }

+   ],

+   "properties": [],

+   "tags": [

+     "software_mahjongg-found_installed"

+   ]

+ } 

\ No newline at end of file