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.
|
|
@ -27,13 +27,13 @@ set(ICON_FILES
|
||||||
install(FILES ${ICON_FILES} DESTINATION ${ICONS_DEST})
|
install(FILES ${ICON_FILES} DESTINATION ${ICONS_DEST})
|
||||||
|
|
||||||
# Application icon goes in theme directory
|
# Application icon goes in theme directory
|
||||||
install(FILES "16x16/geary.png" DESTINATION share/icons/hicolor/16x16/apps)
|
install(FILES "hicolor/16x16/apps/geary.png" DESTINATION share/icons/hicolor/16x16/apps)
|
||||||
install(FILES "24x24/geary.png" DESTINATION share/icons/hicolor/24x24/apps)
|
install(FILES "hicolor/24x24/apps/geary.png" DESTINATION share/icons/hicolor/24x24/apps)
|
||||||
install(FILES "32x32/geary.png" DESTINATION share/icons/hicolor/32x32/apps)
|
install(FILES "hicolor/32x32/apps/geary.png" DESTINATION share/icons/hicolor/32x32/apps)
|
||||||
install(FILES "48x48/geary.png" DESTINATION share/icons/hicolor/48x48/apps)
|
install(FILES "hicolor/48x48/apps/geary.png" DESTINATION share/icons/hicolor/48x48/apps)
|
||||||
install(FILES "256x256/geary.png" DESTINATION share/icons/hicolor/256x256/apps)
|
install(FILES "hicolor/256x256/apps/geary.png" DESTINATION share/icons/hicolor/256x256/apps)
|
||||||
install(FILES "512x512/geary.png" DESTINATION share/icons/hicolor/512x512/apps)
|
install(FILES "hicolor/512x512/apps/geary.png" DESTINATION share/icons/hicolor/512x512/apps)
|
||||||
install(FILES "geary-symbolic.svg" DESTINATION share/icons/hicolor/symbolic/apps)
|
install(FILES "hicolor/symbolic/apps/geary-symbolic.svg" DESTINATION share/icons/hicolor/symbolic/apps)
|
||||||
|
|
||||||
# Optional: update icon cache at install time.
|
# Optional: update icon cache at install time.
|
||||||
if (ICON_UPDATE)
|
if (ICON_UPDATE)
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 742 B After Width: | Height: | Size: 742 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 9.8 KiB |
|
|
@ -174,10 +174,14 @@ public class GearyController : Geary.BaseObject {
|
||||||
* Starts the controller and brings up Geary.
|
* Starts the controller and brings up Geary.
|
||||||
*/
|
*/
|
||||||
public async void open_async() {
|
public async void open_async() {
|
||||||
// This initializes the IconFactory, important to do before the actions are created (as they
|
// This initializes the IconFactory, important to do before
|
||||||
// refer to some of Geary's custom icons)
|
// the actions are created (as they refer to some of Geary's
|
||||||
|
// custom icons)
|
||||||
IconFactory.instance.init();
|
IconFactory.instance.init();
|
||||||
|
|
||||||
|
// Ensure all geary windows have an icon
|
||||||
|
Gtk.Window.set_default_icon_name("geary");
|
||||||
|
|
||||||
// Setup actions.
|
// Setup actions.
|
||||||
setup_actions();
|
setup_actions();
|
||||||
GearyApplication.instance.load_ui_resource("accelerators.ui");
|
GearyApplication.instance.load_ui_resource("accelerators.ui");
|
||||||
|
|
@ -1709,6 +1713,7 @@ public class GearyController : Geary.BaseObject {
|
||||||
"authors", GearyApplication.AUTHORS,
|
"authors", GearyApplication.AUTHORS,
|
||||||
"copyright", GearyApplication.COPYRIGHT,
|
"copyright", GearyApplication.COPYRIGHT,
|
||||||
"license-type", Gtk.License.LGPL_2_1,
|
"license-type", Gtk.License.LGPL_2_1,
|
||||||
|
"logo-icon-name", "geary",
|
||||||
"version", GearyApplication.VERSION,
|
"version", GearyApplication.VERSION,
|
||||||
"website", GearyApplication.WEBSITE,
|
"website", GearyApplication.WEBSITE,
|
||||||
"website-label", GearyApplication.WEBSITE_LABEL,
|
"website-label", GearyApplication.WEBSITE_LABEL,
|
||||||
|
|
|
||||||
|
|
@ -21,9 +21,6 @@ public class IconFactory {
|
||||||
private set { _instance = value; }
|
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 UNREAD_ICON_SIZE = 16;
|
||||||
public const int STAR_ICON_SIZE = 16;
|
public const int STAR_ICON_SIZE = 16;
|
||||||
|
|
||||||
|
|
@ -33,17 +30,9 @@ public class IconFactory {
|
||||||
|
|
||||||
// Creates the icon factory.
|
// Creates the icon factory.
|
||||||
private IconFactory() {
|
private IconFactory() {
|
||||||
icon_theme = Gtk.IconTheme.get_default();
|
|
||||||
icons_dir = GearyApplication.instance.get_resource_directory().get_child("icons");
|
icons_dir = GearyApplication.instance.get_resource_directory().get_child("icons");
|
||||||
|
icon_theme = Gtk.IconTheme.get_default();
|
||||||
append_icons_search_path(null);
|
icon_theme.append_search_path(icons_dir.get_path());
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void init() {
|
public void init() {
|
||||||
|
|
@ -80,31 +69,6 @@ public class IconFactory {
|
||||||
return new FileIcon(icon_file);
|
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.
|
// Attempts to load and return the missing image icon.
|
||||||
private Gdk.Pixbuf? get_missing_icon(int size, Gtk.IconLookupFlags flags = 0) {
|
private Gdk.Pixbuf? get_missing_icon(int size, Gtk.IconLookupFlags flags = 0) {
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -64,13 +64,6 @@ public class MainWindow : Gtk.ApplicationWindow {
|
||||||
spinner.set_progress_monitor(progress_monitor);
|
spinner.set_progress_monitor(progress_monitor);
|
||||||
progress_monitor.add(conversation_list_store.preview_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);
|
delete_event.connect(on_delete_event);
|
||||||
key_press_event.connect(on_key_press_event);
|
key_press_event.connect(on_key_press_event);
|
||||||
key_release_event.connect(on_key_release_event);
|
key_release_event.connect(on_key_release_event);
|
||||||
|
|
|
||||||
|
|
@ -197,8 +197,7 @@ public class Libnotify : Geary.BaseObject {
|
||||||
if (error_notification != null)
|
if (error_notification != null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
error_notification = issue_notification("email", summary, body,
|
error_notification = issue_notification("email", summary, body, null, null);
|
||||||
IconFactory.instance.application_icon, null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clear_error_notification() {
|
public void clear_error_notification() {
|
||||||
|
|
|
||||||