diff options
author | Marvin W <git@larma.de> | 2018-01-12 21:03:09 +0100 |
---|---|---|
committer | fiaxh <git@mx.ax.lt> | 2018-01-28 00:38:47 +0100 |
commit | 782ae4c049e2b6fab13d7453cbb0e74610e7d200 (patch) | |
tree | 1b4cd0a1689cee0c2e2cac2ae9a5fb8ebbe63621 /main | |
parent | d46d071e57e599e8cfb1780597cbecb36881c4d8 (diff) | |
download | dino-782ae4c049e2b6fab13d7453cbb0e74610e7d200.tar.gz dino-782ae4c049e2b6fab13d7453cbb0e74610e7d200.zip |
Move Jid class to xmpp-vala, partially refactor namespace
Diffstat (limited to 'main')
29 files changed, 72 insertions, 45 deletions
diff --git a/main/src/ui/add_conversation/add_conference_dialog.vala b/main/src/ui/add_conversation/add_conference_dialog.vala index d840ff2a..f6597505 100644 --- a/main/src/ui/add_conversation/add_conference_dialog.vala +++ b/main/src/ui/add_conversation/add_conference_dialog.vala @@ -2,6 +2,7 @@ using Gee; using Gtk; using Dino.Entities; +using Xmpp; namespace Dino.Ui { @@ -122,7 +123,7 @@ public class AddConferenceDialog : Gtk.Dialog { ConferenceListRow? conference_row = conference_list.get_selected_row() as ConferenceListRow; if (conference_row != null) { details_fragment.account = conference_row.account; - details_fragment.jid = conference_row.bookmark.jid; + details_fragment.jid = conference_row.bookmark.jid.to_string(); details_fragment.nick = conference_row.bookmark.nick; if (conference_row.bookmark.password != null) details_fragment.password = conference_row.bookmark.password; ok_button.grab_focus(); diff --git a/main/src/ui/add_conversation/add_contact_dialog.vala b/main/src/ui/add_conversation/add_contact_dialog.vala index decc588d..33f6fa72 100644 --- a/main/src/ui/add_conversation/add_contact_dialog.vala +++ b/main/src/ui/add_conversation/add_contact_dialog.vala @@ -2,6 +2,7 @@ using Gee; using Gtk; using Dino.Entities; +using Xmpp; namespace Dino.Ui { diff --git a/main/src/ui/add_conversation/add_groupchat_dialog.vala b/main/src/ui/add_conversation/add_groupchat_dialog.vala index 2ecc9e19..53359813 100644 --- a/main/src/ui/add_conversation/add_groupchat_dialog.vala +++ b/main/src/ui/add_conversation/add_groupchat_dialog.vala @@ -2,6 +2,7 @@ using Gee; using Gtk; using Dino.Entities; +using Xmpp; namespace Dino.Ui { @@ -43,7 +44,7 @@ protected class AddGroupchatDialog : Gtk.Dialog { accounts_stack.set_visible_child_name("label"); account_label.label = account.bare_jid.to_string(); account_combobox.selected = account; - jid_entry.text = conference.jid; + jid_entry.text = conference.jid.to_string(); nick_entry.text = conference.nick ?? ""; alias_entry.text = conference.name; } @@ -64,7 +65,7 @@ protected class AddGroupchatDialog : Gtk.Dialog { } private void on_ok_button_clicked() { - Xmpp.Xep.Bookmarks.Conference conference = new Xmpp.Xep.Bookmarks.Conference(jid_entry.text); + Xmpp.Xep.Bookmarks.Conference conference = new Xmpp.Xep.Bookmarks.Conference(Jid.parse(jid_entry.text)); conference.nick = nick_entry.text != "" ? nick_entry.text : null; conference.name = alias_entry.text; if (edit_conference == null) { diff --git a/main/src/ui/add_conversation/conference_details_fragment.vala b/main/src/ui/add_conversation/conference_details_fragment.vala index 5efcb593..964bb059 100644 --- a/main/src/ui/add_conversation/conference_details_fragment.vala +++ b/main/src/ui/add_conversation/conference_details_fragment.vala @@ -2,6 +2,7 @@ using Gdk; using Gtk; using Dino.Entities; +using Xmpp; namespace Dino.Ui { diff --git a/main/src/ui/add_conversation/conference_list.vala b/main/src/ui/add_conversation/conference_list.vala index 8338558c..dfe80a66 100644 --- a/main/src/ui/add_conversation/conference_list.vala +++ b/main/src/ui/add_conversation/conference_list.vala @@ -39,8 +39,12 @@ protected class ConferenceList : FilterableList { } } - private void on_conference_bookmarks_received(Core.XmppStream stream, Account account, Gee.List<Xep.Bookmarks.Conference> conferences) { - lists[account] = conferences; + private void on_conference_bookmarks_received(XmppStream stream, Account account, Gee.List<Xep.Bookmarks.Conference>? conferences) { + if (conferences == null) { + lists.unset(account); + } else { + lists[account] = conferences; + } refresh_conferences(); } @@ -77,15 +81,15 @@ internal class ConferenceListRow : ListRow { public Xep.Bookmarks.Conference bookmark; public ConferenceListRow(StreamInteractor stream_interactor, Xep.Bookmarks.Conference bookmark, Account account) { - this.jid = new Jid(bookmark.jid); + this.jid = bookmark.jid; this.account = account; this.bookmark = bookmark; - name_label.label = bookmark.name ?? bookmark.jid; + name_label.label = bookmark.name ?? bookmark.jid.to_string(); if (stream_interactor.get_accounts().size > 1) { via_label.label = "via " + account.bare_jid.to_string(); - } else if (bookmark.name != null && bookmark.name != bookmark.jid) { - via_label.label = bookmark.jid; + } else if (bookmark.name != null && bookmark.name != bookmark.jid.to_string()) { + via_label.label = bookmark.jid.to_string(); } else { via_label.visible = false; } diff --git a/main/src/ui/add_conversation/list_row.vala b/main/src/ui/add_conversation/list_row.vala index 958445b7..ffc1802b 100644 --- a/main/src/ui/add_conversation/list_row.vala +++ b/main/src/ui/add_conversation/list_row.vala @@ -2,6 +2,7 @@ using Gee; using Gtk; using Dino.Entities; +using Xmpp; namespace Dino.Ui { diff --git a/main/src/ui/add_conversation/roster_list.vala b/main/src/ui/add_conversation/roster_list.vala index 3107dc47..fd4d4ade 100644 --- a/main/src/ui/add_conversation/roster_list.vala +++ b/main/src/ui/add_conversation/roster_list.vala @@ -49,7 +49,7 @@ protected class RosterList : FilterableList { private void on_updated_roster_item(Account account, Jid jid, Roster.Item roster_item) { on_removed_roster_item(account, jid, roster_item); - ListRow row = new ListRow.from_jid(stream_interactor, new Jid(roster_item.jid), account, accounts.size > 1); + ListRow row = new ListRow.from_jid(stream_interactor, roster_item.jid, account, accounts.size > 1); rows[account][jid] = row; add(row); invalidate_sort(); @@ -59,7 +59,7 @@ protected class RosterList : FilterableList { private void fetch_roster_items(Account account) { rows[account] = new HashMap<Jid, ListRow>(Jid.hash_func, Jid.equals_func); foreach (Roster.Item roster_item in stream_interactor.get_module(RosterManager.IDENTITY).get_roster(account)) { - on_updated_roster_item(account, new Jid(roster_item.jid), roster_item); + on_updated_roster_item(account, roster_item.jid, roster_item); } } diff --git a/main/src/ui/add_conversation/select_contact_dialog.vala b/main/src/ui/add_conversation/select_contact_dialog.vala index b05762ec..80b7f09b 100644 --- a/main/src/ui/add_conversation/select_contact_dialog.vala +++ b/main/src/ui/add_conversation/select_contact_dialog.vala @@ -3,6 +3,7 @@ using Gdk; using Gtk; using Dino.Entities; +using Xmpp; namespace Dino.Ui { diff --git a/main/src/ui/add_conversation/select_jid_fragment.vala b/main/src/ui/add_conversation/select_jid_fragment.vala index e6f45ba1..aca0a937 100644 --- a/main/src/ui/add_conversation/select_jid_fragment.vala +++ b/main/src/ui/add_conversation/select_jid_fragment.vala @@ -2,6 +2,7 @@ using Gee; using Gtk; using Dino.Entities; +using Xmpp; namespace Dino.Ui { diff --git a/main/src/ui/application.vala b/main/src/ui/application.vala index 3ebe3cff..81cb184a 100644 --- a/main/src/ui/application.vala +++ b/main/src/ui/application.vala @@ -2,6 +2,7 @@ using Gtk; using Dino.Entities; using Dino.Ui; +using Xmpp; public class Dino.Ui.Application : Gtk.Application, Dino.Application { private Notifications notifications; diff --git a/main/src/ui/avatar_generator.vala b/main/src/ui/avatar_generator.vala index dce8e3d6..b89fed21 100644 --- a/main/src/ui/avatar_generator.vala +++ b/main/src/ui/avatar_generator.vala @@ -4,6 +4,7 @@ using Gdk; using Gtk; using Dino.Entities; +using Xmpp; namespace Dino.Ui { @@ -109,7 +110,7 @@ public class AvatarGenerator { } private Pixbuf draw_groupchat_tile(Jid jid, Account account, int width, int height) { - ArrayList<Jid>? occupants = stream_interactor.get_module(MucManager.IDENTITY).get_other_occupants(jid, account); + Gee.List<Jid>? occupants = stream_interactor.get_module(MucManager.IDENTITY).get_other_occupants(jid, account); if (stateless || occupants == null || occupants.size == 0) { return draw_chat_tile(jid, account, width, height); } diff --git a/main/src/ui/chat_input/encryption_button.vala b/main/src/ui/chat_input/encryption_button.vala index 5fdcdaf7..439c8ebd 100644 --- a/main/src/ui/chat_input/encryption_button.vala +++ b/main/src/ui/chat_input/encryption_button.vala @@ -10,6 +10,7 @@ public class EncryptionButton : MenuButton { private Conversation? conversation; private RadioButton? button_unencrypted; private Map<RadioButton, Plugins.EncryptionListEntry> encryption_radios = new HashMap<RadioButton, Plugins.EncryptionListEntry>(); + private string? current_icon; public EncryptionButton() { relief = ReliefStyle.NONE; @@ -56,14 +57,17 @@ public class EncryptionButton : MenuButton { } } - private void update_encryption_menu_icon() { - if (conversation.encryption == Encryption.NONE) { - set_image(new Image.from_icon_name("changes-allow-symbolic", IconSize.BUTTON)); - } else { - set_image(new Image.from_icon_name("changes-prevent-symbolic", IconSize.BUTTON)); + private void set_icon(string icon) { + if (icon != current_icon) { + image = new Image.from_icon_name(icon, IconSize.BUTTON); + current_icon = icon; } } + private void update_encryption_menu_icon() { + set_icon(conversation.encryption == Encryption.NONE ? "changes-allow-symbolic" : "changes-prevent-symbolic"); + } + public new void set_conversation(Conversation conversation) { this.conversation = conversation; update_encryption_menu_state(); diff --git a/main/src/ui/chat_input/occupants_tab_completer.vala b/main/src/ui/chat_input/occupants_tab_completer.vala index 2f35bf0d..b9f5cd45 100644 --- a/main/src/ui/chat_input/occupants_tab_completer.vala +++ b/main/src/ui/chat_input/occupants_tab_completer.vala @@ -3,6 +3,7 @@ using Gee; using Gtk; using Dino.Entities; +using Xmpp; namespace Dino.Ui.ChatInput { diff --git a/main/src/ui/chat_input/view.vala b/main/src/ui/chat_input/view.vala index 007e5379..ec551647 100644 --- a/main/src/ui/chat_input/view.vala +++ b/main/src/ui/chat_input/view.vala @@ -84,8 +84,8 @@ public class View : Box { stream_interactor.get_module(MucManager.IDENTITY).change_nick(conversation.account, conversation.counterpart, token[1]); return; case "/ping": - Xmpp.Core.XmppStream? stream = stream_interactor.get_stream(conversation.account); - stream.get_module(Xmpp.Xep.Ping.Module.IDENTITY).send_ping(stream, conversation.counterpart.to_string() + "/" + token[1], null); + Xmpp.XmppStream? stream = stream_interactor.get_stream(conversation.account); + stream.get_module(Xmpp.Xep.Ping.Module.IDENTITY).send_ping(stream, conversation.counterpart.with_resource(token[1]), null); return; case "/topic": stream_interactor.get_module(MucManager.IDENTITY).change_subject(conversation.account, conversation.counterpart, token[1]); diff --git a/main/src/ui/contact_details/muc_config_form_provider.vala b/main/src/ui/contact_details/muc_config_form_provider.vala index 8340740a..072627bf 100644 --- a/main/src/ui/contact_details/muc_config_form_provider.vala +++ b/main/src/ui/contact_details/muc_config_form_provider.vala @@ -17,7 +17,7 @@ public class MucConfigFormProvider : Plugins.ContactDetailsProvider, Object { public void populate(Conversation conversation, Plugins.ContactDetails contact_details, Plugins.WidgetType type) { if (type != Plugins.WidgetType.GTK) return; if (conversation.type_ == Conversation.Type.GROUPCHAT) { - Xmpp.Core.XmppStream? stream = stream_interactor.get_stream(conversation.account); + Xmpp.XmppStream? stream = stream_interactor.get_stream(conversation.account); if (stream == null) return; stream_interactor.get_module(MucManager.IDENTITY).get_config_form(conversation.account, conversation.counterpart, (jid, data_form) => { contact_details.save.connect(() => { data_form.submit(); }); diff --git a/main/src/ui/conversation_selector/chat_row.vala b/main/src/ui/conversation_selector/chat_row.vala index 692ad1a5..fb427413 100644 --- a/main/src/ui/conversation_selector/chat_row.vala +++ b/main/src/ui/conversation_selector/chat_row.vala @@ -3,6 +3,7 @@ using Gee; using Gtk; using Dino.Entities; +using Xmpp; namespace Dino.Ui.ConversationSelector { @@ -18,7 +19,6 @@ public class ChatRow : ConversationRow { stream_interactor.get_module(RosterManager.IDENTITY).updated_roster_item.connect((account, jid, roster_item) => { if (conversation.account.equals(account) && conversation.counterpart.equals(jid)) { update_name_label(); - update_avatar(); } }); } @@ -41,7 +41,7 @@ public class ChatRow : ConversationRow { jid_label.label = conversation.counterpart.to_string(); - ArrayList<Jid>? full_jids = stream_interactor.get_module(PresenceManager.IDENTITY).get_full_jids(conversation.counterpart, conversation.account); + Gee.List<Jid>? full_jids = stream_interactor.get_module(PresenceManager.IDENTITY).get_full_jids(conversation.counterpart, conversation.account); if (full_jids != null) { for (int i = 0; i < full_jids.size; i++) { inner_box.add(get_fulljid_box(full_jids[i])); diff --git a/main/src/ui/conversation_selector/conversation_row.vala b/main/src/ui/conversation_selector/conversation_row.vala index 45e7277a..450ae570 100644 --- a/main/src/ui/conversation_selector/conversation_row.vala +++ b/main/src/ui/conversation_selector/conversation_row.vala @@ -4,6 +4,7 @@ using Gtk; using Pango; using Dino.Entities; +using Xmpp; namespace Dino.Ui.ConversationSelector { diff --git a/main/src/ui/conversation_selector/groupchat_pm_row.vala b/main/src/ui/conversation_selector/groupchat_pm_row.vala index 00898f0c..795bdcb6 100644 --- a/main/src/ui/conversation_selector/groupchat_pm_row.vala +++ b/main/src/ui/conversation_selector/groupchat_pm_row.vala @@ -15,7 +15,6 @@ public class GroupchatPmRow : ConversationRow { tooltip.set_custom(generate_tooltip()); return true; }); - update_avatar(); } protected override void update_message_label() { diff --git a/main/src/ui/conversation_selector/groupchat_row.vala b/main/src/ui/conversation_selector/groupchat_row.vala index 0dfdfe66..fdbfa40b 100644 --- a/main/src/ui/conversation_selector/groupchat_row.vala +++ b/main/src/ui/conversation_selector/groupchat_row.vala @@ -8,12 +8,10 @@ public class GroupchatRow : ConversationRow { base(stream_interactor, conversation); has_tooltip = true; set_tooltip_text(conversation.counterpart.bare_jid.to_string()); - update_avatar(); closed.connect(() => { stream_interactor.get_module(MucManager.IDENTITY).part(conversation.account, conversation.counterpart); }); - stream_interactor.get_module(MucManager.IDENTITY).left.connect(update_avatar); } protected override void update_message_label() { diff --git a/main/src/ui/conversation_selector/list.vala b/main/src/ui/conversation_selector/list.vala index 08958cb5..e250c4cd 100644 --- a/main/src/ui/conversation_selector/list.vala +++ b/main/src/ui/conversation_selector/list.vala @@ -26,18 +26,6 @@ public class List : ListBox { stream_interactor.get_module(ConversationManager.IDENTITY).conversation_deactivated.connect(remove_conversation); stream_interactor.get_module(MessageProcessor.IDENTITY).message_received.connect(on_message_received); stream_interactor.get_module(MessageProcessor.IDENTITY).message_sent.connect(on_message_received); - stream_interactor.get_module(PresenceManager.IDENTITY).show_received.connect((show, jid, account) => { - foreach (Conversation conversation in stream_interactor.get_module(ConversationManager.IDENTITY).get_conversations_for_presence(show, account)) { - if (rows.has_key(conversation)) rows[conversation].on_show_received(show); - } - }); - stream_interactor.get_module(AvatarManager.IDENTITY).received_avatar.connect((avatar, jid, account) => { - Conversation? conversation = stream_interactor.get_module(ConversationManager.IDENTITY).get_conversation(jid, account); - if (conversation != null && rows.has_key(conversation)) { - ChatRow row = rows[conversation] as ChatRow; - if (row != null) row.update_avatar(); - } - }); Timeout.add_seconds(60, () => { foreach (ConversationRow row in rows.values) row.update(); return true; @@ -99,7 +87,7 @@ public class List : ListBox { row.closed.connect(() => { select_next_conversation(conversation); }); row.main_revealer.set_reveal_child(true); } - invalidate_sort(); + //invalidate_sort(); } private void select_next_conversation(Conversation conversation) { diff --git a/main/src/ui/conversation_summary/default_file_display.vala b/main/src/ui/conversation_summary/default_file_display.vala index 42fe2214..15eab6fe 100644 --- a/main/src/ui/conversation_summary/default_file_display.vala +++ b/main/src/ui/conversation_summary/default_file_display.vala @@ -2,6 +2,7 @@ using Gdk; using Gtk; using Dino.Entities; +using Xmpp; namespace Dino.Ui.ConversationSummary { @@ -26,7 +27,7 @@ public class DefaultFileDisplay : Plugins.MetaConversationItem { this.stream_interactor = stream_interactor; this.file_transfer = file_transfer; - this.jid = file_transfer.direction == FileTransfer.DIRECTION_SENT ? new Jid.with_resource(file_transfer.account.bare_jid.to_string(), file_transfer.account.resourcepart) : file_transfer.counterpart; + this.jid = file_transfer.direction == FileTransfer.DIRECTION_SENT ? file_transfer.account.bare_jid.with_resource(file_transfer.account.resourcepart) : file_transfer.counterpart; this.sort_time = file_transfer.time; this.seccondary_sort_indicator = file_transfer.id + 0.2903; this.display_time = file_transfer.time; diff --git a/main/src/ui/conversation_summary/default_message_display.vala b/main/src/ui/conversation_summary/default_message_display.vala index f843f116..954012a1 100644 --- a/main/src/ui/conversation_summary/default_message_display.vala +++ b/main/src/ui/conversation_summary/default_message_display.vala @@ -1,4 +1,5 @@ using Dino.Entities; +using Xmpp; namespace Dino.Ui.ConversationSummary { diff --git a/main/src/ui/conversation_summary/image_display.vala b/main/src/ui/conversation_summary/image_display.vala index 6093f759..7b77759b 100644 --- a/main/src/ui/conversation_summary/image_display.vala +++ b/main/src/ui/conversation_summary/image_display.vala @@ -1,6 +1,7 @@ using Gtk; using Dino.Entities; +using Xmpp; namespace Dino.Ui.ConversationSummary { @@ -25,7 +26,7 @@ public class ImageDisplay : Plugins.MetaConversationItem { this.stream_interactor = stream_interactor; this.file_transfer = file_transfer; - this.jid = file_transfer.direction == FileTransfer.DIRECTION_SENT ? new Jid.with_resource(file_transfer.account.bare_jid.to_string(), file_transfer.account.resourcepart) : file_transfer.counterpart; + this.jid = file_transfer.direction == FileTransfer.DIRECTION_SENT ? file_transfer.account.bare_jid.with_resource(file_transfer.account.resourcepart) : file_transfer.counterpart; this.sort_time = file_transfer.time; this.seccondary_sort_indicator = file_transfer.id + 0.2903; this.display_time = file_transfer.time; diff --git a/main/src/ui/conversation_summary/slashme_message_display.vala b/main/src/ui/conversation_summary/slashme_message_display.vala index f57950bb..3c8af78c 100644 --- a/main/src/ui/conversation_summary/slashme_message_display.vala +++ b/main/src/ui/conversation_summary/slashme_message_display.vala @@ -1,6 +1,7 @@ using Gtk; using Dino.Entities; +using Xmpp; namespace Dino.Ui.ConversationSummary { diff --git a/main/src/ui/manage_accounts/add_account_dialog.vala b/main/src/ui/manage_accounts/add_account_dialog.vala index 3bd9cc4b..b111a6d5 100644 --- a/main/src/ui/manage_accounts/add_account_dialog.vala +++ b/main/src/ui/manage_accounts/add_account_dialog.vala @@ -2,6 +2,7 @@ using Gee; using Gtk; using Dino.Entities; +using Xmpp; namespace Dino.Ui.ManageAccounts { diff --git a/main/src/ui/manage_accounts/dialog.vala b/main/src/ui/manage_accounts/dialog.vala index b157a936..6fb0c427 100644 --- a/main/src/ui/manage_accounts/dialog.vala +++ b/main/src/ui/manage_accounts/dialog.vala @@ -4,6 +4,7 @@ using Gtk; using Markup; using Dino.Entities; +using Xmpp; namespace Dino.Ui.ManageAccounts { diff --git a/main/src/ui/occupant_menu/list.vala b/main/src/ui/occupant_menu/list.vala index e89cd3d8..f31ada93 100644 --- a/main/src/ui/occupant_menu/list.vala +++ b/main/src/ui/occupant_menu/list.vala @@ -2,6 +2,7 @@ using Gee; using Gtk; using Dino.Entities; +using Xmpp; namespace Dino.Ui.OccupantMenu{ @@ -39,6 +40,7 @@ public class List : Box { add_occupant(occupant); } } + list_box.invalidate_filter(); } private void refilter() { @@ -57,8 +59,6 @@ public class List : Box { public void add_occupant(Jid jid) { rows[jid] = new ListRow(stream_interactor, conversation.account, jid); list_box.add(rows[jid]); - list_box.invalidate_filter(); - list_box.invalidate_sort(); } public void remove_occupant(Jid jid) { @@ -77,6 +77,7 @@ public class List : Box { } else if (show.as != Show.OFFLINE && !rows.has_key(jid)) { add_occupant(jid); } + list_box.invalidate_filter(); } } diff --git a/main/src/ui/occupant_menu/view.vala b/main/src/ui/occupant_menu/view.vala index a76f370a..1115d0ab 100644 --- a/main/src/ui/occupant_menu/view.vala +++ b/main/src/ui/occupant_menu/view.vala @@ -2,6 +2,7 @@ using Gee; using Gtk; using Dino.Entities; +using Xmpp; namespace Dino.Ui.OccupantMenu { public class View : Popover { diff --git a/main/src/ui/util/helper.vala b/main/src/ui/util/helper.vala index a4f800f8..6d9218e4 100644 --- a/main/src/ui/util/helper.vala +++ b/main/src/ui/util/helper.vala @@ -65,7 +65,7 @@ public static string get_display_name(StreamInteractor stream_interactor, Jid ji } return jid.resourcepart; } else { - if (jid.bare_jid.equals(account.bare_jid.bare_jid)) { + if (jid.equals_bare(account.bare_jid)) { if (account.alias == null || account.alias == "") { return account.bare_jid.to_string(); } else { @@ -84,9 +84,24 @@ public static string get_message_display_name(StreamInteractor stream_interactor return get_display_name(stream_interactor, message.from, account); } -public static void image_set_from_scaled_pixbuf(Image image, Gdk.Pixbuf pixbuf, int scale = 0) { +public static void image_set_from_scaled_pixbuf(Image image, Gdk.Pixbuf pixbuf, int scale = 0, int width = 0, int height = 0) { if (scale == 0) scale = image.scale_factor; - image.set_from_surface(Gdk.cairo_surface_create_from_pixbuf(pixbuf, scale, image.get_window())); + Cairo.Surface surface = Gdk.cairo_surface_create_from_pixbuf(pixbuf, scale, image.get_window()); + if (height == 0 && width != 0) { + height = (int) ((double) width / pixbuf.width * pixbuf.height); + } else if (height != 0 && width == 0) { + width = (int) ((double) height / pixbuf.height * pixbuf.width); + } + if (width != 0) { + Cairo.Surface surface_new = new Cairo.Surface.similar_image(surface, Cairo.Format.ARGB32, width, height); + Cairo.Context context = new Cairo.Context(surface_new); + context.scale((double) width * scale / pixbuf.width, (double) height * scale / pixbuf.height); + context.set_source_surface(surface, 0, 0); + context.get_source().set_filter(Cairo.Filter.BEST); + context.paint(); + surface = surface_new; + } + image.set_from_surface(surface); } private const string force_background_css = "%s { background-color: %s; }"; |