From f0c1f96a6f86154d042b88810459486e6a642152831ff0b0a9f3d05e958464d5 Mon Sep 17 00:00:00 2001 From: Vincent Untz Date: Wed, 27 Apr 2011 12:32:12 +0000 Subject: [PATCH 1/3] Accepting request 67401 from GNOME:Next thanks OBS-URL: https://build.opensuse.org/request/show/67401 OBS-URL: https://build.opensuse.org/package/show/GNOME:Factory/gnome-terminal?expand=0&rev=70 --- gnome-terminal-2.32.1.tar.bz2 | 3 - gnome-terminal-3.0.0.tar.bz2 | 3 + gnome-terminal.changes | 23 + gnome-terminal.spec | 20 +- gtk-builder-convert | 799 ++++++++++++++++++++++++++++++++++ 5 files changed, 838 insertions(+), 10 deletions(-) delete mode 100644 gnome-terminal-2.32.1.tar.bz2 create mode 100644 gnome-terminal-3.0.0.tar.bz2 create mode 100644 gtk-builder-convert diff --git a/gnome-terminal-2.32.1.tar.bz2 b/gnome-terminal-2.32.1.tar.bz2 deleted file mode 100644 index 7e1167f..0000000 --- a/gnome-terminal-2.32.1.tar.bz2 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f41e4b185a2cf65ff417b89e429fc3b625c5e3f042ee1763bda6490fa4676fb -size 2319315 diff --git a/gnome-terminal-3.0.0.tar.bz2 b/gnome-terminal-3.0.0.tar.bz2 new file mode 100644 index 0000000..1e282c7 --- /dev/null +++ b/gnome-terminal-3.0.0.tar.bz2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16a3420176bbe5d58ad432306bfc40edb1423d43e311dd1d0de6da16559943f8 +size 2320401 diff --git a/gnome-terminal.changes b/gnome-terminal.changes index f05148a..930340b 100644 --- a/gnome-terminal.changes +++ b/gnome-terminal.changes @@ -1,3 +1,26 @@ +------------------------------------------------------------------- +Mon Apr 4 13:52:43 UTC 2011 - fcrozat@novell.com + +- Update to version 3.0.0: + + bgo#600876: Update paste sensitivity whenever clipboard + changes. + + Updated translations. + +------------------------------------------------------------------- +Thu Mar 24 09:38:54 UTC 2011 - fcrozat@novell.com + +- Update to version 2.33.90: + + Bug fixes + + Port to gtk3 + + Updated translations +- Add copy of git gtk2 gtk-builder-convert to fix build and not + rely on modified gtk2 packages, pass GTK_BUILDER_CONVERT varibale + to configure call. +- Pass --with-gtk=3.0 to configure. +- BuildRequire python-xml for gtk-builder-convert to work properly. +- Change vte-devel BuildRequires to pkgconfig(vte-2.90) +- BuildRequire pkgconfig(gsettings-desktop-schemas) + ------------------------------------------------------------------- Sun Feb 13 16:18:24 CET 2011 - vuntz@opensuse.org diff --git a/gnome-terminal.spec b/gnome-terminal.spec index 7764786..9cdd79c 100644 --- a/gnome-terminal.spec +++ b/gnome-terminal.spec @@ -1,7 +1,7 @@ # -# spec file for package gnome-terminal (Version 2.32.1) +# spec file for package gnome-terminal # -# Copyright (c) 2010 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2011 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -24,18 +24,22 @@ BuildRequires: gnome-doc-utils-devel BuildRequires: intltool BuildRequires: gconf2-devel BuildRequires: dbus-1-glib-devel +# needed by source1 +BuildRequires: python-xml BuildRequires: scrollkeeper BuildRequires: startup-notification-devel BuildRequires: translation-update-upstream BuildRequires: update-desktop-files -BuildRequires: vte-devel +BuildRequires: pkgconfig(vte-2.90) +BuildRequires: pkgconfig(gsettings-desktop-schemas) License: GPLv3+ ; LGPLv2.1+ Group: System/X11/Terminals Obsoletes: gnome-core -Version: 2.32.1 -Release: 2 +Version: 3.0.0 +Release: 1 Summary: GNOME Terminal Source: %{name}-%{version}.tar.bz2 +Source1: gtk-builder-convert Url: http://www.gnome.org BuildRoot: %{_tmppath}/%{name}-%{version}-build PreReq: filesystem gconf2 @@ -51,10 +55,12 @@ This package provides the GNOME terminal emulator application. translation-update-upstream %build -%configure \ +cp %{S:1} . +chmod +x ./gtk-builder-convert +%configure --with-gtk=3.0 \ --disable-schemas-install \ --disable-scrollkeeper -%__make %{?jobs:-j%jobs} +%__make %{?jobs:-j%jobs} GTK_BUILDER_CONVERT="$PWD/gtk-builder-convert" %install %makeinstall diff --git a/gtk-builder-convert b/gtk-builder-convert new file mode 100644 index 0000000..bfefd0e --- /dev/null +++ b/gtk-builder-convert @@ -0,0 +1,799 @@ +#!/usr/bin/env python +# +# Copyright (C) 2006-2008 Async Open Source +# Henrique Romano +# Johan Dahlin +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# TODO: +# Toolbars + +"""Usage: gtk-builder-convert [OPTION] [INPUT] [OUTPUT] +Converts Glade files into XML files which can be loaded with GtkBuilder. +The [INPUT] file is + + -w, --skip-windows Convert everything but GtkWindow subclasses. + -r, --root Convert only widget named root and its children + -h, --help display this help and exit + +When OUTPUT is -, write to standard output. + +Examples: + gtk-builder-convert preference.glade preferences.ui + +Report bugs to http://bugzilla.gnome.org/.""" + +import getopt +import os +import sys + +from xml.dom import minidom, Node + +DIALOGS = ['GtkDialog', + 'GtkFileChooserDialog', + 'GtkMessageDialog'] +WINDOWS = ['GtkWindow'] + DIALOGS + +# The subprocess is only available in Python 2.4+ +try: + import subprocess + subprocess # pyflakes +except ImportError: + subprocess = None + +def get_child_nodes(node): + assert node.tagName == 'object' + nodes = [] + for child in node.childNodes: + if child.nodeType != Node.ELEMENT_NODE: + continue + if child.tagName != 'child': + continue + nodes.append(child) + return nodes + +def get_properties(node): + assert node.tagName == 'object' + properties = {} + for child in node.childNodes: + if child.nodeType != Node.ELEMENT_NODE: + continue + if child.tagName != 'property': + continue + value = child.childNodes[0].data + properties[child.getAttribute('name')] = value + return properties + +def get_property(node, property_name): + assert node.tagName == 'object' + properties = get_properties(node) + return properties.get(property_name) + +def get_property_node(node, property_name): + assert node.tagName == 'object' + properties = {} + for child in node.childNodes: + if child.nodeType != Node.ELEMENT_NODE: + continue + if child.tagName != 'property': + continue + if child.getAttribute('name') == property_name: + return child + +def get_signal_nodes(node): + assert node.tagName == 'object' + signals = [] + for child in node.childNodes: + if child.nodeType != Node.ELEMENT_NODE: + continue + if child.tagName == 'signal': + signals.append(child) + return signals + +def get_property_nodes(node): + assert node.tagName == 'object' + properties = [] + for child in node.childNodes: + if child.nodeType != Node.ELEMENT_NODE: + continue + # FIXME: handle comments + if child.tagName == 'property': + properties.append(child) + return properties + +def get_accelerator_nodes(node): + assert node.tagName == 'object' + accelerators = [] + for child in node.childNodes: + if child.nodeType != Node.ELEMENT_NODE: + continue + if child.tagName == 'accelerator': + accelerators.append(child) + return accelerators + +def get_object_node(child_node): + assert child_node.tagName == 'child', child_node + nodes = [] + for node in child_node.childNodes: + if node.nodeType != Node.ELEMENT_NODE: + continue + if node.tagName == 'object': + nodes.append(node) + assert len(nodes) == 1, nodes + return nodes[0] + +def copy_properties(node, props, prop_dict): + assert node.tagName == 'object' + for prop_name in props: + child = get_property_node(node, prop_name) + if child is not None: + prop_dict[prop_name] = child + + return node + +class GtkBuilderConverter(object): + + def __init__(self, skip_windows, target_version, root): + self.skip_windows = skip_windows + self.target_version = target_version + self.root = root + self.root_objects = [] + self.objects = {} + + # + # Public API + # + + def parse_file(self, file): + self._dom = minidom.parse(file) + self._parse() + + def parse_buffer(self, buffer): + self._dom = minidom.parseString(buffer) + self._parse() + + def to_xml(self): + xml = self._dom.toprettyxml("", "") + return xml.encode('utf-8') + + # + # Private + # + + def _get_object(self, name): + return self.objects.get(name) + + def _get_objects_by_attr(self, attribute, value): + return [w for w in self._dom.getElementsByTagName("object") + if w.getAttribute(attribute) == value] + + def _create_object(self, obj_class, obj_id, template=None, properties=None): + """ + Creates a new tag. + Optionally a name template can be provided which will be used + to avoid naming collisions. + The properties dictionary can either contain string values or Node + values. If a node is provided the name of the node will be overridden + by the dictionary key. + + @param obj_class: class of the object (class tag) + @param obj_id: identifier of the object (id tag) + @param template: name template to use, for example 'button' + @param properties: dictionary of properties + @type properties: string or Node. + @returns: Newly created node of the object + """ + if template is not None: + count = 1 + while True: + obj_id = template + str(count) + widget = self._get_object(obj_id) + if widget is None: + break + + count += 1 + + obj = self._dom.createElement('object') + obj.setAttribute('class', obj_class) + obj.setAttribute('id', obj_id) + if properties: + for name, value in properties.items(): + if isinstance(value, Node): + # Reuse the node, so translatable and context still will be + # set when converting nodes. See also #509153 + prop = value + else: + prop = self._dom.createElement('property') + prop.appendChild(self._dom.createTextNode(value)) + + prop.setAttribute('name', str(name)) + obj.appendChild(prop) + self.objects[obj_id] = obj + return obj + + def _create_root_object(self, obj_class, template, properties=None): + obj = self._create_object(obj_class, None, template, properties) + self.root_objects.append(obj) + return obj + + def _parse(self): + glade_iface = self._dom.getElementsByTagName("glade-interface") + assert glade_iface, ("Badly formed XML, there is " + "no tag.") + # Rename glade-interface to interface + glade_iface[0].tagName = 'interface' + self._interface = glade_iface[0] + + # Remove glade-interface doc type + for node in self._dom.childNodes: + if node.nodeType == Node.DOCUMENT_TYPE_NODE: + if node.name == 'glade-interface': + self._dom.removeChild(node) + + # Strip unsupported tags + for tag in ['requires', 'requires-version']: + for child in self._dom.getElementsByTagName(tag): + child.parentNode.removeChild(child) + + if self.root: + self._strip_root(self.root) + + # Rename widget to object + objects = self._dom.getElementsByTagName("widget") + for node in objects: + node.tagName = "object" + + for node in objects: + self._convert(node.getAttribute("class"), node) + if self._get_object(node.getAttribute('id')) is not None: + print "WARNING: duplicate id \"" + node.getAttribute('id') + "\"" + self.objects[node.getAttribute('id')] = node + + # Convert Gazpachos UI tag + for node in self._dom.getElementsByTagName("ui"): + self._convert_ui(node) + + # Convert accessibility tag + for node in self._dom.getElementsByTagName("accessibility"): + self._convert_accessibility(node) + + # Output the newly created root objects and sort them + # by attribute id + # FIXME: Use sorted(self.root_objects, + # key=lambda n: n.getAttribute('id'), + # reverse=True): + # when we can depend on python 2.4 or higher + root_objects = self.root_objects[:] + root_objects.sort(lambda a, b: cmp(b.getAttribute('id'), + a.getAttribute('id'))) + for obj in root_objects: + self._interface.childNodes.insert(0, obj) + + def _convert(self, klass, node): + if klass == 'GtkNotebook': + self._packing_prop_to_child_attr(node, "type", "tab") + elif klass in ['GtkExpander', 'GtkFrame']: + self._packing_prop_to_child_attr( + node, "type", "label_item", "label") + elif klass == "GtkMenuBar": + self._convert_menu(node) + elif klass == "GtkMenu": + # Only convert toplevel popups + if node.parentNode == self._interface: + self._convert_menu(node, popup=True) + elif klass in WINDOWS and self.skip_windows: + self._remove_window(node) + + if self.target_version == "3.0": + if klass == "GtkComboBoxEntry": + node.setAttribute("class","GtkComboBox") + prop = self._dom.createElement("property") + prop.setAttribute("name", "has-entry") + prop.appendChild(self._dom.createTextNode("True")) + node.appendChild(prop) + elif klass == "GtkDialog": + for child in node.childNodes: + if child.nodeType != Node.ELEMENT_NODE: + continue + if child.tagName != 'property': + continue + if (child.getAttribute("name") not in ("has-separator", "has_separator")): + continue; + node.removeChild(child) + break + + self._default_widget_converter(node) + + def _default_widget_converter(self, node): + klass = node.getAttribute("class") + for prop in get_property_nodes(node): + prop_name = prop.getAttribute("name") + if prop_name == "sizegroup": + self._convert_sizegroup(node, prop) + elif prop_name == "tooltip" and klass != "GtkAction": + prop.setAttribute("name", "tooltip-text") + elif prop_name in ["response_id", 'response-id']: + # It does not make sense to convert responses when + # we're not going to output dialogs + if self.skip_windows: + continue + object_id = node.getAttribute('id') + response = prop.childNodes[0].data + self._convert_dialog_response(node, object_id, response) + prop.parentNode.removeChild(prop) + elif prop_name == "adjustment": + self._convert_adjustment(prop) + elif prop_name == "items" and klass in ['GtkComboBox', + 'GtkComboBoxEntry']: + self._convert_combobox_items(node, prop) + elif prop_name == "text" and klass == 'GtkTextView': + self._convert_textview_text(prop) + + def _remove_window(self, node): + object_node = get_object_node(get_child_nodes(node)[0]) + parent = node.parentNode + parent.removeChild(node) + parent.appendChild(object_node) + + def _convert_menu(self, node, popup=False): + if node.hasAttribute('constructor'): + return + + uimgr = self._create_root_object('GtkUIManager', + template='uimanager') + + if popup: + name = 'popup' + else: + name = 'menubar' + + menu = self._dom.createElement(name) + menu.setAttribute('name', node.getAttribute('id')) + node.setAttribute('constructor', uimgr.getAttribute('id')) + + for child in get_child_nodes(node): + obj_node = get_object_node(child) + item = self._convert_menuitem(uimgr, obj_node) + menu.appendChild(item) + child.removeChild(obj_node) + child.parentNode.removeChild(child) + + ui = self._dom.createElement('ui') + uimgr.appendChild(ui) + + ui.appendChild(menu) + + def _convert_menuitem(self, uimgr, obj_node): + children = get_child_nodes(obj_node) + name = 'menuitem' + if children: + child_node = children[0] + menu_node = get_object_node(child_node) + # Can be GtkImage, which will take care of later. + if menu_node.getAttribute('class') == 'GtkMenu': + name = 'menu' + + object_class = obj_node.getAttribute('class') + if object_class in ['GtkMenuItem', + 'GtkImageMenuItem', + 'GtkCheckMenuItem', + 'GtkRadioMenuItem']: + menu = self._dom.createElement(name) + elif object_class == 'GtkSeparatorMenuItem': + return self._dom.createElement('separator') + else: + raise NotImplementedError(object_class) + + menu.setAttribute('action', obj_node.getAttribute('id')) + self._add_action_from_menuitem(uimgr, obj_node) + if children: + for child in get_child_nodes(menu_node): + obj_node = get_object_node(child) + item = self._convert_menuitem(uimgr, obj_node) + menu.appendChild(item) + child.removeChild(obj_node) + child.parentNode.removeChild(child) + return menu + + def _menuitem_to_action(self, node, properties): + copy_properties(node, ['label', 'tooltip'], properties) + + def _togglemenuitem_to_action(self, node, properties): + self._menuitem_to_action(node, properties) + copy_properties(node, ['active'], properties) + + def _radiomenuitem_to_action(self, node, properties): + self._togglemenuitem_to_action(node, properties) + copy_properties(node, ['group'], properties) + + def _add_action_from_menuitem(self, uimgr, node): + properties = {} + object_class = node.getAttribute('class') + object_id = node.getAttribute('id') + if object_class == 'GtkMenuItem': + name = 'GtkAction' + self._menuitem_to_action(node, properties) + elif object_class == 'GtkCheckMenuItem': + name = 'GtkToggleAction' + self._togglemenuitem_to_action(node, properties) + elif object_class == 'GtkRadioMenuItem': + name = 'GtkRadioAction' + self._radiomenuitem_to_action(node, properties) + elif object_class == 'GtkImageMenuItem': + name = 'GtkAction' + children = get_child_nodes(node) + if (children and + children[0].getAttribute('internal-child') == 'image'): + image = get_object_node(children[0]) + child = get_property_node(image, 'stock') + if child is not None: + properties['stock_id'] = child + self._menuitem_to_action(node, properties) + elif object_class == 'GtkSeparatorMenuItem': + return + else: + raise NotImplementedError(object_class) + + if get_property(node, 'use_stock') == 'True': + if 'label' in properties: + properties['stock_id'] = properties['label'] + del properties['label'] + + properties['name'] = object_id + action = self._create_object(name, + object_id, + properties=properties) + for signal in get_signal_nodes(node): + signal_name = signal.getAttribute('name') + if signal_name in ['activate', 'toggled']: + action.appendChild(signal) + else: + print 'Unhandled signal %s::%s' % (node.getAttribute('class'), + signal_name) + + if not uimgr.childNodes: + child = self._dom.createElement('child') + uimgr.appendChild(child) + + group = self._create_object('GtkActionGroup', None, + template='actiongroup') + child.appendChild(group) + else: + group = uimgr.childNodes[0].childNodes[0] + + child = self._dom.createElement('child') + group.appendChild(child) + child.appendChild(action) + + for accelerator in get_accelerator_nodes(node): + signal_name = accelerator.getAttribute('signal') + if signal_name != 'activate': + print 'Unhandled accelerator signal for %s::%s' % ( + node.getAttribute('class'), signal_name) + continue + accelerator.removeAttribute('signal') + child.appendChild(accelerator) + + def _convert_sizegroup(self, node, prop): + # This is Gazpacho only + node.removeChild(prop) + obj = self._get_object(prop.childNodes[0].data) + if obj is None: + widgets = self._get_objects_by_attr("class", "GtkSizeGroup") + if widgets: + obj = widgets[-1] + else: + obj = self._create_root_object('GtkSizeGroup', + template='sizegroup') + + widgets = obj.getElementsByTagName("widgets") + if widgets: + assert len(widgets) == 1 + widgets = widgets[0] + else: + widgets = self._dom.createElement("widgets") + obj.appendChild(widgets) + + member = self._dom.createElement("widget") + member.setAttribute("name", node.getAttribute("id")) + widgets.appendChild(member) + + def _convert_dialog_response(self, node, object_name, response): + # 1) Get parent dialog node + while True: + # If we can't find the parent dialog, give up + if node == self._dom: + return + + if (node.tagName == 'object' and + node.getAttribute('class') in DIALOGS): + dialog = node + break + node = node.parentNode + assert node + + # 2) Get dialogs action-widgets tag, create if not found + for child in dialog.childNodes: + if child.nodeType != Node.ELEMENT_NODE: + continue + if child.tagName == 'action-widgets': + actions = child + break + else: + actions = self._dom.createElement("action-widgets") + dialog.appendChild(actions) + + # 3) Add action-widget tag for the response + action = self._dom.createElement("action-widget") + action.setAttribute("response", response) + action.appendChild(self._dom.createTextNode(object_name)) + actions.appendChild(action) + + def _convert_adjustment(self, prop): + properties = {} + if prop.childNodes: + data = prop.childNodes[0].data + value, lower, upper, step, page, page_size = data.split(' ') + properties.update(value=value, + lower=lower, + upper=upper, + step_increment=step, + page_increment=page, + page_size=page_size) + else: + prop.appendChild(self._dom.createTextNode("")) + + adj = self._create_root_object("GtkAdjustment", + template='adjustment', + properties=properties) + prop.childNodes[0].data = adj.getAttribute('id') + + def _convert_combobox_items(self, node, prop): + parent = prop.parentNode + if not prop.childNodes: + parent.removeChild(prop) + return + + translatable_attr = prop.attributes.get('translatable') + translatable = translatable_attr is not None and translatable_attr.value == 'yes' + has_context_attr = prop.attributes.get('context') + has_context = has_context_attr is not None and has_context_attr.value == 'yes' + comments_attr = prop.attributes.get('comments') + comments = comments_attr is not None and comments_attr.value or None + + value = prop.childNodes[0].data + model = self._create_root_object("GtkListStore", + template="model") + + columns = self._dom.createElement('columns') + model.appendChild(columns) + + column = self._dom.createElement('column') + column.setAttribute('type', 'gchararray') + columns.appendChild(column) + + data = self._dom.createElement('data') + model.appendChild(data) + + if value.endswith('\n'): + value = value[:-1] + for item in value.split('\n'): + row = self._dom.createElement('row') + data.appendChild(row) + + col = self._dom.createElement('col') + col.setAttribute('id', '0') + if translatable: + col.setAttribute('translatable', 'yes') + if has_context: + splitting = item.split('|', 1) + if len(splitting) == 2: + context, item = splitting + col.setAttribute('context', context) + if comments is not None: + col.setAttribute('comments', comments) + col.appendChild(self._dom.createTextNode(item)) + row.appendChild(col) + + model_prop = self._dom.createElement('property') + model_prop.setAttribute('name', 'model') + model_prop.appendChild( + self._dom.createTextNode(model.getAttribute('id'))) + parent.appendChild(model_prop) + + parent.removeChild(prop) + + child = self._dom.createElement('child') + node.appendChild(child) + cell_renderer = self._create_object('GtkCellRendererText', None, + template='renderer') + child.appendChild(cell_renderer) + + attributes = self._dom.createElement('attributes') + child.appendChild(attributes) + + attribute = self._dom.createElement('attribute') + attributes.appendChild(attribute) + attribute.setAttribute('name', 'text') + attribute.appendChild(self._dom.createTextNode('0')) + + def _convert_textview_text(self, prop): + if not prop.childNodes: + prop.parentNode.removeChild(prop) + return + + data = prop.childNodes[0].data + if prop.hasAttribute('translatable'): + prop.removeAttribute('translatable') + tbuffer = self._create_root_object("GtkTextBuffer", + template='textbuffer', + properties=dict(text=data)) + prop.childNodes[0].data = tbuffer.getAttribute('id') + prop.setAttribute('name', 'buffer') + + def _packing_prop_to_child_attr(self, node, prop_name, prop_val, + attr_val=None): + for child in get_child_nodes(node): + packing_props = [p for p in child.childNodes if p.nodeName == "packing"] + if not packing_props: + continue + assert len(packing_props) == 1 + packing_prop = packing_props[0] + properties = packing_prop.getElementsByTagName("property") + for prop in properties: + if (prop.getAttribute("name") != prop_name or + prop.childNodes[0].data != prop_val): + continue + packing_prop.removeChild(prop) + child.setAttribute(prop_name, attr_val or prop_val) + if len(properties) == 1: + child.removeChild(packing_prop) + + def _convert_ui(self, node): + cdata = node.childNodes[0] + data = cdata.toxml().strip() + if not data.startswith(""): + return + data = data[9:-3] + child = minidom.parseString(data).childNodes[0] + nodes = child.childNodes[:] + for child_node in nodes: + node.appendChild(child_node) + node.removeChild(cdata) + if not node.hasAttribute("id"): + return + + # Updating references made by widgets + parent_id = node.parentNode.getAttribute("id") + for widget in self._get_objects_by_attr("constructor", + node.getAttribute("id")): + widget.getAttributeNode("constructor").value = parent_id + node.removeAttribute("id") + + def _convert_accessibility(self, node): + objectNode = node.parentNode + parent_id = objectNode.getAttribute("id") + + properties = {} + for node in node.childNodes: + if node.nodeName == 'atkproperty': + node.tagName = 'property' + properties[node.getAttribute('name')] = node + node.parentNode.removeChild(node) + elif node.nodeName == 'atkrelation': + node.tagName = 'relation' + relation_type = node.getAttribute('type') + relation_type = relation_type.replace('_', '-') + node.setAttribute('type', relation_type) + elif node.nodeName == 'atkaction': + node.tagName = 'action' + + if properties: + child = self._dom.createElement('child') + child.setAttribute("internal-child", "accessible") + + atkobject = self._create_object( + "AtkObject", None, + template='a11y-%s' % (parent_id,), + properties=properties) + child.appendChild(atkobject) + objectNode.appendChild(child) + + def _strip_root(self, root_name): + for widget in self._dom.getElementsByTagName("widget"): + if widget.getAttribute('id') == root_name: + break + else: + raise SystemExit("Could not find an object called `%s'" % ( + root_name)) + + for child in self._interface.childNodes[:]: + if child.nodeType != Node.ELEMENT_NODE: + continue + child.parentNode.removeChild(child) + + self._interface.appendChild(widget) + + +def _indent(output): + if not subprocess: + return output + + for directory in os.environ['PATH'].split(os.pathsep): + filename = os.path.join(directory, 'xmllint') + if os.path.exists(filename): + break + else: + return output + + s = subprocess.Popen([filename, '--format', '-'], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE) + s.stdin.write(output) + s.stdin.close() + return s.stdout.read() + +def usage(): + print __doc__ + +def main(args): + try: + opts, args = getopt.getopt(args[1:], "hwr:", + ["help", + "skip-windows", + "target-version=", + "root="]) + except getopt.GetoptError: + usage() + return 2 + + if len(args) != 2: + usage() + return 2 + + input_filename, output_filename = args + + skip_windows = False + split = False + root = None + target_version = "2.0" + for o, a in opts: + if o in ("-h", "--help"): + usage() + sys.exit() + elif o in ("-r", "--root"): + root = a + elif o in ("-w", "--skip-windows"): + skip_windows = True + elif o in ("-t", "--target-version"): + target_version = a + + conv = GtkBuilderConverter(skip_windows=skip_windows, + target_version=target_version, + root=root) + conv.parse_file(input_filename) + + xml = _indent(conv.to_xml()) + if output_filename == "-": + print xml + else: + open(output_filename, 'w').write(xml) + print "Wrote", output_filename + + return 0 + +if __name__ == "__main__": + sys.exit(main(sys.argv)) From a8f906980a4f4d9d37754fb6fa8646dbb079687423cb162295d5bc7d3e90d491 Mon Sep 17 00:00:00 2001 From: Vincent Untz Date: Wed, 27 Apr 2011 12:55:58 +0000 Subject: [PATCH 2/3] Accepting request 68563 from home:vuntz:branches:GNOME:Factory ok OBS-URL: https://build.opensuse.org/request/show/68563 OBS-URL: https://build.opensuse.org/package/show/GNOME:Factory/gnome-terminal?expand=0&rev=71 --- gnome-terminal.changes | 48 ++- gnome-terminal.spec | 36 +- gtk-builder-convert | 799 ----------------------------------------- 3 files changed, 57 insertions(+), 826 deletions(-) delete mode 100644 gtk-builder-convert diff --git a/gnome-terminal.changes b/gnome-terminal.changes index 930340b..f3c45bc 100644 --- a/gnome-terminal.changes +++ b/gnome-terminal.changes @@ -1,25 +1,59 @@ +------------------------------------------------------------------- +Wed Apr 27 14:37:48 CEST 2011 - vuntz@opensuse.org + +- Remove now unneeded dbus-1-glib-devel, scrollkeeper, + startup-notification-devel BuildRequires. +- Change gconf2-devel BuildRequires to pkgconfig(gconf-2.0). +- Add explicit pkgconfig() BuildRequires: glib-2.0, gtk+-3.0. +- Drop our copy of gtk-builder-convert: + + Remove the source file. + + Remove python-xml BuildRequires. + + Do not set GTK_BUILDER_CONVERT on build. + + Add gtk2-devel BuildRequires, which has the script. + ------------------------------------------------------------------- Mon Apr 4 13:52:43 UTC 2011 - fcrozat@novell.com - Update to version 3.0.0: - + bgo#600876: Update paste sensitivity whenever clipboard - changes. + + Update paste sensitivity whenever clipboard changes + Updated translations. ------------------------------------------------------------------- Thu Mar 24 09:38:54 UTC 2011 - fcrozat@novell.com - Update to version 2.33.90: - + Bug fixes + + Disable sorting in the Keyboard Shortcut editor + + Take system font from gsettings instead of gconf + + Theme close button + + Updated translations. +- Changes from version 2.33.5: + + More port to gtk3 + + Misc fixes. + + Updated translations. +- Changes from version 2.33.4: + + More port to gtk3 + + Updated translations. +- Changes from version 2.33.3: + + Remove S/Key support + + More port to gtk3 + + Updated translations. +- Changes from version 2.33.2: + + Do not put TERM in the spawn env + + More port to gtk3 + + Don't crash when receiving bogus data in dbus call + + Updated translations. +- Changes from version 2.33.1: + + Make geometry parsing more robust + + Implement a better fix for wrong sizing of detached tabs + + Fix gridding for small sizes + Port to gtk3 + Updated translations +- Pass --with-gtk=3.0 to configure. - Add copy of git gtk2 gtk-builder-convert to fix build and not rely on modified gtk2 packages, pass GTK_BUILDER_CONVERT varibale - to configure call. -- Pass --with-gtk=3.0 to configure. -- BuildRequire python-xml for gtk-builder-convert to work properly. + to configure call, and add python-xml BuildRequires. - Change vte-devel BuildRequires to pkgconfig(vte-2.90) -- BuildRequire pkgconfig(gsettings-desktop-schemas) +- Add pkgconfig(gsettings-desktop-schemas) BuildRequires. ------------------------------------------------------------------- Sun Feb 13 16:18:24 CET 2011 - vuntz@opensuse.org diff --git a/gnome-terminal.spec b/gnome-terminal.spec index 9cdd79c..375ec93 100644 --- a/gnome-terminal.spec +++ b/gnome-terminal.spec @@ -19,31 +19,29 @@ Name: gnome-terminal -BuildRequires: fdupes -BuildRequires: gnome-doc-utils-devel -BuildRequires: intltool -BuildRequires: gconf2-devel -BuildRequires: dbus-1-glib-devel -# needed by source1 -BuildRequires: python-xml -BuildRequires: scrollkeeper -BuildRequires: startup-notification-devel -BuildRequires: translation-update-upstream -BuildRequires: update-desktop-files -BuildRequires: pkgconfig(vte-2.90) -BuildRequires: pkgconfig(gsettings-desktop-schemas) License: GPLv3+ ; LGPLv2.1+ Group: System/X11/Terminals -Obsoletes: gnome-core Version: 3.0.0 Release: 1 Summary: GNOME Terminal -Source: %{name}-%{version}.tar.bz2 -Source1: gtk-builder-convert Url: http://www.gnome.org -BuildRoot: %{_tmppath}/%{name}-%{version}-build +Source: %{name}-%{version}.tar.bz2 +BuildRequires: fdupes +BuildRequires: gnome-doc-utils-devel +# for gtk-builder-convert +BuildRequires: gtk2-devel +BuildRequires: intltool +BuildRequires: translation-update-upstream +BuildRequires: update-desktop-files +BuildRequires: pkgconfig(gconf-2.0) +BuildRequires: pkgconfig(glib-2.0) +BuildRequires: pkgconfig(gsettings-desktop-schemas) +BuildRequires: pkgconfig(gtk+-3.0) +BuildRequires: pkgconfig(vte-2.90) PreReq: filesystem gconf2 Recommends: %{name}-lang +Obsoletes: gnome-core +BuildRoot: %{_tmppath}/%{name}-%{version}-build %gconf_schemas_prereq %description @@ -55,12 +53,10 @@ This package provides the GNOME terminal emulator application. translation-update-upstream %build -cp %{S:1} . -chmod +x ./gtk-builder-convert %configure --with-gtk=3.0 \ --disable-schemas-install \ --disable-scrollkeeper -%__make %{?jobs:-j%jobs} GTK_BUILDER_CONVERT="$PWD/gtk-builder-convert" +%__make %{?jobs:-j%jobs} %install %makeinstall diff --git a/gtk-builder-convert b/gtk-builder-convert deleted file mode 100644 index bfefd0e..0000000 --- a/gtk-builder-convert +++ /dev/null @@ -1,799 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (C) 2006-2008 Async Open Source -# Henrique Romano -# Johan Dahlin -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# TODO: -# Toolbars - -"""Usage: gtk-builder-convert [OPTION] [INPUT] [OUTPUT] -Converts Glade files into XML files which can be loaded with GtkBuilder. -The [INPUT] file is - - -w, --skip-windows Convert everything but GtkWindow subclasses. - -r, --root Convert only widget named root and its children - -h, --help display this help and exit - -When OUTPUT is -, write to standard output. - -Examples: - gtk-builder-convert preference.glade preferences.ui - -Report bugs to http://bugzilla.gnome.org/.""" - -import getopt -import os -import sys - -from xml.dom import minidom, Node - -DIALOGS = ['GtkDialog', - 'GtkFileChooserDialog', - 'GtkMessageDialog'] -WINDOWS = ['GtkWindow'] + DIALOGS - -# The subprocess is only available in Python 2.4+ -try: - import subprocess - subprocess # pyflakes -except ImportError: - subprocess = None - -def get_child_nodes(node): - assert node.tagName == 'object' - nodes = [] - for child in node.childNodes: - if child.nodeType != Node.ELEMENT_NODE: - continue - if child.tagName != 'child': - continue - nodes.append(child) - return nodes - -def get_properties(node): - assert node.tagName == 'object' - properties = {} - for child in node.childNodes: - if child.nodeType != Node.ELEMENT_NODE: - continue - if child.tagName != 'property': - continue - value = child.childNodes[0].data - properties[child.getAttribute('name')] = value - return properties - -def get_property(node, property_name): - assert node.tagName == 'object' - properties = get_properties(node) - return properties.get(property_name) - -def get_property_node(node, property_name): - assert node.tagName == 'object' - properties = {} - for child in node.childNodes: - if child.nodeType != Node.ELEMENT_NODE: - continue - if child.tagName != 'property': - continue - if child.getAttribute('name') == property_name: - return child - -def get_signal_nodes(node): - assert node.tagName == 'object' - signals = [] - for child in node.childNodes: - if child.nodeType != Node.ELEMENT_NODE: - continue - if child.tagName == 'signal': - signals.append(child) - return signals - -def get_property_nodes(node): - assert node.tagName == 'object' - properties = [] - for child in node.childNodes: - if child.nodeType != Node.ELEMENT_NODE: - continue - # FIXME: handle comments - if child.tagName == 'property': - properties.append(child) - return properties - -def get_accelerator_nodes(node): - assert node.tagName == 'object' - accelerators = [] - for child in node.childNodes: - if child.nodeType != Node.ELEMENT_NODE: - continue - if child.tagName == 'accelerator': - accelerators.append(child) - return accelerators - -def get_object_node(child_node): - assert child_node.tagName == 'child', child_node - nodes = [] - for node in child_node.childNodes: - if node.nodeType != Node.ELEMENT_NODE: - continue - if node.tagName == 'object': - nodes.append(node) - assert len(nodes) == 1, nodes - return nodes[0] - -def copy_properties(node, props, prop_dict): - assert node.tagName == 'object' - for prop_name in props: - child = get_property_node(node, prop_name) - if child is not None: - prop_dict[prop_name] = child - - return node - -class GtkBuilderConverter(object): - - def __init__(self, skip_windows, target_version, root): - self.skip_windows = skip_windows - self.target_version = target_version - self.root = root - self.root_objects = [] - self.objects = {} - - # - # Public API - # - - def parse_file(self, file): - self._dom = minidom.parse(file) - self._parse() - - def parse_buffer(self, buffer): - self._dom = minidom.parseString(buffer) - self._parse() - - def to_xml(self): - xml = self._dom.toprettyxml("", "") - return xml.encode('utf-8') - - # - # Private - # - - def _get_object(self, name): - return self.objects.get(name) - - def _get_objects_by_attr(self, attribute, value): - return [w for w in self._dom.getElementsByTagName("object") - if w.getAttribute(attribute) == value] - - def _create_object(self, obj_class, obj_id, template=None, properties=None): - """ - Creates a new tag. - Optionally a name template can be provided which will be used - to avoid naming collisions. - The properties dictionary can either contain string values or Node - values. If a node is provided the name of the node will be overridden - by the dictionary key. - - @param obj_class: class of the object (class tag) - @param obj_id: identifier of the object (id tag) - @param template: name template to use, for example 'button' - @param properties: dictionary of properties - @type properties: string or Node. - @returns: Newly created node of the object - """ - if template is not None: - count = 1 - while True: - obj_id = template + str(count) - widget = self._get_object(obj_id) - if widget is None: - break - - count += 1 - - obj = self._dom.createElement('object') - obj.setAttribute('class', obj_class) - obj.setAttribute('id', obj_id) - if properties: - for name, value in properties.items(): - if isinstance(value, Node): - # Reuse the node, so translatable and context still will be - # set when converting nodes. See also #509153 - prop = value - else: - prop = self._dom.createElement('property') - prop.appendChild(self._dom.createTextNode(value)) - - prop.setAttribute('name', str(name)) - obj.appendChild(prop) - self.objects[obj_id] = obj - return obj - - def _create_root_object(self, obj_class, template, properties=None): - obj = self._create_object(obj_class, None, template, properties) - self.root_objects.append(obj) - return obj - - def _parse(self): - glade_iface = self._dom.getElementsByTagName("glade-interface") - assert glade_iface, ("Badly formed XML, there is " - "no tag.") - # Rename glade-interface to interface - glade_iface[0].tagName = 'interface' - self._interface = glade_iface[0] - - # Remove glade-interface doc type - for node in self._dom.childNodes: - if node.nodeType == Node.DOCUMENT_TYPE_NODE: - if node.name == 'glade-interface': - self._dom.removeChild(node) - - # Strip unsupported tags - for tag in ['requires', 'requires-version']: - for child in self._dom.getElementsByTagName(tag): - child.parentNode.removeChild(child) - - if self.root: - self._strip_root(self.root) - - # Rename widget to object - objects = self._dom.getElementsByTagName("widget") - for node in objects: - node.tagName = "object" - - for node in objects: - self._convert(node.getAttribute("class"), node) - if self._get_object(node.getAttribute('id')) is not None: - print "WARNING: duplicate id \"" + node.getAttribute('id') + "\"" - self.objects[node.getAttribute('id')] = node - - # Convert Gazpachos UI tag - for node in self._dom.getElementsByTagName("ui"): - self._convert_ui(node) - - # Convert accessibility tag - for node in self._dom.getElementsByTagName("accessibility"): - self._convert_accessibility(node) - - # Output the newly created root objects and sort them - # by attribute id - # FIXME: Use sorted(self.root_objects, - # key=lambda n: n.getAttribute('id'), - # reverse=True): - # when we can depend on python 2.4 or higher - root_objects = self.root_objects[:] - root_objects.sort(lambda a, b: cmp(b.getAttribute('id'), - a.getAttribute('id'))) - for obj in root_objects: - self._interface.childNodes.insert(0, obj) - - def _convert(self, klass, node): - if klass == 'GtkNotebook': - self._packing_prop_to_child_attr(node, "type", "tab") - elif klass in ['GtkExpander', 'GtkFrame']: - self._packing_prop_to_child_attr( - node, "type", "label_item", "label") - elif klass == "GtkMenuBar": - self._convert_menu(node) - elif klass == "GtkMenu": - # Only convert toplevel popups - if node.parentNode == self._interface: - self._convert_menu(node, popup=True) - elif klass in WINDOWS and self.skip_windows: - self._remove_window(node) - - if self.target_version == "3.0": - if klass == "GtkComboBoxEntry": - node.setAttribute("class","GtkComboBox") - prop = self._dom.createElement("property") - prop.setAttribute("name", "has-entry") - prop.appendChild(self._dom.createTextNode("True")) - node.appendChild(prop) - elif klass == "GtkDialog": - for child in node.childNodes: - if child.nodeType != Node.ELEMENT_NODE: - continue - if child.tagName != 'property': - continue - if (child.getAttribute("name") not in ("has-separator", "has_separator")): - continue; - node.removeChild(child) - break - - self._default_widget_converter(node) - - def _default_widget_converter(self, node): - klass = node.getAttribute("class") - for prop in get_property_nodes(node): - prop_name = prop.getAttribute("name") - if prop_name == "sizegroup": - self._convert_sizegroup(node, prop) - elif prop_name == "tooltip" and klass != "GtkAction": - prop.setAttribute("name", "tooltip-text") - elif prop_name in ["response_id", 'response-id']: - # It does not make sense to convert responses when - # we're not going to output dialogs - if self.skip_windows: - continue - object_id = node.getAttribute('id') - response = prop.childNodes[0].data - self._convert_dialog_response(node, object_id, response) - prop.parentNode.removeChild(prop) - elif prop_name == "adjustment": - self._convert_adjustment(prop) - elif prop_name == "items" and klass in ['GtkComboBox', - 'GtkComboBoxEntry']: - self._convert_combobox_items(node, prop) - elif prop_name == "text" and klass == 'GtkTextView': - self._convert_textview_text(prop) - - def _remove_window(self, node): - object_node = get_object_node(get_child_nodes(node)[0]) - parent = node.parentNode - parent.removeChild(node) - parent.appendChild(object_node) - - def _convert_menu(self, node, popup=False): - if node.hasAttribute('constructor'): - return - - uimgr = self._create_root_object('GtkUIManager', - template='uimanager') - - if popup: - name = 'popup' - else: - name = 'menubar' - - menu = self._dom.createElement(name) - menu.setAttribute('name', node.getAttribute('id')) - node.setAttribute('constructor', uimgr.getAttribute('id')) - - for child in get_child_nodes(node): - obj_node = get_object_node(child) - item = self._convert_menuitem(uimgr, obj_node) - menu.appendChild(item) - child.removeChild(obj_node) - child.parentNode.removeChild(child) - - ui = self._dom.createElement('ui') - uimgr.appendChild(ui) - - ui.appendChild(menu) - - def _convert_menuitem(self, uimgr, obj_node): - children = get_child_nodes(obj_node) - name = 'menuitem' - if children: - child_node = children[0] - menu_node = get_object_node(child_node) - # Can be GtkImage, which will take care of later. - if menu_node.getAttribute('class') == 'GtkMenu': - name = 'menu' - - object_class = obj_node.getAttribute('class') - if object_class in ['GtkMenuItem', - 'GtkImageMenuItem', - 'GtkCheckMenuItem', - 'GtkRadioMenuItem']: - menu = self._dom.createElement(name) - elif object_class == 'GtkSeparatorMenuItem': - return self._dom.createElement('separator') - else: - raise NotImplementedError(object_class) - - menu.setAttribute('action', obj_node.getAttribute('id')) - self._add_action_from_menuitem(uimgr, obj_node) - if children: - for child in get_child_nodes(menu_node): - obj_node = get_object_node(child) - item = self._convert_menuitem(uimgr, obj_node) - menu.appendChild(item) - child.removeChild(obj_node) - child.parentNode.removeChild(child) - return menu - - def _menuitem_to_action(self, node, properties): - copy_properties(node, ['label', 'tooltip'], properties) - - def _togglemenuitem_to_action(self, node, properties): - self._menuitem_to_action(node, properties) - copy_properties(node, ['active'], properties) - - def _radiomenuitem_to_action(self, node, properties): - self._togglemenuitem_to_action(node, properties) - copy_properties(node, ['group'], properties) - - def _add_action_from_menuitem(self, uimgr, node): - properties = {} - object_class = node.getAttribute('class') - object_id = node.getAttribute('id') - if object_class == 'GtkMenuItem': - name = 'GtkAction' - self._menuitem_to_action(node, properties) - elif object_class == 'GtkCheckMenuItem': - name = 'GtkToggleAction' - self._togglemenuitem_to_action(node, properties) - elif object_class == 'GtkRadioMenuItem': - name = 'GtkRadioAction' - self._radiomenuitem_to_action(node, properties) - elif object_class == 'GtkImageMenuItem': - name = 'GtkAction' - children = get_child_nodes(node) - if (children and - children[0].getAttribute('internal-child') == 'image'): - image = get_object_node(children[0]) - child = get_property_node(image, 'stock') - if child is not None: - properties['stock_id'] = child - self._menuitem_to_action(node, properties) - elif object_class == 'GtkSeparatorMenuItem': - return - else: - raise NotImplementedError(object_class) - - if get_property(node, 'use_stock') == 'True': - if 'label' in properties: - properties['stock_id'] = properties['label'] - del properties['label'] - - properties['name'] = object_id - action = self._create_object(name, - object_id, - properties=properties) - for signal in get_signal_nodes(node): - signal_name = signal.getAttribute('name') - if signal_name in ['activate', 'toggled']: - action.appendChild(signal) - else: - print 'Unhandled signal %s::%s' % (node.getAttribute('class'), - signal_name) - - if not uimgr.childNodes: - child = self._dom.createElement('child') - uimgr.appendChild(child) - - group = self._create_object('GtkActionGroup', None, - template='actiongroup') - child.appendChild(group) - else: - group = uimgr.childNodes[0].childNodes[0] - - child = self._dom.createElement('child') - group.appendChild(child) - child.appendChild(action) - - for accelerator in get_accelerator_nodes(node): - signal_name = accelerator.getAttribute('signal') - if signal_name != 'activate': - print 'Unhandled accelerator signal for %s::%s' % ( - node.getAttribute('class'), signal_name) - continue - accelerator.removeAttribute('signal') - child.appendChild(accelerator) - - def _convert_sizegroup(self, node, prop): - # This is Gazpacho only - node.removeChild(prop) - obj = self._get_object(prop.childNodes[0].data) - if obj is None: - widgets = self._get_objects_by_attr("class", "GtkSizeGroup") - if widgets: - obj = widgets[-1] - else: - obj = self._create_root_object('GtkSizeGroup', - template='sizegroup') - - widgets = obj.getElementsByTagName("widgets") - if widgets: - assert len(widgets) == 1 - widgets = widgets[0] - else: - widgets = self._dom.createElement("widgets") - obj.appendChild(widgets) - - member = self._dom.createElement("widget") - member.setAttribute("name", node.getAttribute("id")) - widgets.appendChild(member) - - def _convert_dialog_response(self, node, object_name, response): - # 1) Get parent dialog node - while True: - # If we can't find the parent dialog, give up - if node == self._dom: - return - - if (node.tagName == 'object' and - node.getAttribute('class') in DIALOGS): - dialog = node - break - node = node.parentNode - assert node - - # 2) Get dialogs action-widgets tag, create if not found - for child in dialog.childNodes: - if child.nodeType != Node.ELEMENT_NODE: - continue - if child.tagName == 'action-widgets': - actions = child - break - else: - actions = self._dom.createElement("action-widgets") - dialog.appendChild(actions) - - # 3) Add action-widget tag for the response - action = self._dom.createElement("action-widget") - action.setAttribute("response", response) - action.appendChild(self._dom.createTextNode(object_name)) - actions.appendChild(action) - - def _convert_adjustment(self, prop): - properties = {} - if prop.childNodes: - data = prop.childNodes[0].data - value, lower, upper, step, page, page_size = data.split(' ') - properties.update(value=value, - lower=lower, - upper=upper, - step_increment=step, - page_increment=page, - page_size=page_size) - else: - prop.appendChild(self._dom.createTextNode("")) - - adj = self._create_root_object("GtkAdjustment", - template='adjustment', - properties=properties) - prop.childNodes[0].data = adj.getAttribute('id') - - def _convert_combobox_items(self, node, prop): - parent = prop.parentNode - if not prop.childNodes: - parent.removeChild(prop) - return - - translatable_attr = prop.attributes.get('translatable') - translatable = translatable_attr is not None and translatable_attr.value == 'yes' - has_context_attr = prop.attributes.get('context') - has_context = has_context_attr is not None and has_context_attr.value == 'yes' - comments_attr = prop.attributes.get('comments') - comments = comments_attr is not None and comments_attr.value or None - - value = prop.childNodes[0].data - model = self._create_root_object("GtkListStore", - template="model") - - columns = self._dom.createElement('columns') - model.appendChild(columns) - - column = self._dom.createElement('column') - column.setAttribute('type', 'gchararray') - columns.appendChild(column) - - data = self._dom.createElement('data') - model.appendChild(data) - - if value.endswith('\n'): - value = value[:-1] - for item in value.split('\n'): - row = self._dom.createElement('row') - data.appendChild(row) - - col = self._dom.createElement('col') - col.setAttribute('id', '0') - if translatable: - col.setAttribute('translatable', 'yes') - if has_context: - splitting = item.split('|', 1) - if len(splitting) == 2: - context, item = splitting - col.setAttribute('context', context) - if comments is not None: - col.setAttribute('comments', comments) - col.appendChild(self._dom.createTextNode(item)) - row.appendChild(col) - - model_prop = self._dom.createElement('property') - model_prop.setAttribute('name', 'model') - model_prop.appendChild( - self._dom.createTextNode(model.getAttribute('id'))) - parent.appendChild(model_prop) - - parent.removeChild(prop) - - child = self._dom.createElement('child') - node.appendChild(child) - cell_renderer = self._create_object('GtkCellRendererText', None, - template='renderer') - child.appendChild(cell_renderer) - - attributes = self._dom.createElement('attributes') - child.appendChild(attributes) - - attribute = self._dom.createElement('attribute') - attributes.appendChild(attribute) - attribute.setAttribute('name', 'text') - attribute.appendChild(self._dom.createTextNode('0')) - - def _convert_textview_text(self, prop): - if not prop.childNodes: - prop.parentNode.removeChild(prop) - return - - data = prop.childNodes[0].data - if prop.hasAttribute('translatable'): - prop.removeAttribute('translatable') - tbuffer = self._create_root_object("GtkTextBuffer", - template='textbuffer', - properties=dict(text=data)) - prop.childNodes[0].data = tbuffer.getAttribute('id') - prop.setAttribute('name', 'buffer') - - def _packing_prop_to_child_attr(self, node, prop_name, prop_val, - attr_val=None): - for child in get_child_nodes(node): - packing_props = [p for p in child.childNodes if p.nodeName == "packing"] - if not packing_props: - continue - assert len(packing_props) == 1 - packing_prop = packing_props[0] - properties = packing_prop.getElementsByTagName("property") - for prop in properties: - if (prop.getAttribute("name") != prop_name or - prop.childNodes[0].data != prop_val): - continue - packing_prop.removeChild(prop) - child.setAttribute(prop_name, attr_val or prop_val) - if len(properties) == 1: - child.removeChild(packing_prop) - - def _convert_ui(self, node): - cdata = node.childNodes[0] - data = cdata.toxml().strip() - if not data.startswith(""): - return - data = data[9:-3] - child = minidom.parseString(data).childNodes[0] - nodes = child.childNodes[:] - for child_node in nodes: - node.appendChild(child_node) - node.removeChild(cdata) - if not node.hasAttribute("id"): - return - - # Updating references made by widgets - parent_id = node.parentNode.getAttribute("id") - for widget in self._get_objects_by_attr("constructor", - node.getAttribute("id")): - widget.getAttributeNode("constructor").value = parent_id - node.removeAttribute("id") - - def _convert_accessibility(self, node): - objectNode = node.parentNode - parent_id = objectNode.getAttribute("id") - - properties = {} - for node in node.childNodes: - if node.nodeName == 'atkproperty': - node.tagName = 'property' - properties[node.getAttribute('name')] = node - node.parentNode.removeChild(node) - elif node.nodeName == 'atkrelation': - node.tagName = 'relation' - relation_type = node.getAttribute('type') - relation_type = relation_type.replace('_', '-') - node.setAttribute('type', relation_type) - elif node.nodeName == 'atkaction': - node.tagName = 'action' - - if properties: - child = self._dom.createElement('child') - child.setAttribute("internal-child", "accessible") - - atkobject = self._create_object( - "AtkObject", None, - template='a11y-%s' % (parent_id,), - properties=properties) - child.appendChild(atkobject) - objectNode.appendChild(child) - - def _strip_root(self, root_name): - for widget in self._dom.getElementsByTagName("widget"): - if widget.getAttribute('id') == root_name: - break - else: - raise SystemExit("Could not find an object called `%s'" % ( - root_name)) - - for child in self._interface.childNodes[:]: - if child.nodeType != Node.ELEMENT_NODE: - continue - child.parentNode.removeChild(child) - - self._interface.appendChild(widget) - - -def _indent(output): - if not subprocess: - return output - - for directory in os.environ['PATH'].split(os.pathsep): - filename = os.path.join(directory, 'xmllint') - if os.path.exists(filename): - break - else: - return output - - s = subprocess.Popen([filename, '--format', '-'], - stdin=subprocess.PIPE, - stdout=subprocess.PIPE) - s.stdin.write(output) - s.stdin.close() - return s.stdout.read() - -def usage(): - print __doc__ - -def main(args): - try: - opts, args = getopt.getopt(args[1:], "hwr:", - ["help", - "skip-windows", - "target-version=", - "root="]) - except getopt.GetoptError: - usage() - return 2 - - if len(args) != 2: - usage() - return 2 - - input_filename, output_filename = args - - skip_windows = False - split = False - root = None - target_version = "2.0" - for o, a in opts: - if o in ("-h", "--help"): - usage() - sys.exit() - elif o in ("-r", "--root"): - root = a - elif o in ("-w", "--skip-windows"): - skip_windows = True - elif o in ("-t", "--target-version"): - target_version = a - - conv = GtkBuilderConverter(skip_windows=skip_windows, - target_version=target_version, - root=root) - conv.parse_file(input_filename) - - xml = _indent(conv.to_xml()) - if output_filename == "-": - print xml - else: - open(output_filename, 'w').write(xml) - print "Wrote", output_filename - - return 0 - -if __name__ == "__main__": - sys.exit(main(sys.argv)) From d3c5d9790ddfd7b1647d13ba160c3c1a6c691b709472dd75f43e94d4378ccc2a Mon Sep 17 00:00:00 2001 From: Vincent Untz Date: Wed, 27 Apr 2011 14:24:55 +0000 Subject: [PATCH 3/3] Accepting request 68589 from home:fcrozat:branches:GNOME:Factory thanks OBS-URL: https://build.opensuse.org/request/show/68589 OBS-URL: https://build.opensuse.org/package/show/GNOME:Factory/gnome-terminal?expand=0&rev=72 --- gnome-terminal-3.0.0.tar.bz2 | 3 --- gnome-terminal-3.0.1.tar.bz2 | 3 +++ gnome-terminal.changes | 7 +++++++ gnome-terminal.spec | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) delete mode 100644 gnome-terminal-3.0.0.tar.bz2 create mode 100644 gnome-terminal-3.0.1.tar.bz2 diff --git a/gnome-terminal-3.0.0.tar.bz2 b/gnome-terminal-3.0.0.tar.bz2 deleted file mode 100644 index 1e282c7..0000000 --- a/gnome-terminal-3.0.0.tar.bz2 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:16a3420176bbe5d58ad432306bfc40edb1423d43e311dd1d0de6da16559943f8 -size 2320401 diff --git a/gnome-terminal-3.0.1.tar.bz2 b/gnome-terminal-3.0.1.tar.bz2 new file mode 100644 index 0000000..e5371b1 --- /dev/null +++ b/gnome-terminal-3.0.1.tar.bz2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:388eda40663566cb785e2d92180e0b584c2c89acc3e7bcd30605601710fddc48 +size 2321517 diff --git a/gnome-terminal.changes b/gnome-terminal.changes index f3c45bc..6905eb4 100644 --- a/gnome-terminal.changes +++ b/gnome-terminal.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Wed Apr 27 14:19:51 UTC 2011 - fcrozat@novell.com + +- Update to version 3.0.1: + + bgo#647077: Use gsettings for proxy settings. + + Updated translations. + ------------------------------------------------------------------- Wed Apr 27 14:37:48 CEST 2011 - vuntz@opensuse.org diff --git a/gnome-terminal.spec b/gnome-terminal.spec index 375ec93..3f78fa5 100644 --- a/gnome-terminal.spec +++ b/gnome-terminal.spec @@ -21,7 +21,7 @@ Name: gnome-terminal License: GPLv3+ ; LGPLv2.1+ Group: System/X11/Terminals -Version: 3.0.0 +Version: 3.0.1 Release: 1 Summary: GNOME Terminal Url: http://www.gnome.org