From d9c46655cceb1263ed8d5e8ef0d0f703b881a443 Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Thu, 24 Feb 2000 04:03:49 +0000 Subject: [PATCH] Added XML-structured TODO file. python script to turn TODO.xml into pretty Wed Feb 23 22:59:50 2000 Owen Taylor * TODO.xml: Added XML-structured TODO file. * docs/make-todo: python script to turn TODO.xml into pretty XML output. --- ChangeLog | 6 + ChangeLog.pre-2-0 | 6 + ChangeLog.pre-2-10 | 6 + ChangeLog.pre-2-2 | 6 + ChangeLog.pre-2-4 | 6 + ChangeLog.pre-2-6 | 6 + ChangeLog.pre-2-8 | 6 + TODO.xml | 236 +++++++++++++++++++++++++++++++ docs/make-todo | 340 +++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 618 insertions(+) create mode 100644 TODO.xml create mode 100755 docs/make-todo diff --git a/ChangeLog b/ChangeLog index 27306256e5..652bb532c6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Wed Feb 23 22:59:50 2000 Owen Taylor + + * TODO.xml: Added XML-structured TODO file. + * docs/make-todo: python script to turn TODO.xml into + pretty XML output. + 2000-02-23 Jonathan Blandford * gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 27306256e5..652bb532c6 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,9 @@ +Wed Feb 23 22:59:50 2000 Owen Taylor + + * TODO.xml: Added XML-structured TODO file. + * docs/make-todo: python script to turn TODO.xml into + pretty XML output. + 2000-02-23 Jonathan Blandford * gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 27306256e5..652bb532c6 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,9 @@ +Wed Feb 23 22:59:50 2000 Owen Taylor + + * TODO.xml: Added XML-structured TODO file. + * docs/make-todo: python script to turn TODO.xml into + pretty XML output. + 2000-02-23 Jonathan Blandford * gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 27306256e5..652bb532c6 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,9 @@ +Wed Feb 23 22:59:50 2000 Owen Taylor + + * TODO.xml: Added XML-structured TODO file. + * docs/make-todo: python script to turn TODO.xml into + pretty XML output. + 2000-02-23 Jonathan Blandford * gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 27306256e5..652bb532c6 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,9 @@ +Wed Feb 23 22:59:50 2000 Owen Taylor + + * TODO.xml: Added XML-structured TODO file. + * docs/make-todo: python script to turn TODO.xml into + pretty XML output. + 2000-02-23 Jonathan Blandford * gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 27306256e5..652bb532c6 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,9 @@ +Wed Feb 23 22:59:50 2000 Owen Taylor + + * TODO.xml: Added XML-structured TODO file. + * docs/make-todo: python script to turn TODO.xml into + pretty XML output. + 2000-02-23 Jonathan Blandford * gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 27306256e5..652bb532c6 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,9 @@ +Wed Feb 23 22:59:50 2000 Owen Taylor + + * TODO.xml: Added XML-structured TODO file. + * docs/make-todo: python script to turn TODO.xml into + pretty XML output. + 2000-02-23 Jonathan Blandford * gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to diff --git a/TODO.xml b/TODO.xml new file mode 100644 index 0000000000..0ab270c3a9 --- /dev/null +++ b/TODO.xml @@ -0,0 +1,236 @@ + + +
+ GDK + + + Add backing store support + +

+ GTK+'s drawing model involves clearing to a background, and + then drawing widgets on top of this. Without having + backing-store support, this results in flickering in various + situations. Backing store cannot be added widget-by-widget, + because the drawing in a particular window is not confined + to a single widget. Instead it needs to be added per GDK + window. +

+

+ The way this is done is by having + gdk_window_begin_paint() + and gdk_window_end_paint() functions that + redirect all drawing to a particular window to an offscreen + pixmap, and then copy that offscreen pixmap back onto the + screen when the paint operation is done. The implementation + of this is mostly complete in the gtk-no-flicker branch of + GTK+. +

+
+ http://www.gtk.org/~otaylor/gtk/1.4/gdk-drawing.html + Owen Taylor <otaylor@redhat.com> +
+ + + 32 Bit Coordinates + +

+ GTK+-1.2 and earlier share X's limitation on the + size of coordinates and restrict all dimensions + to 16 bit quantities. By clever use of X it is + possible to lift this restriction and present a + full 32-bit space to the user. +

+
+ http://www.gtk.org/~otaylor/gtk/1.4/gdk-drawing.html + Owen Taylor <otaylor@redhat.com> +
+ + + Customizable double-click timeout + +

+ The current fixed double-click timeout in GTK+ + is too small for some users. This needs to be + customizable +

+
+ gtk-devel-list@redhat.com + #3958 +
+
+ +
+ Internationalization + + + Integrate Pango + +

+ The purpose of the Pango project is to provide a system for + layout and rendering of internationlized text. It handles + most of the issues necessary to +

+
+ http://www.pango.org + gtk-i18n-list@redhat.com +
+ + + Switch to using UTF-8 + +

+ This is closely related to Pango integration. Pango deals + with all strings in terms of UTF-8; by switching GTK+ over + to UTF-8 we make it considerably simpler for developers to + support multiple languages properly while still retaining + a large degree of compatiblity with existing programs. +

+

+ Some work has already been done on this as part of the Win32 + port, since the Win32 port is currently using UTF-8 for all + strings. In general, this should be an easy job; the hardest + parts are places like GtkFileSelection, cut and paste, and + input method support where there is interaction between GTK+ + and the operating system. +

+
+ gtk-i18n-list@redhat.com +
+ + + Rewrite Input Method Support + +

+ Current support for Input Methods is done via XIM, with + supported styles being over-the-spot and the root-window + styles. However, the over-the-spot style is not going to + work well with the Pango integration, since it relies on the + text rendering in the program being done in the standard + Xlib style, so it will be necessary to also support + on-the-spot input. On-the-spot input is done by supplying a + set of callbacks that are invoked by the input methods. +

+

+ While adding the above support, it may be desirable to + generalize the input-method support to the point where +

+
+ gtk-i18n-list@redhat.com +
+
+ +
+ GTK+ Core + + + Split GtkObject out + +

+ The GTK+ object system is already in use in quite a few different + non-GUI applications; it would be desirable for these uses + to have the object system separated from the GUI portions + of GTK+. +

+
+ Tim Janik <timj@gtk.org> +
+ + + Allow argument customization + +

+ Many types of object arguments (expander style in the CList, + default padding in button boxes, etc), conceptually go with + the theme, or as user preferences; they should not be set by + a particular program. +

+

+ There needs to be a mechanism for themes to be able to + control these arguments from the RC file. +

+
+
+ + + Allow global customization + +

+ There are a number of global parameters in GTK+ and GDK that should be + customizable by the user, such as the double-click timeout, + or whether widgets should be backing-stored by default. +

+

+ If we had argument customization from an RC file, it might + be possible to do this simply with a global object with + arguments for the various global parameters that was + customized in the same fashion as object arguments. +

+
+
+
+ +
+ GTK+ Widgets + + + Make GtkFrame use a label + +

+ The title of a frame should simply be another child widget + which, by default, holds a label widget. This will important + with Pango where proper text behavior will be more complex to + implement, but is also useful for certain user-interface + designs. (It can be useful, for example, to put a checkbutton + in that slot.) +

+
+ gtk-devel-list@redhat.com +
+ + + Replace GtkText Widget + +

+ The GtkText widget is badly in need of replacement, since it is + buggy and insufficiently feature rich. There are a number + of possible candidates for a replacement, with the most + promising at the current time being Havoc Pennington's + (hp@redhat.com) port of the Tk Text widget. +

+

+ As part of this job it will be necessary to add + Pango support to the + replacement. The structure of the Tk text widget port seems + suited to this as it works paragraph-by-paragraph, and + Pango works at a sub-paragraph scale. +

+
+ gtk-devel-list@redhat.com +
+ + + Add unified set of List/Tree/Grid widgets + +

+ Currently, GTK+ has a large number of list and tree widgets + (GtkList, GtkTree, GtkCList, GtkCTree), non of which are + ideal. The GtkList and GtkTree widgets perform badly on large + sets. (GtkTree widget is also quite buggy.) GtkCList + and GtkCTree mostly solve the size problem, but are quite + complex and, despite that, not very flexible. They are limited to + displaying pixmaps and text, and neither support arbitrary + widgets nor custom drawing functions. +

+

+ In addition to list and tree widgets, a closely related need + is a sheet widget that displays a (possibly editable) 2-D grid. + It would be desirable to have a complete set of widgets that + could be presented as the one-true-solution for these needs. + Model/View techniques could be used effectively to increase + both the simplicity and power of the interfaces. +

+
+ gtk-devel-list@redhat.com +
+
+
diff --git a/docs/make-todo b/docs/make-todo new file mode 100755 index 0000000000..498a1e8a41 --- /dev/null +++ b/docs/make-todo @@ -0,0 +1,340 @@ +#!/usr/bin/python + +import xmllib; +import sys; +import string +import re + +def html_subst(s): + if s.group(1) != None: + return s.group(0) + elif s.group(2) != None: + return '' + s.group(0) + '' + elif s.group(3) != None: + return '' + s.group(0) + '' + +def htmlify(str): + return re.sub ("(<[^>]*>)|(http://[~.:/\w-]+)|([\w._!-]+@[\w_-]+).[\w_-]+", html_subst, str) + +def bug_subst(s): + if s.group(1) != None: + return s.group(0) + else: + n = s.group(2) + return '#%s' % (n[0:2], n, n) + +def bugify(str): + str = re.sub ("(<[^>]*>)|#(\d+)", bug_subst, str) + return htmlify(str) + +def make_id(str): + return re.sub ("[^a-z]","-", string.lower(str)) + +class ParseError (Exception): + pass + +class Entry: + def __init__(self): + self.description = None + self.title = None + self.url = None + self.contact = None + self.bugs = None + + def set_size(self, size): + size = string.lower(size) + if size == "small": + self.size = "Small" + elif size == "medium": + self.size = "Medium" + elif size == "big": + self.size = "Big" + else: + raise ParseError, 'size must be "small", "medium", or "big"' + + def output(self): + if self.size == "Big": + bgcolor = "#88bb88" + elif self.size == "Medium": + bgcolor = "#b4d4b4" + else: + bgcolor = "#d0e0d0" + + print ''' +
+ + + + + + + + + + + +
%sSize: %sStatus: %sTarget Version: %s
+ %s + + ''' % (bgcolor, self.title, self.size, self.status, self.target, htmlify(self.description)) + + if self.url != None: + print ''' + + ''' % htmlify (self.url) + + if self.bugs != None: + print ''' + + ''' % bugify (self.bugs) + + if self.contact != None: + print ''' + + ''' % htmlify (self.contact) + + print ''' +
More Info:%s
Bug Reports:%s
Contact:%s
+
+
+''' + +class Section: + def __init__(self): + self.title = None + self.entries = [] + + def output(self): + + print '

%s

' % (make_id(self.title), self.title) + + first = 1 + for entry in self.entries: + if not first: + print "
" + first = 0 + entry.output() + +class TodoParser (xmllib.XMLParser): + def __init__(self): + xmllib.XMLParser.__init__(self) + + self.in_todo = 0 + self.in_data = 0 + self.data = "" + self.section = None + self.entry = None + self.sections = [] + + self.entitydefs = {} + + def start_todo(self,attributes): + if self.in_todo: + raise ParseError, " tags may not be nested" + self.in_todo = 1 + + def end_todo(self): + self.in_todo = 0 + + def start_section(self,attributes): + if self.section: + raise ParseError, "
tags may not be nested" + + self.section = Section() + + def end_section(self): + if self.section.title == None: + raise ParseError, "
requires " + + self.sections.append(self.section) + self.section = None + + def start_title(self,attributes): + if not self.section and not self.entry: + raise ParseError, "<title> tag must be in <section> or <entry>" + if self.in_data: + raise ParseError, "Unexpected <title> tag in content" + self.in_data = 1 + + def end_title(self): + self.in_data = 0 + if self.entry: + self.entry.title = self.data + self.data = "" + else: + self.section.title = self.data + self.data = "" + + def start_description(self,attributes): + if not self.entry: + raise ParseError, "<description> tag must be in <entry>" + if self.in_data: + raise ParseError, "Unexpected <description> tag in content" + self.in_data = 1 + + def end_description(self): + self.in_data = 0 + self.entry.description = self.data + self.data = "" + + def start_url(self,attributes): + if not self.entry: + raise ParseError, "<url> tag must be in <entry>" + if self.in_data: + raise ParseError, "Unexpected <url> tag in content" + self.in_data = 1 + + def end_url(self): + self.in_data = 0 + self.entry.url = self.data + self.data = "" + + def start_contact(self,attributes): + if not self.entry: + raise ParseError, "<contact> tag must be in <contact>" + if self.in_data: + raise ParseError, "Unexpected <contact> tag in content" + self.in_data = 1 + + def end_contact(self): + self.in_data = 0 + self.entry.contact = self.data + self.data = "" + + def start_bugs(self,attributes): + if not self.entry: + raise ParseError, "<bugs> tag must be in <bugs>" + if self.in_data: + raise ParseError, "Unexpected <bugs> tag in content" + self.in_data = 1 + + def end_bugs(self): + self.in_data = 0 + self.entry.bugs = self.data + self.data = "" + + def start_entry(self,attributes): + if not self.section: + raise ParseError, "<entry> tag must be in <section>" + if self.entry: + raise ParseError, "<entry> tags may not be nested" + + self.entry = Entry() + + if not attributes.has_key("size"): + raise ParseError, '"size" attribute required for entry' + self.entry.set_size(attributes["size"]) + + if not attributes.has_key("status"): + raise ParseError, '"status" attribute (completion percentage) required for entry' + self.entry.status=attributes["status"] + + if not attributes.has_key("target"): + raise ParseError, '"target" attribute (target version) required for entry' + self.entry.target=attributes["target"] + + def end_entry(self): + if self.entry.title == None: + raise ParseError, "<entry> requires <title>" + + if self.entry.description == None: + raise ParseError, "<entry> requires <description>" + + self.section.entries.append(self.entry) + self.entry = None + + def handle_data(self,data): + if self.in_data: + self.data = self.data + data + + def unknown_starttag(self,tag,attributes): + if not self.in_data: + raise ParseError, "Unexpected start tag: " + tag + else: + self.data = self.data + "<" + tag + for (key,val) in attributes.items(): + self.data = self.data + ' %s="%s"' % (key,val) + self.data = self.data + ">" + + def unknown_endtag(self,tag): + if not self.in_data: + raise ParseError, "Unexpected end tag: " + tag + else: + self.data = self.data + "</%s>" % tag + + def syntax_error(self, err): + if re.match("reference to unknown entity", err): + pass + else: + xmllib.XMLParser.syntax_error (self, err) + + def unknown_entityref(self,ref): + if not self.in_data: + raise ParseError, "Unknown entity &" + ref + ";" + else: + self.data = self.data + "&" + ref + ";" + +file = open(sys.argv[1]) +parser = TodoParser() + +lineno = 1 +while 1: + line = file.readline() + if line == "": + break + + try: + parser.feed(line) + except ParseError, err: + sys.stderr.write("Parse error at line " + `lineno` + ": " + err.__str__() + "\n") + sys.exit(1) + except RuntimeError, err: + sys.stderr.write(err.__str__() + "\n") + sys.exit(1) + + lineno = lineno + 1 + +parser.close() + +print '''<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> +<html> +<head> +<title>GTK+ TODO List + + + + + + + + + +
+

GTK+ TODO List

''' + + +for section in parser.sections: + ntasks = len(section.entries) + id = make_id (section.title) + if ntasks == 1: + print '%s (1 item)
' % (id,section.title) + else: + print '%s (%d items)
' % (id,section.title,ntasks) + +print ''' +
+ GTK+ Logo +
+''' + +first = 1 +for section in parser.sections: + if not first: + print "

" + first = 0 + section.output() + +print ''' +''' + +