<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/">
  <channel rdf:about="http://blog.gmane.org/gmane.comp.gnome.svn">
    <title>gmane.comp.gnome.svn</title>
    <link>http://blog.gmane.org/gmane.comp.gnome.svn</link>
    <description/>
    <syn:updatePeriod>hourly</syn:updatePeriod>
    <syn:updateFrequency>1</syn:updateFrequency>
    <syn:updateBase>1901-01-01T00:00+00:00</syn:updateBase>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725705"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725704"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725703"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725702"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725701"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725700"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725699"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725698"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725697"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725696"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725695"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725694"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725693"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725692"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725691"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725690"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725689"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725688"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725687"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.gnome.svn/725686"/>
      </rdf:Seq>
    </items>
    <image rdf:resource="http://gmane.org/img/gmane-25t.png"/>
    <textinput rdf:resource=""/>
  </channel>
  <image rdf:about="http://gmane.org/img/gmane-25t.png">
    <title>Gmane</title>
    <url>http://gmane.org/img/gmane-25t.png</url>
    <link>http://gmane.org</link>
  </image>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725705">
    <title>[evolution-ews] Fix leak and avoid to pass NULL to g_strrstr()</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725705</link>
    <description>&lt;pre&gt;commit 50c6948f396ea99ec4993f4e6344d1af32f52b6c
Author: Fabiano Fidêncio &amp;lt;fidencio&amp;lt; at &amp;gt;redhat.com&amp;gt;
Date:   Thu Jun 20 13:59:46 2013 +0200

    Fix leak and avoid to pass NULL to g_strrstr()

 src/server/e-ews-oof-settings.c |   23 +++++++++++++++--------
 1 files changed, 15 insertions(+), 8 deletions(-)
---
diff --git a/src/server/e-ews-oof-settings.c b/src/server/e-ews-oof-settings.c
index b4c06ba..6f2e307 100644
--- a/src/server/e-ews-oof-settings.c
+++ b/src/server/e-ews-oof-settings.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -148,6 +148,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; ews_oof_settings_get_response_cb (ESoapResponse *response,
 ESoapParameter *subsubparam;
 GDateTime *date_time;
 gchar *string;
+gchar *text;
 GError *error = NULL;
 
 param = e_soap_response_get_first_parameter_by_name (
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -239,24 +240,30 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; ews_oof_settings_get_response_cb (ESoapResponse *response,
 subsubparam = e_soap_parameter_get_first_child_by_name (
 subparam, "Message");
 string = e_soap_parameter_get_string_value (subsubparam);
-if (g_strrstr (string, "&amp;lt;/body&amp;gt;") != NULL)
-string = ews_oof_settings_text_from_html (string);
+if (string == NULL)
+text = NULL;
+else if (g_strrstr (string, "&amp;lt;/body&amp;gt;") != NULL)
+text = ews_oof_settings_text_from_html (string);
 else if (g_strrstr (string, "BodyFragment") != NULL)
-string = ews_oof_settings_text_from_html (string);
-e_ews_oof_settings_set_internal_reply (settings, string);
+text = ews_oof_settings_text_from_html (string);
+e_ews_oof_settings_set_internal_reply (settings, text ? text : "");
 g_free (string);
+g_free (text);
 
 subparam = e_soap_parameter_get_first_child_by_name (
 param, "ExternalReply");
 subsubparam = e_soap_parameter_get_first_child_by_name (
 subparam, "Message");
 string = e_soap_parameter_get_string_value (subsubparam);
-if (g_strrstr (string, "&amp;lt;/body&amp;gt;") != NULL)
-string = ews_oof_settings_text_from_html (string);
+if (string == NULL)
+text = NULL;
+else if (g_strrstr (string, "&amp;lt;/body&amp;gt;") != NULL)
+text = ews_oof_settings_text_from_html (string);
 else if (g_strrstr (string, "BodyFragment") != NULL)
-string = ews_oof_settings_text_from_html (string);
-e_ews_oof_settings_set_external_reply (settings, string);
+text = ews_oof_settings_text_from_html (string);
+e_ews_oof_settings_set_external_reply (settings, text ? text : "");
 g_free (string);
+g_free (text);
 
 g_object_unref (source_object);
 }
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.&lt;/pre&gt;</description>
    <dc:creator>Fabiano Fidêncio</dc:creator>
    <dc:date>2013-06-20T12:11:04</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725704">
    <title>[evolution-ews/gnome-3-8] Fix leak and avoid to pass NULL tog_strrstr()</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725704</link>
    <description>&lt;pre&gt;commit 7be6e9d7ba1e4287fef7db661808ad53b1735797
Author: Fabiano Fidêncio &amp;lt;fidencio&amp;lt; at &amp;gt;redhat.com&amp;gt;
Date:   Thu Jun 20 13:59:46 2013 +0200

    Fix leak and avoid to pass NULL to g_strrstr()

 src/server/e-ews-oof-settings.c |   23 +++++++++++++++--------
 1 files changed, 15 insertions(+), 8 deletions(-)
---
diff --git a/src/server/e-ews-oof-settings.c b/src/server/e-ews-oof-settings.c
index a69d97b..ce5c7ea 100644
--- a/src/server/e-ews-oof-settings.c
+++ b/src/server/e-ews-oof-settings.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -148,6 +148,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; ews_oof_settings_get_response_cb (ESoapResponse *response,
 ESoapParameter *subsubparam;
 GDateTime *date_time;
 gchar *string;
+gchar *text;
 GError *error = NULL;
 
 param = e_soap_response_get_first_parameter_by_name (
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -239,24 +240,30 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; ews_oof_settings_get_response_cb (ESoapResponse *response,
 subsubparam = e_soap_parameter_get_first_child_by_name (
 subparam, "Message");
 string = e_soap_parameter_get_string_value (subsubparam);
-if (g_strrstr (string, "&amp;lt;/body&amp;gt;") != NULL)
-string = ews_oof_settings_text_from_html (string);
+if (string == NULL)
+text = NULL;
+else if (g_strrstr (string, "&amp;lt;/body&amp;gt;") != NULL)
+text = ews_oof_settings_text_from_html (string);
 else if (g_strrstr (string, "BodyFragment") != NULL)
-string = ews_oof_settings_text_from_html (string);
-e_ews_oof_settings_set_internal_reply (settings, string);
+text = ews_oof_settings_text_from_html (string);
+e_ews_oof_settings_set_internal_reply (settings, text ? text : "");
 g_free (string);
+g_free (text);
 
 subparam = e_soap_parameter_get_first_child_by_name (
 param, "ExternalReply");
 subsubparam = e_soap_parameter_get_first_child_by_name (
 subparam, "Message");
 string = e_soap_parameter_get_string_value (subsubparam);
-if (g_strrstr (string, "&amp;lt;/body&amp;gt;") != NULL)
-string = ews_oof_settings_text_from_html (string);
+if (string == NULL)
+text = NULL;
+else if (g_strrstr (string, "&amp;lt;/body&amp;gt;") != NULL)
+text = ews_oof_settings_text_from_html (string);
 else if (g_strrstr (string, "BodyFragment") != NULL)
-string = ews_oof_settings_text_from_html (string);
-e_ews_oof_settings_set_external_reply (settings, string);
+text = ews_oof_settings_text_from_html (string);
+e_ews_oof_settings_set_external_reply (settings, text ? text : "");
 g_free (string);
+g_free (text);
 
 g_object_unref (source_object);
 }
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.&lt;/pre&gt;</description>
    <dc:creator>Fabiano Fidêncio</dc:creator>
    <dc:date>2013-06-20T12:09:48</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725703">
    <title>[gnote] Add option to open notes in new window</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725703</link>
    <description>&lt;pre&gt;commit cf0179e5fcf8f0dd6f25f02b7a6993440621e319
Author: Aurimas Černius &amp;lt;aurisc4&amp;lt; at &amp;gt;gmail.com&amp;gt;
Date:   Thu Jun 20 14:42:50 2013 +0300

    Add option to open notes in new window
    
    Add GSettings key and make it work.
    Part of Bug 700458.

 data/org.gnome.gnote.gschema.xml.in |    5 +++++
 src/preferences.cpp                 |    3 ++-
 src/preferences.hpp                 |    3 ++-
 src/recentchanges.cpp               |   22 +++++++++++++++++++---
 src/recentchanges.hpp               |    2 ++
 src/searchnoteswidget.cpp           |   28 +++++++++++++++++++++++-----
 src/searchnoteswidget.hpp           |    1 +
 src/watchers.cpp                    |    6 +++++-
 8 files changed, 59 insertions(+), 11 deletions(-)
---
diff --git a/data/org.gnome.gnote.gschema.xml.in b/data/org.gnome.gnote.gschema.xml.in
index 53572f4..c0fce03 100644
--- a/data/org.gnome.gnote.gschema.xml.in
+++ b/data/org.gnome.gnote.gschema.xml.in
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -120,6 +120,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       &amp;lt;_summary&amp;gt;Use status icon, when started as an application&amp;lt;/_summary&amp;gt;
       &amp;lt;_description&amp;gt;Has affect only when started as an application. When set to TRUE, shows a status icon. If set to FALSE, Search All Notes window is used as main application window, closing which makes application to exit.&amp;lt;/_description&amp;gt;
     &amp;lt;/key&amp;gt;
+    &amp;lt;key name="open-notes-in-new-window" type="b"&amp;gt;
+      &amp;lt;default&amp;gt;false&amp;lt;/default&amp;gt;
+      &amp;lt;_summary&amp;gt;Open notes in new window&amp;lt;/_summary&amp;gt;
+      &amp;lt;_description&amp;gt;Open notes in new window instead of replacing active content of the same window&amp;lt;/_description&amp;gt;
+    &amp;lt;/key&amp;gt;
     &amp;lt;child name="global-keybindings" schema="org.gnome.gnote.global-keybindings" /&amp;gt;
     &amp;lt;child name="export-html" schema="org.gnome.gnote.export-html" /&amp;gt;
     &amp;lt;child name="sync" schema="org.gnome.gnote.sync" /&amp;gt;
diff --git a/src/preferences.cpp b/src/preferences.cpp
index 873ff26..43347d0 100644
--- a/src/preferences.cpp
+++ b/src/preferences.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,7 +1,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 /*
  * gnote
  *
- * Copyright (C) 2011-2012 Aurimas Cernius
+ * Copyright (C) 2011-2013 Aurimas Cernius
  * Copyright (C) 2009 Hubert Figuiere
  *
  * This program is free software: you can redistribute it and/or modify
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -60,6 +60,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; namespace gnote {
 
   const char * Preferences::NOTE_RENAME_BEHAVIOR = "note-rename-behavior";
   const char * Preferences::USE_STATUS_ICON = "use-status-icon";
+  const char * Preferences::OPEN_NOTES_IN_NEW_WINDOW = "open-notes-in-new-window";
 
   const char * Preferences::MAIN_WINDOW_MAXIMIZED = "main-window-maximized";
   const char * Preferences::SEARCH_WINDOW_X_POS = "search-window-x-pos";
diff --git a/src/preferences.hpp b/src/preferences.hpp
index 3d3c621..49e245a 100644
--- a/src/preferences.hpp
+++ b/src/preferences.hpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,7 +1,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 /*
  * gnote
  *
- * Copyright (C) 2011-2012 Aurimas Cernius
+ * Copyright (C) 2011-2013 Aurimas Cernius
  * Copyright (C) 2009 Hubert Figuiere
  *
  * This program is free software: you can redistribute it and/or modify
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -58,6 +58,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; namespace gnote {
 
     static const char *NOTE_RENAME_BEHAVIOR;
     static const char *USE_STATUS_ICON;
+    static const char *OPEN_NOTES_IN_NEW_WINDOW;
 
     static const char *MAIN_WINDOW_MAXIMIZED;
     static const char *SEARCH_WINDOW_X_POS;
diff --git a/src/recentchanges.cpp b/src/recentchanges.cpp
index c5c6d27..a240964 100644
--- a/src/recentchanges.cpp
+++ b/src/recentchanges.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -51,14 +51,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; namespace gnote {
     , m_window_menu_embedded(NULL)
     , m_window_menu_default(NULL)
     , m_keybinder(get_accel_group())
+    , m_open_notes_in_new_window(Preferences::obj().get_schema_settings(
+        Preferences::SCHEMA_GNOTE)-&amp;gt;get_boolean(Preferences::OPEN_NOTES_IN_NEW_WINDOW))
   {
     set_default_size(450,400);
     set_resizable(true);
     set_hide_titlebar_when_maximized(true);
-    if(Preferences::obj().get_schema_settings(Preferences::SCHEMA_GNOTE)-&amp;gt;get_boolean(
-         Preferences::MAIN_WINDOW_MAXIMIZED)) {
+    Glib::RefPtr&amp;lt;Gio::Settings&amp;gt; settings = Preferences::obj().get_schema_settings(Preferences::SCHEMA_GNOTE);
+    if(settings-&amp;gt;get_boolean(Preferences::MAIN_WINDOW_MAXIMIZED)) {
       maximize();
     }
+    settings-&amp;gt;signal_changed().connect(sigc::mem_fun(*this, &amp;amp;NoteRecentChanges::on_settings_changed));
 
     set_has_resize_grip(true);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -311,7 +314,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; namespace gnote {
 
   void NoteRecentChanges::on_open_note(const Note::Ptr &amp;amp; note)
   {
-    present_note(note);
+    if(m_open_notes_in_new_window) {
+      on_open_note_new_window(note);
+    }
+    else {
+      present_note(note);
+    }
   }
 
   void NoteRecentChanges::on_open_note_new_window(const Note::Ptr &amp;amp; note)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -706,5 +714,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; namespace gnote {
     }
   }
 
+  void NoteRecentChanges::on_settings_changed(const Glib::ustring &amp;amp; key)
+  {
+    if(key == Preferences::OPEN_NOTES_IN_NEW_WINDOW) {
+      m_open_notes_in_new_window = Preferences::obj().get_schema_settings(
+        Preferences::SCHEMA_GNOTE)-&amp;gt;get_boolean(Preferences::OPEN_NOTES_IN_NEW_WINDOW);
+    }
+  }
+
 }
 
diff --git a/src/recentchanges.hpp b/src/recentchanges.hpp
index 18bc9e6..2b75a2f 100644
--- a/src/recentchanges.hpp
+++ b/src/recentchanges.hpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -85,6 +85,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; private:
   std::vector&amp;lt;Gtk::MenuItem*&amp;gt; &amp;amp; make_menu_items(std::vector&amp;lt;Gtk::MenuItem*&amp;gt; &amp;amp; items,
                                                 const std::vector&amp;lt;Glib::RefPtr&amp;lt;Gtk::Action&amp;gt; &amp;gt; &amp;amp; actions);
   void on_main_window_actions_changed(Gtk::Menu **menu);
+  void on_settings_changed(const Glib::ustring &amp;amp; key);
 
   NoteManager        &amp;amp;m_note_manager;
   SearchNotesWidget   m_search_notes_widget;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -106,6 +107,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; private:
   Gtk::Menu          *m_window_menu_embedded;
   Gtk::Menu          *m_window_menu_default;
   utils::GlobalKeybinder m_keybinder;
+  bool                m_open_notes_in_new_window;
 };
 
 
diff --git a/src/searchnoteswidget.cpp b/src/searchnoteswidget.cpp
index 35cabb1..d2a4856 100644
--- a/src/searchnoteswidget.cpp
+++ b/src/searchnoteswidget.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -100,6 +100,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; SearchNotesWidget::SearchNotesWidget(NoteManager &amp;amp; m)
     .connect(sigc::mem_fun(*this, &amp;amp;SearchNotesWidget::on_note_removed_from_notebook));
   notebooks::NotebookManager::obj().signal_note_pin_status_changed
     .connect(sigc::mem_fun(*this, &amp;amp;SearchNotesWidget::on_note_pin_status_changed));
+
+  Preferences::obj().get_schema_settings(Preferences::SCHEMA_GNOTE)-&amp;gt;signal_changed()
+    .connect(sigc::mem_fun(*this, &amp;amp;SearchNotesWidget::on_settings_changed));
 }
 
 SearchNotesWidget::~SearchNotesWidget()
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1267,11 +1270,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; Gtk::Menu *SearchNotesWidget::get_note_list_context_menu()
 {
   if(!m_note_list_context_menu) {
     m_note_list_context_menu = new Gtk::Menu;
-
-    Gtk::MenuItem *item = manage(new Gtk::MenuItem);
-    item-&amp;gt;set_related_action(m_open_note_action);
-    item-&amp;gt;add_accelerator("activate", m_accel_group, GDK_KEY_O, Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE);
-    m_note_list_context_menu-&amp;gt;add(*item);
+    bool open_notes_in_new_window = Preferences::obj().get_schema_settings(
+      Preferences::SCHEMA_GNOTE)-&amp;gt;get_boolean(Preferences::OPEN_NOTES_IN_NEW_WINDOW);
+
+    Gtk::MenuItem *item;
+    if(!open_notes_in_new_window) {
+      item = manage(new Gtk::MenuItem);
+      item-&amp;gt;set_related_action(m_open_note_action);
+      item-&amp;gt;add_accelerator("activate", m_accel_group, GDK_KEY_O, Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE);
+      m_note_list_context_menu-&amp;gt;add(*item);
+    }
 
     item = manage(new Gtk::MenuItem);
     item-&amp;gt;set_related_action(m_open_note_new_window_action);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1414,4 +1422,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; sigc::signal&amp;lt;void&amp;gt; &amp;amp; SearchNotesWidget::signal_actions_changed()
   return IActionManager::obj().signal_main_window_search_actions_changed;
 }
 
+void SearchNotesWidget::on_settings_changed(const Glib::ustring &amp;amp; key)
+{
+  if(key == Preferences::OPEN_NOTES_IN_NEW_WINDOW) {
+    if(m_note_list_context_menu) {
+      delete m_note_list_context_menu;
+      m_note_list_context_menu = NULL;
+    }
+  }
+}
+
 }
diff --git a/src/searchnoteswidget.hpp b/src/searchnoteswidget.hpp
index 502b753..0e3cc7a 100644
--- a/src/searchnoteswidget.hpp
+++ b/src/searchnoteswidget.hpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -121,6 +121,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; private:
   void on_open_notebook_template_note();
   void on_new_notebook();
   void on_delete_notebook();
+  void on_settings_changed(const Glib::ustring &amp;amp; key);
 
   class RecentSearchColumnTypes
     : public Gtk::TreeModelColumnRecord
diff --git a/src/watchers.cpp b/src/watchers.cpp
index 3d92b89..29aca14 100644
--- a/src/watchers.cpp
+++ b/src/watchers.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -910,7 +910,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; namespace gnote {
     // also works around the bug.
     if (link) {
       DBG_OUT ("Opening note '%s' on click...", link_name.c_str());
-      MainWindow *window = MainWindow::get_owning(const_cast&amp;lt;NoteEditor&amp;amp;&amp;gt;(editor));
+      MainWindow *window = NULL;
+      if(false == Preferences::obj().get_schema_settings(Preferences::SCHEMA_GNOTE)-&amp;gt;get_boolean(
+                    Preferences::OPEN_NOTES_IN_NEW_WINDOW)) {
+        window = MainWindow::get_owning(const_cast&amp;lt;NoteEditor&amp;amp;&amp;gt;(editor));
+      }
       if(!window) {
         window = &amp;amp;IGnote::obj().new_main_window();
       }
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.&lt;/pre&gt;</description>
    <dc:creator>Aurimas Černius</dc:creator>
    <dc:date>2013-06-20T11:43:52</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725702">
    <title>[libwnck] ClassGroup: fix class signal signature</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725702</link>
    <description>&lt;pre&gt;commit 9d6d14da276683ac984a89a165171314fa2dc53a
Author: Marco Trevisan (Treviño) &amp;lt;mail&amp;lt; at &amp;gt;3v1n0.net&amp;gt;
Date:   Thu Jun 20 13:31:54 2013 +0200

    ClassGroup: fix class signal signature

 libwnck/class-group.h |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)
---
diff --git a/libwnck/class-group.h b/libwnck/class-group.h
index d7b6f34..052a172 100644
--- a/libwnck/class-group.h
+++ b/libwnck/class-group.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -62,9 +62,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct _WnckClassGroupClass
 {
   GObjectClass parent_class;
 
-  void (* name_changed) (WnckApplication *app);
-  void (* icon_changed) (WnckApplication *app);
-  
+  void (* name_changed) (WnckClassGroup *group);
+  void (* icon_changed) (WnckClassGroup *group);
+
   /* Padding for future expansion */
   void (* pad1) (void);
   void (* pad2) (void);
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.&lt;/pre&gt;</description>
    <dc:creator>Marco Trevisan</dc:creator>
    <dc:date>2013-06-20T11:40:06</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725701">
    <title>[gtk+] Improve doc of gtk_text_iter_forward_search()</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725701</link>
    <description>&lt;pre&gt;commit 38d78f48b592deb72ca5065cc90e8793ecea2370
Author: Sébastien Wilmet &amp;lt;swilmet&amp;lt; at &amp;gt;gnome.org&amp;gt;
Date:   Thu Jun 20 12:09:20 2013 +0200

    Improve doc of gtk_text_iter_forward_search()
    
    It was not possible to know if the &amp;lt; at &amp;gt;limit was for &amp;lt; at &amp;gt;match_start or
    &amp;lt; at &amp;gt;match_end. It was documented for backward_search(), but not for
    forward_search().
    
    https://bugzilla.gnome.org/show_bug.cgi?id=390048

 gtk/gtktextiter.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
---
diff --git a/gtk/gtktextiter.c b/gtk/gtktextiter.c
index 8a24ae8..4821c62 100644
--- a/gtk/gtktextiter.c
+++ b/gtk/gtktextiter.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4848,7 +4848,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; strbreakup (const char *string,
  * &amp;lt; at &amp;gt;flags: flags affecting how the search is done
  * &amp;lt; at &amp;gt;match_start: (out caller-allocates) (allow-none): return location for start of match, or %NULL
  * &amp;lt; at &amp;gt;match_end: (out caller-allocates) (allow-none): return location for end of match, or %NULL
- * &amp;lt; at &amp;gt;limit: (allow-none): bound for the search, or %NULL for the end of the buffer
+ * &amp;lt; at &amp;gt;limit: (allow-none): location of last possible &amp;lt; at &amp;gt;match_end, or %NULL for the end of the buffer
  *
  * Searches forward for &amp;lt; at &amp;gt;str. Any match is returned by setting
  * &amp;lt; at &amp;gt;match_start to the first character of the match and &amp;lt; at &amp;gt;match_end to the
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.&lt;/pre&gt;</description>
    <dc:creator>Sébastien Wilmet</dc:creator>
    <dc:date>2013-06-20T10:39:53</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725700">
    <title>[evolution/gnome-3-8] Bug #693216 - Email type is changed to otherafter merging</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725700</link>
    <description>&lt;pre&gt;commit 0c18d2e755acbb84f48dd3b4ba783dac047ec4a2
Author: Milan Crha &amp;lt;mcrha&amp;lt; at &amp;gt;redhat.com&amp;gt;
Date:   Thu Jun 20 12:19:30 2013 +0200

    Bug #693216 - Email type is changed to other after merging

 addressbook/gui/merging/eab-contact-merging.c |  184 +++++++++++++++----------
 1 files changed, 112 insertions(+), 72 deletions(-)
---
diff --git a/addressbook/gui/merging/eab-contact-merging.c b/addressbook/gui/merging/eab-contact-merging.c
index 459ae8a..6ba850d 100644
--- a/addressbook/gui/merging/eab-contact-merging.c
+++ b/addressbook/gui/merging/eab-contact-merging.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -36,6 +36,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include "e-util/e-util-private.h"
 #include &amp;lt;glib/gi18n.h&amp;gt;
 
+#include &amp;lt;camel/camel.h&amp;gt;
+
 typedef struct dropdown_data dropdown_data;
 typedef enum {
 E_CONTACT_MERGING_ADD,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -61,6 +63,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct {
 struct dropdown_data {
 EContact *match;
 EContactField field;
+
+/* for E_CONTACT_EMAIL field */
+GList *email_attr_list_item;
+EVCardAttribute *email_attr;
 };
 static void match_query_callback (EContact *contact, EContact *match, EABContactMatchType type, gpointer closure);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -270,14 +276,28 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void
 dropdown_changed (GtkWidget *dropdown,
                   dropdown_data *data)
 {
-gchar *str;
-str = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (dropdown));
+gchar *str = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (dropdown));
 
-if (g_ascii_strcasecmp (str, ""))
+if (str &amp;amp;&amp;amp; *str)
 e_contact_set (data-&amp;gt;match, data-&amp;gt;field, str);
 else
 e_contact_set (data-&amp;gt;match, data-&amp;gt;field, NULL);
-return;
+
+g_free (str);
+}
+
+static void
+email_dropdown_changed (GtkWidget *dropdown,
+dropdown_data *data)
+{
+gchar *str = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (dropdown));
+
+if (str &amp;amp;&amp;amp; *str)
+data-&amp;gt;email_attr_list_item-&amp;gt;data = data-&amp;gt;email_attr;
+else
+data-&amp;gt;email_attr_list_item-&amp;gt;data = NULL;
+
+g_free (str);
 }
 
 static void
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -314,9 +334,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mergeit (EContactMergingLookup *lookup)
 GtkWidget *dialog;
 GtkTable *table;
 EContactField field;
-gchar *str = NULL, *string = NULL, *string1 = NULL;
-gint num_of_email;
-GList *email_attr_list;
+gchar *string = NULL, *string1 = NULL;
+GList *match_email_attr_list, *contact_email_attr_list, *miter, *citer, *use_email_attr_list;
+GHashTable *match_emails; /* emails in the 'match' contact */
 gint row = -1;
 gint value = 0, result;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -342,8 +362,25 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mergeit (EContactMergingLookup *lookup)
 _("_Merge"), GTK_RESPONSE_OK,
 NULL);
 
-email_attr_list = e_contact_get_attributes (lookup-&amp;gt;match, E_CONTACT_EMAIL);
-num_of_email = g_list_length (email_attr_list);
+match_emails = g_hash_table_new_full (camel_strcase_hash, camel_strcase_equal, g_free, NULL);
+match_email_attr_list = e_contact_get_attributes (lookup-&amp;gt;match, E_CONTACT_EMAIL);
+contact_email_attr_list = e_contact_get_attributes (lookup-&amp;gt;contact, E_CONTACT_EMAIL);
+use_email_attr_list = NULL;
+
+for (miter = match_email_attr_list; miter; miter = g_list_next (miter)) {
+EVCardAttribute *attr = miter-&amp;gt;data;
+gchar *email;
+
+email = e_vcard_attribute_get_value (attr);
+if (email &amp;amp;&amp;amp; *email) {
+g_hash_table_insert (match_emails, email, attr);
+use_email_attr_list = g_list_prepend (use_email_attr_list, attr);
+} else {
+g_free (email);
+}
+}
+
+use_email_attr_list = g_list_reverse (use_email_attr_list);
 
 /*we match all the string fields of the already existing contact and the new contact.*/
 for (field = E_CONTACT_FULL_NAME; field != (E_CONTACT_LAST_SIMPLE_STRING -1); field++) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -353,72 +390,59 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mergeit (EContactMergingLookup *lookup)
 
 /*the field must exist in the new as well as the duplicate contact*/
 if (string &amp;amp;&amp;amp; *string) {
-/*Four email id's present, should be compared with all email id's in duplicate contact */
-/*Merge only if number of email id's in existing contact is less than 4 */
-if ((field == E_CONTACT_EMAIL_1 || field == E_CONTACT_EMAIL_2
-    || field == E_CONTACT_EMAIL_3 || field == E_CONTACT_EMAIL_4) &amp;amp;&amp;amp; (num_of_email &amp;lt; 4)) {
-EContactField use_field = field;
-row++;
-str = (gchar *) e_contact_get_const (lookup-&amp;gt;contact, use_field);
-switch (num_of_email)
-{
-case 0:
-use_field = E_CONTACT_EMAIL_1;
-break;
-case 1:
-/*New contact has email that is NOT equal to email in duplicate contact*/
-if ((str &amp;amp;&amp;amp; *str) &amp;amp;&amp;amp; (g_ascii_strcasecmp (e_contact_get_const (lookup-&amp;gt;match, E_CONTACT_EMAIL_1),str))) {
-use_field = E_CONTACT_EMAIL_2;
-break;
+if (field == E_CONTACT_EMAIL_1) {
+for (citer = contact_email_attr_list; citer; citer = g_list_next (citer)) {
+EVCardAttribute *attr = citer-&amp;gt;data;
+gchar *email;
+
+email = e_vcard_attribute_get_value (attr);
+if (email &amp;amp;&amp;amp; *email) {
+if (!g_hash_table_lookup (match_emails, email)) {
+dropdown_data *data;
+
+/* the email is not set in both contacts */
+use_email_attr_list = g_list_append (use_email_attr_list, attr);
+
+row++;
+label = gtk_label_new (_("Email"));
+hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+gtk_box_pack_start (GTK_BOX (hbox), (GtkWidget *) label, FALSE, FALSE, 0);
+gtk_table_attach_defaults (table, (GtkWidget *) hbox, 0, 1, row, row + 1);
+
+dropdown = gtk_combo_box_text_new ();
+gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (dropdown), email);
+
+data = g_new0 (dropdown_data, 1);
+
+gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (dropdown), "");
+
+gtk_combo_box_set_active (GTK_COMBO_BOX (dropdown), 0);
+data-&amp;gt;field = E_CONTACT_EMAIL;
+data-&amp;gt;match = lookup-&amp;gt;match;
+data-&amp;gt;email_attr_list_item = g_list_last (use_email_attr_list);
+data-&amp;gt;email_attr = attr;
+
+g_signal_connect (
+dropdown, "changed",
+G_CALLBACK (email_dropdown_changed), data);
+g_object_set_data_full (G_OBJECT (dropdown), "eab-contact-merging::dropdown-data", data, g_free);
+
+hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+gtk_box_pack_start (GTK_BOX (hbox), (GtkWidget *) dropdown, FALSE, FALSE, 0);
+gtk_table_attach_defaults (table, (GtkWidget *) hbox, 1, 2, row, row + 1);
+gtk_widget_show ((GtkWidget *) dropdown);
+}
 }
-else/*Either the new contact has no email OR the email already exist in the duplicate contact */
-continue;
-case 2:
-/*New contact has email and it is equal to neither of the 2 emails in the duplicate contact*/
-if ((str &amp;amp;&amp;amp; *str) &amp;amp;&amp;amp;
-(g_ascii_strcasecmp (str,e_contact_get_const (lookup-&amp;gt;match, E_CONTACT_EMAIL_1))) &amp;amp;&amp;amp;
-(g_ascii_strcasecmp (e_contact_get_const (lookup-&amp;gt;match, E_CONTACT_EMAIL_2),str))) {
-use_field = E_CONTACT_EMAIL_3;
-break;
-}
-else
-continue;
-case 3:
-/*New contact has email and it is equal to none of the 3 emails in the duplicate contact*/
-if ((str &amp;amp;&amp;amp; *str) &amp;amp;&amp;amp;
-(g_ascii_strcasecmp (e_contact_get_const (lookup-&amp;gt;match, E_CONTACT_EMAIL_1),str)) &amp;amp;&amp;amp;
-(g_ascii_strcasecmp (e_contact_get_const (lookup-&amp;gt;match, E_CONTACT_EMAIL_2),str)) &amp;amp;&amp;amp;
-(g_ascii_strcasecmp (e_contact_get_const (lookup-&amp;gt;match, E_CONTACT_EMAIL_3),str)))
-use_field = E_CONTACT_EMAIL_4;
-else
-continue;
+g_free (email);
 }
-label = gtk_label_new (_("Email"));
-hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-gtk_box_pack_start (GTK_BOX (hbox), (GtkWidget *) label, FALSE, FALSE, 0);
-gtk_table_attach_defaults (table, (GtkWidget *) hbox, 0, 1, row, row + 1);
-
-dropdown = gtk_combo_box_text_new ();
-gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (dropdown), string);
-
-data = g_new0 (dropdown_data, 1);
-
-gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (dropdown), "");
-
-gtk_combo_box_set_active (GTK_COMBO_BOX (dropdown), 0);
-data-&amp;gt;field = use_field;
-data-&amp;gt;match = lookup-&amp;gt;match;
-e_contact_set (lookup-&amp;gt;match, use_field, string);
-g_signal_connect (
-dropdown, "changed",
-G_CALLBACK (dropdown_changed), data);
+continue;
+}
 
-hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-gtk_box_pack_start (GTK_BOX (hbox), (GtkWidget *) dropdown, FALSE, FALSE, 0);
-gtk_table_attach_defaults (table, (GtkWidget *) hbox, 1, 2, row, row + 1);
-gtk_widget_show ((GtkWidget *) dropdown);
+if (field == E_CONTACT_EMAIL_2 || field == E_CONTACT_EMAIL_3 || field == E_CONTACT_EMAIL_4) {
+/* emails are compared above */
 continue;
 }
+
 if (((field == E_CONTACT_FULL_NAME) &amp;amp;&amp;amp; (!g_ascii_strcasecmp (string, string1)))) {
 row++;
 label = gtk_label_new (e_contact_pretty_name (field));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -460,6 +484,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mergeit (EContactMergingLookup *lookup)
 g_signal_connect (
 dropdown, "changed",
 G_CALLBACK (dropdown_changed), data);
+g_object_set_data_full (G_OBJECT (dropdown), "eab-contact-merging::dropdown-data", data, g_free);
 
 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 gtk_box_pack_start (GTK_BOX (hbox), (GtkWidget *) dropdown, FALSE, FALSE, 0);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -481,6 +506,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mergeit (EContactMergingLookup *lookup)
 
 switch (result) {
 case GTK_RESPONSE_OK:
+citer = NULL;
+for (miter = use_email_attr_list; miter; miter = g_list_next (miter)) {
+if (miter-&amp;gt;data)
+citer = g_list_prepend (citer, miter-&amp;gt;data);
+}
+citer = g_list_reverse (citer);
+e_contact_set_attributes (lookup-&amp;gt;match, E_CONTACT_EMAIL, citer);
+g_list_free (citer);
+
 g_object_unref (lookup-&amp;gt;contact);
 lookup-&amp;gt;contact = g_object_ref (lookup-&amp;gt;match);
 e_book_client_remove_contact (
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -495,7 +529,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mergeit (EContactMergingLookup *lookup)
 break;
 }
 gtk_widget_destroy (dialog);
-g_list_free_full (email_attr_list, (GDestroyNotify) e_vcard_attribute_free);
+g_list_free_full (match_email_attr_list, (GDestroyNotify) e_vcard_attribute_free);
+g_list_free_full (contact_email_attr_list, (GDestroyNotify) e_vcard_attribute_free);
+g_list_free (use_email_attr_list);
+g_hash_table_destroy (match_emails);
+
 return value;
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -622,7 +660,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; match_query_callback (EContact *contact,
 GtkWidget *merge_button;
 GtkWidget *widget;
 
-/* XXX I think we're leaking the GtkBuilder. */
 builder = gtk_builder_new ();
 
 lookup-&amp;gt;match = g_object_ref (match);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -640,6 +677,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; match_query_callback (EContact *contact,
 builder, "eab-contact-commit-duplicate-detected.ui");
 } else {
 doit (lookup, FALSE);
+g_object_unref (builder);
 return;
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -672,6 +710,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; match_query_callback (EContact *contact,
 G_CALLBACK (response), lookup);
 
 gtk_widget_show_all (widget);
+
+g_object_unref (builder);
 }
 }
 
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.

&lt;/pre&gt;</description>
    <dc:creator>Milan Crha</dc:creator>
    <dc:date>2013-06-20T10:20:31</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725699">
    <title>[evolution] Bug #693216 - Email type is changed to other after merging</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725699</link>
    <description>&lt;pre&gt;commit 38edd6e5deb584fb5e11071249dae671fee292d9
Author: Milan Crha &amp;lt;mcrha&amp;lt; at &amp;gt;redhat.com&amp;gt;
Date:   Thu Jun 20 12:18:33 2013 +0200

    Bug #693216 - Email type is changed to other after merging

 addressbook/gui/merging/eab-contact-merging.c |  184 +++++++++++++++----------
 1 files changed, 112 insertions(+), 72 deletions(-)
---
diff --git a/addressbook/gui/merging/eab-contact-merging.c b/addressbook/gui/merging/eab-contact-merging.c
index 459ae8a..6ba850d 100644
--- a/addressbook/gui/merging/eab-contact-merging.c
+++ b/addressbook/gui/merging/eab-contact-merging.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -36,6 +36,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include "e-util/e-util-private.h"
 #include &amp;lt;glib/gi18n.h&amp;gt;
 
+#include &amp;lt;camel/camel.h&amp;gt;
+
 typedef struct dropdown_data dropdown_data;
 typedef enum {
 E_CONTACT_MERGING_ADD,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -61,6 +63,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct {
 struct dropdown_data {
 EContact *match;
 EContactField field;
+
+/* for E_CONTACT_EMAIL field */
+GList *email_attr_list_item;
+EVCardAttribute *email_attr;
 };
 static void match_query_callback (EContact *contact, EContact *match, EABContactMatchType type, gpointer closure);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -270,14 +276,28 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void
 dropdown_changed (GtkWidget *dropdown,
                   dropdown_data *data)
 {
-gchar *str;
-str = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (dropdown));
+gchar *str = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (dropdown));
 
-if (g_ascii_strcasecmp (str, ""))
+if (str &amp;amp;&amp;amp; *str)
 e_contact_set (data-&amp;gt;match, data-&amp;gt;field, str);
 else
 e_contact_set (data-&amp;gt;match, data-&amp;gt;field, NULL);
-return;
+
+g_free (str);
+}
+
+static void
+email_dropdown_changed (GtkWidget *dropdown,
+dropdown_data *data)
+{
+gchar *str = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (dropdown));
+
+if (str &amp;amp;&amp;amp; *str)
+data-&amp;gt;email_attr_list_item-&amp;gt;data = data-&amp;gt;email_attr;
+else
+data-&amp;gt;email_attr_list_item-&amp;gt;data = NULL;
+
+g_free (str);
 }
 
 static void
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -314,9 +334,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mergeit (EContactMergingLookup *lookup)
 GtkWidget *dialog;
 GtkTable *table;
 EContactField field;
-gchar *str = NULL, *string = NULL, *string1 = NULL;
-gint num_of_email;
-GList *email_attr_list;
+gchar *string = NULL, *string1 = NULL;
+GList *match_email_attr_list, *contact_email_attr_list, *miter, *citer, *use_email_attr_list;
+GHashTable *match_emails; /* emails in the 'match' contact */
 gint row = -1;
 gint value = 0, result;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -342,8 +362,25 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mergeit (EContactMergingLookup *lookup)
 _("_Merge"), GTK_RESPONSE_OK,
 NULL);
 
-email_attr_list = e_contact_get_attributes (lookup-&amp;gt;match, E_CONTACT_EMAIL);
-num_of_email = g_list_length (email_attr_list);
+match_emails = g_hash_table_new_full (camel_strcase_hash, camel_strcase_equal, g_free, NULL);
+match_email_attr_list = e_contact_get_attributes (lookup-&amp;gt;match, E_CONTACT_EMAIL);
+contact_email_attr_list = e_contact_get_attributes (lookup-&amp;gt;contact, E_CONTACT_EMAIL);
+use_email_attr_list = NULL;
+
+for (miter = match_email_attr_list; miter; miter = g_list_next (miter)) {
+EVCardAttribute *attr = miter-&amp;gt;data;
+gchar *email;
+
+email = e_vcard_attribute_get_value (attr);
+if (email &amp;amp;&amp;amp; *email) {
+g_hash_table_insert (match_emails, email, attr);
+use_email_attr_list = g_list_prepend (use_email_attr_list, attr);
+} else {
+g_free (email);
+}
+}
+
+use_email_attr_list = g_list_reverse (use_email_attr_list);
 
 /*we match all the string fields of the already existing contact and the new contact.*/
 for (field = E_CONTACT_FULL_NAME; field != (E_CONTACT_LAST_SIMPLE_STRING -1); field++) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -353,72 +390,59 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mergeit (EContactMergingLookup *lookup)
 
 /*the field must exist in the new as well as the duplicate contact*/
 if (string &amp;amp;&amp;amp; *string) {
-/*Four email id's present, should be compared with all email id's in duplicate contact */
-/*Merge only if number of email id's in existing contact is less than 4 */
-if ((field == E_CONTACT_EMAIL_1 || field == E_CONTACT_EMAIL_2
-    || field == E_CONTACT_EMAIL_3 || field == E_CONTACT_EMAIL_4) &amp;amp;&amp;amp; (num_of_email &amp;lt; 4)) {
-EContactField use_field = field;
-row++;
-str = (gchar *) e_contact_get_const (lookup-&amp;gt;contact, use_field);
-switch (num_of_email)
-{
-case 0:
-use_field = E_CONTACT_EMAIL_1;
-break;
-case 1:
-/*New contact has email that is NOT equal to email in duplicate contact*/
-if ((str &amp;amp;&amp;amp; *str) &amp;amp;&amp;amp; (g_ascii_strcasecmp (e_contact_get_const (lookup-&amp;gt;match, E_CONTACT_EMAIL_1),str))) {
-use_field = E_CONTACT_EMAIL_2;
-break;
+if (field == E_CONTACT_EMAIL_1) {
+for (citer = contact_email_attr_list; citer; citer = g_list_next (citer)) {
+EVCardAttribute *attr = citer-&amp;gt;data;
+gchar *email;
+
+email = e_vcard_attribute_get_value (attr);
+if (email &amp;amp;&amp;amp; *email) {
+if (!g_hash_table_lookup (match_emails, email)) {
+dropdown_data *data;
+
+/* the email is not set in both contacts */
+use_email_attr_list = g_list_append (use_email_attr_list, attr);
+
+row++;
+label = gtk_label_new (_("Email"));
+hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+gtk_box_pack_start (GTK_BOX (hbox), (GtkWidget *) label, FALSE, FALSE, 0);
+gtk_table_attach_defaults (table, (GtkWidget *) hbox, 0, 1, row, row + 1);
+
+dropdown = gtk_combo_box_text_new ();
+gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (dropdown), email);
+
+data = g_new0 (dropdown_data, 1);
+
+gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (dropdown), "");
+
+gtk_combo_box_set_active (GTK_COMBO_BOX (dropdown), 0);
+data-&amp;gt;field = E_CONTACT_EMAIL;
+data-&amp;gt;match = lookup-&amp;gt;match;
+data-&amp;gt;email_attr_list_item = g_list_last (use_email_attr_list);
+data-&amp;gt;email_attr = attr;
+
+g_signal_connect (
+dropdown, "changed",
+G_CALLBACK (email_dropdown_changed), data);
+g_object_set_data_full (G_OBJECT (dropdown), "eab-contact-merging::dropdown-data", data, g_free);
+
+hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+gtk_box_pack_start (GTK_BOX (hbox), (GtkWidget *) dropdown, FALSE, FALSE, 0);
+gtk_table_attach_defaults (table, (GtkWidget *) hbox, 1, 2, row, row + 1);
+gtk_widget_show ((GtkWidget *) dropdown);
+}
 }
-else/*Either the new contact has no email OR the email already exist in the duplicate contact */
-continue;
-case 2:
-/*New contact has email and it is equal to neither of the 2 emails in the duplicate contact*/
-if ((str &amp;amp;&amp;amp; *str) &amp;amp;&amp;amp;
-(g_ascii_strcasecmp (str,e_contact_get_const (lookup-&amp;gt;match, E_CONTACT_EMAIL_1))) &amp;amp;&amp;amp;
-(g_ascii_strcasecmp (e_contact_get_const (lookup-&amp;gt;match, E_CONTACT_EMAIL_2),str))) {
-use_field = E_CONTACT_EMAIL_3;
-break;
-}
-else
-continue;
-case 3:
-/*New contact has email and it is equal to none of the 3 emails in the duplicate contact*/
-if ((str &amp;amp;&amp;amp; *str) &amp;amp;&amp;amp;
-(g_ascii_strcasecmp (e_contact_get_const (lookup-&amp;gt;match, E_CONTACT_EMAIL_1),str)) &amp;amp;&amp;amp;
-(g_ascii_strcasecmp (e_contact_get_const (lookup-&amp;gt;match, E_CONTACT_EMAIL_2),str)) &amp;amp;&amp;amp;
-(g_ascii_strcasecmp (e_contact_get_const (lookup-&amp;gt;match, E_CONTACT_EMAIL_3),str)))
-use_field = E_CONTACT_EMAIL_4;
-else
-continue;
+g_free (email);
 }
-label = gtk_label_new (_("Email"));
-hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-gtk_box_pack_start (GTK_BOX (hbox), (GtkWidget *) label, FALSE, FALSE, 0);
-gtk_table_attach_defaults (table, (GtkWidget *) hbox, 0, 1, row, row + 1);
-
-dropdown = gtk_combo_box_text_new ();
-gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (dropdown), string);
-
-data = g_new0 (dropdown_data, 1);
-
-gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (dropdown), "");
-
-gtk_combo_box_set_active (GTK_COMBO_BOX (dropdown), 0);
-data-&amp;gt;field = use_field;
-data-&amp;gt;match = lookup-&amp;gt;match;
-e_contact_set (lookup-&amp;gt;match, use_field, string);
-g_signal_connect (
-dropdown, "changed",
-G_CALLBACK (dropdown_changed), data);
+continue;
+}
 
-hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-gtk_box_pack_start (GTK_BOX (hbox), (GtkWidget *) dropdown, FALSE, FALSE, 0);
-gtk_table_attach_defaults (table, (GtkWidget *) hbox, 1, 2, row, row + 1);
-gtk_widget_show ((GtkWidget *) dropdown);
+if (field == E_CONTACT_EMAIL_2 || field == E_CONTACT_EMAIL_3 || field == E_CONTACT_EMAIL_4) {
+/* emails are compared above */
 continue;
 }
+
 if (((field == E_CONTACT_FULL_NAME) &amp;amp;&amp;amp; (!g_ascii_strcasecmp (string, string1)))) {
 row++;
 label = gtk_label_new (e_contact_pretty_name (field));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -460,6 +484,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mergeit (EContactMergingLookup *lookup)
 g_signal_connect (
 dropdown, "changed",
 G_CALLBACK (dropdown_changed), data);
+g_object_set_data_full (G_OBJECT (dropdown), "eab-contact-merging::dropdown-data", data, g_free);
 
 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 gtk_box_pack_start (GTK_BOX (hbox), (GtkWidget *) dropdown, FALSE, FALSE, 0);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -481,6 +506,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mergeit (EContactMergingLookup *lookup)
 
 switch (result) {
 case GTK_RESPONSE_OK:
+citer = NULL;
+for (miter = use_email_attr_list; miter; miter = g_list_next (miter)) {
+if (miter-&amp;gt;data)
+citer = g_list_prepend (citer, miter-&amp;gt;data);
+}
+citer = g_list_reverse (citer);
+e_contact_set_attributes (lookup-&amp;gt;match, E_CONTACT_EMAIL, citer);
+g_list_free (citer);
+
 g_object_unref (lookup-&amp;gt;contact);
 lookup-&amp;gt;contact = g_object_ref (lookup-&amp;gt;match);
 e_book_client_remove_contact (
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -495,7 +529,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mergeit (EContactMergingLookup *lookup)
 break;
 }
 gtk_widget_destroy (dialog);
-g_list_free_full (email_attr_list, (GDestroyNotify) e_vcard_attribute_free);
+g_list_free_full (match_email_attr_list, (GDestroyNotify) e_vcard_attribute_free);
+g_list_free_full (contact_email_attr_list, (GDestroyNotify) e_vcard_attribute_free);
+g_list_free (use_email_attr_list);
+g_hash_table_destroy (match_emails);
+
 return value;
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -622,7 +660,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; match_query_callback (EContact *contact,
 GtkWidget *merge_button;
 GtkWidget *widget;
 
-/* XXX I think we're leaking the GtkBuilder. */
 builder = gtk_builder_new ();
 
 lookup-&amp;gt;match = g_object_ref (match);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -640,6 +677,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; match_query_callback (EContact *contact,
 builder, "eab-contact-commit-duplicate-detected.ui");
 } else {
 doit (lookup, FALSE);
+g_object_unref (builder);
 return;
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -672,6 +710,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; match_query_callback (EContact *contact,
 G_CALLBACK (response), lookup);
 
 gtk_widget_show_all (widget);
+
+g_object_unref (builder);
 }
 }
 
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.

&lt;/pre&gt;</description>
    <dc:creator>Milan Crha</dc:creator>
    <dc:date>2013-06-20T10:20:06</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725698">
    <title>[gvfs] gvfs-test: Drop dbus startup from gvfs-testbed</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725698</link>
    <description>&lt;pre&gt;commit 14f82fd299320f28ac11c877c326e254507b402e
Author: Martin Pitt &amp;lt;martinpitt&amp;lt; at &amp;gt;gnome.org&amp;gt;
Date:   Fri Jun 14 16:12:12 2013 +0200

    gvfs-test: Drop dbus startup from gvfs-testbed
    
    Drop the D-BUS launch in the gvfs-testbed wrapper, and always launch the test
    session D-BUS in gvfs-test. This makes both scripts easier and more consistent,
    and also makes the GPhoto test work under gvfs-testbed.
    
    This bumps the (optional) umockdev dependency to &amp;gt;= 0.2.9.

 test/gvfs-test    |   68 ++++++++++++++++++++++++++++------------------------
 test/gvfs-testbed |    2 +-
 2 files changed, 38 insertions(+), 32 deletions(-)
---
diff --git a/test/gvfs-test b/test/gvfs-test
index b8882db..bd8fdbb 100755
--- a/test/gvfs-test
+++ b/test/gvfs-test
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -80,7 +80,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; english_messages = not lc or lc.startswith('en_')
 PTYPE_DISK = 0 
 PTYPE_CDROM = 5 
 
-# local D-BUS daemon if we don't run under gvfs-testbed
+# local D-BUS daemon
 dbus_daemon = None
 
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -105,13 +105,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; class GvfsTestCase(unittest.TestCase):
         super().run(result)
         # always read the logs, so that we only get the ones relevant to this
         # particular test case
-        if dbus_daemon:
-            dbus_out = dbus_daemon.stdout.read()
-            dbus_err = dbus_daemon.stderr.read()
-            if result and len(result.errors) + len(result.failures) &amp;gt; orig_err_fail:
-                print('\n----- dbus stdout -----\n%s\n----- dbus stderr -----\n%s\n' %
-                      (dbus_out and dbus_out.decode('UTF-8') or '',
-                       dbus_err and dbus_err.decode('UTF-8') or ''))
+        dbus_out = dbus_daemon.stdout.read()
+        dbus_err = dbus_daemon.stderr.read()
+        if result and len(result.errors) + len(result.failures) &amp;gt; orig_err_fail:
+            print('\n----- dbus stdout -----\n%s\n----- dbus stderr -----\n%s\n' %
+                  (dbus_out and dbus_out.decode('UTF-8') or '',
+                   dbus_err and dbus_err.decode('UTF-8') or ''))
 
     def program_code_out_err(self, argv):
         '''Return (exitcode, stdout, stderr) from a program call.'''
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -950,8 +949,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; class Drive(GvfsTestCase):
         self.monitor.stdout.read()
 
     def setUp(self):
+        super().setUp()
+
         self.mock_polkit = None
 
+        # do not use the mocked /sys for these tests, but the real one
+        # (GvfsTestCase.tearDown() puts it back via .clear())
+        if umockdev_testbed:
+            umockdev_testbed.disable()
+
         self.monitor = subprocess.Popen(['gvfs-mount', '-oi'],
                                         stdout=subprocess.PIPE)
         # set monitor stdout to non-blocking
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -970,6 +976,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; class Drive(GvfsTestCase):
         self.monitor.wait()
         self.stop_polkit()
 
+        super().tearDown()
+
     def test_cdrom(self):
         '''drive mount: cdrom'''
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1624,7 +1632,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; class Trash(GvfsTestCase):
             self.assertTrue(os.path.exists(self.my_file))
 
 
-&amp;lt; at &amp;gt;unittest.skipIf(in_testbed, 'this test does not currently work under gvfs-testbed')
 &amp;lt; at &amp;gt;unittest.skipUnless(have_umockdev,
                      'umockdev not installed; get it from https://launchpad.net/umockdev')
 class GPhoto(GvfsTestCase):
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1713,7 +1720,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; def start_dbus():
     env['GVFS_DEBUG'] = 'all'
     env['GVFS_SMB_DEBUG'] = '6'
     env['GVFS_HTTP_DEBUG'] = 'all'
-    env['LIBSMB_PROG'] = "nc localhost 1445"
+    if not in_testbed:
+        env['LIBSMB_PROG'] = "nc localhost 1445"
     # run local D-BUS; if we run this in a built tree, use our config to pick
     # up the built services, otherwise the standard session one
     if os.path.exists(dbus_conf):
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1745,29 +1753,27 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; if __name__ == '__main__':
         pass
     os.environ['LC_ALL'] = 'C'
     
-    if not in_testbed:
-        # we need to create the umockdev testbed before launching D-BUS, so
-        # that all spawned gvfs daemons see it
-        if have_umockdev:
-            umockdev_testbed = UMockdev.Testbed.new()
+    # we need to create the umockdev testbed before launching D-BUS, so
+    # that all spawned gvfs daemons see it
+    if have_umockdev:
+        umockdev_testbed = UMockdev.Testbed.new()
 
-        temp_home = start_dbus()
+    temp_home = start_dbus()
     try:
         unittest.main(testRunner=unittest.TextTestRunner(stream=sys.stdout, verbosity=2))
     finally:
-        if not in_testbed:
-            dbus_daemon.terminate()
-            dbus_daemon.wait()
-            # it might take a while until the child processes terminate and
-            # release usage of the home dir, so try several times
-            timeout = 20
-            while timeout &amp;gt; 0:
-                try:
-                    shutil.rmtree(temp_home)
-                    break
-                except OSError as e:
-                    timeout -= 1
-                    time.sleep(0.1)
-                    if timeout &amp;lt;= 0:
-                        raise
+        dbus_daemon.terminate()
+        dbus_daemon.wait()
+        # it might take a while until the child processes terminate and
+        # release usage of the home dir, so try several times
+        timeout = 20
+        while timeout &amp;gt; 0:
+            try:
+                shutil.rmtree(temp_home)
+                break
+            except OSError as e:
+                timeout -= 1
+                time.sleep(0.1)
+                if timeout &amp;lt;= 0:
+                    raise
 
diff --git a/test/gvfs-testbed b/test/gvfs-testbed
index b21bf84..9c1bac9 100755
--- a/test/gvfs-testbed
+++ b/test/gvfs-testbed
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -150,7 +150,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; $UDISKSD --no-debug --replace &amp;amp;
 UDISKS_PID=\$!
 
 echo "Running commmand in testbed: \$ARGS"
-su -lc "export PATH=$PATH; export \\\`dbus-launch\\\`; export XDG_RUNTIME_DIR=/home/$CALLING_USER/run; \$ARGS; rc=\\\$?; kill \\\$DBUS_SESSION_BUS_PID; exit \\\$rc" $CALLING_USER || {
+su -lc "export PATH=$PATH; export XDG_RUNTIME_DIR=/home/$CALLING_USER/run; \$ARGS" $CALLING_USER || {
     RC=\$?
     echo "=== command failed, showing Samba log files ==="
     for f in /var/log/samba/log.*; do
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.

&lt;/pre&gt;</description>
    <dc:creator>Martin Pitt</dc:creator>
    <dc:date>2013-06-20T10:12:50</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725697">
    <title>[gvfs] gvfs-test: Support calling this in an unbuilt tree</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725697</link>
    <description>&lt;pre&gt;commit 4099005236ff64aad3cdf7d79bca5d8bd6741cfb
Author: Martin Pitt &amp;lt;martinpitt&amp;lt; at &amp;gt;gnome.org&amp;gt;
Date:   Fri Jun 14 15:56:09 2013 +0200

    gvfs-test: Support calling this in an unbuilt tree
    
    Instead of failing all over the place and complaining about a missing
    session.conf, run the tests against the installed gvfs.

 test/gvfs-test |   10 +++++++---
 1 files changed, 7 insertions(+), 3 deletions(-)
---
diff --git a/test/gvfs-test b/test/gvfs-test
index e5094d4..b8882db 100755
--- a/test/gvfs-test
+++ b/test/gvfs-test
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1692,7 +1692,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; def start_dbus():
     
     Return temporary XDG home directory.
     '''
-
     global dbus_daemon
 
     # use temporary config/data/runtime directories; NB that these need to be
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1704,10 +1703,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; def start_dbus():
     os.environ['XDG_CONFIG_HOME'] = os.path.join(temp_home, 'config')
     os.environ['XDG_DATA_HOME'] = os.path.join(temp_home, 'data')
 
-    # run local D-BUS
     if os.path.exists('session.conf'):
         dbus_conf = 'session.conf'
     else:
+        # for out-of-tree builds
         dbus_conf = os.path.join(os.path.dirname(__file__), 'session.conf')
     env = os.environ.copy()
     env['G_MESSAGES_DEBUG'] = 'all'
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1715,7 +1714,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; def start_dbus():
     env['GVFS_SMB_DEBUG'] = '6'
     env['GVFS_HTTP_DEBUG'] = 'all'
     env['LIBSMB_PROG'] = "nc localhost 1445"
-    argv = ['dbus-daemon', '--config-file', dbus_conf, '--print-address=1']
+    # run local D-BUS; if we run this in a built tree, use our config to pick
+    # up the built services, otherwise the standard session one
+    if os.path.exists(dbus_conf):
+        argv = ['dbus-daemon', '--config-file', dbus_conf, '--print-address=1']
+    else:
+        argv = ['dbus-daemon', '--session', '--print-address=1']
     if umockdev_testbed:
         argv.insert(0, 'umockdev-wrapper')
         # Python doesn't catch the setenv() from UMockdev.Testbed.new()
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.

&lt;/pre&gt;</description>
    <dc:creator>Martin Pitt</dc:creator>
    <dc:date>2013-06-20T10:12:45</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725696">
    <title>[gnome-shell/wip/paging] Make iconGrid with pagination mode</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725696</link>
    <description>&lt;pre&gt;commit c0d18c0511ef7dbf383d3b5b0cd693dec2330ffd
Author: Carlos Soriano &amp;lt;carlos.soriano89&amp;lt; at &amp;gt;gmail.com&amp;gt;
Date:   Thu Jun 20 12:11:19 2013 +0200

    Make iconGrid with pagination mode

 js/ui/appDisplay.js |   85 ++++++++++++++++++++++++------------------------
 js/ui/iconGrid.js   |   90 +++++++++++++++++++++++++++++---------------------
 2 files changed, 95 insertions(+), 80 deletions(-)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index 8c68c70..1f62b50 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -60,6 +60,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; const AlphabeticalView = new Lang.Class({
 
     _init: function() {
         this._grid = new IconGrid.IconGrid({ xAlign: St.Align.MIDDLE,
+                                             usePagination: true,
                                              columnLimit: MAX_COLUMNS });
 
         // Standard hack for ClutterBinLayout
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -156,37 +157,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; const FolderView = new Lang.Class({
     }
 });
 
-const AllViewLayout = new Lang.Class({
-    Name: 'AllViewLayout',
-    Extends: Clutter.BinLayout,
-
-    vfunc_get_preferred_height: function(container, forWidth) {
-        if(this.parentSize)
-            {
-            return this.parentSize;
-            }
-        global.log("Parent size " + this.parentSize);
-        let minBottom = 0;
-        let naturalBottom = 0;
-
-        for (let child = container.get_first_child();
-             child;
-             child = child.get_next_sibling()) {
-            let childY = child.y;
-            let [childMin, childNatural] = child.get_preferred_height(forWidth);
-
-            if (childMin + childY &amp;gt; minBottom)
-                minBottom = childMin + childY;
-
-            if (childNatural + childY &amp;gt; naturalBottom)
-                naturalBottom = childNatural + childY;
-        }
-        return [minBottom, naturalBottom];
-    }
-});
-
-const AppPage = new Lang.Class({
-    Name: 'AppPage',
+const AppPages = new Lang.Class({
+    Name: 'AppPages',
     Extends: AlphabeticalView,
    
     _init: function() {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -222,6 +194,30 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; const AppPage = new Lang.Class({
    
     addItem: function(item) {
         this._addItem(item);
+    },
+    
+    nPages: function() {
+        return this._grid.nPages();
+    },
+    
+    goToPreviousPage: function() {
+        this._grid.goToPreviousPage();
+    },
+    
+    goToNextPage: function() {
+        this._grid.goToNextPage();
+    },
+    
+    goToFirstPage: function() {
+        this._grid.goToFirstPage();
+    },
+    
+    currentPagePosition: function() {
+        return this._grid.currentPagePosition();
+    },
+    
+    setGridParentSize: function(size) {
+        this._grid._parentSize = size;
     }
 });
 const PaginationScrollActor = new Lang.Class({
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -230,10 +226,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; const PaginationScrollActor = new Lang.Class({
     
     _init: function() {
         this.parent();
-        this.expand_x = true;
         this._box = new St.BoxLayout({vertical: true});
-        this._page = new AppPage();
-        this._box.add_actor(this._page.actor);
+        this._pages = new AppPages();
+        this._box.add_actor(this._pages.actor);
         this.add_actor(this._box);
 
         this.connect('scroll-event', Lang.bind(this, this._onScroll));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -263,17 +258,23 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; const PaginationScrollActor = new Lang.Class({
         childBox.x2 = availWidth;
         childBox.y2 = availHeight;   
         
-        //Put parentSize in grid
-        this._page._grid._parentHeight = availHeight;
+        this._pages.setGridParentSize([availWidth, availHeight]);
 
         child.allocate(childBox, flags);
+        
+        if(this._pages.nPages &amp;gt; 0) {
+            this._pages.goToFirstPage();
+            this.vscroll.adjustment.set_value(this._pages.currentPagePosition()[1]);
+       }
     },
     
     goToNextPage: function() {
-        this.vscroll.adjustment.set_value(this._page._grid.goToNextPage());
+        this._pages.goToNextPage();
+        this.vscroll.adjustment.set_value(this._pages.currentPagePosition()[1]);
     },
     goToPreviousPage: function() {
-        this.vscroll.adjustment.set_value(this._page._grid.goToPreviousPage());
+        this._pages.goToPreviousPage();
+        this.vscroll.adjustment.set_value(this._pages.currentPagePosition()[1]);
     },
     
     _onScroll: function(actor, event) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -316,14 +317,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; const AllView = new Lang.Class({
     },
 
     addApp: function(app) {
-       let appIcon = this.actor._page.addItem(app);
+       let appIcon = this.actor._pages.addItem(app);
         /*if (appIcon)
             appIcon.actor.connect('key-focus-in',
                                   Lang.bind(this, this._ensureIconVisible));*/
     },
 
     addFolder: function(dir) {
-        let folderIcon = this.actor._page.addItem(dir);
+        let folderIcon = this.actor._pages.addItem(dir);
         /*if (folderIcon)
             folderIcon.actor.connect('key-focus-in',
                                      Lang.bind(this, this._ensureIconVisible));*/
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -356,11 +357,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; const AllView = new Lang.Class({
     },
    
     removeAll: function() {
-        this.actor._page.removeAll();
+        this.actor._pages.removeAll();
     },
 
     loadGrid: function() {
-        this.actor._page.loadGrid();
+        this.actor._pages.loadGrid();
     }
 });
 
diff --git a/js/ui/iconGrid.js b/js/ui/iconGrid.js
index 11a4bcf..7cd769a 100644
--- a/js/ui/iconGrid.js
+++ b/js/ui/iconGrid.js
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -177,12 +177,21 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; const IconGrid = new Lang.Class({
         params = Params.parse(params, { rowLimit: null,
                                         columnLimit: null,
                                         fillParent: false,
-                                        xAlign: St.Align.MIDDLE });
+                                        xAlign: St.Align.MIDDLE,
+                                        usePagination: false});
         this._rowLimit = params.rowLimit;
         this._colLimit = params.columnLimit;
         this._xAlign = params.xAlign;
         this._fillParent = params.fillParent;
-
+        this._usePagination = params.usePagination;
+        
+        if(this._usePagination) {
+            this._nPages = 0;
+            //Set this variable properly before getPreferredHeight function is called
+            this._parentSize = [0, 0];
+            this._currentPage = 0;
+            this._firstPagesItems = [];
+        }
         this.actor = new St.BoxLayout({ style_class: 'icon-grid',
                                         vertical: true });
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -196,8 +205,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; const IconGrid = new Lang.Class({
         this._grid.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
         this._grid.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
         this._grid.connect('allocate', Lang.bind(this, this._allocate));
-        this._currentPage = 0;
-        this._firstPagesItems = [];
+        
     },
 
     _getPreferredWidth: function (grid, forHeight, alloc) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -227,14 +235,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; const IconGrid = new Lang.Class({
     },
 
     _getPreferredHeight: function (grid, forWidth, alloc) {
-        
         if (this._fillParent)
             // Ignore all size requests of children and request a size of 0;
             // later we'll allocate as many children as fit the parent
             return;
 
         let children = this._getVisibleChildren();
-        global.log("Num children visible"  + children.length);
         let nColumns, spacing;
         if (forWidth &amp;lt; 0) {
             nColumns = children.length;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -242,7 +248,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; const IconGrid = new Lang.Class({
         } else {
             [nColumns, , spacing] = this._computeLayout(forWidth);
         }
-        this._spacePerRow = this._vItemSize + spacing;
 
         let nRows;
         if (nColumns &amp;gt; 0)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -254,15 +259,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; const IconGrid = new Lang.Class({
         let totalSpacing = Math.max(0, nRows - 1) * spacing;
         let height = nRows * this._vItemSize + totalSpacing;
         
-        if(this._parentHeight) {
+        if(this._usePagination) {
             
-            let rowsPerPage = Math.floor(this._parentHeight / this._spacePerRow);            
-            this._nPages = Math.ceil(nRows / rowsPerPage);
-            this._spaceBetweenPages = this._parentHeight - (rowsPerPage * (this._vItemSize + spacing));
+            this._spacePerRow = this._vItemSize + spacing;
+            this._rowsPerPage = Math.floor(this._parentSize[1] / this._spacePerRow);            
+            this._nPages = Math.ceil(nRows / this._rowsPerPage);
+            this._spaceBetweenPages = this._parentSize[1] - (this._rowsPerPage * (this._vItemSize + spacing));
             let spaceBetweenPagesTotal = this._spaceBetweenPages * (this._nPages);
-            this._childrenPerPage = nColumns * rowsPerPage;
-            alloc.min_size = rowsPerPage * this._spacePerRow * this._nPages + spaceBetweenPagesTotal;
-            alloc.natural_size = rowsPerPage * this._spacePerRow * this._nPages + spaceBetweenPagesTotal;
+            this._childrenPerPage = nColumns * this._rowsPerPage;
+            alloc.min_size = this._rowsPerPage * this._spacePerRow * this._nPages + spaceBetweenPagesTotal;
+            alloc.natural_size = this._rowsPerPage * this._spacePerRow * this._nPages + spaceBetweenPagesTotal;
             return;
         }
         alloc.min_size = height;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -280,8 +286,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; const IconGrid = new Lang.Class({
         let children = this._getVisibleChildren();
         let availWidth = box.x2 - box.x1;
         let availHeight = box.y2 - box.y1;
-
         let [nColumns, usedWidth, spacing] = this._computeLayout(availWidth);
+        if(this._usePagination) {
+            //Recalculate the space between pages with the new spacing
+            this._spaceBetweenPages = this._parentSize[1] - (this._rowsPerPage * (this._vItemSize + spacing));
+        }
 
         let leftPadding;
         switch(this._xAlign) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -305,17 +314,19 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; const IconGrid = new Lang.Class({
         }
         for (let i = 0; i &amp;lt; children.length; i++) {
             let childBox = this._calculateChildrenBox(children[i], x, y);
-            if (this._rowLimit &amp;amp;&amp;amp; rowIndex &amp;gt;= this._rowLimit ||
-                    this._fillParent &amp;amp;&amp;amp; childBox.y2 &amp;gt; availHeight) {
+            if(!this._usePagination) {
+                if (this._rowLimit &amp;amp;&amp;amp; rowIndex &amp;gt;= this._rowLimit ||
+                        this._fillParent &amp;amp;&amp;amp; childBox.y2 &amp;gt; availHeight) {
                     this._grid.set_skip_paint(children[i], true);
                 } else {
                     children[i].allocate(childBox, flags);
                     this._grid.set_skip_paint(children[i], false);
                 }
+            } else {
+                children[i].allocate(childBox, flags);
+                this._grid.set_skip_paint(children[i], false);
+            }
             
-            
-            //children[i].allocate(childBox, flags);
-
             columnIndex++;
             if (columnIndex == nColumns) {
                 columnIndex = 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -324,10 +335,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; const IconGrid = new Lang.Class({
 
             if (columnIndex == 0) {
                 y += this._vItemSize + spacing;
-                if((i + 1) % this._childrenPerPage == 0) {
-                    y+= this._spaceBetweenPages;
-                    if(i &amp;lt; children.length) {
-                        this._firstPagesItems.push(children[i+1]);
+                if(this._usePagination) {
+                    if((i + 1) % this._childrenPerPage == 0) {
+                        y+= this._spaceBetweenPages;
+                        if(i &amp;lt; children.length) {
+                            this._firstPagesItems.push(children[i+1]);
+                        }
                     }
                 }
                 x = box.x1 + leftPadding;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -422,28 +435,29 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; const IconGrid = new Lang.Class({
     nPages: function() {
         return this._nPages;
     },
+
+    currentPagePosition: function() {
+        let childBox = this._firstPagesItems[this._currentPage].get_allocation_box();
+        return [childBox.x1, childBox.y1];
+    },
     
     goToNextPage: function() {
-        if(this._nPages == 0) {
+        if(!this._nPages)
             return;
-        }
-        if(this._currentPage + 1 &amp;lt; this._firstPagesItems.length) {
+        if(this._currentPage + 1 &amp;lt; this._firstPagesItems.length)
             this._currentPage++;
-        }
-        let childBox = this._firstPagesItems[this._currentPage].get_allocation_box();
-        let scrollY = childBox.y1;
-        return scrollY;
     },
     
     goToPreviousPage: function() {
-        if(this._nPages == 0) {
+        if(!this._nPages)
             return;
-        }
-        if(this._currentPage - 1 &amp;gt; -1) {
+        if(this._currentPage &amp;gt; 0)
             this._currentPage--;
-        }
-        let childBox = this._firstPagesItems[this._currentPage].get_allocation_box();
-        let scrollY = childBox.y1;
-        return scrollY;
+    },
+    
+    goToFirstPage: function() {
+        if(!this._nPages)
+            return;
+        this._currentPage = 0;
     }
 });
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.

&lt;/pre&gt;</description>
    <dc:creator>Carlos Soriano</dc:creator>
    <dc:date>2013-06-20T10:11:45</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725695">
    <title>[glib] Updated Norwegian bokmål translation</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725695</link>
    <description>&lt;pre&gt;commit 69afaf6905bf6d9e6808a1f18d410ea810e37435
Author: Kjartan Maraas &amp;lt;kmaraas&amp;lt; at &amp;gt;gnome.org&amp;gt;
Date:   Thu Jun 20 11:46:58 2013 +0200

    Updated Norwegian bokmål translation

 po/nb.po |  286 +++++++++++++++++++++++++++++--------------------------------
 1 files changed, 136 insertions(+), 150 deletions(-)
---
diff --git a/po/nb.po b/po/nb.po
index e85237b..ffa07fc 100644
--- a/po/nb.po
+++ b/po/nb.po
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -8,8 +8,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgid ""
 msgstr ""
 "Project-Id-Version: glib 2.36.x\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-05-20 14:50+0200\n"
-"PO-Revision-Date: 2013-05-20 14:51+0200\n"
+"POT-Creation-Date: 2013-06-20 11:45+0200\n"
+"PO-Revision-Date: 2013-06-20 11:46+0200\n"
 "Last-Translator: Kjartan Maraas &amp;lt;kmaraas&amp;lt; at &amp;gt;gnome.org&amp;gt;\n"
 "Language-Team: Norwegian bokmål &amp;lt;i18n-nb&amp;lt; at &amp;gt;lister.ping.uio.no&amp;gt;\n"
 "Language:\n"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -47,7 +47,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Avkorting er ikke støttet på grunnstrøm"
 
 #: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885
 #: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1421
-#: ../gio/glocalfile.c:2172 ../gio/gsimpleasyncresult.c:843
+#: ../gio/glocalfile.c:2177 ../gio/gsimpleasyncresult.c:843
 #: ../gio/gsimpleasyncresult.c:869
 #, c-format
 msgid "Operation was cancelled"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -623,8 +623,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr ""
 #: ../gio/gdbusmessage.c:2705
 #, c-format
 msgid ""
-"Message body has type signature '%s' but signature in the header field is '"
-"%s'"
+"Message body has type signature '%s' but signature in the header field is "
+"'%s'"
 msgstr ""
 "Meldingskroppen har signaturtype «%s», men signaturen i topptekstfeltet et "
 "«%s»"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -719,13 +719,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr ""
 "Bruk «%s COMMAND --help» for å få hjelp om hver kommando.\n"
 
 #: ../gio/gdbus-tool.c:166 ../gio/gdbus-tool.c:222 ../gio/gdbus-tool.c:294
-#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1020
-#: ../gio/gdbus-tool.c:1453
+#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1022
+#: ../gio/gdbus-tool.c:1456
 #, c-format
 msgid "Error: %s\n"
 msgstr "Feil: %s\n"
 
-#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1469
+#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1472
 #, c-format
 msgid "Error parsing introspection XML: %s\n"
 msgstr "Feil under tolking av introspeksjons-XML: %s\n"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -792,8 +792,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Navn på signal og grensesnitt"
 msgid "Emit a signal."
 msgstr "Send ut et signal."
 
-#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1559
-#: ../gio/gdbus-tool.c:1791
+#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1562
+#: ../gio/gdbus-tool.c:1794
 #, c-format
 msgid "Error connecting: %s\n"
 msgstr "Feil under tilkobling: %s\n"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -803,8 +803,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Feil under tilkobling: %s\n"
 msgid "Error: object path not specified.\n"
 msgstr "Feil: Objektsti er ikke oppgitt.\n"
 
-#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1617
-#: ../gio/gdbus-tool.c:1850
+#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1620
+#: ../gio/gdbus-tool.c:1853
 #, c-format
 msgid "Error: %s is not a valid object path\n"
 msgstr "Feil: %s er ikke en gyldig objektsti\n"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -864,12 +864,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Tidsavbrudd i sekunder"
 msgid "Invoke a method on a remote object."
 msgstr "Kjør en metode på et eksternt objekt."
 
-#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1578 ../gio/gdbus-tool.c:1810
+#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1581 ../gio/gdbus-tool.c:1813
 #, c-format
 msgid "Error: Destination is not specified\n"
 msgstr "Feil: Mål er ikke oppgitt\n"
 
-#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1597
+#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1600
 #, c-format
 msgid "Error: Object path is not specified\n"
 msgstr "Feil: Objektsti er ikke oppgitt\n"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -889,74 +889,74 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Feil: metodenavn «%s» er ugyldig\n"
 msgid "Error parsing parameter %d of type '%s': %s\n"
 msgstr "Feil under tolking av parameter %d av type «%s»: %s\n"
 
-#: ../gio/gdbus-tool.c:1416
+#: ../gio/gdbus-tool.c:1419
 msgid "Destination name to introspect"
 msgstr "Målnavn som skal inspiseres"
 
-#: ../gio/gdbus-tool.c:1417
+#: ../gio/gdbus-tool.c:1420
 msgid "Object path to introspect"
 msgstr "Objektsti som skal inspiseres"
 
-#: ../gio/gdbus-tool.c:1418
+#: ../gio/gdbus-tool.c:1421
 msgid "Print XML"
 msgstr "Skriv ut XML"
 
-#: ../gio/gdbus-tool.c:1419
+#: ../gio/gdbus-tool.c:1422
 msgid "Introspect children"
 msgstr "Bruk introspeksjon for barn"
 
-#: ../gio/gdbus-tool.c:1420
+#: ../gio/gdbus-tool.c:1423
 msgid "Only print properties"
 msgstr "Skriv kun ut egenskaper"
 
-#: ../gio/gdbus-tool.c:1511
+#: ../gio/gdbus-tool.c:1514
 msgid "Introspect a remote object."
 msgstr "Inspiser et eksternt objekt."
 
-#: ../gio/gdbus-tool.c:1709
+#: ../gio/gdbus-tool.c:1712
 msgid "Destination name to monitor"
 msgstr "Navn på mål som skal overvåkes"
 
-#: ../gio/gdbus-tool.c:1710
+#: ../gio/gdbus-tool.c:1713
 msgid "Object path to monitor"
 msgstr "Objektsti som skal overvåkes"
 
-#: ../gio/gdbus-tool.c:1743
+#: ../gio/gdbus-tool.c:1746
 msgid "Monitor a remote object."
 msgstr "Overvåk et eksternt objekt."
 
-#: ../gio/gdesktopappinfo.c:628 ../gio/gwin32appinfo.c:221
+#: ../gio/gdesktopappinfo.c:653 ../gio/gwin32appinfo.c:221
 msgid "Unnamed"
 msgstr "Uten navn"
 
-#: ../gio/gdesktopappinfo.c:1041
+#: ../gio/gdesktopappinfo.c:1066
 msgid "Desktop file didn't specify Exec field"
 msgstr "Desktop-filen hadde ingen verdi i Exec-feltet"
 
-#: ../gio/gdesktopappinfo.c:1329
+#: ../gio/gdesktopappinfo.c:1351
 msgid "Unable to find terminal required for application"
 msgstr "Kan ikke finne terminalen som kreves for programmet"
 
-#: ../gio/gdesktopappinfo.c:1631
+#: ../gio/gdesktopappinfo.c:1754
 #, c-format
 msgid "Can't create user application configuration folder %s: %s"
 msgstr "Kan ikke opprette konfigurasjonsmappe %s for brukers program: %s"
 
-#: ../gio/gdesktopappinfo.c:1635
+#: ../gio/gdesktopappinfo.c:1758
 #, c-format
 msgid "Can't create user MIME configuration folder %s: %s"
 msgstr "Kan ikke opprette brukers konfigurasjonsmappe %s for MIME: %s"
 
-#: ../gio/gdesktopappinfo.c:1875 ../gio/gdesktopappinfo.c:1899
+#: ../gio/gdesktopappinfo.c:1998 ../gio/gdesktopappinfo.c:2022
 msgid "Application information lacks an identifier"
 msgstr "Programinformasjonen mangler en identifikator"
 
-#: ../gio/gdesktopappinfo.c:2131
+#: ../gio/gdesktopappinfo.c:2254
 #, c-format
 msgid "Can't create user desktop file %s"
 msgstr "Kan ikke opprette brukers desktop-fil %s"
 
-#: ../gio/gdesktopappinfo.c:2255
+#: ../gio/gdesktopappinfo.c:2378
 #, c-format
 msgid "Custom definition for %s"
 msgstr "Egendefinert definisjon for %s"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1013,14 +1013,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Feil antall tegn (%d) i GEmblemedIcon-koding"
 msgid "Expected a GEmblem for GEmblemedIcon"
 msgstr "Ventet et GEmblem for GEmblemedIcon"
 
-#: ../gio/gfile.c:937 ../gio/gfile.c:1176 ../gio/gfile.c:1315
-#: ../gio/gfile.c:1555 ../gio/gfile.c:1610 ../gio/gfile.c:1668
-#: ../gio/gfile.c:1752 ../gio/gfile.c:1809 ../gio/gfile.c:1873
-#: ../gio/gfile.c:1928 ../gio/gfile.c:3489 ../gio/gfile.c:3544
-#: ../gio/gfile.c:3752 ../gio/gfile.c:3794 ../gio/gfile.c:4260
-#: ../gio/gfile.c:4672 ../gio/gfile.c:4757 ../gio/gfile.c:4847
-#: ../gio/gfile.c:4944 ../gio/gfile.c:5031 ../gio/gfile.c:5132
-#: ../gio/gfile.c:7311 ../gio/gfile.c:7401 ../gio/gfile.c:7485
+#: ../gio/gfile.c:938 ../gio/gfile.c:1177 ../gio/gfile.c:1316
+#: ../gio/gfile.c:1556 ../gio/gfile.c:1611 ../gio/gfile.c:1669
+#: ../gio/gfile.c:1753 ../gio/gfile.c:1810 ../gio/gfile.c:1874
+#: ../gio/gfile.c:1929 ../gio/gfile.c:3559 ../gio/gfile.c:3614
+#: ../gio/gfile.c:3822 ../gio/gfile.c:3864 ../gio/gfile.c:4330
+#: ../gio/gfile.c:4742 ../gio/gfile.c:4827 ../gio/gfile.c:4917
+#: ../gio/gfile.c:5014 ../gio/gfile.c:5101 ../gio/gfile.c:5202
+#: ../gio/gfile.c:7381 ../gio/gfile.c:7471 ../gio/gfile.c:7555
 #: ../gio/win32/gwinhttpfile.c:439
 msgid "Operation not supported"
 msgstr "Operasjonen er ikke støttet"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1035,83 +1035,83 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Operasjonen er ikke støttet"
 #. Translators: This is an error message when trying to find
 #. * the enclosing (user visible) mount of a file, but none
 #. * exists.
-#: ../gio/gfile.c:1439 ../gio/glocalfile.c:1096 ../gio/glocalfile.c:1107
-#: ../gio/glocalfile.c:1120
+#: ../gio/gfile.c:1440 ../gio/glocalfile.c:1101 ../gio/glocalfile.c:1112
+#: ../gio/glocalfile.c:1125
 msgid "Containing mount does not exist"
 msgstr "Omsluttende monteringspunkt finnes ikke"
 
-#: ../gio/gfile.c:2494 ../gio/glocalfile.c:2328
+#: ../gio/gfile.c:2495 ../gio/glocalfile.c:2333
 msgid "Can't copy over directory"
 msgstr "Kan ikke kopiere over katalog"
 
-#: ../gio/gfile.c:2554
+#: ../gio/gfile.c:2555
 msgid "Can't copy directory over directory"
 msgstr "Kan ikke kopiere katalog over katalog"
 
-#: ../gio/gfile.c:2562 ../gio/glocalfile.c:2337
+#: ../gio/gfile.c:2563 ../gio/glocalfile.c:2342
 msgid "Target file exists"
 msgstr "Målfilen eksisterer"
 
-#: ../gio/gfile.c:2581
+#: ../gio/gfile.c:2582
 msgid "Can't recursively copy directory"
 msgstr "Kan ikke kopiere katalog rekursivt"
 
-#: ../gio/gfile.c:2845
+#: ../gio/gfile.c:2864
 msgid "Splice not supported"
 msgstr "Splice er ikke støttet"
 
-#: ../gio/gfile.c:2849
+#: ../gio/gfile.c:2868
 #, c-format
 msgid "Error splicing file: %s"
 msgstr "Feil ved bruk av  splice(2) på fil: %s"
 
-#: ../gio/gfile.c:2980
+#: ../gio/gfile.c:2999
 msgid "Copy (reflink/clone) between mounts is not supported"
 msgstr "Kopiering (reflink/clone) mellom monteringspunkter er ikke støttet"
 
-#: ../gio/gfile.c:2984
+#: ../gio/gfile.c:3003
 msgid "Copy (reflink/clone) is not supported or invalid"
 msgstr "Kopiering (reflink/clone) er ikke støttet eller ugyldig"
 
-#: ../gio/gfile.c:2989
+#: ../gio/gfile.c:3008
 msgid "Copy (reflink/clone) is not supported or didn't work"
 msgstr "Kopiering (reflink/clone) er ikke støttet eller virket ikke"
 
-#: ../gio/gfile.c:3049
+#: ../gio/gfile.c:3071
 msgid "Can't copy special file"
 msgstr "Kan ikke kopiere spesiell fil"
 
-#: ../gio/gfile.c:3742
+#: ../gio/gfile.c:3812
 msgid "Invalid symlink value given"
 msgstr "Ugyldig verdi oppgitt for symbolsk lenke"
 
-#: ../gio/gfile.c:3904
+#: ../gio/gfile.c:3974
 msgid "Trash not supported"
 msgstr "Papirkurv er ikke støttet"
 
-#: ../gio/gfile.c:4017
+#: ../gio/gfile.c:4087
 #, c-format
 msgid "File names cannot contain '%c'"
 msgstr "Filnavn kan ikke inneholde «%c»"
 
-#: ../gio/gfile.c:6434 ../gio/gvolume.c:365
+#: ../gio/gfile.c:6504 ../gio/gvolume.c:365
 msgid "volume doesn't implement mount"
 msgstr "volumet implementerer ikke montering"
 
-#: ../gio/gfile.c:6543
+#: ../gio/gfile.c:6613
 msgid "No application is registered as handling this file"
 msgstr "Ingen program registrert for å håndtere denne filen"
 
-#: ../gio/gfileenumerator.c:204
+#: ../gio/gfileenumerator.c:218
 msgid "Enumerator is closed"
 msgstr "Enumerator er lukket"
 
-#: ../gio/gfileenumerator.c:211 ../gio/gfileenumerator.c:270
-#: ../gio/gfileenumerator.c:367 ../gio/gfileenumerator.c:467
+#: ../gio/gfileenumerator.c:225 ../gio/gfileenumerator.c:284
+#: ../gio/gfileenumerator.c:384 ../gio/gfileenumerator.c:484
 msgid "File enumerator has outstanding operation"
 msgstr "Filenumerator har utestående operasjon"
 
-#: ../gio/gfileenumerator.c:358 ../gio/gfileenumerator.c:458
+#: ../gio/gfileenumerator.c:375 ../gio/gfileenumerator.c:475
 msgid "File enumerator is already closed"
 msgstr "Filenumerator er allerede lukket"
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1448,13 +1448,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "&amp;lt;schema id='%s'&amp;gt; allerede oppgitt"
 
 #: ../gio/glib-compile-schemas.c:1129
 #, c-format
-msgid "&amp;lt;schema id='%s'&amp;gt; extends not-yet-existing schema '%s'"
-msgstr "&amp;lt;schema id='%s'&amp;gt; utvider et ikke-eksisterende schema '%s'"
+msgid "&amp;lt;schema id='%s'&amp;gt; extends not yet existing schema '%s'"
+msgstr "&amp;lt;schema id='%s'&amp;gt; utvider et schema som ikke eksisterer ennå '%s'"
 
 #: ../gio/glib-compile-schemas.c:1145
 #, c-format
-msgid "&amp;lt;schema id='%s'&amp;gt; is list of not-yet-existing schema '%s'"
-msgstr "&amp;lt;schema id='%s'&amp;gt; er en liste med ikke-eksisterende schema «%s»"
+msgid "&amp;lt;schema id='%s'&amp;gt; is list of not yet existing schema '%s'"
+msgstr "&amp;lt;schema id='%s'&amp;gt; er en liste med schema som ikke eksisterer ennå «%s»"
 
 #: ../gio/glib-compile-schemas.c:1153
 #, c-format
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1618,119 +1618,117 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "fjernet eksisterende utdatafil.\n"
 msgid "Unable to find default local directory monitor type"
 msgstr "Klarte ikke å finne forvalgt type overvåker for lokal katalog"
 
-#: ../gio/glocalfile.c:597 ../gio/win32/gwinhttpfile.c:422
+#: ../gio/glocalfile.c:602 ../gio/win32/gwinhttpfile.c:422
 #, c-format
 msgid "Invalid filename %s"
 msgstr "Ugyldig filnavn %s"
 
-#: ../gio/glocalfile.c:974
+#: ../gio/glocalfile.c:979
 #, c-format
 msgid "Error getting filesystem info: %s"
 msgstr "Feil under lesing av informasjon om filsystem: %s"
 
-#: ../gio/glocalfile.c:1142
+#: ../gio/glocalfile.c:1147
 msgid "Can't rename root directory"
 msgstr "Kan ikke endre navn på rotkatalogen"
 
-#: ../gio/glocalfile.c:1162 ../gio/glocalfile.c:1188
+#: ../gio/glocalfile.c:1167 ../gio/glocalfile.c:1193
 #, c-format
 msgid "Error renaming file: %s"
 msgstr "Feil under endring av navn på fil: %s"
 
-#: ../gio/glocalfile.c:1171
+#: ../gio/glocalfile.c:1176
 msgid "Can't rename file, filename already exists"
 msgstr "Kan ikke endre navn på filen. Filnavnet eksisterer allerede"
 
-#: ../gio/glocalfile.c:1184 ../gio/glocalfile.c:2201 ../gio/glocalfile.c:2230
-#: ../gio/glocalfile.c:2390 ../gio/glocalfileoutputstream.c:575
-#: ../gio/glocalfileoutputstream.c:628 ../gio/glocalfileoutputstream.c:673
-#: ../gio/glocalfileoutputstream.c:1161
+#: ../gio/glocalfile.c:1189 ../gio/glocalfile.c:2206 ../gio/glocalfile.c:2235
+#: ../gio/glocalfile.c:2395 ../gio/glocalfileoutputstream.c:558
 msgid "Invalid filename"
 msgstr "Ugyldig filnavn"
 
-#: ../gio/glocalfile.c:1351 ../gio/glocalfile.c:1375
+#: ../gio/glocalfile.c:1356 ../gio/glocalfile.c:1380
 msgid "Can't open directory"
 msgstr "Kan ikke åpne mappe"
 
-#: ../gio/glocalfile.c:1359
+#: ../gio/glocalfile.c:1364
 #, c-format
 msgid "Error opening file: %s"
 msgstr "Feil under åpning av fil: %s"
 
-#: ../gio/glocalfile.c:1500
+#: ../gio/glocalfile.c:1505
 #, c-format
 msgid "Error removing file: %s"
 msgstr "Feil ved fjerning av fil: %s"
 
-#: ../gio/glocalfile.c:1880
+#: ../gio/glocalfile.c:1885
 #, c-format
 msgid "Error trashing file: %s"
 msgstr "Feil ved plassering av fil i papirkurv: %s"
 
-#: ../gio/glocalfile.c:1903
+#: ../gio/glocalfile.c:1908
 #, c-format
 msgid "Unable to create trash dir %s: %s"
 msgstr "Kan ikke legge katalog %s i papirkurven: %s"
 
-#: ../gio/glocalfile.c:1924
+#: ../gio/glocalfile.c:1929
 msgid "Unable to find toplevel directory for trash"
 msgstr "Kan ikke finne toppnivå for papirkurv"
 
-#: ../gio/glocalfile.c:2003 ../gio/glocalfile.c:2023
+#: ../gio/glocalfile.c:2008 ../gio/glocalfile.c:2028
 msgid "Unable to find or create trash directory"
 msgstr "Kan ikke finne eller opprette mappe for papirkurv"
 
-#: ../gio/glocalfile.c:2057
+#: ../gio/glocalfile.c:2062
 #, c-format
 msgid "Unable to create trashing info file: %s"
 msgstr "Kan ikke opprette informasjonsfil for papirkurv: %s"
 
-#: ../gio/glocalfile.c:2086 ../gio/glocalfile.c:2091 ../gio/glocalfile.c:2171
-#: ../gio/glocalfile.c:2178
+#: ../gio/glocalfile.c:2091 ../gio/glocalfile.c:2096 ../gio/glocalfile.c:2176
+#: ../gio/glocalfile.c:2183
 #, c-format
 msgid "Unable to trash file: %s"
 msgstr "Kan ikke legge fil i papirkurven: %s"
 
-#: ../gio/glocalfile.c:2179 ../glib/gregex.c:280
+#: ../gio/glocalfile.c:2184 ../glib/gregex.c:280
 msgid "internal error"
 msgstr "intern feil"
 
-#: ../gio/glocalfile.c:2205
+#: ../gio/glocalfile.c:2210
 #, c-format
 msgid "Error creating directory: %s"
 msgstr "Feil under oppretting av katalog: %s"
 
-#: ../gio/glocalfile.c:2234
+#: ../gio/glocalfile.c:2239
 #, c-format
 msgid "Filesystem does not support symbolic links"
 msgstr "Filsystemet støtter ikke symbolske lenker"
 
-#: ../gio/glocalfile.c:2238
+#: ../gio/glocalfile.c:2243
 #, c-format
 msgid "Error making symbolic link: %s"
 msgstr "Feil ved oppretting av symbolsk lenke: %s"
 
-#: ../gio/glocalfile.c:2300 ../gio/glocalfile.c:2394
+#: ../gio/glocalfile.c:2305 ../gio/glocalfile.c:2399
 #, c-format
 msgid "Error moving file: %s"
 msgstr "Feil under flytting av fil: %s"
 
-#: ../gio/glocalfile.c:2323
+#: ../gio/glocalfile.c:2328
 msgid "Can't move directory over directory"
 msgstr "Kan ikke flytte katalog over katalog"
 
-#: ../gio/glocalfile.c:2350 ../gio/glocalfileoutputstream.c:959
-#: ../gio/glocalfileoutputstream.c:973 ../gio/glocalfileoutputstream.c:988
-#: ../gio/glocalfileoutputstream.c:1004 ../gio/glocalfileoutputstream.c:1018
+#: ../gio/glocalfile.c:2355 ../gio/glocalfileoutputstream.c:934
+#: ../gio/glocalfileoutputstream.c:948 ../gio/glocalfileoutputstream.c:963
+#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:993
 msgid "Backup file creation failed"
 msgstr "Oppretting av sikkerhetskopi feilet"
 
-#: ../gio/glocalfile.c:2369
+#: ../gio/glocalfile.c:2374
 #, c-format
 msgid "Error removing target file: %s"
 msgstr "Feil under fjerning av målfil: %s"
 
-#: ../gio/glocalfile.c:2383
+#: ../gio/glocalfile.c:2388
 msgid "Move between mounts not supported"
 msgstr "Flytting mellom monteringspunkter er ikke støttet"
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1755,7 +1753,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Feil under setting av utvidet attributt «%s»: %s"
 msgid " (invalid encoding)"
 msgstr " (ugyldig koding)"
 
-#: ../gio/glocalfileinfo.c:1736 ../gio/glocalfileoutputstream.c:837
+#: ../gio/glocalfileinfo.c:1736 ../gio/glocalfileoutputstream.c:812
 #, c-format
 msgid "Error when getting information for file '%s': %s"
 msgstr "Feil ved henting av informasjon for fil «%s»: %s"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1828,20 +1826,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "SELinux er ikke slått på på dette systemet"
 msgid "Setting attribute %s not supported"
 msgstr "Støtter ikke å sette attributt %s"
 
-#: ../gio/glocalfileinputstream.c:186 ../gio/glocalfileoutputstream.c:726
+#: ../gio/glocalfileinputstream.c:186 ../gio/glocalfileoutputstream.c:703
 #, c-format
 msgid "Error reading from file: %s"
 msgstr "Feil under lesing fra fil: %s"
 
 #: ../gio/glocalfileinputstream.c:217 ../gio/glocalfileinputstream.c:229
-#: ../gio/glocalfileinputstream.c:336 ../gio/glocalfileoutputstream.c:464
-#: ../gio/glocalfileoutputstream.c:1036
+#: ../gio/glocalfileinputstream.c:336 ../gio/glocalfileoutputstream.c:465
+#: ../gio/glocalfileoutputstream.c:1011
 #, c-format
 msgid "Error seeking in file: %s"
 msgstr "Feil under søking i fil: %s"
 
-#: ../gio/glocalfileinputstream.c:258 ../gio/glocalfileoutputstream.c:254
-#: ../gio/glocalfileoutputstream.c:348
+#: ../gio/glocalfileinputstream.c:258 ../gio/glocalfileoutputstream.c:255
+#: ../gio/glocalfileoutputstream.c:349
 #, c-format
 msgid "Error closing file: %s"
 msgstr "Feil under lukking av fil: %s"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1850,52 +1848,51 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Feil under lukking av fil: %s"
 msgid "Unable to find default local file monitor type"
 msgstr "Kan ikke finne forvalgt lokal filovervåkingstype"
 
-#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:234
-#: ../gio/glocalfileoutputstream.c:747
+#: ../gio/glocalfileoutputstream.c:203 ../gio/glocalfileoutputstream.c:235
+#: ../gio/glocalfileoutputstream.c:724
 #, c-format
 msgid "Error writing to file: %s"
 msgstr "Feil under skriving til fil: %s"
 
-#: ../gio/glocalfileoutputstream.c:281
+#: ../gio/glocalfileoutputstream.c:282
 #, c-format
 msgid "Error removing old backup link: %s"
 msgstr "Feil ved fjerning av gammel sikkerhetskopi av lenke: %s"
 
-#: ../gio/glocalfileoutputstream.c:295 ../gio/glocalfileoutputstream.c:308
+#: ../gio/glocalfileoutputstream.c:296 ../gio/glocalfileoutputstream.c:309
 #, c-format
 msgid "Error creating backup copy: %s"
 msgstr "Feil under oppretting av sikkerhetskopi: %s"
 
-#: ../gio/glocalfileoutputstream.c:326
+#: ../gio/glocalfileoutputstream.c:327
 #, c-format
 msgid "Error renaming temporary file: %s"
 msgstr "Feil ved endring av navn på midlertidig fil: %s"
 
-#: ../gio/glocalfileoutputstream.c:510 ../gio/glocalfileoutputstream.c:1087
+#: ../gio/glocalfileoutputstream.c:511 ../gio/glocalfileoutputstream.c:1062
 #, c-format
 msgid "Error truncating file: %s"
 msgstr "Feil under avkorting av fil: «%s»"
 
-#: ../gio/glocalfileoutputstream.c:581 ../gio/glocalfileoutputstream.c:634
-#: ../gio/glocalfileoutputstream.c:679 ../gio/glocalfileoutputstream.c:819
-#: ../gio/glocalfileoutputstream.c:1068 ../gio/glocalfileoutputstream.c:1167
+#: ../gio/glocalfileoutputstream.c:564 ../gio/glocalfileoutputstream.c:794
+#: ../gio/glocalfileoutputstream.c:1043
 #, c-format
 msgid "Error opening file '%s': %s"
 msgstr "Feil under åpning av fil «%s»: %s"
 
-#: ../gio/glocalfileoutputstream.c:850
+#: ../gio/glocalfileoutputstream.c:825
 msgid "Target file is a directory"
 msgstr "Målfilen er en katalog"
 
-#: ../gio/glocalfileoutputstream.c:855
+#: ../gio/glocalfileoutputstream.c:830
 msgid "Target file is not a regular file"
 msgstr "Målfilen er ikke en vanlig fil"
 
-#: ../gio/glocalfileoutputstream.c:867
+#: ../gio/glocalfileoutputstream.c:842
 msgid "The file was externally modified"
 msgstr "Filen ble endret eksternt"
 
-#: ../gio/glocalfileoutputstream.c:1052
+#: ../gio/glocalfileoutputstream.c:1027
 #, c-format
 msgid "Error removing old file: %s"
 msgstr "Feil ved fjerning av gammel fil: %s"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2730,51 +2727,55 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr ""
 msgid "The password entered is incorrect."
 msgstr "Oppgitt passord er ikke korrekt."
 
-#: ../gio/gunixconnection.c:159 ../gio/gunixconnection.c:548
+#: ../gio/gunixconnection.c:159 ../gio/gunixconnection.c:554
 #, c-format
 msgid "Expecting 1 control message, got %d"
-msgstr "Ventet 1 kontrollmelding, fikk %d"
+msgid_plural "Expecting 1 control message, got %d"
+msgstr[0] "Ventet 1 kontrollmelding, fikk %d"
+msgstr[1] "Ventet 1 kontrollmelding, fikk %d"
 
-#: ../gio/gunixconnection.c:172 ../gio/gunixconnection.c:558
+#: ../gio/gunixconnection.c:175 ../gio/gunixconnection.c:566
 msgid "Unexpected type of ancillary data"
 msgstr "Uventet type data"
 
-#: ../gio/gunixconnection.c:190
+#: ../gio/gunixconnection.c:193
 #, c-format
 msgid "Expecting one fd, but got %d\n"
-msgstr "Ventet en fd, men fikk %d\n"
+msgid_plural "Expecting one fd, but got %d\n"
+msgstr[0] "Ventet en fd, men fikk %d\n"
+msgstr[1] "Ventet en fd, men fikk %d\n"
 
-#: ../gio/gunixconnection.c:206
+#: ../gio/gunixconnection.c:212
 msgid "Received invalid fd"
 msgstr "Mottok ugyldig fd"
 
-#: ../gio/gunixconnection.c:342
+#: ../gio/gunixconnection.c:348
 msgid "Error sending credentials: "
 msgstr "Feil ved sending av påloggingsinformasjon: "
 
-#: ../gio/gunixconnection.c:490
+#: ../gio/gunixconnection.c:496
 #, c-format
 msgid "Error checking if SO_PASSCRED is enabled for socket: %s"
 msgstr "Feil under sjekk om SO_PASSCRED er slått på for plugg: %s"
 
-#: ../gio/gunixconnection.c:505
+#: ../gio/gunixconnection.c:511
 #, c-format
 msgid "Error enabling SO_PASSCRED: %s"
 msgstr "Feil under forsøk på å slå på SO_PASSCRED: %s"
 
-#: ../gio/gunixconnection.c:534
+#: ../gio/gunixconnection.c:540
 msgid ""
 "Expecting to read a single byte for receiving credentials but read zero bytes"
 msgstr ""
 "Forventer å lese en enkelt byte for mottak av påloggingsinformasjon, men "
 "leste null byte"
 
-#: ../gio/gunixconnection.c:572
+#: ../gio/gunixconnection.c:580
 #, c-format
 msgid "Not expecting control message, but got %d"
 msgstr "Forventet ikke kontrollmelding, men fikk %d"
 
-#: ../gio/gunixconnection.c:596
+#: ../gio/gunixconnection.c:604
 #, c-format
 msgid "Error while disabling SO_PASSCRED: %s"
 msgstr "Feil ved forsøk på å slå av SO_PASSCRED: %s"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3279,57 +3280,42 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s"
 msgstr ""
 "Feil under endring av navn på filen «%s» til «%s»: g_rename() feilet: %s"
 
-#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1593
+#: ../glib/gfileutils.c:1047 ../glib/gfileutils.c:1561
 #, c-format
 msgid "Failed to create file '%s': %s"
 msgstr "Feil under oppretting av fil «%s»: %s"
 
-#: ../glib/gfileutils.c:1049
+#: ../glib/gfileutils.c:1071
 #, c-format
-msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
-msgstr "Feil under åpning av filen «%s» for skriving: fdopen() feilet: %s"
+msgid "Failed to write file '%s': write() failed: %s"
+msgstr "Kunne ikke skrive fil «%s»: write() feilet: %s"
 
-#: ../glib/gfileutils.c:1074
-#, c-format
-msgid "Failed to write file '%s': fwrite() failed: %s"
-msgstr "Kunne ikke skrive fil «%s»: fwrite() feilet: %s"
-
-#: ../glib/gfileutils.c:1093
-#, c-format
-msgid "Failed to write file '%s': fflush() failed: %s"
-msgstr "Kunne ikke skrive fil «%s»: fflush() feilet: %s"
-
-#: ../glib/gfileutils.c:1137
+#: ../glib/gfileutils.c:1118
 #, c-format
 msgid "Failed to write file '%s': fsync() failed: %s"
 msgstr "Kunne ikke skrive fil «%s»: fsync() feilet: %s"
 
-#: ../glib/gfileutils.c:1161
-#, c-format
-msgid "Failed to close file '%s': fclose() failed: %s"
-msgstr "Kunne ikke lukke fil «%s»: fclose() feilet: %s"
-
-#: ../glib/gfileutils.c:1282
+#: ../glib/gfileutils.c:1250
 #, c-format
 msgid "Existing file '%s' could not be removed: g_unlink() failed: %s"
 msgstr "Eksisterende fil «%s» kunne ikke bli fjernet: g_unlink() feilet: %s"
 
-#: ../glib/gfileutils.c:1556
+#: ../glib/gfileutils.c:1524
 #, c-format
 msgid "Template '%s' invalid, should not contain a '%s'"
 msgstr "Mal «%s» er ugyldig, må ikke inneholde «%s»"
 
-#: ../glib/gfileutils.c:1569
+#: ../glib/gfileutils.c:1537
 #, c-format
 msgid "Template '%s' doesn't contain XXXXXX"
 msgstr "Mal «%s» inneholder ikke XXXXXX"
 
-#: ../glib/gfileutils.c:2097
+#: ../glib/gfileutils.c:2065
 #, c-format
 msgid "Failed to read the symbolic link '%s': %s"
 msgstr "Feil under lesing av symbolsk lenke «%s»: %s"
 
-#: ../glib/gfileutils.c:2118
+#: ../glib/gfileutils.c:2086
 msgid "Symbolic links not supported"
 msgstr "Symbolske lenker er ikke støttet"
 
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.&lt;/pre&gt;</description>
    <dc:creator>Kjartan Maraas</dc:creator>
    <dc:date>2013-06-20T09:47:04</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725694">
    <title>[releng] add limits for several modules</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725694</link>
    <description>&lt;pre&gt;commit 89524d614132722ad957533671a4eba29655ff01
Author: Frédéric Péters &amp;lt;fpeters&amp;lt; at &amp;gt;0d.be&amp;gt;
Date:   Thu Jun 20 11:45:31 2013 +0200

    add limits for several modules

 tools/smoketesting/tarball-conversion.config |   11 +++++------
 1 files changed, 5 insertions(+), 6 deletions(-)
---
diff --git a/tools/smoketesting/tarball-conversion.config b/tools/smoketesting/tarball-conversion.config
index 77ae78b..0646e87 100644
--- a/tools/smoketesting/tarball-conversion.config
+++ b/tools/smoketesting/tarball-conversion.config
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -50,7 +50,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     &amp;lt;package name="telepathy-farstream"/&amp;gt;
     &amp;lt;package name="telepathy-glib"/&amp;gt;
     &amp;lt;package name="telepathy-logger"/&amp;gt;
-    &amp;lt;package name="telepathy-mission-control"/&amp;gt;
+    &amp;lt;package name="telepathy-mission-control" limit="5.15"/&amp;gt;
 
     ## CORE SHELL
     &amp;lt;package name="at-spi2-core"                set="core"/&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -110,7 +110,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
     # CORE SERVICES
     &amp;lt;package name="accountsservice"/&amp;gt;
-    &amp;lt;package name="avahi"/&amp;gt;
     &amp;lt;package name="ConsoleKit"/&amp;gt;
     &amp;lt;package name="gdm"                         set="core"/&amp;gt;
     &amp;lt;package name="NetworkManager"              set="core"/&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -143,10 +142,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     &amp;lt;package name="gobject-introspection"       set="core"/&amp;gt;
     &amp;lt;package name="grilo"                       set="core"/&amp;gt;
     &amp;lt;package name="grilo-plugins"               set="core"/&amp;gt;
-    &amp;lt;package name="gstreamer"                   set="core"/&amp;gt;
-    &amp;lt;package name="gst-plugins-base"            set="core"/&amp;gt;
-    &amp;lt;package name="gst-plugins-good"            set="core"/&amp;gt;
-    &amp;lt;package name="gst-plugins-bad"/&amp;gt;
+    &amp;lt;package name="gstreamer"                   set="core" limit="1.1"/&amp;gt;
+    &amp;lt;package name="gst-plugins-base"            set="core" limit="1.1"/&amp;gt;
+    &amp;lt;package name="gst-plugins-good"            set="core" limit="1.1"/&amp;gt;
+    &amp;lt;package name="gst-plugins-bad"                        limit="1.1"/&amp;gt;
     &amp;lt;package name="gssdp"                       set="core"/&amp;gt;
     &amp;lt;package name="gtk+-2" module="gtk+"        set="core" limit="2.90"/&amp;gt;
     &amp;lt;package name="gtk+"                        set="core"/&amp;gt;
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.&lt;/pre&gt;</description>
    <dc:creator>Frederic Peters</dc:creator>
    <dc:date>2013-06-20T09:46:11</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725693">
    <title>[gdk-pixbuf] Updated Norwegian bokmål translation</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725693</link>
    <description>&lt;pre&gt;commit 92be59fd985b5429c451fb509518e2f1974275e2
Author: Kjartan Maraas &amp;lt;kmaraas&amp;lt; at &amp;gt;gnome.org&amp;gt;
Date:   Thu Jun 20 11:45:00 2013 +0200

    Updated Norwegian bokmål translation

 po/nb.po |   50 +++++++++++++++++++++++++++-----------------------
 1 files changed, 27 insertions(+), 23 deletions(-)
---
diff --git a/po/nb.po b/po/nb.po
index bf2edc8..e47160e 100644
--- a/po/nb.po
+++ b/po/nb.po
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,14 +1,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 # Norwegian bokmål translation of gdk-pixbuf.
 # Copyright (C) 1998-2004, 2005 Free Software Foundation, Inc.
-# Kjartan Maraas &amp;lt;kmaraas&amp;lt; at &amp;gt;gnome.org&amp;gt;, 1998-2012.
+# Kjartan Maraas &amp;lt;kmaraas&amp;lt; at &amp;gt;gnome.org&amp;gt;, 1998-2013.
 # Terance Edward Sola &amp;lt;terance&amp;lt; at &amp;gt;lyse.net&amp;gt;, 2005.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: gdk-pixbuf 2.25.x\n"
+"Project-Id-Version: gdk-pixbuf 2.29.x\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-25 17:09+0100\n"
-"PO-Revision-Date: 2013-02-25 17:10+0100\n"
+"POT-Creation-Date: 2013-06-20 11:44+0200\n"
+"PO-Revision-Date: 2013-06-20 11:44+0200\n"
 "Last-Translator: Kjartan Maraas &amp;lt;kmaraas&amp;lt; at &amp;gt;gnome.org&amp;gt;\n"
 "Language-Team: Norwegian bokmål &amp;lt;i18n-nb&amp;lt; at &amp;gt;lister.ping.uio.no&amp;gt;\n"
 "Language: nb\n"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -37,7 +37,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr ""
 "Feil under lasting av animasjon «%s»: årsak ikke kjent, sannsynligvis "
 "korrupt animasjonsfil"
 
-#: ../gdk-pixbuf/gdk-pixbuf-animation.c:277 ../gdk-pixbuf/gdk-pixbuf-io.c:1112
+#: ../gdk-pixbuf/gdk-pixbuf-animation.c:280 ../gdk-pixbuf/gdk-pixbuf-io.c:1112
 #: ../gdk-pixbuf/gdk-pixbuf-io.c:1382
 #, c-format
 msgid ""
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -178,7 +178,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Ikke nok minne til å laste animasjon"
 msgid "Malformed chunk in animation"
 msgstr "Feil i en del av animasjonen"
 
-#: ../gdk-pixbuf/io-ani.c:660
+#: ../gdk-pixbuf/io-ani.c:630
+msgid "ANI image was truncated or incomplete."
+msgstr "ANI-bildet er avkuttet eller ukomplett."
+
+#: ../gdk-pixbuf/io-ani.c:671
 msgid "The ANI image format"
 msgstr "ANI bildeformat"
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -533,37 +537,37 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Transformert pixbuf har bredde eller høyde lik null."
 msgid "The GdkPixdata format"
 msgstr "GdkPixdata-format"
 
-#: ../gdk-pixbuf/io-png.c:54
+#: ../gdk-pixbuf/io-png.c:55
 msgid "Bits per channel of PNG image is invalid."
 msgstr "Ugyldig antall biter per kanal i PNG-bilde."
 
-#: ../gdk-pixbuf/io-png.c:135 ../gdk-pixbuf/io-png.c:641
+#: ../gdk-pixbuf/io-png.c:136 ../gdk-pixbuf/io-png.c:642
 msgid "Transformed PNG has zero width or height."
 msgstr "Transformert PNG har bredde eller høyde lik null."
 
-#: ../gdk-pixbuf/io-png.c:143
+#: ../gdk-pixbuf/io-png.c:144
 msgid "Bits per channel of transformed PNG is not 8."
 msgstr "Antall biter per kanal i transformert PNG er forskjellig fra 8."
 
-#: ../gdk-pixbuf/io-png.c:152
+#: ../gdk-pixbuf/io-png.c:153
 msgid "Transformed PNG not RGB or RGBA."
 msgstr "Transformert PNG er ikke RGB eller RGBA."
 
-#: ../gdk-pixbuf/io-png.c:161
+#: ../gdk-pixbuf/io-png.c:162
 msgid "Transformed PNG has unsupported number of channels, must be 3 or 4."
 msgstr ""
 "Transformert PNG har et ikke-støttet antall kanaler, må være 3 eller 4."
 
-#: ../gdk-pixbuf/io-png.c:182
+#: ../gdk-pixbuf/io-png.c:183
 #, c-format
 msgid "Fatal error in PNG image file: %s"
 msgstr "Fatal feil i PNG-bildefil: %s"
 
-#: ../gdk-pixbuf/io-png.c:315
+#: ../gdk-pixbuf/io-png.c:316
 msgid "Insufficient memory to load PNG file"
 msgstr "Ikke nok minne til å laste PNG-fil"
 
-#: ../gdk-pixbuf/io-png.c:656
+#: ../gdk-pixbuf/io-png.c:657
 #, c-format
 msgid ""
 "Insufficient memory to store a %lu by %lu image; try exiting some "
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -572,30 +576,30 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr ""
 "Ikke nok minne til å lagre et %lu ganger %lu bilde; prøv å avslutte noen "
 "applikasjoner for å redusere minnebruken"
 
-#: ../gdk-pixbuf/io-png.c:719
+#: ../gdk-pixbuf/io-png.c:720
 msgid "Fatal error reading PNG image file"
 msgstr "Fatal feil under lesing av PNG-bildefil"
 
-#: ../gdk-pixbuf/io-png.c:768
+#: ../gdk-pixbuf/io-png.c:769
 #, c-format
 msgid "Fatal error reading PNG image file: %s"
 msgstr "Fatal feil under lesing av PNG-bildefil: %s"
 
-#: ../gdk-pixbuf/io-png.c:858
+#: ../gdk-pixbuf/io-png.c:859
 msgid ""
 "Keys for PNG text chunks must have at least 1 and at most 79 characters."
 msgstr "Nøkler for PNG tekstbiter må minst ha mellom 1 og 79 tegn."
 
-#: ../gdk-pixbuf/io-png.c:867
+#: ../gdk-pixbuf/io-png.c:868
 msgid "Keys for PNG text chunks must be ASCII characters."
 msgstr "Nøkler for PNG tekstbiter må bestå av ASCII-tegn."
 
-#: ../gdk-pixbuf/io-png.c:881 ../gdk-pixbuf/io-tiff.c:667
+#: ../gdk-pixbuf/io-png.c:882 ../gdk-pixbuf/io-tiff.c:667
 #, c-format
 msgid "Color profile has invalid length %d."
 msgstr "Fargeprofilen har ugyldig lengde %d."
 
-#: ../gdk-pixbuf/io-png.c:894
+#: ../gdk-pixbuf/io-png.c:895
 #, c-format
 msgid ""
 "PNG compression level must be a value between 0 and 9; value '%s' could not "
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -604,7 +608,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr ""
 "Nivået til PNG-komprimeringen må være en verdi mello 0 og 9; verdi «%s» kan "
 "ikke brukes."
 
-#: ../gdk-pixbuf/io-png.c:907
+#: ../gdk-pixbuf/io-png.c:908
 #, c-format
 msgid ""
 "PNG compression level must be a value between 0 and 9; value '%d' is not "
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -613,12 +617,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr ""
 "Nivået på PNG-komprimering må være en verdi mellom 0 og 9; verdien «%d» er "
 "ikke tillat."
 
-#: ../gdk-pixbuf/io-png.c:955
+#: ../gdk-pixbuf/io-png.c:956
 #, c-format
 msgid "Value for PNG text chunk %s cannot be converted to ISO-8859-1 encoding."
 msgstr "Verdi for PNG-tekstbit %s kan ikke konverteres til ISO-8859-1-koding."
 
-#: ../gdk-pixbuf/io-png.c:1118
+#: ../gdk-pixbuf/io-png.c:1119
 msgid "The PNG image format"
 msgstr "PNG-bildeformat"
 
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.&lt;/pre&gt;</description>
    <dc:creator>Kjartan Maraas</dc:creator>
    <dc:date>2013-06-20T09:45:04</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725692">
    <title>[gtk+/wip/window-scales: 108/108] x11: Initial cut at supportingwindow scaling for X11</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725692</link>
    <description>&lt;pre&gt;commit fa59e41fd38cb51531355e5617f99953ad2fa5ea
Author: Alexander Larsson &amp;lt;alexl&amp;lt; at &amp;gt;redhat.com&amp;gt;
Date:   Thu Jun 20 11:40:07 2013 +0200

    x11: Initial cut at supporting window scaling for X11
    
    If you set GDK_SCALE=2 in the environment then all windows will be
    scaled by 2. Its not an ideal solution as it doesn't handle
    multi-monitors at different scales, and only affects gtk apps.
    But it is a good starting points and will help a lot on HiDPI
    laptops.

 gdk/x11/gdkdevice-core-x11.c        |   35 +++++--
 gdk/x11/gdkdevice-xi2.c             |   21 +++--
 gdk/x11/gdkdevicemanager-core-x11.c |   54 ++++++-----
 gdk/x11/gdkdevicemanager-xi2.c      |   59 ++++++------
 gdk/x11/gdkdisplay-x11.c            |   62 +++++++-----
 gdk/x11/gdkdnd-x11.c                |    4 +-
 gdk/x11/gdkgeometry-x11.c           |   20 +++--
 gdk/x11/gdkmain-x11.c               |    9 +-
 gdk/x11/gdkprivate-x11.h            |    2 +
 gdk/x11/gdkscreen-x11.c             |   34 ++++++-
 gdk/x11/gdkscreen-x11.h             |    2 +
 gdk/x11/gdkwindow-x11.c             |  182 ++++++++++++++++++++++-------------
 gdk/x11/gdkwindow-x11.h             |    2 +
 13 files changed, 304 insertions(+), 182 deletions(-)
---
diff --git a/gdk/x11/gdkdevice-core-x11.c b/gdk/x11/gdkdevice-core-x11.c
index 0c6ed7f..7aa7e1b 100644
--- a/gdk/x11/gdkdevice-core-x11.c
+++ b/gdk/x11/gdkdevice-core-x11.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -135,10 +135,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_core_get_history (GdkDevice      *device,
   XTimeCoord *xcoords;
   GdkTimeCoord **coords;
   GdkWindow *impl_window;
+  GdkWindowImplX11 *impl;
   int tmp_n_events;
   int i, j;
 
   impl_window = _gdk_window_get_impl_window (window);
+  impl =  GDK_WINDOW_IMPL_X11 (impl_window-&amp;gt;impl);
   xcoords = XGetMotionEvents (GDK_WINDOW_XDISPLAY (window),
                               GDK_WINDOW_XID (impl_window),
                               start, stop, &amp;amp;tmp_n_events);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -149,11 +151,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_core_get_history (GdkDevice      *device,
 
   for (i = 0, j = 0; i &amp;lt; tmp_n_events; i++)
     {
-      if (impl_coord_in_window (window, xcoords[i].x, xcoords[i].y))
+      if (impl_coord_in_window (window,
+                                xcoords[i].x / impl-&amp;gt;window_scale,
+                                xcoords[i].y / impl-&amp;gt;window_scale))
         {
           coords[j]-&amp;gt;time = xcoords[i].time;
-          coords[j]-&amp;gt;axes[0] = xcoords[i].x - window-&amp;gt;abs_x;
-          coords[j]-&amp;gt;axes[1] = xcoords[i].y - window-&amp;gt;abs_y;
+          coords[j]-&amp;gt;axes[0] = (double)xcoords[i].x / impl-&amp;gt;window_scale - window-&amp;gt;abs_x;
+          coords[j]-&amp;gt;axes[1] = (double)xcoords[i].y / impl-&amp;gt;window_scale - window-&amp;gt;abs_y;
           j++;
         }
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -194,6 +198,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_core_get_state (GdkDevice       *device,
 {
   gint x_int, y_int;
 
+  /* TODO: This rounds the coords, should use double */
   gdk_window_get_device_position (window, device, &amp;amp;x_int, &amp;amp;y_int, mask);
 
   if (axes)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -232,7 +237,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_core_warp (GdkDevice *device,
   xdisplay = GDK_DISPLAY_XDISPLAY (gdk_device_get_display (device));
   dest = GDK_WINDOW_XID (gdk_screen_get_root_window (screen));
 
-  XWarpPointer (xdisplay, None, dest, 0, 0, 0, 0, x, y);
+  XWarpPointer (xdisplay, None, dest, 0, 0, 0, 0,
+                x * GDK_X11_SCREEN (screen)-&amp;gt;default_window_scale,
+                y * GDK_X11_SCREEN (screen)-&amp;gt;default_window_scale);
 }
 
 static void
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -246,6 +253,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_core_query_state (GdkDevice        *device,
                                  gint             *win_y,
                                  GdkModifierType  *mask)
 {
+  GdkWindowImplX11 *impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
   GdkDisplay *display;
   GdkScreen *default_screen;
   Window xroot_window, xchild_window;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -291,16 +299,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_core_query_state (GdkDevice        *device,
     *child_window = gdk_x11_window_lookup_for_display (display, xchild_window);
 
   if (root_x)
-    *root_x = xroot_x;
+    *root_x = xroot_x / impl-&amp;gt;window_scale;
 
   if (root_y)
-    *root_y = xroot_y;
+    *root_y = xroot_y / impl-&amp;gt;window_scale;
 
   if (win_x)
-    *win_x = xwin_x;
+    *win_x = xwin_x / impl-&amp;gt;window_scale;
 
   if (win_y)
-    *win_y = xwin_y;
+    *win_y = xwin_y / impl-&amp;gt;window_scale;
 
   if (mask)
     *mask = xmask;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -413,6 +421,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_core_window_at_position (GdkDevice       *device,
                                         GdkModifierType *mask,
                                         gboolean         get_toplevel)
 {
+  GdkWindowImplX11 *impl;
   GdkDisplay *display;
   GdkScreen *screen;
   Display *xdisplay;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -464,6 +473,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_core_window_at_position (GdkDevice       *device,
       for (list = toplevels; list != NULL; list = g_list_next (list))
         {
           window = GDK_WINDOW (list-&amp;gt;data);
+          impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
           xwindow = GDK_WINDOW_XID (window);
           gdk_x11_display_error_trap_push (display);
           XQueryPointer (xdisplay, xwindow,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -479,7 +489,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_core_window_at_position (GdkDevice       *device,
               break;
             }
           gdk_window_get_geometry (window, NULL, NULL, &amp;amp;width, &amp;amp;height);
-          if (winx &amp;gt;= 0 &amp;amp;&amp;amp; winy &amp;gt;= 0 &amp;amp;&amp;amp; winx &amp;lt; width &amp;amp;&amp;amp; winy &amp;lt; height)
+          if (winx &amp;gt;= 0 &amp;amp;&amp;amp; winy &amp;gt;= 0 &amp;amp;&amp;amp; winx &amp;lt; width * impl-&amp;gt;window_scale &amp;amp;&amp;amp; winy &amp;lt; height * impl-&amp;gt;window_scale)
             {
               /* A childless toplevel, or below another window? */
               XSetWindowAttributes attributes;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -532,12 +542,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_core_window_at_position (GdkDevice       *device,
   gdk_x11_display_ungrab (display);
 
   window = gdk_x11_window_lookup_for_display (display, last);
+  impl = NULL;
+  if (window)
+    impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
 
   if (win_x)
-    *win_x = (window) ? xwin_x : -1;
+    *win_x = (window) ? xwin_x / impl-&amp;gt;window_scale : -1;
 
   if (win_y)
-    *win_y = (window) ? xwin_y : -1;
+    *win_y = (window) ? xwin_y / impl-&amp;gt;window_scale : -1;
 
   if (mask)
     *mask = xmask;
diff --git a/gdk/x11/gdkdevice-xi2.c b/gdk/x11/gdkdevice-xi2.c
index 9755a06..ad84bd5 100644
--- a/gdk/x11/gdkdevice-xi2.c
+++ b/gdk/x11/gdkdevice-xi2.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -303,7 +303,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_xi2_warp (GdkDevice *device,
   XIWarpPointer (GDK_SCREEN_XDISPLAY (screen),
                  device_xi2-&amp;gt;device_id,
                  None, dest,
-                 0, 0, 0, 0, x, y);
+                 0, 0, 0, 0,
+                 x * GDK_X11_SCREEN(screen)-&amp;gt;default_window_scale,
+                 y * GDK_X11_SCREEN(screen)-&amp;gt;default_window_scale);
 }
 
 static void
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -317,6 +319,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_xi2_query_state (GdkDevice        *device,
                                 gint             *win_y,
                                 GdkModifierType  *mask)
 {
+  GdkWindowImplX11 *impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
   GdkX11DeviceXI2 *device_xi2 = GDK_X11_DEVICE_XI2 (device);
   GdkDisplay *display;
   GdkScreen *default_screen;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -381,16 +384,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_xi2_query_state (GdkDevice        *device,
     *child_window = gdk_x11_window_lookup_for_display (display, xchild_window);
 
   if (root_x)
-    *root_x = (gint) xroot_x;
+    *root_x = (gint) (xroot_x / impl-&amp;gt;window_scale);
 
   if (root_y)
-    *root_y = (gint) xroot_y;
+    *root_y = (gint) (xroot_y / impl-&amp;gt;window_scale);
 
   if (win_x)
-    *win_x = (gint) xwin_x;
+    *win_x = (gint) (xwin_x / impl-&amp;gt;window_scale);
 
   if (win_y)
-    *win_y = (gint) xwin_y;
+    *win_y = (gint) (xwin_y / impl-&amp;gt;window_scale);
 
   if (mask)
     *mask = _gdk_x11_device_xi2_translate_state (&amp;amp;mod_state, &amp;amp;button_state, &amp;amp;group_state);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -479,6 +482,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_xi2_window_at_position (GdkDevice       *device,
                                        GdkModifierType *mask,
                                        gboolean         get_toplevel)
 {
+  GdkWindowImplX11 *impl;
   GdkX11DeviceXI2 *device_xi2 = GDK_X11_DEVICE_XI2 (device);
   GdkDisplay *display;
   GdkScreen *screen;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -624,12 +628,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_xi2_window_at_position (GdkDevice       *device,
   gdk_x11_display_ungrab (display);
 
   window = gdk_x11_window_lookup_for_display (display, last);
+  impl = NULL;
+  if (window)
+    impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
 
   if (win_x)
-    *win_x = (window) ? (gint) xwin_x : -1;
+    *win_x = (window) ? (gint) (xwin_x / impl-&amp;gt;window_scale) : -1;
 
   if (win_y)
-    *win_y = (window) ? (gint) xwin_y : -1;
+    *win_y = (window) ? (gint) (xwin_y / impl-&amp;gt;window_scale) : -1;
 
   if (mask)
     *mask = _gdk_x11_device_xi2_translate_state (&amp;amp;mod_state, &amp;amp;button_state, &amp;amp;group_state);
diff --git a/gdk/x11/gdkdevicemanager-core-x11.c b/gdk/x11/gdkdevicemanager-core-x11.c
index 0e49fb7..dffef96 100644
--- a/gdk/x11/gdkdevicemanager-core-x11.c
+++ b/gdk/x11/gdkdevicemanager-core-x11.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -332,9 +332,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_manager_core_translate_event (GdkEventTranslator *translator,
                                              GdkEvent           *event,
                                              XEvent             *xevent)
 {
+  GdkWindowImplX11 *impl;
   GdkX11DeviceManagerCore *device_manager;
   GdkWindow *window;
   gboolean return_val;
+  int scale;
   GdkX11Display *display_x11 = GDK_X11_DISPLAY (display);
 
   device_manager = GDK_X11_DEVICE_MANAGER_CORE (translator);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -342,14 +344,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_manager_core_translate_event (GdkEventTranslator *translator,
 
   window = get_event_window (translator, xevent);
 
+  scale = 1;
   if (window)
     {
       if (GDK_WINDOW_DESTROYED (window) || !GDK_IS_WINDOW (window))
         return FALSE;
 
       g_object_ref (window);
+      impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
+      scale = impl-&amp;gt;window_scale;
     }
 
+
   event-&amp;gt;any.window = window;
   event-&amp;gt;any.send_event = xevent-&amp;gt;xany.send_event ? TRUE : FALSE;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -458,10 +464,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_manager_core_translate_event (GdkEventTranslator *translator,
 
           event-&amp;gt;scroll.window = window;
           event-&amp;gt;scroll.time = xevent-&amp;gt;xbutton.time;
-          event-&amp;gt;scroll.x = (gdouble) xevent-&amp;gt;xbutton.x;
-          event-&amp;gt;scroll.y = (gdouble) xevent-&amp;gt;xbutton.y;
-          event-&amp;gt;scroll.x_root = (gdouble) xevent-&amp;gt;xbutton.x_root;
-          event-&amp;gt;scroll.y_root = (gdouble) xevent-&amp;gt;xbutton.y_root;
+          event-&amp;gt;scroll.x = (gdouble) xevent-&amp;gt;xbutton.x / scale;
+          event-&amp;gt;scroll.y = (gdouble) xevent-&amp;gt;xbutton.y / scale;
+          event-&amp;gt;scroll.x_root = (gdouble) xevent-&amp;gt;xbutton.x_root / scale;
+          event-&amp;gt;scroll.y_root = (gdouble) xevent-&amp;gt;xbutton.y_root / scale;
           event-&amp;gt;scroll.state = (GdkModifierType) xevent-&amp;gt;xbutton.state;
           event-&amp;gt;scroll.device = device_manager-&amp;gt;core_pointer;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -480,10 +486,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_manager_core_translate_event (GdkEventTranslator *translator,
           event-&amp;gt;button.type = GDK_BUTTON_PRESS;
           event-&amp;gt;button.window = window;
           event-&amp;gt;button.time = xevent-&amp;gt;xbutton.time;
-          event-&amp;gt;button.x = (gdouble) xevent-&amp;gt;xbutton.x;
-          event-&amp;gt;button.y = (gdouble) xevent-&amp;gt;xbutton.y;
-          event-&amp;gt;button.x_root = (gdouble) xevent-&amp;gt;xbutton.x_root;
-          event-&amp;gt;button.y_root = (gdouble) xevent-&amp;gt;xbutton.y_root;
+          event-&amp;gt;button.x = (gdouble) xevent-&amp;gt;xbutton.x / scale;
+          event-&amp;gt;button.y = (gdouble) xevent-&amp;gt;xbutton.y / scale;
+          event-&amp;gt;button.x_root = (gdouble) xevent-&amp;gt;xbutton.x_root / scale;
+          event-&amp;gt;button.y_root = (gdouble) xevent-&amp;gt;xbutton.y_root / scale;
           event-&amp;gt;button.axes = NULL;
           event-&amp;gt;button.state = (GdkModifierType) xevent-&amp;gt;xbutton.state;
           event-&amp;gt;button.button = xevent-&amp;gt;xbutton.button;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -523,10 +529,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_manager_core_translate_event (GdkEventTranslator *translator,
       event-&amp;gt;button.type = GDK_BUTTON_RELEASE;
       event-&amp;gt;button.window = window;
       event-&amp;gt;button.time = xevent-&amp;gt;xbutton.time;
-      event-&amp;gt;button.x = (gdouble) xevent-&amp;gt;xbutton.x;
-      event-&amp;gt;button.y = (gdouble) xevent-&amp;gt;xbutton.y;
-      event-&amp;gt;button.x_root = (gdouble) xevent-&amp;gt;xbutton.x_root;
-      event-&amp;gt;button.y_root = (gdouble) xevent-&amp;gt;xbutton.y_root;
+      event-&amp;gt;button.x = (gdouble) xevent-&amp;gt;xbutton.x / scale;
+      event-&amp;gt;button.y = (gdouble) xevent-&amp;gt;xbutton.y / scale;
+      event-&amp;gt;button.x_root = (gdouble) xevent-&amp;gt;xbutton.x_root / scale;
+      event-&amp;gt;button.y_root = (gdouble) xevent-&amp;gt;xbutton.y_root / scale;
       event-&amp;gt;button.axes = NULL;
       event-&amp;gt;button.state = (GdkModifierType) xevent-&amp;gt;xbutton.state;
       event-&amp;gt;button.button = xevent-&amp;gt;xbutton.button;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -553,10 +559,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_manager_core_translate_event (GdkEventTranslator *translator,
       event-&amp;gt;motion.type = GDK_MOTION_NOTIFY;
       event-&amp;gt;motion.window = window;
       event-&amp;gt;motion.time = xevent-&amp;gt;xmotion.time;
-      event-&amp;gt;motion.x = (gdouble) xevent-&amp;gt;xmotion.x;
-      event-&amp;gt;motion.y = (gdouble) xevent-&amp;gt;xmotion.y;
-      event-&amp;gt;motion.x_root = (gdouble) xevent-&amp;gt;xmotion.x_root;
-      event-&amp;gt;motion.y_root = (gdouble) xevent-&amp;gt;xmotion.y_root;
+      event-&amp;gt;motion.x = (gdouble) xevent-&amp;gt;xmotion.x / scale;
+      event-&amp;gt;motion.y = (gdouble) xevent-&amp;gt;xmotion.y / scale;
+      event-&amp;gt;motion.x_root = (gdouble) xevent-&amp;gt;xmotion.x_root / scale;
+      event-&amp;gt;motion.y_root = (gdouble) xevent-&amp;gt;xmotion.y_root / scale;
       event-&amp;gt;motion.axes = NULL;
       event-&amp;gt;motion.state = (GdkModifierType) xevent-&amp;gt;xmotion.state;
       event-&amp;gt;motion.is_hint = xevent-&amp;gt;xmotion.is_hint;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -602,10 +608,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_manager_core_translate_event (GdkEventTranslator *translator,
         event-&amp;gt;crossing.subwindow = NULL;
 
       event-&amp;gt;crossing.time = xevent-&amp;gt;xcrossing.time;
-      event-&amp;gt;crossing.x = (gdouble) xevent-&amp;gt;xcrossing.x;
-      event-&amp;gt;crossing.y = (gdouble) xevent-&amp;gt;xcrossing.y;
-      event-&amp;gt;crossing.x_root = (gdouble) xevent-&amp;gt;xcrossing.x_root;
-      event-&amp;gt;crossing.y_root = (gdouble) xevent-&amp;gt;xcrossing.y_root;
+      event-&amp;gt;crossing.x = (gdouble) xevent-&amp;gt;xcrossing.x / scale;
+      event-&amp;gt;crossing.y = (gdouble) xevent-&amp;gt;xcrossing.y / scale;
+      event-&amp;gt;crossing.x_root = (gdouble) xevent-&amp;gt;xcrossing.x_root / scale;
+      event-&amp;gt;crossing.y_root = (gdouble) xevent-&amp;gt;xcrossing.y_root / scale;
 
       event-&amp;gt;crossing.mode = translate_crossing_mode (xevent-&amp;gt;xcrossing.mode);
       event-&amp;gt;crossing.detail = translate_notify_type (xevent-&amp;gt;xcrossing.detail);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -646,10 +652,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_manager_core_translate_event (GdkEventTranslator *translator,
         event-&amp;gt;crossing.subwindow = NULL;
 
       event-&amp;gt;crossing.time = xevent-&amp;gt;xcrossing.time;
-      event-&amp;gt;crossing.x = (gdouble) xevent-&amp;gt;xcrossing.x;
-      event-&amp;gt;crossing.y = (gdouble) xevent-&amp;gt;xcrossing.y;
-      event-&amp;gt;crossing.x_root = (gdouble) xevent-&amp;gt;xcrossing.x_root;
-      event-&amp;gt;crossing.y_root = (gdouble) xevent-&amp;gt;xcrossing.y_root;
+      event-&amp;gt;crossing.x = (gdouble) xevent-&amp;gt;xcrossing.x / scale;
+      event-&amp;gt;crossing.y = (gdouble) xevent-&amp;gt;xcrossing.y / scale;
+      event-&amp;gt;crossing.x_root = (gdouble) xevent-&amp;gt;xcrossing.x_root / scale;
+      event-&amp;gt;crossing.y_root = (gdouble) xevent-&amp;gt;xcrossing.y_root / scale;
 
       event-&amp;gt;crossing.mode = translate_crossing_mode (xevent-&amp;gt;xcrossing.mode);
       event-&amp;gt;crossing.detail = translate_notify_type (xevent-&amp;gt;xcrossing.detail);
diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c
index b9093b9..683dc06 100644
--- a/gdk/x11/gdkdevicemanager-xi2.c
+++ b/gdk/x11/gdkdevicemanager-xi2.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1113,6 +1113,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
   XGenericEventCookie *cookie;
   gboolean return_val = TRUE;
   GdkWindow *window;
+  GdkWindowImplX11 *impl;
   XIEvent *ev;
 
   device_manager = (GdkX11DeviceManagerXI2 *) translator;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1134,6 +1135,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
   if (window &amp;amp;&amp;amp; GDK_WINDOW_DESTROYED (window))
     return FALSE;
 
+  impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
+
   if (ev-&amp;gt;evtype == XI_Motion ||
       ev-&amp;gt;evtype == XI_ButtonRelease)
     {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1230,10 +1233,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
 
             event-&amp;gt;scroll.window = window;
             event-&amp;gt;scroll.time = xev-&amp;gt;time;
-            event-&amp;gt;scroll.x = (gdouble) xev-&amp;gt;event_x;
-            event-&amp;gt;scroll.y = (gdouble) xev-&amp;gt;event_y;
-            event-&amp;gt;scroll.x_root = (gdouble) xev-&amp;gt;root_x;
-            event-&amp;gt;scroll.y_root = (gdouble) xev-&amp;gt;root_y;
+            event-&amp;gt;scroll.x = (gdouble) xev-&amp;gt;event_x / impl-&amp;gt;window_scale;
+            event-&amp;gt;scroll.y = (gdouble) xev-&amp;gt;event_y / impl-&amp;gt;window_scale;
+            event-&amp;gt;scroll.x_root = (gdouble) xev-&amp;gt;root_x / impl-&amp;gt;window_scale;
+            event-&amp;gt;scroll.y_root = (gdouble) xev-&amp;gt;root_y / impl-&amp;gt;window_scale;
             event-&amp;gt;scroll.delta_x = 0;
             event-&amp;gt;scroll.delta_y = 0;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1257,10 +1260,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
 
             event-&amp;gt;button.window = window;
             event-&amp;gt;button.time = xev-&amp;gt;time;
-            event-&amp;gt;button.x = (gdouble) xev-&amp;gt;event_x;
-            event-&amp;gt;button.y = (gdouble) xev-&amp;gt;event_y;
-            event-&amp;gt;button.x_root = (gdouble) xev-&amp;gt;root_x;
-            event-&amp;gt;button.y_root = (gdouble) xev-&amp;gt;root_y;
+            event-&amp;gt;button.x = (gdouble) xev-&amp;gt;event_x / impl-&amp;gt;window_scale;
+            event-&amp;gt;button.y = (gdouble) xev-&amp;gt;event_y / impl-&amp;gt;window_scale;
+            event-&amp;gt;button.x_root = (gdouble) xev-&amp;gt;root_x / impl-&amp;gt;window_scale;
+            event-&amp;gt;button.y_root = (gdouble) xev-&amp;gt;root_y / impl-&amp;gt;window_scale;
 
             event-&amp;gt;button.device = g_hash_table_lookup (device_manager-&amp;gt;id_table,
                                                         GUINT_TO_POINTER (xev-&amp;gt;deviceid));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1348,10 +1351,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
 
             event-&amp;gt;scroll.window = window;
             event-&amp;gt;scroll.time = xev-&amp;gt;time;
-            event-&amp;gt;scroll.x = (gdouble) xev-&amp;gt;event_x;
-            event-&amp;gt;scroll.y = (gdouble) xev-&amp;gt;event_y;
-            event-&amp;gt;scroll.x_root = (gdouble) xev-&amp;gt;root_x;
-            event-&amp;gt;scroll.y_root = (gdouble) xev-&amp;gt;root_y;
+            event-&amp;gt;scroll.x = (gdouble) xev-&amp;gt;event_x / impl-&amp;gt;window_scale;
+            event-&amp;gt;scroll.y = (gdouble) xev-&amp;gt;event_y / impl-&amp;gt;window_scale;
+            event-&amp;gt;scroll.x_root = (gdouble) xev-&amp;gt;root_x / impl-&amp;gt;window_scale;
+            event-&amp;gt;scroll.y_root = (gdouble) xev-&amp;gt;root_y / impl-&amp;gt;window_scale;
             event-&amp;gt;scroll.delta_x = delta_x;
             event-&amp;gt;scroll.delta_y = delta_y;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1365,10 +1368,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
         event-&amp;gt;motion.type = GDK_MOTION_NOTIFY;
         event-&amp;gt;motion.window = window;
         event-&amp;gt;motion.time = xev-&amp;gt;time;
-        event-&amp;gt;motion.x = (gdouble) xev-&amp;gt;event_x;
-        event-&amp;gt;motion.y = (gdouble) xev-&amp;gt;event_y;
-        event-&amp;gt;motion.x_root = (gdouble) xev-&amp;gt;root_x;
-        event-&amp;gt;motion.y_root = (gdouble) xev-&amp;gt;root_y;
+        event-&amp;gt;motion.x = (gdouble) xev-&amp;gt;event_x / impl-&amp;gt;window_scale;
+        event-&amp;gt;motion.y = (gdouble) xev-&amp;gt;event_y / impl-&amp;gt;window_scale;
+        event-&amp;gt;motion.x_root = (gdouble) xev-&amp;gt;root_x / impl-&amp;gt;window_scale;
+        event-&amp;gt;motion.y_root = (gdouble) xev-&amp;gt;root_y / impl-&amp;gt;window_scale;
 
         event-&amp;gt;motion.device = device;
         gdk_event_set_source_device (event, source_device);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1421,10 +1424,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
 
         event-&amp;gt;touch.window = window;
         event-&amp;gt;touch.time = xev-&amp;gt;time;
-        event-&amp;gt;touch.x = (gdouble) xev-&amp;gt;event_x;
-        event-&amp;gt;touch.y = (gdouble) xev-&amp;gt;event_y;
-        event-&amp;gt;touch.x_root = (gdouble) xev-&amp;gt;root_x;
-        event-&amp;gt;touch.y_root = (gdouble) xev-&amp;gt;root_y;
+        event-&amp;gt;touch.x = (gdouble) xev-&amp;gt;event_x / impl-&amp;gt;window_scale;
+        event-&amp;gt;touch.y = (gdouble) xev-&amp;gt;event_y / impl-&amp;gt;window_scale;
+        event-&amp;gt;touch.x_root = (gdouble) xev-&amp;gt;root_x / impl-&amp;gt;window_scale;
+        event-&amp;gt;touch.y_root = (gdouble) xev-&amp;gt;root_y / impl-&amp;gt;window_scale;
 
         event-&amp;gt;touch.device = g_hash_table_lookup (device_manager-&amp;gt;id_table,
                                                    GUINT_TO_POINTER (xev-&amp;gt;deviceid));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1490,10 +1493,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
         event-&amp;gt;touch.sequence = GUINT_TO_POINTER (xev-&amp;gt;detail);
         event-&amp;gt;touch.type = GDK_TOUCH_UPDATE;
         event-&amp;gt;touch.time = xev-&amp;gt;time;
-        event-&amp;gt;touch.x = (gdouble) xev-&amp;gt;event_x;
-        event-&amp;gt;touch.y = (gdouble) xev-&amp;gt;event_y;
-        event-&amp;gt;touch.x_root = (gdouble) xev-&amp;gt;root_x;
-        event-&amp;gt;touch.y_root = (gdouble) xev-&amp;gt;root_y;
+        event-&amp;gt;touch.x = (gdouble) xev-&amp;gt;event_x / impl-&amp;gt;window_scale;
+        event-&amp;gt;touch.y = (gdouble) xev-&amp;gt;event_y / impl-&amp;gt;window_scale;
+        event-&amp;gt;touch.x_root = (gdouble) xev-&amp;gt;root_x / impl-&amp;gt;window_scale;
+        event-&amp;gt;touch.y_root = (gdouble) xev-&amp;gt;root_y / impl-&amp;gt;window_scale;
 
         event-&amp;gt;touch.device = g_hash_table_lookup (device_manager-&amp;gt;id_table,
                                                    GINT_TO_POINTER (xev-&amp;gt;deviceid));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1538,10 +1541,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
 
         event-&amp;gt;crossing.type = (ev-&amp;gt;evtype == XI_Enter) ? GDK_ENTER_NOTIFY : GDK_LEAVE_NOTIFY;
 
-        event-&amp;gt;crossing.x = (gdouble) xev-&amp;gt;event_x;
-        event-&amp;gt;crossing.y = (gdouble) xev-&amp;gt;event_y;
-        event-&amp;gt;crossing.x_root = (gdouble) xev-&amp;gt;root_x;
-        event-&amp;gt;crossing.y_root = (gdouble) xev-&amp;gt;root_y;
+        event-&amp;gt;crossing.x = (gdouble) xev-&amp;gt;event_x / impl-&amp;gt;window_scale;
+        event-&amp;gt;crossing.y = (gdouble) xev-&amp;gt;event_y / impl-&amp;gt;window_scale;
+        event-&amp;gt;crossing.x_root = (gdouble) xev-&amp;gt;root_x / impl-&amp;gt;window_scale;
+        event-&amp;gt;crossing.y_root = (gdouble) xev-&amp;gt;root_y / impl-&amp;gt;window_scale;
         event-&amp;gt;crossing.time = xev-&amp;gt;time;
         event-&amp;gt;crossing.focus = xev-&amp;gt;focus;
 
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c
index 09a4347..91a7aec 100644
--- a/gdk/x11/gdkdisplay-x11.c
+++ b/gdk/x11/gdkdisplay-x11.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -558,11 +558,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_display_translate_event (GdkEventTranslator *translator,
 
       {
 GdkRectangle expose_rect;
+        int x2, y2;
 
-expose_rect.x = xevent-&amp;gt;xexpose.x;
-expose_rect.y = xevent-&amp;gt;xexpose.y;
-expose_rect.width = xevent-&amp;gt;xexpose.width;
-expose_rect.height = xevent-&amp;gt;xexpose.height;
+        expose_rect.x = xevent-&amp;gt;xexpose.x / window_impl-&amp;gt;window_scale;
+        expose_rect.y = xevent-&amp;gt;xexpose.y / window_impl-&amp;gt;window_scale;
+
+        x2 = (xevent-&amp;gt;xexpose.x + xevent-&amp;gt;xexpose.width + window_impl-&amp;gt;window_scale -1) / window_impl-&amp;gt;window_scale;
+        expose_rect.width = x2 - expose_rect.x;
+
+        y2 = (xevent-&amp;gt;xexpose.y + xevent-&amp;gt;xexpose.height + window_impl-&amp;gt;window_scale -1) / window_impl-&amp;gt;window_scale;
+        expose_rect.height = y2 - expose_rect.y;
 
         _gdk_x11_window_process_expose (window, xevent-&amp;gt;xexpose.serial, &amp;amp;expose_rect);
         return_val = FALSE;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -573,6 +578,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_display_translate_event (GdkEventTranslator *translator,
     case GraphicsExpose:
       {
 GdkRectangle expose_rect;
+        int x2, y2;
 
         GDK_NOTE (EVENTS,
   g_message ("graphics expose:\tdrawable: %ld",
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -584,10 +590,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_display_translate_event (GdkEventTranslator *translator,
             break;
           }
 
-expose_rect.x = xevent-&amp;gt;xgraphicsexpose.x;
-expose_rect.y = xevent-&amp;gt;xgraphicsexpose.y;
-expose_rect.width = xevent-&amp;gt;xgraphicsexpose.width;
-expose_rect.height = xevent-&amp;gt;xgraphicsexpose.height;
+        expose_rect.x = xevent-&amp;gt;xgraphicsexpose.x / window_impl-&amp;gt;window_scale;
+        expose_rect.y = xevent-&amp;gt;xgraphicsexpose.y / window_impl-&amp;gt;window_scale;
+
+        x2 = (xevent-&amp;gt;xgraphicsexpose.x + xevent-&amp;gt;xgraphicsexpose.width + window_impl-&amp;gt;window_scale -1) / window_impl-&amp;gt;window_scale;
+        expose_rect.width = x2 - expose_rect.x;
+
+        y2 = (xevent-&amp;gt;xgraphicsexpose.y + xevent-&amp;gt;xgraphicsexpose.height + window_impl-&amp;gt;window_scale -1) / window_impl-&amp;gt;window_scale;
+        expose_rect.height = y2 - expose_rect.y;
 
         _gdk_x11_window_process_expose (window, xevent-&amp;gt;xgraphicsexpose.serial, &amp;amp;expose_rect);
         return_val = FALSE;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -773,8 +783,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_display_translate_event (GdkEventTranslator *translator,
    : ""));
       if (window &amp;amp;&amp;amp; GDK_WINDOW_TYPE (window) == GDK_WINDOW_ROOT)
         {
-  window-&amp;gt;width = xevent-&amp;gt;xconfigure.width;
-  window-&amp;gt;height = xevent-&amp;gt;xconfigure.height;
+  window-&amp;gt;width = xevent-&amp;gt;xconfigure.width / window_impl-&amp;gt;window_scale;
+  window-&amp;gt;height = xevent-&amp;gt;xconfigure.height / window_impl-&amp;gt;window_scale;
 
   _gdk_window_update_size (window);
   _gdk_x11_window_update_size (GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -799,8 +809,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_display_translate_event (GdkEventTranslator *translator,
 {
   event-&amp;gt;configure.type = GDK_CONFIGURE;
   event-&amp;gt;configure.window = window;
-  event-&amp;gt;configure.width = xevent-&amp;gt;xconfigure.width;
-  event-&amp;gt;configure.height = xevent-&amp;gt;xconfigure.height;
+  event-&amp;gt;configure.width = xevent-&amp;gt;xconfigure.width / window_impl-&amp;gt;window_scale;
+  event-&amp;gt;configure.height = xevent-&amp;gt;xconfigure.height / window_impl-&amp;gt;window_scale;
 
   if (!xevent-&amp;gt;xconfigure.send_event &amp;amp;&amp;amp;
       !xevent-&amp;gt;xconfigure.override_redirect &amp;amp;&amp;amp;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -818,22 +828,22 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_display_translate_event (GdkEventTranslator *translator,
  &amp;amp;tx, &amp;amp;ty,
  &amp;amp;child_window))
 {
-  event-&amp;gt;configure.x = tx;
-  event-&amp;gt;configure.y = ty;
+  event-&amp;gt;configure.x = tx / window_impl-&amp;gt;window_scale;
+  event-&amp;gt;configure.y = ty / window_impl-&amp;gt;window_scale;
 }
       gdk_x11_display_error_trap_pop_ignored (display);
     }
   else
     {
-      event-&amp;gt;configure.x = xevent-&amp;gt;xconfigure.x;
-      event-&amp;gt;configure.y = xevent-&amp;gt;xconfigure.y;
+      event-&amp;gt;configure.x = xevent-&amp;gt;xconfigure.x / window_impl-&amp;gt;window_scale;
+      event-&amp;gt;configure.y = xevent-&amp;gt;xconfigure.y / window_impl-&amp;gt;window_scale;
     }
   if (!is_substructure)
     {
-      window-&amp;gt;x = event-&amp;gt;configure.x;
-      window-&amp;gt;y = event-&amp;gt;configure.y;
-      window-&amp;gt;width = xevent-&amp;gt;xconfigure.width;
-      window-&amp;gt;height = xevent-&amp;gt;xconfigure.height;
+      window-&amp;gt;x = event-&amp;gt;configure.x / window_impl-&amp;gt;window_scale;
+      window-&amp;gt;y = event-&amp;gt;configure.y / window_impl-&amp;gt;window_scale;
+      window-&amp;gt;width = xevent-&amp;gt;xconfigure.width / window_impl-&amp;gt;window_scale;
+      window-&amp;gt;height = xevent-&amp;gt;xconfigure.height / window_impl-&amp;gt;window_scale;
 
       _gdk_window_update_size (window);
       _gdk_x11_window_update_size (GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1015,11 +1025,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_display_translate_event (GdkEventTranslator *translator,
   XDamageNotifyEvent *damage_event = (XDamageNotifyEvent *) xevent;
   XserverRegion repair;
   GdkRectangle rect;
+          int x2, y2;
+
+  rect.x = window-&amp;gt;x + damage_event-&amp;gt;area.x / window_impl-&amp;gt;window_scale;
+  rect.y = window-&amp;gt;y + damage_event-&amp;gt;area.y / window_impl-&amp;gt;window_scale;
 
-  rect.x = window-&amp;gt;x + damage_event-&amp;gt;area.x;
-  rect.y = window-&amp;gt;y + damage_event-&amp;gt;area.y;
-  rect.width = damage_event-&amp;gt;area.width;
-  rect.height = damage_event-&amp;gt;area.height;
+          x2 = (rect.x * window_impl-&amp;gt;window_scale + damage_event-&amp;gt;area.width + window_impl-&amp;gt;window_scale -1) / window_impl-&amp;gt;window_scale;
+          y2 = (rect.y * window_impl-&amp;gt;window_scale + damage_event-&amp;gt;area.height + window_impl-&amp;gt;window_scale -1) / window_impl-&amp;gt;window_scale;
+  rect.width = x2 - rect.x;
+  rect.height = y2 - rect.y;
 
   repair = XFixesCreateRegion (display_x11-&amp;gt;xdisplay,
        &amp;amp;damage_event-&amp;gt;area, 1);
diff --git a/gdk/x11/gdkdnd-x11.c b/gdk/x11/gdkdnd-x11.c
index b5a6b54..77baea7 100644
--- a/gdk/x11/gdkdnd-x11.c
+++ b/gdk/x11/gdkdnd-x11.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -651,12 +651,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; is_pointer_within_shape (GdkDisplay    *display,
       child-&amp;gt;shape = NULL;
       if (gdk_display_supports_shapes (display))
         child-&amp;gt;shape = _gdk_x11_xwindow_get_shape (display_x11-&amp;gt;xdisplay,
-                                                   child-&amp;gt;xid, ShapeBounding);
+                                                   child-&amp;gt;xid, 1 /*TODO: from window? */,  ShapeBounding);
 #ifdef ShapeInput
       input_shape = NULL;
       if (gdk_display_supports_input_shapes (display))
         input_shape = _gdk_x11_xwindow_get_shape (display_x11-&amp;gt;xdisplay,
-                                                  child-&amp;gt;xid, ShapeInput);
+                                                  child-&amp;gt;xid, 1 /*TODO: from window? */, ShapeInput);
 
       if (child-&amp;gt;shape &amp;amp;&amp;amp; input_shape)
         {
diff --git a/gdk/x11/gdkgeometry-x11.c b/gdk/x11/gdkgeometry-x11.c
index 63620e7..a09a81b 100644
--- a/gdk/x11/gdkgeometry-x11.c
+++ b/gdk/x11/gdkgeometry-x11.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -42,18 +42,22 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_x11_window_move_resize_child (GdkWindow *window,
                                    gint       width,
                                    gint       height)
 {
+  GdkWindowImplX11 *impl;
+
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
 
-  if (width &amp;gt; 65535 ||
-      height &amp;gt; 65535)
+  impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
+
+  if (width * impl-&amp;gt;window_scale &amp;gt; 65535 ||
+      height * impl-&amp;gt;window_scale &amp;gt; 65535)
     {
       g_warning ("Native children wider or taller than 65535 pixels are not supported");
 
-      if (width &amp;gt; 65535)
-        width = 65535;
-      if (height &amp;gt; 65535)
-        height = 65535;
+      if (width * impl-&amp;gt;window_scale &amp;gt; 65535)
+        width = 65535 / impl-&amp;gt;window_scale;
+      if (height * impl-&amp;gt;window_scale &amp;gt; 65535)
+        height = 65535 / impl-&amp;gt;window_scale;
     }
 
   window-&amp;gt;x = x;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -69,8 +73,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_x11_window_move_resize_child (GdkWindow *window,
   _gdk_x11_window_tmp_unset_bg (window, TRUE);
   XMoveResizeWindow (GDK_WINDOW_XDISPLAY (window),
                      GDK_WINDOW_XID (window),
-                     window-&amp;gt;x + window-&amp;gt;parent-&amp;gt;abs_x,
-                     window-&amp;gt;y + window-&amp;gt;parent-&amp;gt;abs_y,
+                     (window-&amp;gt;x + window-&amp;gt;parent-&amp;gt;abs_x) * impl-&amp;gt;window_scale,
+                     (window-&amp;gt;y + window-&amp;gt;parent-&amp;gt;abs_y) * impl-&amp;gt;window_scale,
                      width, height);
   _gdk_x11_window_tmp_reset_parent_bg (window);
   _gdk_x11_window_tmp_reset_bg (window, TRUE);
diff --git a/gdk/x11/gdkmain-x11.c b/gdk/x11/gdkmain-x11.c
index 5065f9c..955313b 100644
--- a/gdk/x11/gdkmain-x11.c
+++ b/gdk/x11/gdkmain-x11.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -368,6 +368,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void
 _gdk_x11_region_get_xrectangles (const cairo_region_t *region,
                                  gint             x_offset,
                                  gint             y_offset,
+                                 gint             scale,
                                  XRectangle     **rects,
                                  gint            *n_rects)
 {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -381,10 +382,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_x11_region_get_xrectangles (const cairo_region_t *region,
   for (i = 0; i &amp;lt; n; i++)
     {
       cairo_region_get_rectangle (region, i, &amp;amp;box);
-      rectangles[i].x = CLAMP (box.x + x_offset, G_MINSHORT, G_MAXSHORT);
-      rectangles[i].y = CLAMP (box.y + y_offset, G_MINSHORT, G_MAXSHORT);
-      rectangles[i].width = CLAMP (box.width, G_MINSHORT, G_MAXSHORT);
-      rectangles[i].height = CLAMP (box.height, G_MINSHORT, G_MAXSHORT);
+      rectangles[i].x = CLAMP ((box.x + x_offset) * scale, G_MINSHORT, G_MAXSHORT);
+      rectangles[i].y = CLAMP ((box.y + y_offset) * scale, G_MINSHORT, G_MAXSHORT);
+      rectangles[i].width = CLAMP (box.width * scale, G_MINSHORT, G_MAXSHORT);
+      rectangles[i].height = CLAMP (box.height * scale, G_MINSHORT, G_MAXSHORT);
     }
 
   *n_rects = n;
diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h
index defd47e..57f7d89 100644
--- a/gdk/x11/gdkprivate-x11.h
+++ b/gdk/x11/gdkprivate-x11.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -140,11 +140,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gboolean _gdk_x11_selection_filter_clear_event (XSelectionClearEvent *event);
 
 cairo_region_t* _gdk_x11_xwindow_get_shape  (Display *xdisplay,
                                              Window   window,
+                                             gint     scale,
                                              gint     shape_type);
 
 void     _gdk_x11_region_get_xrectangles   (const cairo_region_t  *region,
                                             gint                   x_offset,
                                             gint                   y_offset,
+                                            gint                   scale,
                                             XRectangle           **rects,
                                             gint                  *n_rects);
 
diff --git a/gdk/x11/gdkscreen-x11.c b/gdk/x11/gdkscreen-x11.c
index 760da2b..ae441aa 100644
--- a/gdk/x11/gdkscreen-x11.c
+++ b/gdk/x11/gdkscreen-x11.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -96,13 +96,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_screen_get_display (GdkScreen *screen)
 static gint
 gdk_x11_screen_get_width (GdkScreen *screen)
 {
-  return WidthOfScreen (GDK_X11_SCREEN (screen)-&amp;gt;xscreen);
+  return WidthOfScreen (GDK_X11_SCREEN (screen)-&amp;gt;xscreen) / GDK_X11_SCREEN (screen)-&amp;gt;default_window_scale;
 }
 
 static gint
 gdk_x11_screen_get_height (GdkScreen *screen)
 {
-  return HeightOfScreen (GDK_X11_SCREEN (screen)-&amp;gt;xscreen);
+  return HeightOfScreen (GDK_X11_SCREEN (screen)-&amp;gt;xscreen) / GDK_X11_SCREEN (screen)-&amp;gt;default_window_scale;
 }
 
 static gint
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -253,7 +253,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_screen_get_monitor_geometry (GdkScreen    *screen,
   GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen);
 
   if (dest)
-    *dest = x11_screen-&amp;gt;monitors[monitor_num].geometry;
+    {
+      *dest = x11_screen-&amp;gt;monitors[monitor_num].geometry;
+      dest-&amp;gt;x /= GDK_X11_SCREEN (screen)-&amp;gt;default_window_scale;
+      dest-&amp;gt;y /= GDK_X11_SCREEN (screen)-&amp;gt;default_window_scale;
+      dest-&amp;gt;width /= GDK_X11_SCREEN (screen)-&amp;gt;default_window_scale;
+      dest-&amp;gt;height /= GDK_X11_SCREEN (screen)-&amp;gt;default_window_scale;
+    }
 }
 
 static int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -318,8 +324,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; get_work_area (GdkScreen    *screen,
   /* Defaults in case of error */
   area-&amp;gt;x = 0;
   area-&amp;gt;y = 0;
-  area-&amp;gt;width = gdk_screen_get_width (screen);
-  area-&amp;gt;height = gdk_screen_get_height (screen);
+  area-&amp;gt;width = gdk_screen_get_width (screen) / GDK_X11_SCREEN (screen)-&amp;gt;default_window_scale;
+  area-&amp;gt;height = gdk_screen_get_height (screen) / GDK_X11_SCREEN (screen)-&amp;gt;default_window_scale;
 
   if (!gdk_x11_screen_supports_net_wm_hint (screen,
                                             gdk_atom_intern_static_string ("_NET_WORKAREA")))
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -356,6 +362,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; get_work_area (GdkScreen    *screen,
   area-&amp;gt;width = workareas[desktop * 4 + 2];
   area-&amp;gt;height = workareas[desktop * 4 + 3];
 
+  area-&amp;gt;x /= GDK_X11_SCREEN (screen)-&amp;gt;default_window_scale;
+  area-&amp;gt;y /= GDK_X11_SCREEN (screen)-&amp;gt;default_window_scale;
+  area-&amp;gt;width /= GDK_X11_SCREEN (screen)-&amp;gt;default_window_scale;
+  area-&amp;gt;height /= GDK_X11_SCREEN (screen)-&amp;gt;default_window_scale;
+
   XFree (ret_workarea);
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1029,6 +1040,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_x11_screen_new (GdkDisplay *display,
   GdkScreen *screen;
   GdkX11Screen *x11_screen;
   GdkX11Display *display_x11 = GDK_X11_DISPLAY (display);
+  char *scale_str;
 
   screen = g_object_new (GDK_TYPE_X11_SCREEN, NULL);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1041,7 +1053,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_x11_screen_new (GdkDisplay *display,
   x11_screen-&amp;gt;wmspec_check_window = None;
   /* we want this to be always non-null */
   x11_screen-&amp;gt;window_manager_name = g_strdup ("unknown");
-  
+
+  scale_str = g_getenv ("GDK_SCALE");
+  if (scale_str)
+    {
+      x11_screen-&amp;gt;default_window_scale = atol (scale_str);
+      if (x11_screen-&amp;gt;default_window_scale == 0)
+        x11_screen-&amp;gt;default_window_scale = 1;
+    }
+  else
+    x11_screen-&amp;gt;default_window_scale = 1;
+
   init_multihead (screen);
   init_randr_support (screen);
   
diff --git a/gdk/x11/gdkscreen-x11.h b/gdk/x11/gdkscreen-x11.h
index 5c88a1a..9f96981 100644
--- a/gdk/x11/gdkscreen-x11.h
+++ b/gdk/x11/gdkscreen-x11.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -47,6 +47,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct _GdkX11Screen
   GdkX11Monitor *monitors;
   gint primary_monitor;
 
+  gint default_window_scale;
+
   /* Xft resources for the display, used for default values for
    * the Xft/ XSETTINGS
    */
diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c
index 1f1dbf1..973e7a8 100644
--- a/gdk/x11/gdkwindow-x11.c
+++ b/gdk/x11/gdkwindow-x11.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -194,8 +194,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_x11_window_update_size (GdkWindowImplX11 *impl)
   if (impl-&amp;gt;cairo_surface)
     {
       cairo_xlib_surface_set_size (impl-&amp;gt;cairo_surface,
-                                   gdk_window_get_width (impl-&amp;gt;wrapper),
-                                   gdk_window_get_height (impl-&amp;gt;wrapper));
+                                   gdk_window_get_width (impl-&amp;gt;wrapper) * impl-&amp;gt;window_scale,
+                                   gdk_window_get_height (impl-&amp;gt;wrapper) * impl-&amp;gt;window_scale);
     }
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -464,8 +464,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_ref_cairo_surface (GdkWindow *window)
   if (!impl-&amp;gt;cairo_surface)
     {
       impl-&amp;gt;cairo_surface = gdk_x11_create_cairo_surface (impl,
-                                                          gdk_window_get_width (window),
-                                                          gdk_window_get_height (window));
+                                                          gdk_window_get_width (window) * impl-&amp;gt;window_scale,
+                                                          gdk_window_get_height (window) * impl-&amp;gt;window_scale);
+      cairo_surface_set_device_scale (impl-&amp;gt;cairo_surface, impl-&amp;gt;window_scale, impl-&amp;gt;window_scale);
       
       if (impl-&amp;gt;cairo_surface)
 cairo_surface_set_user_data (impl-&amp;gt;cairo_surface, &amp;amp;gdk_x11_cairo_key,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -727,6 +728,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_x11_screen_init_root_window (GdkScreen *screen)
   
   impl-&amp;gt;xid = x11_screen-&amp;gt;xroot_window;
   impl-&amp;gt;wrapper = window;
+  impl-&amp;gt;window_scale = x11_screen-&amp;gt;default_window_scale;
   
   window-&amp;gt;window_type = GDK_WINDOW_ROOT;
   window-&amp;gt;depth = DefaultDepthOfScreen (x11_screen-&amp;gt;xscreen);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -735,8 +737,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_x11_screen_init_root_window (GdkScreen *screen)
   window-&amp;gt;y = 0;
   window-&amp;gt;abs_x = 0;
   window-&amp;gt;abs_y = 0;
-  window-&amp;gt;width = WidthOfScreen (x11_screen-&amp;gt;xscreen);
-  window-&amp;gt;height = HeightOfScreen (x11_screen-&amp;gt;xscreen);
+  window-&amp;gt;width = WidthOfScreen (x11_screen-&amp;gt;xscreen) / impl-&amp;gt;window_scale;
+  window-&amp;gt;height = HeightOfScreen (x11_screen-&amp;gt;xscreen) / impl-&amp;gt;window_scale;
   window-&amp;gt;viewable = TRUE;
 
   /* see init_randr_support() in gdkscreen-x11.c */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -872,6 +874,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; setup_toplevel_window (GdkWindow *window,
        GdkWindow *parent)
 {
   GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (window);
+  GdkWindowImplX11 *impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
   GdkDisplay *display = gdk_window_get_display (window);
   Display *xdisplay = GDK_WINDOW_XDISPLAY (window);
   XID xid = GDK_WINDOW_XID (window);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -900,8 +903,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; setup_toplevel_window (GdkWindow *window,
    * correct value???
    */
   size_hints.flags = PSize;
-  size_hints.width = window-&amp;gt;width;
-  size_hints.height = window-&amp;gt;height;
+  size_hints.width = window-&amp;gt;width * impl-&amp;gt;window_scale;
+  size_hints.height = window-&amp;gt;height * impl-&amp;gt;window_scale;
   
   XSetWMNormalHints (xdisplay, xid, &amp;amp;size_hints);
   
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1006,6 +1009,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_x11_display_create_window_impl (GdkDisplay    *display,
   impl = g_object_new (GDK_TYPE_WINDOW_IMPL_X11, NULL);
   window-&amp;gt;impl = GDK_WINDOW_IMPL (impl);
   impl-&amp;gt;wrapper = GDK_WINDOW (window);
+  impl-&amp;gt;window_scale = x11_screen-&amp;gt;default_window_scale;
 
   xdisplay = x11_screen-&amp;gt;xdisplay;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1076,21 +1080,21 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_x11_display_create_window_impl (GdkDisplay    *display,
       class = InputOnly;
     }
 
-  if (window-&amp;gt;width &amp;gt; 65535 ||
-      window-&amp;gt;height &amp;gt; 65535)
+  if (window-&amp;gt;width * impl-&amp;gt;window_scale &amp;gt; 65535 ||
+      window-&amp;gt;height * impl-&amp;gt;window_scale &amp;gt; 65535)
     {
       g_warning ("Native Windows wider or taller than 65535 pixels are not supported");
 
-      if (window-&amp;gt;width &amp;gt; 65535)
-        window-&amp;gt;width = 65535;
-      if (window-&amp;gt;height &amp;gt; 65535)
-        window-&amp;gt;height = 65535;
+      if (window-&amp;gt;width * impl-&amp;gt;window_scale &amp;gt; 65535)
+        window-&amp;gt;width = 65535 / impl-&amp;gt;window_scale;
+      if (window-&amp;gt;height  * impl-&amp;gt;window_scale &amp;gt; 65535)
+        window-&amp;gt;height = 65535 /  impl-&amp;gt;window_scale;
     }
 
   impl-&amp;gt;xid = XCreateWindow (xdisplay, xparent,
-                             window-&amp;gt;x + window-&amp;gt;parent-&amp;gt;abs_x,
-                             window-&amp;gt;y + window-&amp;gt;parent-&amp;gt;abs_y,
-                             window-&amp;gt;width, window-&amp;gt;height,
+                             (window-&amp;gt;x + window-&amp;gt;parent-&amp;gt;abs_x) * impl-&amp;gt;window_scale,
+                             (window-&amp;gt;y + window-&amp;gt;parent-&amp;gt;abs_y) * impl-&amp;gt;window_scale,
+                             window-&amp;gt;width * impl-&amp;gt;window_scale, window-&amp;gt;height * impl-&amp;gt;window_scale,
                              0, window-&amp;gt;depth, class, xvisual,
                              xattributes_mask, &amp;amp;xattributes);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1219,6 +1223,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_window_foreign_new_for_display (GdkDisplay *display,
 
   impl = GDK_WINDOW_IMPL_X11 (win-&amp;gt;impl);
   impl-&amp;gt;wrapper = win;
+  impl-&amp;gt;window_scale = GDK_X11_SCREEN (screen)-&amp;gt;default_window_scale;
 
   win-&amp;gt;parent = gdk_x11_window_lookup_for_display (display, parent);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1231,10 +1236,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_window_foreign_new_for_display (GdkDisplay *display,
 
   impl-&amp;gt;xid = window;
 
-  win-&amp;gt;x = attrs.x;
-  win-&amp;gt;y = attrs.y;
-  win-&amp;gt;width = attrs.width;
-  win-&amp;gt;height = attrs.height;
+  win-&amp;gt;x = attrs.x / impl-&amp;gt;window_scale;
+  win-&amp;gt;y = attrs.y / impl-&amp;gt;window_scale;
+  win-&amp;gt;width = attrs.width / impl-&amp;gt;window_scale;
+  win-&amp;gt;height = attrs.height  / impl-&amp;gt;window_scale;
   win-&amp;gt;window_type = GDK_WINDOW_FOREIGN;
   win-&amp;gt;destroyed = FALSE;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1765,7 +1770,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; window_x11_move (GdkWindow *window,
     {
       XMoveWindow (GDK_WINDOW_XDISPLAY (window),
                    GDK_WINDOW_XID (window),
-                   x, y);
+                   x * impl-&amp;gt;window_scale, y * impl-&amp;gt;window_scale);
 
       if (impl-&amp;gt;override_redirect)
         {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1800,7 +1805,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; window_x11_resize (GdkWindow *window,
 
       XResizeWindow (GDK_WINDOW_XDISPLAY (window),
                      GDK_WINDOW_XID (window),
-                     width, height);
+                     width * impl-&amp;gt;window_scale, height * impl-&amp;gt;window_scale);
 
       if (impl-&amp;gt;override_redirect)
         {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1844,7 +1849,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; window_x11_move_resize (GdkWindow *window,
 
       XMoveResizeWindow (GDK_WINDOW_XDISPLAY (window),
                          GDK_WINDOW_XID (window),
-                         x, y, width, height);
+                         x * impl-&amp;gt;window_scale, y * impl-&amp;gt;window_scale,
+                         width * impl-&amp;gt;window_scale, height * impl-&amp;gt;window_scale);
 
       if (impl-&amp;gt;override_redirect)
         {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1898,7 +1904,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_window_x11_reparent (GdkWindow *window,
   XReparentWindow (GDK_WINDOW_XDISPLAY (window),
    GDK_WINDOW_XID (window),
    GDK_WINDOW_XID (new_parent),
-   new_parent-&amp;gt;abs_x + x, new_parent-&amp;gt;abs_y + y);
+   (new_parent-&amp;gt;abs_x + x)  * impl-&amp;gt;window_scale,
+                   (new_parent-&amp;gt;abs_y + y) * impl-&amp;gt;window_scale);
   _gdk_x11_window_tmp_reset_parent_bg (window);
   _gdk_x11_window_tmp_reset_bg (window, TRUE);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2390,6 +2397,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_window_set_geometry_hints (GdkWindow         *window,
    const GdkGeometry *geometry,
    GdkWindowHints     geom_mask)
 {
+  GdkWindowImplX11 *impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
   XSizeHints size_hints;
   
   if (GDK_WINDOW_DESTROYED (window) ||
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2422,31 +2430,37 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_window_set_geometry_hints (GdkWindow         *window,
   if (geom_mask &amp;amp; GDK_HINT_MIN_SIZE)
     {
       size_hints.flags |= PMinSize;
-      size_hints.min_width = geometry-&amp;gt;min_width;
-      size_hints.min_height = geometry-&amp;gt;min_height;
+      size_hints.min_width = geometry-&amp;gt;min_width * impl-&amp;gt;window_scale;
+      size_hints.min_height = geometry-&amp;gt;min_height * impl-&amp;gt;window_scale;
     }
   
   if (geom_mask &amp;amp; GDK_HINT_MAX_SIZE)
     {
       size_hints.flags |= PMaxSize;
-      size_hints.max_width = MAX (geometry-&amp;gt;max_width, 1);
-      size_hints.max_height = MAX (geometry-&amp;gt;max_height, 1);
+      size_hints.max_width = MAX (geometry-&amp;gt;max_width, 1) * impl-&amp;gt;window_scale;
+      size_hints.max_height = MAX (geometry-&amp;gt;max_height, 1) * impl-&amp;gt;window_scale;
     }
   
   if (geom_mask &amp;amp; GDK_HINT_BASE_SIZE)
     {
       size_hints.flags |= PBaseSize;
-      size_hints.base_width = geometry-&amp;gt;base_width;
-      size_hints.base_height = geometry-&amp;gt;base_height;
+      size_hints.base_width = geometry-&amp;gt;base_width * impl-&amp;gt;window_scale;
+      size_hints.base_height = geometry-&amp;gt;base_height * impl-&amp;gt;window_scale;
     }
   
   if (geom_mask &amp;amp; GDK_HINT_RESIZE_INC)
     {
       size_hints.flags |= PResizeInc;
-      size_hints.width_inc = geometry-&amp;gt;width_inc;
-      size_hints.height_inc = geometry-&amp;gt;height_inc;
+      size_hints.width_inc = geometry-&amp;gt;width_inc * impl-&amp;gt;window_scale;
+      size_hints.height_inc = geometry-&amp;gt;height_inc * impl-&amp;gt;window_scale;
     }
-  
+  else if (impl-&amp;gt;window_scale &amp;gt; 1)
+    {
+      size_hints.flags |= PResizeInc;
+      size_hints.width_inc = impl-&amp;gt;window_scale;
+      size_hints.height_inc = impl-&amp;gt;window_scale;
+    }
+
   if (geom_mask &amp;amp; GDK_HINT_ASPECT)
     {
       size_hints.flags |= PAspect;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2491,6 +2505,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_window_get_geometry_hints (GdkWindow      *window,
                                GdkGeometry    *geometry,
                                GdkWindowHints *geom_mask)
 {
+  GdkWindowImplX11 *impl;
   XSizeHints *size_hints;  
   glong junk_supplied_mask = 0;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2504,6 +2519,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_window_get_geometry_hints (GdkWindow      *window,
       !WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
     return;
 
+  impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
+
   size_hints = XAllocSizeHints ();
   if (!size_hints)
     return;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2517,22 +2534,22 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_window_get_geometry_hints (GdkWindow      *window,
   if (size_hints-&amp;gt;flags &amp;amp; PMinSize)
     {
       *geom_mask |= GDK_HINT_MIN_SIZE;
-      geometry-&amp;gt;min_width = size_hints-&amp;gt;min_width;
-      geometry-&amp;gt;min_height = size_hints-&amp;gt;min_height;
+      geometry-&amp;gt;min_width = size_hints-&amp;gt;min_width / impl-&amp;gt;window_scale;
+      geometry-&amp;gt;min_height = size_hints-&amp;gt;min_height / impl-&amp;gt;window_scale;
     }
 
   if (size_hints-&amp;gt;flags &amp;amp; PMaxSize)
     {
       *geom_mask |= GDK_HINT_MAX_SIZE;
-      geometry-&amp;gt;max_width = MAX (size_hints-&amp;gt;max_width, 1);
-      geometry-&amp;gt;max_height = MAX (size_hints-&amp;gt;max_height, 1);
+      geometry-&amp;gt;max_width = MAX (size_hints-&amp;gt;max_width, 1) / impl-&amp;gt;window_scale;
+      geometry-&amp;gt;max_height = MAX (size_hints-&amp;gt;max_height, 1) / impl-&amp;gt;window_scale;
     }
 
   if (size_hints-&amp;gt;flags &amp;amp; PResizeInc)
     {
       *geom_mask |= GDK_HINT_RESIZE_INC;
-      geometry-&amp;gt;width_inc = size_hints-&amp;gt;width_inc;
-      geometry-&amp;gt;height_inc = size_hints-&amp;gt;height_inc;
+      geometry-&amp;gt;width_inc = size_hints-&amp;gt;width_inc / impl-&amp;gt;window_scale;
+      geometry-&amp;gt;height_inc = size_hints-&amp;gt;height_inc / impl-&amp;gt;window_scale;
     }
 
   if (size_hints-&amp;gt;flags &amp;amp; PAspect)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2793,6 +2810,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void
 gdk_window_x11_set_background (GdkWindow      *window,
                                cairo_pattern_t *pattern)
 {
+  GdkWindowImplX11 *impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
   double r, g, b, a;
   cairo_surface_t *surface;
   cairo_matrix_t matrix;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2831,12 +2849,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_window_x11_set_background (GdkWindow      *window,
           cairo_xlib_surface_get_visual (surface) == GDK_VISUAL_XVISUAL (gdk_window_get_visual ((window))) &amp;amp;&amp;amp;
           cairo_xlib_surface_get_display (surface) == GDK_WINDOW_XDISPLAY (window))
         {
-          double x, y;
+          double x, y, sx, sy;
 
           cairo_surface_get_device_offset (surface, &amp;amp;x, &amp;amp;y);
+          cairo_surface_get_device_scale (surface, &amp;amp;sx, &amp;amp;sy);
           /* XXX: This still bombs for non-pixmaps, but there's no way to
            * detect we're not a pixmap in Cairo... */
-          if (x == 0.0 &amp;amp;&amp;amp; y == 0.0)
+          if (x == 0.0 &amp;amp;&amp;amp; y == 0.0 &amp;amp;&amp;amp;
+              sx == impl-&amp;gt;window_scale &amp;amp;&amp;amp; sy == impl-&amp;gt;window_scale)
             {
               XSetWindowBackgroundPixmap (GDK_WINDOW_XDISPLAY (window),
                                           GDK_WINDOW_XID (window),
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2900,6 +2920,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_window_x11_get_geometry (GdkWindow *window,
                              gint      *width,
                              gint      *height)
 {
+  GdkWindowImplX11 *impl;
   Window root;
   gint tx;
   gint ty;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2910,18 +2931,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_window_x11_get_geometry (GdkWindow *window,
   
   if (!GDK_WINDOW_DESTROYED (window))
     {
+      impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
+
       XGetGeometry (GDK_WINDOW_XDISPLAY (window),
     GDK_WINDOW_XID (window),
     &amp;amp;root, &amp;amp;tx, &amp;amp;ty, &amp;amp;twidth, &amp;amp;theight, &amp;amp;tborder_width, &amp;amp;tdepth);
       
       if (x)
-*x = tx;
+*x = tx / impl-&amp;gt;window_scale;
       if (y)
-*y = ty;
+*y = ty / impl-&amp;gt;window_scale;
       if (width)
-*width = twidth;
+*width = twidth / impl-&amp;gt;window_scale;
       if (height)
-*height = theight;
+*height = theight / impl-&amp;gt;window_scale;
     }
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2932,6 +2955,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_window_x11_get_root_coords (GdkWindow *window,
 gint      *root_x,
 gint      *root_y)
 {
+  GdkWindowImplX11 *impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
   gint return_val;
   Window child;
   gint tx;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2940,13 +2964,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_window_x11_get_root_coords (GdkWindow *window,
   return_val = XTranslateCoordinates (GDK_WINDOW_XDISPLAY (window),
       GDK_WINDOW_XID (window),
       GDK_WINDOW_XROOTWIN (window),
-      x, y, &amp;amp;tx, &amp;amp;ty,
+      x * impl-&amp;gt;window_scale, y * impl-&amp;gt;window_scale, &amp;amp;tx, &amp;amp;ty,
       &amp;amp;child);
   
   if (root_x)
-    *root_x = tx;
+    *root_x = tx / impl-&amp;gt;window_scale;
   if (root_y)
-    *root_y = ty;
+    *root_y = ty / impl-&amp;gt;window_scale;
   
   return return_val;
 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3001,13 +3025,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_window_get_frame_extents (GdkWindow    *window,
   while (window-&amp;gt;parent &amp;amp;&amp;amp; (window-&amp;gt;parent)-&amp;gt;parent)
     window = window-&amp;gt;parent;
 
+  impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
+
   /* Refine our fallback answer a bit using local information */
-  rect-&amp;gt;x = window-&amp;gt;x;
-  rect-&amp;gt;y = window-&amp;gt;y;
-  rect-&amp;gt;width = window-&amp;gt;width;
-  rect-&amp;gt;height = window-&amp;gt;height;
+  rect-&amp;gt;x = window-&amp;gt;x * impl-&amp;gt;window_scale;
+  rect-&amp;gt;y = window-&amp;gt;y * impl-&amp;gt;window_scale;
+  rect-&amp;gt;width = window-&amp;gt;width * impl-&amp;gt;window_scale;
+  rect-&amp;gt;height = window-&amp;gt;height * impl-&amp;gt;window_scale;
 
-  impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
   if (GDK_WINDOW_DESTROYED (window) || impl-&amp;gt;override_redirect)
     return;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3126,6 +3151,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_window_get_frame_extents (GdkWindow    *window,
   if (vroots)
     XFree (vroots);
 
+  rect-&amp;gt;x /= impl-&amp;gt;window_scale;
+  rect-&amp;gt;y /= impl-&amp;gt;window_scale;
+  rect-&amp;gt;width /= impl-&amp;gt;window_scale;
+  rect-&amp;gt;height /= impl-&amp;gt;window_scale;
   gdk_x11_display_error_trap_pop_ignored (display);
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3143,6 +3172,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_window_x11_get_device_state (GdkWindow       *window,
   if (GDK_WINDOW_DESTROYED (window))
     return FALSE;
 
+  /*HIDPI: handle coords here?*/
   GDK_DEVICE_GET_CLASS (device)-&amp;gt;query_state (device, window,
                                               NULL, &amp;amp;child,
                                               NULL, NULL,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3199,6 +3229,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; do_shape_combine_region (GdkWindow       *window,
  gint             offset_y,
  gint             shape)
 {
+  GdkWindowImplX11 *impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
+
   if (GDK_WINDOW_DESTROYED (window))
     return;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3237,7 +3269,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; do_shape_combine_region (GdkWindow       *window,
       XRectangle *xrects = NULL;
 
       _gdk_x11_region_get_xrectangles (shape_region,
-                                       0, 0,
+                                       0, 0, impl-&amp;gt;window_scale,
                                        &amp;amp;xrects, &amp;amp;n_rects);
       
       if (shape == ShapeBounding)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3248,7 +3280,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; do_shape_combine_region (GdkWindow       *window,
       XShapeCombineRectangles (GDK_WINDOW_XDISPLAY (window),
                                GDK_WINDOW_XID (window),
                                shape,
-                               offset_x, offset_y,
+                               offset_x * impl-&amp;gt;window_scale,
+                               offset_y * impl-&amp;gt;window_scale,
                                xrects, n_rects,
                                ShapeSet,
                                YXBanded);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4307,6 +4340,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_x11_window_set_functions (GdkWindow    *window,
 cairo_region_t *
 _gdk_x11_xwindow_get_shape (Display *xdisplay,
                             Window   window,
+                            gint     scale,
                             gint     shape_type)
 {
   cairo_region_t *shape;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4340,13 +4374,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_x11_xwindow_get_shape (Display *xdisplay,
       return NULL;
     }
 
+  /* NOTE: The scale divisions here may lose some precision if someone
+     else set the shape to be non-scale precision */
   rl = g_new (GdkRectangle, rn);
   for (i = 0; i &amp;lt; rn; i++)
     {
-      rl[i].x = xrl[i].x;
-      rl[i].y = xrl[i].y;
-      rl[i].width = xrl[i].width;
-      rl[i].height = xrl[i].height;
+      rl[i].x = xrl[i].x / scale;
+      rl[i].y = xrl[i].y / scale;
+      rl[i].width = xrl[i].width / scale;
+      rl[i].height = xrl[i].height / scale;
     }
   XFree (xrl);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4360,10 +4396,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_x11_xwindow_get_shape (Display *xdisplay,
 static cairo_region_t *
 gdk_x11_window_get_shape (GdkWindow *window)
 {
+  GdkWindowImplX11 *impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
+
   if (!GDK_WINDOW_DESTROYED (window) &amp;amp;&amp;amp;
       gdk_display_supports_shapes (GDK_WINDOW_DISPLAY (window)))
     return _gdk_x11_xwindow_get_shape (GDK_WINDOW_XDISPLAY (window),
                                        GDK_WINDOW_XID (window),
+                                       impl-&amp;gt;window_scale,
                                        ShapeBounding);
 
   return NULL;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4373,10 +4412,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static cairo_region_t *
 gdk_x11_window_get_input_shape (GdkWindow *window)
 {
 #if defined(ShapeInput)
+  GdkWindowImplX11 *impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
+
   if (!GDK_WINDOW_DESTROYED (window) &amp;amp;&amp;amp;
       gdk_display_supports_input_shapes (GDK_WINDOW_DISPLAY (window)))
     return _gdk_x11_xwindow_get_shape (GDK_WINDOW_XDISPLAY (window),
                                        GDK_WINDOW_XID (window),
+                                       impl-&amp;gt;window_scale,
                                        ShapeInput);
 #endif
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4467,6 +4509,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wmspec_send_message (GdkDisplay *display,
                      gint        action,
                      gint        button)
 {
+  GdkWindowImplX11 *impl = GDK_WINDOW_IMPL_X11 (window-&amp;gt;impl);
   XClientMessageEvent xclient;
 
   memset (&amp;amp;xclient, 0, sizeof (xclient));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4475,8 +4518,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; wmspec_send_message (GdkDisplay *display,
   xclient.message_type =
     gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_MOVERESIZE");
   xclient.format = 32;
-  xclient.data.l[0] = root_x;
-  xclient.data.l[1] = root_y;
+  xclient.data.l[0] = root_x * impl-&amp;gt;window_scale;
+  xclient.data.l[1] = root_y * impl-&amp;gt;window_scale;
   xclient.data.l[2] = action;
   xclient.data.l[3] = button;
   xclient.data.l[4] = 1;  /* source indication */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4798,6 +4841,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_x11_moveresize_handle_event (XEvent *event)
   guint button_mask = 0;
   GdkDisplay *display = gdk_x11_lookup_xdisplay (event-&amp;gt;xany.display);
   MoveResizeData *mv_resize = get_move_resize_data (display, FALSE);
+  GdkWindowImplX11 *impl;
 
   if (!mv_resize || !mv_resize-&amp;gt;moveresize_window)
     {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4805,6 +4849,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_x11_moveresize_handle_event (XEvent *event)
       return FALSE;
     }
 
+  impl = GDK_WINDOW_IMPL_X11 (mv_resize-&amp;gt;moveresize_window-&amp;gt;impl);
+
   button_mask = GDK_BUTTON1_MASK &amp;lt;&amp;lt; (mv_resize-&amp;gt;moveresize_button - 1);
 
   switch (event-&amp;gt;xany.type)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4824,8 +4870,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_x11_moveresize_handle_event (XEvent *event)
         break;
 
       update_pos (mv_resize,
-                  event-&amp;gt;xmotion.x_root,
-                  event-&amp;gt;xmotion.y_root);
+                  event-&amp;gt;xmotion.x_root / impl-&amp;gt;window_scale,
+                  event-&amp;gt;xmotion.y_root / impl-&amp;gt;window_scale);
 
       /* This should never be triggered in normal cases, but in the
        * case where the drag started without an implicit grab being
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4839,8 +4885,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_x11_moveresize_handle_event (XEvent *event)
 
     case ButtonRelease:
       update_pos (mv_resize,
-                  event-&amp;gt;xbutton.x_root,
-                  event-&amp;gt;xbutton.y_root);
+                  event-&amp;gt;xbutton.x_root / impl-&amp;gt;window_scale,
+                  event-&amp;gt;xbutton.y_root / impl-&amp;gt;window_scale);
 
       if (event-&amp;gt;xbutton.button == mv_resize-&amp;gt;moveresize_button)
         finish_drag (mv_resize);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4856,14 +4902,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_x11_moveresize_handle_event (XEvent *event)
         switch (ev-&amp;gt;evtype)
           {
           case XI_Motion:
-            update_pos (mv_resize, xev-&amp;gt;root_x, xev-&amp;gt;root_y);
+            update_pos (mv_resize, xev-&amp;gt;root_x / impl-&amp;gt;window_scale, xev-&amp;gt;root_y / impl-&amp;gt;window_scale);
             state = _gdk_x11_device_xi2_translate_state (&amp;amp;xev-&amp;gt;mods, &amp;amp;xev-&amp;gt;buttons, &amp;amp;xev-&amp;gt;group);
             if ((state &amp;amp; button_mask) == 0)
             finish_drag (mv_resize);
             break;
 
           case XI_ButtonRelease:
-            update_pos (mv_resize, xev-&amp;gt;root_x, xev-&amp;gt;root_y);
+            update_pos (mv_resize, xev-&amp;gt;root_x / impl-&amp;gt;window_scale, xev-&amp;gt;root_y / impl-&amp;gt;window_scale);
             if (xev-&amp;gt;detail == mv_resize-&amp;gt;moveresize_button)
               finish_drag (mv_resize);
             break;
diff --git a/gdk/x11/gdkwindow-x11.h b/gdk/x11/gdkwindow-x11.h
index 5079b5d..5a9b31d 100644
--- a/gdk/x11/gdkwindow-x11.h
+++ b/gdk/x11/gdkwindow-x11.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -64,6 +64,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct _GdkWindowImplX11
 
   Window xid;
 
+  gint window_scale;
+
   GdkToplevelX11 *toplevel;/* Toplevel-specific information */
   GdkCursor *cursor;
   GHashTable *device_cursor;
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.

&lt;/pre&gt;</description>
    <dc:creator>Alexander Larsson</dc:creator>
    <dc:date>2013-06-20T09:44:46</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725691">
    <title>[gtk+/wip/window-scales: 107/108] icontheme: Add support for highresolution icons</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725691</link>
    <description>&lt;pre&gt;commit 6cb020cc3d8b38eabc2a8dba8b4c010a30d427dd
Author: Carlos Garnacho &amp;lt;carlos&amp;lt; at &amp;gt;lanedo.com&amp;gt;
Date:   Fri May 10 18:06:00 2013 +0200

    icontheme: Add support for high resolution icons
    
    An optional OutputScale integer key has been added to index.theme
    subdirs description, so icon themes may provide icons that are
    more suitable to render at a (typically 2x) integer upscaled
    resolution. This way it is possible to make eg. a 16x16&amp;lt; at &amp;gt;2x icon has a
    real size of 32x32, but contains a similar level of detail to the
    16x16 icon so things don't look any more cluttered on high-dpi
    screens.
    
    The pixbuf lookup has changed so it prefers a minimal scale change
    that yields the minimal real size difference, so if looking up for
    a 16x16 icon at 2x, it would first prefer 16x16&amp;lt; at &amp;gt;2x, then 32x32, and
    then any other icon that's closest to match
    
    There is now *_for_scale() variants for all GtkIconTheme ways
    to directly or indirectly fetch a GdkPixbuf.
    
    This is based on code by Carlos Garnacho with changes by Alexander
    Larsson

 gtk/gtkicontheme.c |  351 +++++++++++++++++++++++++++++++++++++++++++---------
 gtk/gtkicontheme.h |   28 ++++
 2 files changed, 320 insertions(+), 59 deletions(-)
---
diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
index 9a8e4b3..62839a9 100644
--- a/gtk/gtkicontheme.c
+++ b/gtk/gtkicontheme.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -253,11 +253,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct _GtkIconInfo
    */
   IconThemeDirType dir_type;
   gint dir_size;
+  gint dir_scale;
   gint threshold;
 
   /* Parameters influencing the scaled icon
    */
   gint desired_size;
+  gint desired_scale;
   guint raw_coordinates : 1;
   guint forced_size     : 1;
   guint emblems_applied : 1;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -295,6 +297,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct
   int min_size;
   int max_size;
   int threshold;
+  int scale;
 
   char *dir;
   char *subdir;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -333,6 +336,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void         theme_destroy     (IconTheme        *theme);
 static GtkIconInfo *theme_lookup_icon (IconTheme        *theme,
        const char       *icon_name,
        int               size,
+                                       gint              scale,
        gboolean          allow_svg,
        gboolean          use_default_icons);
 static void         theme_list_icons  (IconTheme        *theme,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1365,11 +1369,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gtk_icon_theme_ensure_builtin_cache (void)
   IconThemeDir *dir;
   static IconThemeDir dirs[5] = 
     {
-      { ICON_THEME_DIR_THRESHOLD, 0, 16, 16, 16, 2, NULL, "16", -1, NULL, NULL, NULL },
-      { ICON_THEME_DIR_THRESHOLD, 0, 20, 20, 20, 2, NULL, "20", -1,  NULL, NULL, NULL },
-      { ICON_THEME_DIR_THRESHOLD, 0, 24, 24, 24, 2, NULL, "24", -1, NULL, NULL, NULL },
-      { ICON_THEME_DIR_THRESHOLD, 0, 32, 32, 32, 2, NULL, "32", -1, NULL, NULL, NULL },
-      { ICON_THEME_DIR_THRESHOLD, 0, 48, 48, 48, 2, NULL, "48", -1, NULL, NULL, NULL }
+      { ICON_THEME_DIR_THRESHOLD, 0, 16, 16, 16, 2, 1, NULL, "16", -1, NULL, NULL, NULL },
+      { ICON_THEME_DIR_THRESHOLD, 0, 20, 20, 20, 2, 1, NULL, "20", -1,  NULL, NULL, NULL },
+      { ICON_THEME_DIR_THRESHOLD, 0, 24, 24, 24, 2, 1, NULL, "24", -1, NULL, NULL, NULL },
+      { ICON_THEME_DIR_THRESHOLD, 0, 32, 32, 32, 2, 1, NULL, "32", -1, NULL, NULL, NULL },
+      { ICON_THEME_DIR_THRESHOLD, 0, 48, 48, 48, 2, 1, NULL, "48", -1, NULL, NULL, NULL }
     };
   gint i;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1597,6 +1601,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static GtkIconInfo *
 choose_icon (GtkIconTheme       *icon_theme,
      const gchar        *icon_names[],
      gint                size,
+             gint                scale,
      GtkIconLookupFlags  flags)
 {
   GtkIconThemePrivate *priv;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1651,7 +1656,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; choose_icon (GtkIconTheme       *icon_theme,
       for (l = priv-&amp;gt;themes; l; l = l-&amp;gt;next)
         {
           IconTheme *theme = l-&amp;gt;data;
-          icon_info = theme_lookup_icon (theme, icon_names[0], size, allow_svg, use_builtin);
+          icon_info = theme_lookup_icon (theme, icon_names[0], size, scale, allow_svg, use_builtin);
           if (icon_info)
             goto out;
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1663,7 +1668,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; choose_icon (GtkIconTheme       *icon_theme,
       
       for (i = 0; icon_names[i]; i++)
         {
-          icon_info = theme_lookup_icon (theme, icon_names[i], size, allow_svg, use_builtin);
+          icon_info = theme_lookup_icon (theme, icon_names[i], size, scale, allow_svg, use_builtin);
           if (icon_info)
             goto out;
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1697,6 +1702,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; choose_icon (GtkIconTheme       *icon_theme,
   DestroyIcon (hIcon);
           icon_info-&amp;gt;dir_type = ICON_THEME_DIR_UNTHEMED;
           icon_info-&amp;gt;dir_size = size;
+          icon_info-&amp;gt;dir_scale = 1;
 }
       g_strfreev (resources);
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1721,12 +1727,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; choose_icon (GtkIconTheme       *icon_theme,
 
       icon_info-&amp;gt;dir_type = ICON_THEME_DIR_UNTHEMED;
       icon_info-&amp;gt;dir_size = size;
+      icon_info-&amp;gt;dir_scale = 1;
     }
 
  out:
   if (icon_info)
     {
       icon_info-&amp;gt;desired_size = size;
+      icon_info-&amp;gt;desired_scale = scale;
       icon_info-&amp;gt;forced_size = (flags &amp;amp; GTK_ICON_LOOKUP_FORCE_SIZE) != 0;
 
       icon_info-&amp;gt;key.icon_names = g_strdupv ((char **)icon_names);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1800,12 +1808,51 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gtk_icon_theme_lookup_icon (GtkIconTheme       *icon_theme,
     gint                size,
     GtkIconLookupFlags  flags)
 {
+  g_return_val_if_fail (GTK_IS_ICON_THEME (icon_theme), NULL);
+  g_return_val_if_fail (icon_name != NULL, NULL);
+  g_return_val_if_fail ((flags &amp;amp; GTK_ICON_LOOKUP_NO_SVG) == 0 ||
+(flags &amp;amp; GTK_ICON_LOOKUP_FORCE_SVG) == 0, NULL);
+
+  GTK_NOTE (ICONTHEME, 
+    g_print ("gtk_icon_theme_lookup_icon %s\n", icon_name));
+
+  return gtk_icon_theme_lookup_icon_for_scale (icon_theme, icon_name,
+                                               size, 1, flags);
+}
+
+/**
+ * gtk_icon_theme_lookup_icon_for_scale:
+ * &amp;lt; at &amp;gt;icon_theme: a #GtkIconTheme
+ * &amp;lt; at &amp;gt;icon_name: the name of the icon to lookup
+ * &amp;lt; at &amp;gt;size: desired icon size
+ * &amp;lt; at &amp;gt;scale: the desired scale
+ * &amp;lt; at &amp;gt;flags: flags modifying the behavior of the icon lookup
+ *
+ * Looks up a named icon for a particular window scale and returns a
+ * structure containing information such as the filename of the
+ * icon. The icon can then be rendered into a pixbuf using
+ * gtk_icon_info_load_icon(). (gtk_icon_theme_load_icon() combines
+ * these two steps if all you need is the pixbuf.)
+ *
+ * Return value: (transfer full): a #GtkIconInfo object containing
+ * information about the icon, or %NULL if the icon wasn't found.
+ *
+ * Since: 3.10
+ */
+GtkIconInfo *
+gtk_icon_theme_lookup_icon_for_scale (GtkIconTheme       *icon_theme,
+                                      const gchar        *icon_name,
+                                      gint                size,
+                                      gint                scale,
+                                      GtkIconLookupFlags  flags)
+{
   GtkIconInfo *info;
 
   g_return_val_if_fail (GTK_IS_ICON_THEME (icon_theme), NULL);
   g_return_val_if_fail (icon_name != NULL, NULL);
   g_return_val_if_fail ((flags &amp;amp; GTK_ICON_LOOKUP_NO_SVG) == 0 ||
 (flags &amp;amp; GTK_ICON_LOOKUP_FORCE_SVG) == 0, NULL);
+  g_return_val_if_fail (scale &amp;gt;= 1, NULL);
 
   GTK_NOTE (ICONTHEME, 
     g_print ("gtk_icon_theme_lookup_icon %s\n", icon_name));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1831,7 +1878,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gtk_icon_theme_lookup_icon (GtkIconTheme       *icon_theme,
         }
       names[dashes + 1] = NULL;
    
-      info = choose_icon (icon_theme, (const gchar **) names, size, flags);
+      info = choose_icon (icon_theme, (const gchar **) names, size, scale, flags);
       
       g_strfreev (names);
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1842,7 +1889,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gtk_icon_theme_lookup_icon (GtkIconTheme       *icon_theme,
       names[0] = icon_name;
       names[1] = NULL;
 
-      info = choose_icon (icon_theme, names, size, flags);
+      info = choose_icon (icon_theme, names, size, scale, flags);
     }
 
   return info;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1882,9 +1929,50 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gtk_icon_theme_choose_icon (GtkIconTheme       *icon_theme,
   g_return_val_if_fail ((flags &amp;amp; GTK_ICON_LOOKUP_NO_SVG) == 0 ||
 (flags &amp;amp; GTK_ICON_LOOKUP_FORCE_SVG) == 0, NULL);
 
-  return choose_icon (icon_theme, icon_names, size, flags);
+  return choose_icon (icon_theme, icon_names, size, 1, flags);
 }
 
+/**
+ * gtk_icon_theme_choose_icon_for_scale:
+ * &amp;lt; at &amp;gt;icon_theme: a #GtkIconTheme
+ * &amp;lt; at &amp;gt;icon_names: (array zero-terminated=1): %NULL-terminated array of
+ *     icon names to lookup
+ * &amp;lt; at &amp;gt;size: desired icon size
+ * &amp;lt; at &amp;gt;scale: desired scale
+ * &amp;lt; at &amp;gt;flags: flags modifying the behavior of the icon lookup
+ * 
+ * Looks up a named icon for a particular window scale and returns a
+ * structure containing information such as the filename of the
+ * icon. The icon can then be rendered into a pixbuf using
+ * gtk_icon_info_load_icon(). (gtk_icon_theme_load_icon() combines
+ * these two steps if all you need is the pixbuf.)
+ *
+ * If &amp;lt; at &amp;gt;icon_names contains more than one name, this function 
+ * tries them all in the given order before falling back to 
+ * inherited icon themes.
+ * 
+ * Return value: (transfer full): a #GtkIconInfo object containing information
+ * about the icon, or %NULL if the icon wasn't found.
+ *
+ * Since: 3.10
+ */
+GtkIconInfo *
+gtk_icon_theme_choose_icon_for_scale (GtkIconTheme       *icon_theme,
+                                      const gchar        *icon_names[],
+                                      gint                size,
+                                      gint                scale,
+                                      GtkIconLookupFlags  flags)
+{
+  g_return_val_if_fail (GTK_IS_ICON_THEME (icon_theme), NULL);
+  g_return_val_if_fail (icon_names != NULL, NULL);
+  g_return_val_if_fail ((flags &amp;amp; GTK_ICON_LOOKUP_NO_SVG) == 0 ||
+(flags &amp;amp; GTK_ICON_LOOKUP_FORCE_SVG) == 0, NULL);
+  g_return_val_if_fail (scale &amp;gt;= 1, NULL);
+
+  return choose_icon (icon_theme, icon_names, size, scale, flags);
+}
+
+
 /* Error quark */
 GQuark
 gtk_icon_theme_error_quark (void)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1929,6 +2017,56 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gtk_icon_theme_load_icon (GtkIconTheme         *icon_theme,
   GtkIconLookupFlags    flags,
   GError              **error)
 {
+  g_return_val_if_fail (GTK_IS_ICON_THEME (icon_theme), NULL);
+  g_return_val_if_fail (icon_name != NULL, NULL);
+  g_return_val_if_fail ((flags &amp;amp; GTK_ICON_LOOKUP_NO_SVG) == 0 ||
+(flags &amp;amp; GTK_ICON_LOOKUP_FORCE_SVG) == 0, NULL);
+  g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+  return gtk_icon_theme_load_icon_for_scale (icon_theme, icon_name,
+                                             size, 1, flags, error);
+}
+
+/**
+ * gtk_icon_theme_load_icon_for_scale:
+ * &amp;lt; at &amp;gt;icon_theme: a #GtkIconTheme
+ * &amp;lt; at &amp;gt;icon_name: the name of the icon to lookup
+ * &amp;lt; at &amp;gt;size: the desired icon size. The resulting icon may not be
+ *     exactly this size; see gtk_icon_info_load_icon().
+ * &amp;lt; at &amp;gt;scale: desired scale
+ * &amp;lt; at &amp;gt;flags: flags modifying the behavior of the icon lookup
+ * &amp;lt; at &amp;gt;error: (allow-none): Location to store error information on failure,
+ *     or %NULL.
+ *
+ * Looks up an icon in an icon theme for a particular window scale,
+ * scales it to the given size and renders it into a pixbuf. This is a
+ * convenience function; if more details about the icon are needed,
+ * use gtk_icon_theme_lookup_icon() followed by
+ * gtk_icon_info_load_icon().
+ *
+ * Note that you probably want to listen for icon theme changes and
+ * update the icon. This is usually done by connecting to the
+ * GtkWidget::style-set signal. If for some reason you do not want to
+ * update the icon when the icon theme changes, you should consider
+ * using gdk_pixbuf_copy() to make a private copy of the pixbuf
+ * returned by this function. Otherwise GTK+ may need to keep the old
+ * icon theme loaded, which would be a waste of memory.
+ *
+ * Return value: (transfer full): the rendered icon; this may be a
+ *     newly created icon or a new reference to an internal icon, so
+ *     you must not modify the icon. Use g_object_unref() to release
+ *     your reference to the icon. %NULL if the icon isn't found.
+ *
+ * Since: 3.10
+ **/
+GdkPixbuf *
+gtk_icon_theme_load_icon_for_scale (GtkIconTheme        *icon_theme,
+                                    const gchar         *icon_name,
+                                    gint                 size,
+                                    gint                 scale,
+                                    GtkIconLookupFlags   flags,
+                                    GError             **error)
+{
   GtkIconInfo *icon_info;
   GdkPixbuf *pixbuf = NULL;
   
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1937,9 +2075,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gtk_icon_theme_load_icon (GtkIconTheme         *icon_theme,
   g_return_val_if_fail ((flags &amp;amp; GTK_ICON_LOOKUP_NO_SVG) == 0 ||
 (flags &amp;amp; GTK_ICON_LOOKUP_FORCE_SVG) == 0, NULL);
   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
-  
-  icon_info = gtk_icon_theme_lookup_icon (icon_theme, icon_name, size,
-          flags | GTK_ICON_LOOKUP_USE_BUILTIN);
+  g_return_val_if_fail (scale &amp;gt;= 1, NULL);
+
+  icon_info = gtk_icon_theme_lookup_icon_for_scale (icon_theme, icon_name, size, scale,
+                                                    flags | GTK_ICON_LOOKUP_USE_BUILTIN);
   if (!icon_info)
     {
       g_set_error (error, GTK_ICON_THEME_ERROR,  GTK_ICON_THEME_NOT_FOUND,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2375,31 +2514,43 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; theme_dir_destroy (IconThemeDir *dir)
 }
 
 static int
-theme_dir_size_difference (IconThemeDir *dir, int size, gboolean *smaller)
+theme_dir_size_difference (IconThemeDir *dir,
+                           int           size,
+                           gint          scale,
+                           gboolean     *smaller,
+                           gint         *scale_diff)
 {
+  int scaled_size, scaled_dir_size;
   int min, max;
+
+  scaled_size = size * scale;
+  scaled_dir_size = dir-&amp;gt;size * dir-&amp;gt;scale;
+  *scale_diff = abs (scale - dir-&amp;gt;scale);
+
   switch (dir-&amp;gt;type)
     {
     case ICON_THEME_DIR_FIXED:
-      *smaller = size &amp;lt; dir-&amp;gt;size;
-      return abs (size - dir-&amp;gt;size);
+      *smaller = scaled_size &amp;lt; scaled_dir_size;
+      return abs (scaled_size - scaled_dir_size);
       break;
     case ICON_THEME_DIR_SCALABLE:
-      *smaller = size &amp;lt; dir-&amp;gt;min_size;
-      if (size &amp;lt; dir-&amp;gt;min_size)
-return dir-&amp;gt;min_size - size;
-      if (size &amp;gt; dir-&amp;gt;max_size)
-return size - dir-&amp;gt;max_size;
+      *smaller = scaled_size &amp;lt; (dir-&amp;gt;min_size * dir-&amp;gt;scale);
+      if (scaled_size &amp;lt; (dir-&amp;gt;min_size * dir-&amp;gt;scale))
+return (dir-&amp;gt;min_size * dir-&amp;gt;scale) - scaled_size;
+      if (size &amp;gt; (dir-&amp;gt;max_size * dir-&amp;gt;scale))
+return scaled_size - (dir-&amp;gt;max_size * dir-&amp;gt;scale);
+      /* If the range covers the scaled_size then there really is no scale difference */
+      *scale_diff = 0;
       return 0;
       break;
     case ICON_THEME_DIR_THRESHOLD:
-      min = dir-&amp;gt;size - dir-&amp;gt;threshold;
-      max = dir-&amp;gt;size + dir-&amp;gt;threshold;
-      *smaller = size &amp;lt; min;
-      if (size &amp;lt; min)
-return min - size;
-      if (size &amp;gt; max)
-return size - max;
+      min = (dir-&amp;gt;size - dir-&amp;gt;threshold) * dir-&amp;gt;scale;
+      max = (dir-&amp;gt;size + dir-&amp;gt;threshold) * dir-&amp;gt;scale;
+      *smaller = scaled_size &amp;lt; min;
+      if (scaled_size &amp;lt; min)
+return min - scaled_size;
+      if (scaled_size &amp;gt; max)
+return scaled_size - max;
       return 0;
       break;
     case ICON_THEME_DIR_UNTHEMED:
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2490,6 +2641,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static GtkIconInfo *
 theme_lookup_icon (IconTheme          *theme,
    const char         *icon_name,
    int                 size,
+                   gint                scale,
    gboolean            allow_svg,
    gboolean            use_builtin)
 {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2497,11 +2649,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; theme_lookup_icon (IconTheme          *theme,
   IconThemeDir *dir, *min_dir;
   char *file;
   int min_difference, difference;
+  int min_scale_diff, scale_diff;
   BuiltinIcon *closest_builtin = NULL;
   gboolean smaller, has_larger, match;
   IconSuffix suffix;
 
   min_difference = G_MAXINT;
+  min_scale_diff = G_MAXINT;
   min_dir = NULL;
   has_larger = FALSE;
   match = FALSE;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2534,9 +2688,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; theme_lookup_icon (IconTheme          *theme,
       suffix = theme_dir_get_icon_suffix (dir, icon_name, NULL);
       if (best_suffix (suffix, allow_svg) != ICON_SUFFIX_NONE)
 {
-  difference = theme_dir_size_difference (dir, size, &amp;amp;smaller);
+  difference = theme_dir_size_difference (dir, size, scale,
+                                                  &amp;amp;smaller, &amp;amp;scale_diff);
 
-  if (difference == 0)
+  if (difference == 0 &amp;amp;&amp;amp; scale_diff == 0)
     {
               if (dir-&amp;gt;type == ICON_THEME_DIR_SCALABLE)
                 {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2553,8 +2708,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; theme_lookup_icon (IconTheme          *theme,
                 {
                   /* for a matching non-scalable dir keep
                    * going and look for a closer match
-                   */             
-                  difference = abs (size - dir-&amp;gt;size);
+                   */
+                  difference = abs (size * scale - dir-&amp;gt;size * dir-&amp;gt;scale);
                   if (!match || difference &amp;lt; min_difference)
                     {
                       match = TRUE;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2564,24 +2719,29 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; theme_lookup_icon (IconTheme          *theme,
                   if (difference == 0)
                     break;
                 }
-    } 
-  
+    }
+
           if (!match)
             {
       if (!has_larger)
         {
-          if (difference &amp;lt; min_difference || smaller)
+          if (difference &amp;lt; min_difference ||
+                      (difference == min_difference &amp;amp;&amp;amp; (scale_diff &amp;lt; min_scale_diff)) ||
+                      smaller)
       {
       min_difference = difference;
+                      min_scale_diff = scale_diff;
       min_dir = dir;
       has_larger = smaller;
      }
         }
       else
         {
-          if (difference &amp;lt; min_difference &amp;amp;&amp;amp; smaller)
+          if ((difference &amp;lt; min_difference ||
+                       (difference == min_difference &amp;amp;&amp;amp; scale_diff &amp;lt; min_scale_diff)) &amp;amp;&amp;amp; smaller)
     {
       min_difference = difference;
+                      min_scale_diff = scale_diff;
       min_dir = dir;
     }
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2663,6 +2823,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; theme_lookup_icon (IconTheme          *theme,
 
       icon_info-&amp;gt;dir_type = min_dir-&amp;gt;type;
       icon_info-&amp;gt;dir_size = min_dir-&amp;gt;size;
+      icon_info-&amp;gt;dir_scale = min_dir-&amp;gt;scale;
       icon_info-&amp;gt;threshold = min_dir-&amp;gt;threshold;
       
       return icon_info;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2881,6 +3042,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; theme_subdir_load (GtkIconTheme *icon_theme,
   char *full_dir;
   GError *error = NULL;
   IconThemeDirMtime *dir_mtime;
+  int scale;
 
   size = g_key_file_get_integer (theme_file, subdir, "Size", &amp;amp;error);
   if (error)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2928,6 +3090,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; theme_subdir_load (GtkIconTheme *icon_theme,
   else
     threshold = 2;
 
+  if (g_key_file_has_key (theme_file, subdir, "OutputScale", NULL))
+    scale = g_key_file_get_integer (theme_file, subdir, "OutputScale", NULL);
+  else
+    scale = 1;
+
   for (d = icon_theme-&amp;gt;priv-&amp;gt;dir_mtimes; d; d = d-&amp;gt;next)
     {
       dir_mtime = (IconThemeDirMtime *)d-&amp;gt;data;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2956,6 +3123,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; theme_subdir_load (GtkIconTheme *icon_theme,
   dir-&amp;gt;dir = full_dir;
   dir-&amp;gt;icon_data = NULL;
   dir-&amp;gt;subdir = g_strdup (subdir);
+          dir-&amp;gt;scale = scale;
+
   if (dir_mtime-&amp;gt;cache != NULL)
             {
       dir-&amp;gt;cache = _gtk_icon_cache_ref (dir_mtime-&amp;gt;cache);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3071,8 +3240,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; icon_info_dup (GtkIconInfo *icon_info)
   dup-&amp;gt;data = icon_data_dup (icon_info-&amp;gt;data);
   dup-&amp;gt;dir_type = icon_info-&amp;gt;dir_type;
   dup-&amp;gt;dir_size = icon_info-&amp;gt;dir_size;
+  dup-&amp;gt;dir_scale = icon_info-&amp;gt;dir_scale;
   dup-&amp;gt;threshold = icon_info-&amp;gt;threshold;
   dup-&amp;gt;desired_size = icon_info-&amp;gt;desired_size;
+  dup-&amp;gt;desired_scale = icon_info-&amp;gt;desired_scale;
   dup-&amp;gt;raw_coordinates = icon_info-&amp;gt;raw_coordinates;
   dup-&amp;gt;forced_size = icon_info-&amp;gt;forced_size;
   dup-&amp;gt;emblems_applied = icon_info-&amp;gt;emblems_applied;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3088,6 +3259,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; icon_info_new_builtin (BuiltinIcon *icon)
   icon_info-&amp;gt;cache_pixbuf = g_object_ref (icon-&amp;gt;pixbuf);
   icon_info-&amp;gt;dir_type = ICON_THEME_DIR_THRESHOLD;
   icon_info-&amp;gt;dir_size = icon-&amp;gt;size;
+  icon_info-&amp;gt;dir_scale = 1;
   icon_info-&amp;gt;threshold = 2;
 
   return icon_info;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3181,7 +3353,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gtk_icon_info_class_init (GtkIconInfoClass *klass)
  * to a larger icon. These icons will be given
  * the same base size as the larger icons to which
  * they are attached.
- * 
+ *
+ * Note that for scaled icons the base size does
+ * not include the base scale.
+ *
  * Return value: the base size, or 0, if no base
  *  size is known for the icon.
  *
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3196,6 +3371,27 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gtk_icon_info_get_base_size (GtkIconInfo *icon_info)
 }
 
 /**
+ * gtk_icon_info_get_base_scale:
+ * &amp;lt; at &amp;gt;icon_info: a #GtkIconInfo
+ *
+ * Gets the base scale for the icon. The base scale is a scale for the
+ * icon that was specified by the icon theme creator. For instance an
+ * icon drawn for a high-dpi screen with window-scale 2 for a base
+ * size of 32 will be 64 pixels tall and have a base_scale of 2.
+ *
+ * Return value: the base scale.
+ *
+ * Since: 3.10
+ **/
+gint
+gtk_icon_info_get_base_scale (GtkIconInfo *icon_info)
+{
+  g_return_val_if_fail (icon_info != NULL, 0);
+
+  return icon_info-&amp;gt;dir_scale;
+}
+
+/**
  * gtk_icon_info_get_filename:
  * &amp;lt; at &amp;gt;icon_info: a #GtkIconInfo
  * 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3355,6 +3551,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; icon_info_ensure_scale_and_pixbuf (GtkIconInfo  *icon_info,
    gboolean      scale_only)
 {
   int image_width, image_height;
+  int scaled_desired_size;
   GdkPixbuf *source_pixbuf;
   gboolean is_svg;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3379,6 +3576,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; icon_info_ensure_scale_and_pixbuf (GtkIconInfo  *icon_info,
   if (icon_info-&amp;gt;icon_file &amp;amp;&amp;amp; !icon_info-&amp;gt;loadable)
     icon_info-&amp;gt;loadable = G_LOADABLE_ICON (g_file_icon_new (icon_info-&amp;gt;icon_file));
 
+  scaled_desired_size = icon_info-&amp;gt;desired_size * icon_info-&amp;gt;desired_scale;
+
   is_svg = FALSE;
   if (G_IS_FILE_ICON (icon_info-&amp;gt;loadable))
     {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3406,20 +3605,21 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; icon_info_ensure_scale_and_pixbuf (GtkIconInfo  *icon_info,
     {
       GInputStream *stream;
 
-      icon_info-&amp;gt;scale = icon_info-&amp;gt;desired_size / 1000.;
+      icon_info-&amp;gt;scale = scaled_desired_size / 1000.;
 
       if (scale_only)
 return TRUE;
-      
+
+      /* TODO: We should have a load_at_scale */
       stream = g_loadable_icon_load (icon_info-&amp;gt;loadable,
-                                     icon_info-&amp;gt;desired_size,
+                                     scaled_desired_size,
                                      NULL, NULL,
                                      &amp;amp;icon_info-&amp;gt;load_error);
       if (stream)
         {
           icon_info-&amp;gt;pixbuf = gdk_pixbuf_new_from_stream_at_scale (stream,
-                                                                   icon_info-&amp;gt;desired_size,
-                                                                   icon_info-&amp;gt;desired_size,
+                                                                   scaled_desired_size,
+                                                                   scaled_desired_size,
                                                                    TRUE,
                                                                    NULL,
                                                                    &amp;amp;icon_info-&amp;gt;load_error);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3442,19 +3642,19 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; icon_info_ensure_scale_and_pixbuf (GtkIconInfo  *icon_info,
   if (icon_info-&amp;gt;forced_size)
     icon_info-&amp;gt;scale = -1;
   else if (icon_info-&amp;gt;dir_type == ICON_THEME_DIR_FIXED)
-    icon_info-&amp;gt;scale = 1.0;
+    icon_info-&amp;gt;scale = (double) icon_info-&amp;gt;desired_scale / icon_info-&amp;gt;dir_scale;
   else if (icon_info-&amp;gt;dir_type == ICON_THEME_DIR_THRESHOLD)
     {
-      if (icon_info-&amp;gt;desired_size &amp;gt;= icon_info-&amp;gt;dir_size - icon_info-&amp;gt;threshold &amp;amp;&amp;amp;
-  icon_info-&amp;gt;desired_size &amp;lt;= icon_info-&amp;gt;dir_size + icon_info-&amp;gt;threshold)
-icon_info-&amp;gt;scale = 1.0;
+      if (scaled_desired_size  &amp;gt;= (icon_info-&amp;gt;dir_size - icon_info-&amp;gt;threshold) * icon_info-&amp;gt;dir_scale &amp;amp;&amp;amp;
+  scaled_desired_size &amp;lt;= (icon_info-&amp;gt;dir_size + icon_info-&amp;gt;threshold) * icon_info-&amp;gt;dir_scale)
+        icon_info-&amp;gt;scale = (double) icon_info-&amp;gt;desired_scale / icon_info-&amp;gt;dir_scale;
       else if (icon_info-&amp;gt;dir_size &amp;gt; 0)
-icon_info-&amp;gt;scale =(gdouble) icon_info-&amp;gt;desired_size / icon_info-&amp;gt;dir_size;
+icon_info-&amp;gt;scale =(gdouble) scaled_desired_size / (icon_info-&amp;gt;dir_size * icon_info-&amp;gt;dir_scale);
     }
   else if (icon_info-&amp;gt;dir_type == ICON_THEME_DIR_SCALABLE)
     {
       if (icon_info-&amp;gt;dir_size &amp;gt; 0)
-icon_info-&amp;gt;scale = (gdouble) icon_info-&amp;gt;desired_size / icon_info-&amp;gt;dir_size;
+icon_info-&amp;gt;scale = (gdouble) scaled_desired_size / (icon_info-&amp;gt;dir_size * icon_info-&amp;gt;dir_scale);
     }
 
   if (icon_info-&amp;gt;scale &amp;gt;= 0. &amp;amp;&amp;amp; scale_only)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3470,8 +3670,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; icon_info_ensure_scale_and_pixbuf (GtkIconInfo  *icon_info,
     {
       GInputStream *stream;
 
+      /* TODO: We should have a load_at_scale */
       stream = g_loadable_icon_load (icon_info-&amp;gt;loadable,
-                                     icon_info-&amp;gt;desired_size,
+                                     scaled_desired_size,
                                      NULL, NULL,
                                      &amp;amp;icon_info-&amp;gt;load_error);
       if (stream)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3495,7 +3696,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; icon_info_ensure_scale_and_pixbuf (GtkIconInfo  *icon_info,
     {
       gint image_size = MAX (image_width, image_height);
       if (image_size &amp;gt; 0)
-icon_info-&amp;gt;scale = (gdouble)icon_info-&amp;gt;desired_size / (gdouble)image_size;
+icon_info-&amp;gt;scale = (gdouble)scaled_desired_size / (gdouble)image_size;
       else
 icon_info-&amp;gt;scale = 1.0;
       
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3910,8 +4111,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gtk_icon_info_load_symbolic_internal (GtkIconInfo  *icon_info,
 
   stream = g_memory_input_stream_new_from_data (data, -1, g_free);
   pixbuf = gdk_pixbuf_new_from_stream_at_scale (stream,
-                                                icon_info-&amp;gt;desired_size,
-                                                icon_info-&amp;gt;desired_size,
+                                                icon_info-&amp;gt;desired_size * icon_info-&amp;gt;desired_scale,
+                                                icon_info-&amp;gt;desired_size * icon_info-&amp;gt;desired_scale,
                                                 TRUE,
                                                 NULL,
                                                 error);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4851,6 +5052,37 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gtk_icon_theme_lookup_by_gicon (GtkIconTheme       *icon_theme,
                                 gint                size,
                                 GtkIconLookupFlags  flags)
 {
+  return gtk_icon_theme_lookup_by_gicon_for_scale (icon_theme, icon,
+                                                   size, 1, flags);
+}
+
+
+/**
+ * gtk_icon_theme_lookup_by_gicon_for_scale:
+ * &amp;lt; at &amp;gt;icon_theme: a #GtkIconTheme
+ * &amp;lt; at &amp;gt;icon: the #GIcon to look up
+ * &amp;lt; at &amp;gt;size: desired icon size
+ * &amp;lt; at &amp;gt;scale: the desired scale
+ * &amp;lt; at &amp;gt;flags: flags modifying the behavior of the icon lookup
+ *
+ * Looks up an icon and returns a structure containing
+ * information such as the filename of the icon.
+ * The icon can then be rendered into a pixbuf using
+ * gtk_icon_info_load_icon_for_scale ().
+ *
+ * Return value: (transfer full): a #GtkIconInfo structure containing 
+ *     information about the icon, or %NULL if the icon 
+ *     wasn't found. Unref with g_object_unref()
+ *
+ * Since: 2.14
+ */
+GtkIconInfo *
+gtk_icon_theme_lookup_by_gicon_for_scale (GtkIconTheme       *icon_theme,
+                                          GIcon              *icon,
+                                          gint                size,
+                                          gint                scale,
+                                          GtkIconLookupFlags  flags)
+{
   GtkIconInfo *info;
 
   g_return_val_if_fail (GTK_IS_ICON_THEME (icon_theme), NULL);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4874,6 +5106,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gtk_icon_theme_lookup_by_gicon (GtkIconTheme       *icon_theme,
       info-&amp;gt;dir_type = ICON_THEME_DIR_UNTHEMED;
       info-&amp;gt;dir_size = size;
       info-&amp;gt;desired_size = size;
+      info-&amp;gt;desired_scale = scale;
       info-&amp;gt;threshold = 2;
       info-&amp;gt;forced_size = (flags &amp;amp; GTK_ICON_LOOKUP_FORCE_SIZE) != 0;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4884,7 +5117,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gtk_icon_theme_lookup_by_gicon (GtkIconTheme       *icon_theme,
       const gchar **names;
 
       names = (const gchar **)g_themed_icon_get_names (G_THEMED_ICON (icon));
-      info = gtk_icon_theme_choose_icon (icon_theme, names, size, flags);
+      info = gtk_icon_theme_choose_icon_for_scale (icon_theme, names, size, scale, flags);
 
       return info;
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4898,7 +5131,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gtk_icon_theme_lookup_by_gicon (GtkIconTheme       *icon_theme,
         _gtk_numerable_icon_set_background_icon_size (GTK_NUMERABLE_ICON (icon), size / 2);
 
       base = g_emblemed_icon_get_icon (G_EMBLEMED_ICON (icon));
-      base_info = gtk_icon_theme_lookup_by_gicon (icon_theme, base, size, flags);
+      base_info = gtk_icon_theme_lookup_by_gicon_for_scale (icon_theme, base, size, scale, flags);
       if (base_info)
         {
           info = icon_info_dup (base_info);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4909,7 +5142,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gtk_icon_theme_lookup_by_gicon (GtkIconTheme       *icon_theme,
             {
               emblem = g_emblem_get_icon (G_EMBLEM (l-&amp;gt;data));
       /* always force size for emblems */
-              emblem_info = gtk_icon_theme_lookup_by_gicon (icon_theme, emblem, size / 2, flags | GTK_ICON_LOOKUP_FORCE_SIZE);
+              emblem_info = gtk_icon_theme_lookup_by_gicon_for_scale (icon_theme, emblem, size / 2, scale, flags | GTK_ICON_LOOKUP_FORCE_SIZE);
               if (emblem_info)
                 info-&amp;gt;emblem_infos = g_slist_prepend (info-&amp;gt;emblem_infos, emblem_info);
             }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4928,17 +5161,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gtk_icon_theme_lookup_by_gicon (GtkIconTheme       *icon_theme,
       if ((flags &amp;amp; GTK_ICON_LOOKUP_FORCE_SIZE) != 0)
 {
   gint width, height, max;
-  gdouble scale;
+  gdouble pixbuf_scale;
   GdkPixbuf *scaled;
 
   width = gdk_pixbuf_get_width (pixbuf);
   height = gdk_pixbuf_get_height (pixbuf);
   max = MAX (width, height);
-  scale = (gdouble) size / (gdouble) max;
+  pixbuf_scale = (gdouble) size * scale / (gdouble) max;
 
   scaled = gdk_pixbuf_scale_simple (pixbuf,
-    0.5 + width * scale,
-    0.5 + height * scale,
+    0.5 + width * pixbuf_scale,
+    0.5 + height * pixbuf_scale,
     GDK_INTERP_BILINEAR);
 
   info = gtk_icon_info_new_for_pixbuf (icon_theme, scaled);
diff --git a/gtk/gtkicontheme.h b/gtk/gtkicontheme.h
index 443457d..0902909 100644
--- a/gtk/gtkicontheme.h
+++ b/gtk/gtkicontheme.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -179,23 +179,49 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; GtkIconInfo * gtk_icon_theme_lookup_icon           (GtkIconTheme
     const gchar                 *icon_name,
     gint                         size,
     GtkIconLookupFlags           flags);
+GDK_AVAILABLE_IN_3_10
+GtkIconInfo * gtk_icon_theme_lookup_icon_for_scale (GtkIconTheme                *icon_theme,
+                                                    const gchar                 *icon_name,
+                                                    gint                         size,
+                                                    gint                         scale,
+                                                    GtkIconLookupFlags           flags);
+
 GDK_AVAILABLE_IN_ALL
 GtkIconInfo * gtk_icon_theme_choose_icon           (GtkIconTheme                *icon_theme,
     const gchar                 *icon_names[],
     gint                         size,
     GtkIconLookupFlags           flags);
+GDK_AVAILABLE_IN_3_10
+GtkIconInfo * gtk_icon_theme_choose_icon_for_scale (GtkIconTheme                *icon_theme,
+    const gchar                 *icon_names[],
+    gint                         size,
+                                                    gint                         scale,
+    GtkIconLookupFlags           flags);
 GDK_AVAILABLE_IN_ALL
 GdkPixbuf *   gtk_icon_theme_load_icon             (GtkIconTheme                *icon_theme,
     const gchar                 *icon_name,
     gint                         size,
     GtkIconLookupFlags           flags,
     GError                     **error);
+GDK_AVAILABLE_IN_3_10
+GdkPixbuf *   gtk_icon_theme_load_icon_for_scale   (GtkIconTheme                *icon_theme,
+                                                    const gchar                 *icon_name,
+                                                    gint                         size,
+                                                    gint                         scale,
+                                                    GtkIconLookupFlags           flags,
+                                                    GError                     **error);
 
 GDK_AVAILABLE_IN_ALL
 GtkIconInfo * gtk_icon_theme_lookup_by_gicon       (GtkIconTheme                *icon_theme,
                                                     GIcon                       *icon,
                                                     gint                         size,
                                                     GtkIconLookupFlags           flags);
+GtkIconInfo * gtk_icon_theme_lookup_by_gicon_for_scale (GtkIconTheme             *icon_theme,
+                                                        GIcon                    *icon,
+                                                        gint                      size,
+                                                        gint                      scale,
+                                                        GtkIconLookupFlags        flags);
+
 
 GDK_AVAILABLE_IN_ALL
 GList *       gtk_icon_theme_list_icons            (GtkIconTheme                *icon_theme,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -226,6 +252,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; GtkIconInfo *         gtk_icon_info_new_for_pixbuf     (GtkIconTheme  *icon_them
 
 GDK_AVAILABLE_IN_ALL
 gint                  gtk_icon_info_get_base_size      (GtkIconInfo   *icon_info);
+GDK_AVAILABLE_IN_3_10
+gint                  gtk_icon_info_get_base_scale     (GtkIconInfo   *icon_info);
 GDK_AVAILABLE_IN_ALL
 const gchar *         gtk_icon_info_get_filename       (GtkIconInfo   *icon_info);
 GDK_AVAILABLE_IN_ALL
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.

&lt;/pre&gt;</description>
    <dc:creator>Alexander Larsson</dc:creator>
    <dc:date>2013-06-20T09:44:41</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725690">
    <title>[gtk+/wip/window-scales: 106/108] wayland: Supportgdk_window_get_scale</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725690</link>
    <description>&lt;pre&gt;commit b3791d9375a488dbafa2a430f2db34762f5286d3
Author: Alexander Larsson &amp;lt;alexl&amp;lt; at &amp;gt;redhat.com&amp;gt;
Date:   Tue Jun 4 11:39:36 2013 +0200

    wayland: Support gdk_window_get_scale
    
    We track the list of outputs each window is on, and set the
    scale to the largest scale value of the outputs. Any time the scale
    changes we also emit a configure event.

 gdk/wayland/gdkwindow-wayland.c |   96 +++++++++++++++++++++++++++++++++++----
 1 files changed, 86 insertions(+), 10 deletions(-)
---
diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c
index 1e7eba1..507ffc4 100644
--- a/gdk/wayland/gdkwindow-wayland.c
+++ b/gdk/wayland/gdkwindow-wayland.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -145,6 +145,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct _GdkWindowImplWayland
 
   gboolean use_custom_surface;
 
+  guint32 scale;
   gboolean pending_commit;
   gint64 pending_frame_counter;
 };
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -154,11 +155,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct _GdkWindowImplWaylandClass
   GdkWindowImplClass parent_class;
 };
 
+static void gdk_wayland_window_configure (GdkWindow *window,
+  int width, int height, int edges);
+
 G_DEFINE_TYPE (GdkWindowImplWayland, _gdk_window_impl_wayland, GDK_TYPE_WINDOW_IMPL)
 
 static void
 _gdk_window_impl_wayland_init (GdkWindowImplWayland *impl)
 {
+  impl-&amp;gt;scale = 1;
 }
 
 void
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -391,6 +396,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct _GdkWaylandCairoSurfaceData {
   struct wl_buffer *buffer;
   GdkWaylandDisplay *display;
   int32_t width, height;
+  uint32_t scale;
   gboolean busy;
 } GdkWaylandCairoSurfaceData;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -419,6 +425,44 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; on_frame_clock_after_paint (GdkFrameClock *clock,
   data-&amp;gt;busy = TRUE;
 }
 
+static void
+window_update_scale (GdkWindow *window)
+{
+  GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window-&amp;gt;impl);
+  GdkWaylandDisplay *wayland_display = GDK_WAYLAND_DISPLAY (gdk_window_get_display (window));
+  guint32 scale;
+  GSList *l;
+
+  scale = 1;
+  for (l = impl-&amp;gt;outputs; l != NULL; l = l-&amp;gt;next)
+    {
+      guint32 output_scale =
+_gdk_wayland_screen_get_output_scale (wayland_display-&amp;gt;screen,
+      l-&amp;gt;data);
+      scale = MAX (scale, output_scale);
+    }
+
+#ifndef HAVE_CAIRO_SURFACE_SET_DEVICE_SCALE
+  /* Don't announce a scale if we can't support it */
+  scale = 1;
+#endif
+
+  if (scale != impl-&amp;gt;scale)
+    {
+      impl-&amp;gt;scale = scale;
+
+      /* Notify app that scale changed */
+      gdk_wayland_window_configure (window, window-&amp;gt;width, window-&amp;gt;height, impl-&amp;gt;resize_edges);
+    }
+}
+
+static void
+on_monitors_changed (GdkScreen *screen,
+     GdkWindow *window)
+{
+  window_update_scale (window);
+}
+
 void
 _gdk_wayland_display_create_window_impl (GdkDisplay    *display,
  GdkWindow     *window,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -449,6 +493,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_wayland_display_create_window_impl (GdkDisplay    *display,
 
   g_object_ref (window);
 
+  /* More likely to be right than just assuming 1 */
+  impl-&amp;gt;scale = gdk_screen_get_monitor_scale_factor (screen, 0);
+
   impl-&amp;gt;title = NULL;
 
   switch (GDK_WINDOW_TYPE (window))
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -477,6 +524,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_wayland_display_create_window_impl (GdkDisplay    *display,
                     G_CALLBACK (on_frame_clock_before_paint), window);
   g_signal_connect (frame_clock, "after-paint",
                     G_CALLBACK (on_frame_clock_after_paint), window);
+
+  g_signal_connect (screen, "monitors-changed",
+                    G_CALLBACK (on_monitors_changed), window);
 }
 
 static void
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -528,6 +578,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_wayland_window_attach_image (GdkWindow *window)
 
   /* Attach this new buffer to the surface */
   wl_surface_attach (impl-&amp;gt;surface, data-&amp;gt;buffer, dx, dy);
+  wl_surface_set_buffer_scale (impl-&amp;gt;surface, data-&amp;gt;scale);
+
   impl-&amp;gt;pending_commit = TRUE;
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -609,7 +661,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static const struct wl_buffer_listener buffer_listener = {
 
 static cairo_surface_t *
 gdk_wayland_create_cairo_surface (GdkWaylandDisplay *display,
-  int width, int height)
+  int width, int height, guint scale)
 {
   GdkWaylandCairoSurfaceData *data;
   cairo_surface_t *surface = NULL;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -621,29 +673,34 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_wayland_create_cairo_surface (GdkWaylandDisplay *display,
   data-&amp;gt;buffer = NULL;
   data-&amp;gt;width = width;
   data-&amp;gt;height = height;
+  data-&amp;gt;scale = scale;
   data-&amp;gt;busy = FALSE;
 
   stride = width * 4;
 
   data-&amp;gt;pool = _create_shm_pool (display-&amp;gt;shm,
-                                 width, height,
+                                 width*scale, height*scale,
                                  &amp;amp;data-&amp;gt;buf_length,
                                  &amp;amp;data-&amp;gt;buf);
 
   data-&amp;gt;buffer = wl_shm_pool_create_buffer (data-&amp;gt;pool, 0,
-                                            width, height,
-                                            stride, WL_SHM_FORMAT_ARGB8888);
+                                            width*scale, height*scale,
+                                            stride*scale, WL_SHM_FORMAT_ARGB8888);
   wl_buffer_add_listener (data-&amp;gt;buffer, &amp;amp;buffer_listener, data);
 
   surface = cairo_image_surface_create_for_data (data-&amp;gt;buf,
                                                  CAIRO_FORMAT_ARGB32,
-                                                 width,
-                                                 height,
-                                                 stride);
+                                                 width*scale,
+                                                 height*scale,
+                                                 stride*scale);
 
   cairo_surface_set_user_data (surface, &amp;amp;gdk_wayland_cairo_key,
                                data, gdk_wayland_cairo_surface_destroy);
 
+#ifdef HAVE_CAIRO_SURFACE_SET_DEVICE_SCALE
+  cairo_surface_set_device_scale (surface, scale, scale);
+#endif
+
   status = cairo_surface_status (surface);
   if (status != CAIRO_STATUS_SUCCESS)
     {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -665,8 +722,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_wayland_window_ensure_cairo_surface (GdkWindow *window)
 
       impl-&amp;gt;cairo_surface =
 gdk_wayland_create_cairo_surface (display_wayland,
-      impl-&amp;gt;wrapper-&amp;gt;width,
-      impl-&amp;gt;wrapper-&amp;gt;height);
+  impl-&amp;gt;wrapper-&amp;gt;width,
+  impl-&amp;gt;wrapper-&amp;gt;height,
+  impl-&amp;gt;scale);
     }
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -727,7 +785,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_wayland_window_configure (GdkWindow *window,
 
   display = gdk_window_get_display (window);
 
-  /* TODO: Only generate a configure event if width or height have actually
+  /* TODO: Only generate a configure event if width/height/scale have actually
    * changed?
    */
   event = gdk_event_new (GDK_CONFIGURE);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -841,6 +899,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; surface_enter (void *data,
   GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window-&amp;gt;impl);
 
   impl-&amp;gt;outputs = g_slist_prepend (impl-&amp;gt;outputs, output);
+
+  window_update_scale (window);
 }
 
 static void
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -852,8 +912,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; surface_leave (void *data,
   GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window-&amp;gt;impl);
 
   impl-&amp;gt;outputs = g_slist_remove (impl-&amp;gt;outputs, output);
+
+  window_update_scale (window);
 }
 
+
 static void
 shell_surface_handle_configure(void *data,
                                struct wl_shell_surface *shell_surface,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1905,6 +1968,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_wayland_window_delete_property (GdkWindow *window,
 {
 }
 
+static gdouble
+gdk_wayland_window_get_scale_factor (GdkWindow *window)
+{
+  GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window-&amp;gt;impl);
+
+  if (GDK_WINDOW_DESTROYED (window))
+    return 1.0;
+
+  return impl-&amp;gt;scale;
+}
+
+
 static void
 _gdk_window_impl_wayland_class_init (GdkWindowImplWaylandClass *klass)
 {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1991,6 +2066,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_window_impl_wayland_class_init (GdkWindowImplWaylandClass *klass)
   impl_class-&amp;gt;get_property = gdk_wayland_window_get_property;
   impl_class-&amp;gt;change_property = gdk_wayland_window_change_property;
   impl_class-&amp;gt;delete_property = gdk_wayland_window_delete_property;
+  impl_class-&amp;gt;get_scale_factor = gdk_wayland_window_get_scale_factor;
 }
 
 
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.

&lt;/pre&gt;</description>
    <dc:creator>Alexander Larsson</dc:creator>
    <dc:date>2013-06-20T09:44:36</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725689">
    <title>[gtk+/wip/window-scales: 105/108] wayland: Require wayland-client1.1.90</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725689</link>
    <description>&lt;pre&gt;commit 8e7c4b3e2f6b4d9bd1f63bb2a963d01af8295b6c
Author: Alexander Larsson &amp;lt;alexl&amp;lt; at &amp;gt;redhat.com&amp;gt;
Date:   Tue Jun 4 11:27:56 2013 +0200

    wayland: Require wayland-client 1.1.90
    
    This has the new methods required for buffer scaling.

 configure.ac |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index eee7fdc..b1e77e8 100644
--- a/configure.ac
+++ b/configure.ac
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -402,7 +402,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; if test "x$enable_wayland_backend" = "xyes"; then
   GDK_WINDOWING="$GDK_WINDOWING
 #define GDK_WINDOWING_WAYLAND"
   DISABLE_ON_WAYLAND='%'
-  WAYLAND_PACKAGES="wayland-client &amp;gt;= 1.0.0 xkbcommon &amp;gt;= 0.2.0 wayland-cursor"
+  WAYLAND_PACKAGES="wayland-client &amp;gt;= 1.1.90 xkbcommon &amp;gt;= 0.2.0 wayland-cursor"
   AM_CONDITIONAL(USE_WAYLAND, true)
 else
   AM_CONDITIONAL(USE_WAYLAND, false)
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.

&lt;/pre&gt;</description>
    <dc:creator>Alexander Larsson</dc:creator>
    <dc:date>2013-06-20T09:44:31</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725688">
    <title>[gtk+/wip/window-scales: 104/108] wayland: Implementgdk_screen_get_monitor_scale()</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725688</link>
    <description>&lt;pre&gt;commit 445d53cf26315888131566e2118d3fef13a30e00
Author: Alexander Larsson &amp;lt;alexl&amp;lt; at &amp;gt;redhat.com&amp;gt;
Date:   Tue Jun 4 11:18:49 2013 +0200

    wayland: Implement gdk_screen_get_monitor_scale()
    
    We bind to the newer version of the wl_output which supports
    the new done and scale events, and if we use this to get the
    scale for each monitor (defaulting to 1 if not supported).

 gdk/wayland/gdkdisplay-wayland.c |    4 +-
 gdk/wayland/gdkprivate-wayland.h |    5 ++-
 gdk/wayland/gdkscreen-wayland.c  |   76 +++++++++++++++++++++++++++++++++++--
 3 files changed, 77 insertions(+), 8 deletions(-)
---
diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c
index ee51ab5..dec350a 100644
--- a/gdk/wayland/gdkdisplay-wayland.c
+++ b/gdk/wayland/gdkdisplay-wayland.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -168,8 +168,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_registry_handle_global(void *data, struct wl_registry *registry, uint32_t id
 wl_registry_bind(display_wayland-&amp;gt;wl_registry, id, &amp;amp;wl_shell_interface, 1);
   } else if (strcmp(interface, "wl_output") == 0) {
     output =
-      wl_registry_bind(display_wayland-&amp;gt;wl_registry, id, &amp;amp;wl_output_interface, 1);
-    _gdk_wayland_screen_add_output(display_wayland-&amp;gt;screen, id, output);
+      wl_registry_bind(display_wayland-&amp;gt;wl_registry, id, &amp;amp;wl_output_interface, 2);
+    _gdk_wayland_screen_add_output(display_wayland-&amp;gt;screen, id, output, version);
     /* We need another roundtrip to receive the modes and geometry
      * events for the output, which gives us the physical properties
      * and available modes on the output. */
diff --git a/gdk/wayland/gdkprivate-wayland.h b/gdk/wayland/gdkprivate-wayland.h
index 43d1c3d..ebe4f43 100644
--- a/gdk/wayland/gdkprivate-wayland.h
+++ b/gdk/wayland/gdkprivate-wayland.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -161,11 +161,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; GdkWindow *_gdk_wayland_screen_create_root_window (GdkScreen *screen,
 GdkScreen *_gdk_wayland_screen_new (GdkDisplay *display);
 void _gdk_wayland_screen_add_output (GdkScreen        *screen,
                                      guint32           id,
-                                     struct wl_output *output);
+                                     struct wl_output *output,
+     guint32           version);
 void _gdk_wayland_screen_remove_output (GdkScreen *screen,
                                         guint32 id);
 int _gdk_wayland_screen_get_output_refresh_rate (GdkScreen        *screen,
                                                  struct wl_output *output);
+guint32 _gdk_wayland_screen_get_output_scale (GdkScreen        *screen,
+      struct wl_output *output);
 
 void _gdk_wayland_window_set_device_grabbed (GdkWindow      *window,
                                              GdkDevice      *device,
diff --git a/gdk/wayland/gdkscreen-wayland.c b/gdk/wayland/gdkscreen-wayland.c
index c7a0fe3..1e3a9e7 100644
--- a/gdk/wayland/gdkscreen-wayland.c
+++ b/gdk/wayland/gdkscreen-wayland.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -77,10 +77,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct _GdkWaylandScreenClass
   void (* window_manager_changed) (GdkWaylandScreen *screen_wayland);
 };
 
+#define OUTPUT_VERSION_WITH_DONE 2
+
 struct _GdkWaylandMonitor
 {
   GdkWaylandScreen *screen;
   guint32       id;
+  guint32       version;
   struct wl_output *output;
   GdkRectangle  geometry;
   intwidth_mm;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -88,6 +91,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct _GdkWaylandMonitor
   char *output_name;
   char *manufacturer;
   intrefresh_rate;
+  gint          scale;
 };
 
 G_DEFINE_TYPE (GdkWaylandScreen, _gdk_wayland_screen, GDK_TYPE_SCREEN)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -249,6 +253,21 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_wayland_screen_get_monitor_geometry (GdkScreen    *screen,
     *dest = monitor-&amp;gt;geometry;
 }
 
+static gdouble
+gdk_wayland_screen_get_monitor_scale_factor (GdkScreen *screen,
+     gint       monitor_num)
+{
+  GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
+  GdkWaylandMonitor *monitor;
+
+  if (monitor_num &amp;gt;= screen_wayland-&amp;gt;monitors-&amp;gt;len)
+    return 1.0;
+
+  monitor = g_ptr_array_index(screen_wayland-&amp;gt;monitors, monitor_num);
+
+  return monitor-&amp;gt;scale;
+}
+
 static GdkVisual *
 gdk_wayland_screen_get_system_visual (GdkScreen * screen)
 {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -830,6 +849,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_wayland_screen_class_init (GdkWaylandScreenClass *klass)
   screen_class-&amp;gt;get_monitor_plug_name = gdk_wayland_screen_get_monitor_plug_name;
   screen_class-&amp;gt;get_monitor_geometry = gdk_wayland_screen_get_monitor_geometry;
   screen_class-&amp;gt;get_monitor_workarea = gdk_wayland_screen_get_monitor_geometry;
+  screen_class-&amp;gt;get_monitor_scale_factor = gdk_wayland_screen_get_monitor_scale_factor;
   screen_class-&amp;gt;get_system_visual = gdk_wayland_screen_get_system_visual;
   screen_class-&amp;gt;get_rgba_visual = gdk_wayland_screen_get_rgba_visual;
   screen_class-&amp;gt;is_composited = gdk_wayland_screen_is_composited;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -896,7 +916,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; output_handle_geometry(void *data,
   monitor-&amp;gt;manufacturer = g_strdup (make);
   monitor-&amp;gt;output_name = g_strdup (model);
 
-  if (monitor-&amp;gt;geometry.width != 0)
+  if (monitor-&amp;gt;geometry.width != 0 &amp;amp;&amp;amp; monitor-&amp;gt;version &amp;lt; OUTPUT_VERSION_WITH_DONE)
     {
       g_signal_emit_by_name (monitor-&amp;gt;screen, "monitors-changed");
       update_screen_size (monitor-&amp;gt;screen);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -904,6 +924,26 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; output_handle_geometry(void *data,
 }
 
 static void
+output_handle_done(void *data,
+   struct wl_output *wl_output)
+{
+  GdkWaylandMonitor *monitor = (GdkWaylandMonitor *)data;
+
+  g_signal_emit_by_name (monitor-&amp;gt;screen, "monitors-changed");
+  update_screen_size (monitor-&amp;gt;screen);
+}
+
+static void
+output_handle_scale(void *data,
+    struct wl_output *wl_output,
+    uint32_t factor)
+{
+  GdkWaylandMonitor *monitor = (GdkWaylandMonitor *)data;
+
+  monitor-&amp;gt;scale = factor;
+}
+
+static void
 output_handle_mode(void *data,
                    struct wl_output *wl_output,
                    uint32_t flags,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -920,27 +960,35 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; output_handle_mode(void *data,
   monitor-&amp;gt;geometry.height = height;
   monitor-&amp;gt;refresh_rate = refresh;
 
-  g_signal_emit_by_name (monitor-&amp;gt;screen, "monitors-changed");
-  update_screen_size (monitor-&amp;gt;screen);
+  if (monitor-&amp;gt;geometry.width != 0 &amp;amp;&amp;amp; monitor-&amp;gt;version &amp;lt; OUTPUT_VERSION_WITH_DONE)
+    {
+      g_signal_emit_by_name (monitor-&amp;gt;screen, "monitors-changed");
+      update_screen_size (monitor-&amp;gt;screen);
+    }
 }
 
 static const struct wl_output_listener output_listener =
 {
   output_handle_geometry,
-  output_handle_mode
+  output_handle_mode,
+  output_handle_done,
+  output_handle_scale,
 };
 
 void
 _gdk_wayland_screen_add_output (GdkScreen        *screen,
                                 guint32           id,
-                                struct wl_output *output)
+                                struct wl_output *output,
+guint32           version)
 {
   GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
   GdkWaylandMonitor *monitor = g_new0(GdkWaylandMonitor, 1);
 
   monitor-&amp;gt;id = id;
   monitor-&amp;gt;output = output;
+  monitor-&amp;gt;version = version;
   monitor-&amp;gt;screen = screen_wayland;
+  monitor-&amp;gt;scale = 1;
   g_ptr_array_add(screen_wayland-&amp;gt;monitors, monitor);
 
   wl_output_add_listener(output, &amp;amp;output_listener, monitor);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -985,3 +1033,21 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gdk_wayland_screen_get_output_refresh_rate (GdkScreen        *screen,
 
   return 0;
 }
+
+guint32
+_gdk_wayland_screen_get_output_scale (GdkScreen        *screen,
+      struct wl_output *output)
+{
+  GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
+  int i;
+
+  for (i = 0; i &amp;lt; screen_wayland-&amp;gt;monitors-&amp;gt;len; i++)
+    {
+      GdkWaylandMonitor *monitor = screen_wayland-&amp;gt;monitors-&amp;gt;pdata[i];
+
+      if (monitor-&amp;gt;output == output)
+        return monitor-&amp;gt;scale;
+    }
+
+  return 0;
+}
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.

&lt;/pre&gt;</description>
    <dc:creator>Alexander Larsson</dc:creator>
    <dc:date>2013-06-20T09:44:26</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725687">
    <title>[gtk+/wip/window-scales: 103/108] gdkwindow: Respect cairo surfaceswith device scale</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725687</link>
    <description>&lt;pre&gt;commit 8fad04487f83d8e8d7abdd8d403795231d8b420a
Author: Alexander Larsson &amp;lt;alexl&amp;lt; at &amp;gt;redhat.com&amp;gt;
Date:   Tue Jun 4 10:41:44 2013 +0200

    gdkwindow: Respect cairo surfaces with device scale
    
    If a cairo_surface for a window has a device scale set we need
    to respect this when creating a similar window. I.e. we want
    to then automatically create a larger window which inherits
    the scale from the original.
    
    We also need to calculate a different device_offset if there
    is a device_scale set.

 gdk/gdkwindow.c |   21 +++++++++++++++++++--
 1 files changed, 19 insertions(+), 2 deletions(-)
---
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index ae4223f..e83b169 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2756,6 +2756,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_window_begin_paint_region (GdkWindow       *window,
   GdkWindowImplClass *impl_class;
   GdkWindowPaint *paint;
   GSList *list;
+  double sx, sy;
   gboolean needs_surface;
 
   g_return_if_fail (GDK_IS_WINDOW (window));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2782,7 +2783,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_window_begin_paint_region (GdkWindow       *window,
   gdk_window_get_content (window),
   MAX (clip_box.width, 1),
   MAX (clip_box.height, 1));
-      cairo_surface_set_device_offset (paint-&amp;gt;surface, -clip_box.x, -clip_box.y);
+      sx = sy = 1;
+#ifdef HAVE_CAIRO_SURFACE_SET_DEVICE_SCALE
+      cairo_surface_get_device_scale (paint-&amp;gt;surface, &amp;amp;sx, &amp;amp;sy);
+#endif
+      cairo_surface_set_device_offset (paint-&amp;gt;surface, -clip_box.x*sx, -clip_box.y*sy);
     }
 
   for (list = window-&amp;gt;paint_stack; list != NULL; list = list-&amp;gt;next)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -9177,10 +9182,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_window_create_similar_surface (GdkWindow *     window,
                                    int             height)
 {
   cairo_surface_t *window_surface, *surface;
+  double sx, sy;
 
   g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
-  
+
   window_surface = gdk_window_ref_impl_surface (window);
+  sx = sy = 1;
+#ifdef HAVE_CAIRO_SURFACE_SET_DEVICE_SCALE
+  cairo_surface_get_device_scale (window_surface, &amp;amp;sx, &amp;amp;sy);
+#endif
+
+  width = width * sx;
+  height = height * sy;
 
   switch (_gdk_rendering_mode)
   {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -9203,6 +9216,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gdk_window_create_similar_surface (GdkWindow *     window,
       break;
   }
 
+#ifdef HAVE_CAIRO_SURFACE_SET_DEVICE_SCALE
+  cairo_surface_set_device_scale (surface, sx, sy);
+#endif
+
   cairo_surface_destroy (window_surface);
 
   _gdk_cairo_surface_set_window (surface, window);
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.

&lt;/pre&gt;</description>
    <dc:creator>Alexander Larsson</dc:creator>
    <dc:date>2013-06-20T09:44:21</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725686">
    <title>[gtk+/wip/window-scales: 102/108] configure: Add buildtime check forcairo_surface_set_device_scale</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725686</link>
    <description>&lt;pre&gt;commit 25e9eace1dad6af4ba48dbe80d57bb6150155dc5
Author: Alexander Larsson &amp;lt;alexl&amp;lt; at &amp;gt;redhat.com&amp;gt;
Date:   Tue Jun 4 10:39:32 2013 +0200

    configure: Add buildtime check for cairo_surface_set_device_scale
    
    We will need this for the window scale support, but its not yet
    in a stable cairo release (or even on a master yet), so we make
    this optional.

 configure.ac |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 18ba0d1..eee7fdc 100644
--- a/configure.ac
+++ b/configure.ac
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1263,6 +1263,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; else
         LIBS="$gtk_save_LIBS"
 fi
 
+# Check for cairo_set_device_scale, as we don't want to depend hard on
+# this until there is a stable release with it
+CAIRO_CFLAGS=`$PKG_CONFIG --cflags cairo`
+CAIRO_LIBS=`$PKG_CONFIG --libs cairo`
+CFLAGS="$CFLAGS $CAIRO_CFLAGS"
+gtk_save_LIBS="$LIBS"
+LIBS="$CAIRO_LIBS $LIBS"
+AC_CHECK_FUNCS(cairo_surface_set_device_scale)
+LIBS="$gtk_save_LIBS"
+
+
 CFLAGS="$saved_cflags"
 LDFLAGS="$saved_ldflags"
 
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.

&lt;/pre&gt;</description>
    <dc:creator>Alexander Larsson</dc:creator>
    <dc:date>2013-06-20T09:44:16</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.gnome.svn/725685">
    <title>[gtk+/wip/window-scales: 101/108] pixel-cache: Refresh pixel cache onwindow scale factor changes.</title>
    <link>http://comments.gmane.org/gmane.comp.gnome.svn/725685</link>
    <description>&lt;pre&gt;commit 5723cd9b56ac162af4c7d9d5de9041407398f89e
Author: Alexander Larsson &amp;lt;alexl&amp;lt; at &amp;gt;redhat.com&amp;gt;
Date:   Mon Jun 3 17:04:03 2013 +0200

    pixel-cache: Refresh pixel cache on window scale factor changes.

 gtk/gtkpixelcache.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)
---
diff --git a/gtk/gtkpixelcache.c b/gtk/gtkpixelcache.c
index 9b2f1d8..882dbcb 100644
--- a/gtk/gtkpixelcache.c
+++ b/gtk/gtkpixelcache.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -38,6 +38,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct _GtkPixelCache {
   int surface_y;
   int surface_w;
   int surface_h;
+  double surface_scale;
 
   /* may be null if not dirty */
   cairo_region_t *surface_dirty;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -159,7 +160,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gtk_pixel_cache_create_surface_if_needed (GtkPixelCache         *cache,
        cache-&amp;gt;surface_w &amp;lt; view_rect-&amp;gt;width ||
        cache-&amp;gt;surface_w &amp;gt; surface_w + ALLOW_LARGER_SIZE ||
        cache-&amp;gt;surface_h &amp;lt; view_rect-&amp;gt;height ||
-       cache-&amp;gt;surface_h &amp;gt; surface_h + ALLOW_LARGER_SIZE))
+       cache-&amp;gt;surface_h &amp;gt; surface_h + ALLOW_LARGER_SIZE ||
+       cache-&amp;gt;surface_scale != gdk_window_get_scale_factor (window)))
     {
       cairo_surface_destroy (cache-&amp;gt;surface);
       cache-&amp;gt;surface = NULL;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -178,6 +180,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; _gtk_pixel_cache_create_surface_if_needed (GtkPixelCache         *cache,
       cache-&amp;gt;surface_y = -canvas_rect-&amp;gt;y;
       cache-&amp;gt;surface_w = surface_w;
       cache-&amp;gt;surface_h = surface_h;
+      cache-&amp;gt;surface_scale = gdk_window_get_scale_factor (window);
 
       cache-&amp;gt;surface =
 gdk_window_create_similar_surface (window, content,
_______________________________________________
commits-list mailing list (read only)
https://mail.gnome.org/mailman/listinfo/commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.

&lt;/pre&gt;</description>
    <dc:creator>Alexander Larsson</dc:creator>
    <dc:date>2013-06-20T09:44:11</dc:date>
  </item>
  <textinput rdf:about="http://search.gmane.org/?group=$group=gmane.comp.gnome.svn">
    <title>Search Engine</title>
    <description>Search the mailing list at Gmane</description>
    <name>query</name>
    <link>http://search.gmane.org/?group=$group=gmane.comp.gnome.svn</link>
  </textinput>
</rdf:RDF>
