Simplify icon handling a bit.

When implementing bug 765359, it appears that Geary is doing too much
work to load icons. Simplify it a bit.

* src/client/components/icon-factory.vala (IconFactory): Don't bother
  loading an application icon, it's easier and works better to just use
  an icon name where needed. Don't bother adding all of the icons/*x*
  directories to the icon theme search path, just make the icon's
  directory hierarchy follow the XDG/hicolor spec and add the base
  directory. Remove now-redundant code.

* src/client/application/geary-controller.vala: Set the default icon name
  for all geary windows.
  (GearyController:on_about()): Set the name for the icon in the About
  dialog.

* src/client/components/main-window.vala (ApplicationWindow): Don't
  bother loading icons for the window, just use the new default.

* src/client/notification/libnotify.vala: Don't bother passing the
  application icon through for error notifications, an icon name has
  already been set.

* icons/*x*/geary.png: Move to a new directory hierarchy that follows the
  hicolor spec.

* icons/CMakeLists.txt: Updated to use new paths to the icons.
This commit is contained in:
Michael James Gratton 2016-04-27 11:56:25 +10:00 committed by Adam Dingle
parent 38d628e49f
commit d33e3e7229
12 changed files with 25 additions and 64 deletions

View file

@ -27,13 +27,13 @@ set(ICON_FILES
install(FILES ${ICON_FILES} DESTINATION ${ICONS_DEST})
# Application icon goes in theme directory
install(FILES "16x16/geary.png" DESTINATION share/icons/hicolor/16x16/apps)
install(FILES "24x24/geary.png" DESTINATION share/icons/hicolor/24x24/apps)
install(FILES "32x32/geary.png" DESTINATION share/icons/hicolor/32x32/apps)
install(FILES "48x48/geary.png" DESTINATION share/icons/hicolor/48x48/apps)
install(FILES "256x256/geary.png" DESTINATION share/icons/hicolor/256x256/apps)
install(FILES "512x512/geary.png" DESTINATION share/icons/hicolor/512x512/apps)
install(FILES "geary-symbolic.svg" DESTINATION share/icons/hicolor/symbolic/apps)
install(FILES "hicolor/16x16/apps/geary.png" DESTINATION share/icons/hicolor/16x16/apps)
install(FILES "hicolor/24x24/apps/geary.png" DESTINATION share/icons/hicolor/24x24/apps)
install(FILES "hicolor/32x32/apps/geary.png" DESTINATION share/icons/hicolor/32x32/apps)
install(FILES "hicolor/48x48/apps/geary.png" DESTINATION share/icons/hicolor/48x48/apps)
install(FILES "hicolor/256x256/apps/geary.png" DESTINATION share/icons/hicolor/256x256/apps)
install(FILES "hicolor/512x512/apps/geary.png" DESTINATION share/icons/hicolor/512x512/apps)
install(FILES "hicolor/symbolic/apps/geary-symbolic.svg" DESTINATION share/icons/hicolor/symbolic/apps)
# Optional: update icon cache at install time.
if (ICON_UPDATE)

View file

Before

Width:  |  Height:  |  Size: 742 B

After

Width:  |  Height:  |  Size: 742 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

Before After
Before After

View file

@ -174,10 +174,14 @@ public class GearyController : Geary.BaseObject {
* Starts the controller and brings up Geary.
*/
public async void open_async() {
// This initializes the IconFactory, important to do before the actions are created (as they
// refer to some of Geary's custom icons)
// This initializes the IconFactory, important to do before
// the actions are created (as they refer to some of Geary's
// custom icons)
IconFactory.instance.init();
// Ensure all geary windows have an icon
Gtk.Window.set_default_icon_name("geary");
// Setup actions.
setup_actions();
GearyApplication.instance.load_ui_resource("accelerators.ui");
@ -1709,6 +1713,7 @@ public class GearyController : Geary.BaseObject {
"authors", GearyApplication.AUTHORS,
"copyright", GearyApplication.COPYRIGHT,
"license-type", Gtk.License.LGPL_2_1,
"logo-icon-name", "geary",
"version", GearyApplication.VERSION,
"website", GearyApplication.WEBSITE,
"website-label", GearyApplication.WEBSITE_LABEL,
@ -1718,7 +1723,7 @@ public class GearyController : Geary.BaseObject {
"translator-credits", _("translator-credits")
);
}
private void on_donate() {
try {
Gtk.show_uri(null, GearyApplication.DONATE, Gdk.CURRENT_TIME);

View file

@ -20,10 +20,7 @@ public class IconFactory {
private set { _instance = value; }
}
public const int APPLICATION_ICON_SIZE = 128;
public Gdk.Pixbuf application_icon { get; private set; }
public const int UNREAD_ICON_SIZE = 16;
public const int STAR_ICON_SIZE = 16;
@ -33,19 +30,11 @@ public class IconFactory {
// Creates the icon factory.
private IconFactory() {
icon_theme = Gtk.IconTheme.get_default();
icons_dir = GearyApplication.instance.get_resource_directory().get_child("icons");
append_icons_search_path(null);
append_icons_search_path("128x128");
append_icons_search_path("48x48");
append_icons_search_path("24x24");
append_icons_search_path("16x16");
// Load icons here.
application_icon = load("geary", APPLICATION_ICON_SIZE);
icon_theme = Gtk.IconTheme.get_default();
icon_theme.append_search_path(icons_dir.get_path());
}
public void init() {
// perform any additional initialization here; at this time, everything is done in the
// constructor
@ -79,32 +68,7 @@ public class IconFactory {
return new FileIcon(icon_file);
}
private void append_icons_search_path(string? name) {
if (Geary.String.is_empty(name))
icon_theme.append_search_path(icons_dir.get_path());
else
icon_theme.append_search_path(icons_dir.get_child(name).get_path());
}
private Gdk.Pixbuf? load(string icon_name, int size, Gtk.IconLookupFlags flags = 0) {
// Try looking up IconInfo (to report path in case of error) then load image
Gtk.IconInfo? icon_info = icon_theme.lookup_icon(icon_name, size, flags);
if (icon_info != null) {
try {
return icon_info.load_icon();
} catch (Error err) {
warning("Couldn't load icon %s at %s, falling back to image-missing: %s", icon_name,
icon_info.get_filename(), err.message);
}
} else {
debug("Unable to lookup icon %s, falling back to image-missing...", icon_name);
}
// Default: missing image icon.
return get_missing_icon(size, flags);
}
// Attempts to load and return the missing image icon.
private Gdk.Pixbuf? get_missing_icon(int size, Gtk.IconLookupFlags flags = 0) {
try {

View file

@ -63,14 +63,7 @@ public class MainWindow : Gtk.ApplicationWindow {
spinner.set_progress_monitor(progress_monitor);
progress_monitor.add(conversation_list_store.preview_monitor);
GLib.List<Gdk.Pixbuf> pixbuf_list = new GLib.List<Gdk.Pixbuf>();
pixbuf_list.append(IconFactory.instance.application_icon);
// Use copy() because set_default_icon_list() actually accepts an owned reference
// If we didn't hold the pixbufs in memory, would need to use copy_deep()
// See https://mail.gnome.org/archives/vala-list/2014-August/msg00022.html
set_default_icon_list(pixbuf_list.copy());
delete_event.connect(on_delete_event);
key_press_event.connect(on_key_press_event);
key_release_event.connect(on_key_release_event);

View file

@ -196,11 +196,10 @@ public class Libnotify : Geary.BaseObject {
// but it means in the future, a more robust system will be needed.)
if (error_notification != null)
return;
error_notification = issue_notification("email", summary, body,
IconFactory.instance.application_icon, null);
error_notification = issue_notification("email", summary, body, null, null);
}
public void clear_error_notification() {
if (error_notification != null) {
try {