# HG changeset patch # User Sadrul Habib Chowdhury # Date 1209184451 0 # Node ID 35621ae24544894e4a96e894130a02e2626d0825 # Parent 116a1483d554fe0e4355ea3cd576af774a902bf4 pygnt's home has been http://repo.or.cz/w/python-gnt.git for a while. Remove the old cruft from here. diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/Makefile.am --- a/finch/libgnt/Makefile.am Sat Apr 26 00:46:20 2008 +0000 +++ b/finch/libgnt/Makefile.am Sat Apr 26 04:34:11 2008 +0000 @@ -1,4 +1,4 @@ -EXTRA_DIST=genmarshal pygnt +EXTRA_DIST=genmarshal SUBDIRS = . wms pkgconfigdir = $(libdir)/pkgconfig diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/Files.txt --- a/finch/libgnt/pygnt/Files.txt Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -gendef.sh -gnt.override -Makefile -test.py -dbus-gnt -gntmodule.c diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/Makefile.am --- a/finch/libgnt/pygnt/Makefile.am Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -EXTRA_DIST = gendef.sh - -pg_LTLIBRARIES = gnt.la - -pgdir = $(libdir) - -sources = \ - gnt.def \ - gnt.override \ - gntbox.override \ - gntfilesel.override \ - gnttree.override \ - gntwidget.override - -gnt_la_SOURCES = gnt.c common.c common.h gntmodule.c - -gnt_la_LDFLAGS = -module -avoid-version \ - `pkg-config --libs pygobject-2.0` - -gnt_la_LIBADD = \ - $(GLIB_LIBS) \ - ../libgnt.la - -AM_CPPFLAGS = \ - -I../ \ - $(GLIB_CFLAGS) \ - $(GNT_CFLAGS) \ - -I/usr/include/python2.4 \ - `pkg-config --cflags pygobject-2.0` - -CLEANFILES = gnt.def gnt.c gnt.defe - -gnt.def: $(srcdir)/../*.h - $(srcdir)/gendef.sh - -gnt.c: $(sources) - pygtk-codegen-2.0 --prefix gnt \ - --override gnt.override \ - gnt.def > $@ - diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/Makefile.make --- a/finch/libgnt/pygnt/Makefile.make Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -CC = gcc -CFLAGS = `pkg-config --cflags gtk+-2.0 pygtk-2.0` -I/usr/include/python2.4/ -I.. -g -O0 -LDFLAGS = `pkg-config --libs gtk+-2.0 pygtk-2.0 gnt` - -gnt.so: gnt.o gntmodule.o common.o - $(CC) $(LDFLAGS) -shared $^ -o $@ - -gnt.c: gnt.def *.override common.c common.h - pygtk-codegen-2.0 --prefix gnt \ - --override gnt.override \ - gnt.def > $@ - -#python codegen/codegen.py --prefix gnt \ - -clean: - @rm *.so *.o gnt.c diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/README.txt --- a/finch/libgnt/pygnt/README.txt Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -Run these in sequence: - -./gendef.sh -make -f Makefile.make gnt.so diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/common.c --- a/finch/libgnt/pygnt/common.c Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -#include "common.h" - -PyObject * -create_pyobject_from_string_list(GList *list) -{ - PyObject *py_list; - if (list == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - if ((py_list = PyList_New(0)) == NULL) { - g_list_foreach(list, (GFunc)g_free, NULL); - g_list_free(list); - return NULL; - } - while (list) { - PyObject *obj = PyString_FromString(list->data); - PyList_Append(py_list, obj); - Py_DECREF(obj); - g_free(list->data); - list = g_list_delete_link(list, list); - } - return py_list; -} diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/common.h --- a/finch/libgnt/pygnt/common.h Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -#include "Python.h" -#include "gnt.h" - -PyObject *create_pyobject_from_string_list(GList *list); - diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/dbus-gnt --- a/finch/libgnt/pygnt/dbus-gnt Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,154 +0,0 @@ -#!/usr/bin/env python - -# This script requires Python 2.4 and pygnt bindings -# -# Note that all function names are resolved dynamically, no -# purple-specific library is needed. - -import dbus -import dbus.glib -import dbus.decorators -import gobject -import os -import gnt -import sys - -import time - -convwins = {} - -def buddysignedon(buddy): - pass - -def conv_closed(conv): - key = get_dict_key(conv) - stuff = convwins[key] - stuff[0].destroy() - # if a conv window is closed, then reopened, this thing crashes - convwins[key] = None - -def add_message(conv, who, msg, flags, timestamp): - stuff = show_conversation(conv, False) - tv = stuff[1] - tv.append_text_with_flags("\n", 0) - if timestamp: - tv.append_text_with_flags(time.strftime("(%X) ", time.localtime(timestamp)), 8) - else: - tv.append_text_with_flags(time.strftime("(%X) "), 8) - if flags & 3: - tv.append_text_with_flags(who + ": ", 1) - msg = purple.PurpleMarkupStripHtml(msg) - tv.append_text_with_flags(msg, 0) - stuff[0].set_urgent() - else: - tv.append_text_with_flags(msg, 8) - tv.scroll(0) - -def wrote_msg(account, who, msg, conv, flags): - add_message(conv, who, msg, flags, None) - -bus = dbus.SessionBus() -obj = bus.get_object("im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject") -purple = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface") - -bus.add_signal_receiver(buddysignedon, - dbus_interface = "im.pidgin.purple.PurpleInterface", - signal_name = "BuddySignedOn") - -bus.add_signal_receiver(wrote_msg, - dbus_interface = "im.pidgin.purple.PurpleInterface", - signal_name = "WroteImMsg") - -bus.add_signal_receiver(wrote_msg, - dbus_interface = "im.pidgin.purple.PurpleInterface", - signal_name = "WroteChatMsg") - -bus.add_signal_receiver(conv_closed, - dbus_interface = "im.pidgin.purple.PurpleInterface", - signal_name = "DeletingConversation") - -def get_dict_key(conv): - val = purple.PurpleConversationGetName(conv) - return val - -def send_im_cb(entry, key, conv): - if key[0] == '\r': - # XXX: do something about the / commands - type = purple.PurpleConversationGetType(conv) - if type == 1: - imdata = purple.PurpleConversationGetImData(conv) - purple.PurpleConvImSend(imdata, entry.get_text()) - else: - chatdata = purple.PurpleConversationGetChatData(conv) - purple.PurpleConvChatSend(chatdata, entry.get_text()) - entry.clear() - -def conv_window_destroyed(win, key): - del convwins[key] - -def show_conversation(conv, history): - key = get_dict_key(conv) - if key in convwins: - return convwins[key] - win = gnt.Window() - vbox = gnt.Box(0, 1) - win.add_widget(vbox) - win.set_title(purple.PurpleConversationGetName(conv)) - win.set_pad(0) - vbox.set_pad(0) - tv = gnt.TextView() - entry = gnt.Entry("") - vbox.add_widget(tv) - entry.set_size(40, 1) - vbox.add_widget(entry) - entry.connect("key_pressed", send_im_cb, conv) - tv.clear() - tv.attach_scroll_widget(entry) - win.show() - convwins[key] = [win, tv, entry] - win.connect("destroy", conv_window_destroyed, key) - - if history: - msgs = purple.PurpleConversationGetMessageHistory(conv) - msgs.reverse() - for msg in msgs: - who = purple.PurpleConversationMessageGetSender(msg) - what = purple.PurpleConversationMessageGetMessage(msg) - flags = purple.PurpleConversationMessageGetFlags(msg) - when = purple.PurpleConversationMessageGetTimestamp(msg) - add_message(conv, who, what, flags, when) - - return convwins[key] - -def show_buddylist(): - win = gnt.Window() - tree = gnt.Tree() - tree.set_property("columns", 1) - win.add_widget(tree) - node = purple.PurpleBlistGetRoot() - while node: - if purple.PurpleBlistNodeIsGroup(node): - sys.stderr.write(str(node) + "\n") - tree.add_row_after(str(node), ["asd", ""], None, None) - #tree.add_row_after(node, [str(purple.PurpleGroupGetName(node)), ""], None, None) - #tree.add_row_after(node, ["aasd", ""], None, None) - elif purple.PurpleBlistNodeIsContact(node): - buddy = purple.PurpleContactGetPriorityBuddy(node) - group = purple.PurpleBuddyGetGroup(buddy) - #tree.add_row_after(node, [str(purple.PurpleBuddyGetName(buddy)), ""], group, None) - - node = purple.PurpleBlistNodeNext(node, False) - win.show() - -gnt.gnt_init() - -# show_buddylist() - -convs = purple.PurpleGetConversations() -for conv in convs: - show_conversation(conv, True) - -gnt.gnt_main() - -gnt.gnt_quit() - diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/example/rss/gnthtml.py --- a/finch/libgnt/pygnt/example/rss/gnthtml.py Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -#!/usr/bin/env python - -""" -gr - An RSS-reader built using libgnt and feedparser. - -Copyright (C) 2007 Sadrul Habib Chowdhury - -This application 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.1 of the License, or (at your option) any later version. - -This application 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this application; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 -USA -""" - -""" -This file defines GParser, which is a simple HTML parser to display HTML -in a GntTextView nicely. -""" - -import sgmllib -import gnt - -class GParser(sgmllib.SGMLParser): - def __init__(self, view): - sgmllib.SGMLParser.__init__(self, False) - self.link = None - self.view = view - self.flag = gnt.TEXT_FLAG_NORMAL - - def parse(self, s): - self.feed(s) - self.close() - - def unknown_starttag(self, tag, attrs): - if tag in ["b", "i", "blockquote", "strong"]: - self.flag = self.flag | gnt.TEXT_FLAG_BOLD - elif tag in ["p", "hr", "br"]: - self.view.append_text_with_flags("\n", self.flag) - else: - print tag - - def unknown_endtag(self, tag): - if tag in ["b", "i", "blockquote", "strong"]: - self.flag = self.flag & ~gnt.TEXT_FLAG_BOLD - elif tag in ["p", "hr", "br"]: - self.view.append_text_with_flags("\n", self.flag) - else: - print tag - - def start_u(self, attrs): - self.flag = self.flag | gnt.TEXT_FLAG_UNDERLINE - - def end_u(self): - self.flag = self.flag & ~gnt.TEXT_FLAG_UNDERLINE - - def start_a(self, attributes): - for name, value in attributes: - if name == "href": - self.link = value - - def do_img(self, attrs): - for name, value in attrs: - if name == 'src': - self.view.append_text_with_flags("[img:" + value + "]", self.flag) - - def end_a(self): - if not self.link: - return - self.view.append_text_with_flags(" (", self.flag) - self.view.append_text_with_flags(self.link, self.flag | gnt.TEXT_FLAG_UNDERLINE) - self.view.append_text_with_flags(")", self.flag) - self.link = None - - def handle_data(self, data): - if len(data.strip()) == 0: - return - self.view.append_text_with_flags(data, self.flag) - diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/example/rss/gntrss-ui.py --- a/finch/libgnt/pygnt/example/rss/gntrss-ui.py Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,400 +0,0 @@ -#!/usr/bin/env python - -""" -gr - An RSS-reader built using libgnt and feedparser. - -Copyright (C) 2007 Sadrul Habib Chowdhury - -This application 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.1 of the License, or (at your option) any later version. - -This application 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this application; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 -USA -""" - -""" -This file deals with the UI part (gnt) of the application - -TODO: - - Allow showing feeds of only selected 'category' and/or 'priority'. A different - window should be used to change such filtering. - - Display details of each item in its own window. - - Add search capability, and allow searching only in title/body. Also allow - filtering in the search results. - - Show the data and time for feed items (probably in a separate column .. perhaps not) - - Have a simple way to add a feed. - - Allow renaming a feed. -""" - -import gntrss -import gnthtml -import gnt -import gobject -import sys - -__version__ = "0.0.1alpha" -__author__ = "Sadrul Habib Chowdhury (sadrul@pidgin.im)" -__copyright__ = "Copyright 2007, Sadrul Habib Chowdhury" -__license__ = "GPL" # see full license statement above - -gnt.gnt_init() - -class RssTree(gnt.Tree): - __gsignals__ = { - 'active_changed' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_OBJECT,)) - } - - __gntbindings__ = { - 'jump-next-unread' : ('jump_next_unread', 'n') - } - - def jump_next_unread(self, null): - first = None - next = None - all = self.get_rows() - for item in all: - if item.unread: - if next: - first = item - break - elif not first and self.active != item: - first = item - if self.active == item: - next = item - if first: - self.set_active(first) - self.set_selected(first) - return True - - def __init__(self): - self.active = None - gnt.Tree.__init__(self) - gnt.set_flag(self, 8) # remove borders - self.connect('key_pressed', self.do_key_pressed) - - def set_active(self, active): - if self.active == active: - return - if self.active: - flag = gnt.TEXT_FLAG_NORMAL - if self.active.unread: - flag = flag | gnt.TEXT_FLAG_BOLD - self.set_row_flags(self.active, flag) - old = self.active - self.active = active - flag = gnt.TEXT_FLAG_UNDERLINE - if self.active.unread: - flag = flag | gnt.TEXT_FLAG_BOLD - self.set_row_flags(self.active, flag) - self.emit('active_changed', old) - - def do_key_pressed(self, null, text): - if text == '\r': - now = self.get_selection_data() - self.set_active(now) - return True - return False - -gobject.type_register(RssTree) -gnt.register_bindings(RssTree) - -win = gnt.Box(homo = False, vert = True) -win.set_toplevel(True) -win.set_title("GntRss") -win.set_pad(0) - -# -# [[[ Generic feed/item callbacks -# -def feed_item_added(feed, item): - add_feed_item(item) - -def add_feed(feed): - if not feed.get_data('gntrss-connected'): - feed.connect('added', feed_item_added) - feed.connect('notify', update_feed_title) - feed.set_data('gntrss-connected', True) - feeds.add_row_after(feed, [feed.title, str(feed.unread)], None, None) - -def remove_item(item, feed): - items.remove(item) - -def update_feed_item(item, property): - if property.name == 'unread': - if feeds.active == item.parent: - flag = 0 - if item == items.active: - flag = gnt.TEXT_FLAG_UNDERLINE - if item.unread: - flag = flag | gnt.TEXT_FLAG_BOLD - else: - flag = flag | gnt.TEXT_FLAG_NORMAL - items.set_row_flags(item, flag) - - unread = item.parent.unread - if item.unread: - unread = unread + 1 - else: - unread = unread - 1 - item.parent.set_property('unread', unread) - -def add_feed_item(item): - currentfeed = feeds.active - if item.parent != currentfeed: - return - months = ["", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] - dt = str(item.date_parsed[2]) + "." + months[item.date_parsed[1]] + "." + str(item.date_parsed[0]) - items.add_row_after(item, [str(item.title), dt], None, None) - if item.unread: - items.set_row_flags(item, gnt.TEXT_FLAG_BOLD) - if not item.get_data('gntrss-connected'): - item.set_data('gntrss-connected', True) - # this needs to happen *without* having to add the item in the tree - item.connect('notify', update_feed_item) - item.connect('delete', remove_item) - -# -# ]]] Generic feed/item callbacks -# - - -#### -# [[[ The list of feeds -### - -# 'Add Feed' dialog -add_feed_win = None -def add_feed_win_closed(win): - global add_feed_win - add_feed_win = None - -def add_new_feed(): - global add_feed_win - - if add_feed_win: - gnt.gnt_window_present(add_feed_win) - return - win = gnt.Window() - win.set_title("New Feed") - - box = gnt.Box(False, False) - label = gnt.Label("Link") - box.add_widget(label) - entry = gnt.Entry("") - entry.set_size(40, 1) - box.add_widget(entry) - - win.add_widget(box) - win.show() - add_feed_win = win - add_feed_win.connect("destroy", add_feed_win_closed) - -# -# The active row in the feed-list has changed. Update the feed-item table. -def feed_active_changed(tree, old): - items.remove_all() - if not tree.active: - return - update_items_title() - for item in tree.active.items: - add_feed_item(item) - win.give_focus_to_child(items) - -# -# Check for the action keys and decide how to deal with them. -def feed_key_pressed(tree, text): - if tree.is_searching(): - return - if text == 'r': - feed = tree.get_selection_data() - tree.perform_action_key('j') - #tree.perform_action('move-down') - feed.refresh() - elif text == 'R': - feeds = tree.get_rows() - for feed in feeds: - feed.refresh() - elif text == 'm': - feed = tree.get_selection_data() - if feed: - feed.mark_read() - feed.set_property('unread', 0) - elif text == 'a': - add_new_feed() - else: - return False - return True - -feeds = RssTree() -feeds.set_property('columns', 2) -feeds.set_col_width(0, 20) -feeds.set_col_width(1, 6) -feeds.set_column_resizable(0, False) -feeds.set_column_resizable(1, False) -feeds.set_column_is_right_aligned(1, True) -feeds.set_show_separator(False) -feeds.set_column_title(0, "Feeds") -feeds.set_show_title(True) - -feeds.connect('active_changed', feed_active_changed) -feeds.connect('key_pressed', feed_key_pressed) -gnt.unset_flag(feeds, 256) # Fix the width - -#### -# ]]] The list of feeds -### - -#### -# [[[ The list of items in the feed -#### - -# -# The active item in the feed-item list has changed. Update the -# summary content. -def item_active_changed(tree, old): - details.clear() - if not tree.active: - return - item = tree.active - details.append_text_with_flags(str(item.title) + "\n", gnt.TEXT_FLAG_BOLD) - details.append_text_with_flags("Link: ", gnt.TEXT_FLAG_BOLD) - details.append_text_with_flags(str(item.link) + "\n", gnt.TEXT_FLAG_UNDERLINE) - details.append_text_with_flags("Date: ", gnt.TEXT_FLAG_BOLD) - details.append_text_with_flags(str(item.date) + "\n", gnt.TEXT_FLAG_NORMAL) - details.append_text_with_flags("\n", gnt.TEXT_FLAG_NORMAL) - parser = gnthtml.GParser(details) - parser.parse(str(item.summary)) - item.mark_unread(False) - - if old and old.unread: # If the last selected item is marked 'unread', then make sure it's bold - items.set_row_flags(old, gnt.TEXT_FLAG_BOLD) - -# -# Look for action keys in the feed-item list. -def item_key_pressed(tree, text): - if tree.is_searching(): - return - current = tree.get_selection_data() - if text == 'M': # Mark all of the items 'read' - feed = feeds.active - if feed: - feed.mark_read() - elif text == 'm': # Mark the current item 'read' - current.mark_unread(False) - tree.perform_action_key('j') - elif text == 'U': # Mark the current item 'unread' - current.mark_unread(True) - elif text == 'd': - current.remove() - tree.perform_action_key('j') - else: - return False - return True - -items = RssTree() -items.set_property('columns', 2) -items.set_col_width(0, 40) -items.set_col_width(1, 11) -items.set_column_resizable(1, False) -items.set_column_title(0, "Items") -items.set_column_title(1, "Date") -items.set_show_title(True) -items.connect('key_pressed', item_key_pressed) -items.connect('active_changed', item_active_changed) - -#### -# ]]] The list of items in the feed -#### - -# -# Update the title of the items list depending on the selection in the feed list -def update_items_title(): - feed = feeds.active - if feed: - items.set_column_title(0, str(feed.title) + ": " + str(feed.unread) + "(" + str(len(feed.items)) + ")") - else: - items.set_column_title(0, "Items") - items.draw() - -# The container on the top -line = gnt.Line(vertical = False) - -# The textview to show the details of a feed -details = gnt.TextView() -details.set_take_focus(True) -details.set_flag(gnt.TEXT_VIEW_TOP_ALIGN) -details.attach_scroll_widget(details) - -# Make it look nice -s = feeds.get_size() -size = gnt.screen_size() -size[0] = size[0] - s[0] -items.set_size(size[0], size[1] / 2) -details.set_size(size[0], size[1] / 2) - -# Category tree -cat = gnt.Tree() -cat.set_property('columns', 1) -cat.set_column_title(0, 'Category') -cat.set_show_title(True) -gnt.set_flag(cat, 8) # remove borders - -box = gnt.Box(homo = False, vert = False) -box.set_pad(0) - -vbox = gnt.Box(homo = False, vert = True) -vbox.set_pad(0) -vbox.add_widget(feeds) -vbox.add_widget(gnt.Line(False)) -vbox.add_widget(cat) -box.add_widget(vbox) - -box.add_widget(gnt.Line(True)) - -vbox = gnt.Box(homo = False, vert = True) -vbox.set_pad(0) -vbox.add_widget(items) -vbox.add_widget(gnt.Line(False)) -vbox.add_widget(details) -box.add_widget(vbox) - -win.add_widget(box) -win.show() - -def update_feed_title(feed, property): - if property.name == 'title': - if feed.customtitle: - title = feed.customtitle - else: - title = feed.title - feeds.change_text(feed, 0, title) - elif property.name == 'unread': - feeds.change_text(feed, 1, str(feed.unread) + "(" + str(len(feed.items)) + ")") - flag = 0 - if feeds.active == feed: - flag = gnt.TEXT_FLAG_UNDERLINE - update_items_title() - if feed.unread > 0: - flag = flag | gnt.TEXT_FLAG_BOLD - feeds.set_row_flags(feed, flag) - -# populate everything -for feed in gntrss.feeds: - feed.refresh() - feed.set_auto_refresh(True) - add_feed(feed) - -gnt.gnt_register_action("Stuff", add_new_feed) -gnt.gnt_main() - -gnt.gnt_quit() - diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/example/rss/gntrss.py --- a/finch/libgnt/pygnt/example/rss/gntrss.py Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,256 +0,0 @@ -#!/usr/bin/env python - -""" -gr - An RSS-reader built using libgnt and feedparser. - -Copyright (C) 2007 Sadrul Habib Chowdhury - -This application 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.1 of the License, or (at your option) any later version. - -This application 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 -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this application; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 -USA -""" - -""" -This file deals with the rss parsing part (feedparser) of the application -""" - -import os -import tempfile, urllib2 -import feedparser -import gobject -import sys -import time - -## -# The FeedItem class. It will update emit 'delete' signal when it's -# destroyed. -## -class FeedItem(gobject.GObject): - __gproperties__ = { - 'unread' : (gobject.TYPE_BOOLEAN, 'read', - 'The unread state of the item.', - False, gobject.PARAM_READWRITE) - } - __gsignals__ = { - 'delete' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_OBJECT,)) - } - def __init__(self, item, parent): - self.__gobject_init__() - try: - "Apparently some feed items don't have any dates in them" - self.date = item['date'] - self.date_parsed = item['date_parsed'] - except: - item['date'] = self.date = time.ctime() - self.date_parsed = feedparser._parse_date(self.date) - - self.title = item['title'].encode('utf8') - self.summary = item['summary'].encode('utf8') - self.link = item['link'] - self.parent = parent - self.unread = True - - def __del__(self): - pass - - def remove(self): - self.emit('delete', self.parent) - if self.unread: - self.parent.set_property('unread', self.parent.unread - 1) - - def do_set_property(self, property, value): - if property.name == 'unread': - self.unread = value - - def mark_unread(self, unread): - if self.unread == unread: - return - self.set_property('unread', unread) - -gobject.type_register(FeedItem) - -def item_hash(item): - return str(item['title']) - -""" -The Feed class. It will update the 'link', 'title', 'desc' and 'items' -attributes if/when they are updated (triggering 'notify::' signal) - -TODO: - - Add a 'count' attribute - - Each feed will have a 'uidata', which will be its display window - - Look into 'category'. Is it something that feed defines, or the user? - - Have separate refresh times for each feed. - - Have 'priority' for each feed. (somewhat like category, perhaps?) -""" -class Feed(gobject.GObject): - __gproperties__ = { - 'link' : (gobject.TYPE_STRING, 'link', - 'The web page this feed is associated with.', - '...', gobject.PARAM_READWRITE), - 'title' : (gobject.TYPE_STRING, 'title', - 'The title of the feed.', - '...', gobject.PARAM_READWRITE), - 'desc' : (gobject.TYPE_STRING, 'description', - 'The description for the feed.', - '...', gobject.PARAM_READWRITE), - 'items' : (gobject.TYPE_POINTER, 'items', - 'The items in the feed.', gobject.PARAM_READWRITE), - 'unread' : (gobject.TYPE_INT, 'unread', - 'Number of unread items in the feed.', 0, 10000, 0, gobject.PARAM_READWRITE) - } - __gsignals__ = { - 'added' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_OBJECT,)) - } - - def __init__(self, feed): - self.__gobject_init__() - url = feed['link'] - name = feed['name'] - self.url = url # The url of the feed itself - self.link = url # The web page associated with the feed - self.desc = url - self.title = (name, url)[not name] - self.customtitle = name - self.unread = 0 - self.items = [] - self.hash = {} - self.pending = False - self._refresh = {'time' : 30, 'id' : 0} - - def __del__(self): - pass - - def do_set_property(self, property, value): - if property.name == 'link': - self.link = value - elif property.name == 'desc': - self.desc = value - elif property.name == 'title': - self.title = value - elif property.name == 'unread': - self.unread = value - pass - - def set_result(self, result): - # XXX Look at result['bozo'] first, and emit some signal that the UI can use - # to indicate (dim the row?) that the feed has invalid XML format or something - - try: - channel = result['channel'] - self.set_property('link', channel['link']) - self.set_property('desc', channel['description']) - self.set_property('title', channel['title']) - items = result['items'] - except: - items = () - - tmp = {} - for item in self.items: - tmp[hash(item)] = item - - unread = self.unread - for item in items: - try: - exist = self.hash[item_hash(item)] - del tmp[hash(exist)] - except: - itm = FeedItem(item, self) - self.items.append(itm) - self.emit('added', itm) - self.hash[item_hash(item)] = itm - unread = unread + 1 - - if unread != self.unread: - self.set_property('unread', unread) - - for hv in tmp: - self.items.remove(tmp[hv]) - tmp[hv].remove() - "Also notify the UI about the count change" - - self.pending = False - return False - - def refresh(self): - if self.pending: - return - self.pending = True - FeedReader(self).run() - return True - - def mark_read(self): - for item in self.items: - item.mark_unread(False) - - def set_auto_refresh(self, auto): - if auto: - if self._refresh['id']: - return - if self._refresh['time'] < 1: - self._refresh['time'] = 1 - self.id = gobject.timeout_add(self._refresh['time'] * 1000 * 60, self.refresh) - else: - if not self._refresh['id']: - return - gobject.source_remove(self._refresh['id']) - self._refresh['id'] = 0 - -gobject.type_register(Feed) - -""" -The FeedReader updates a Feed. It fork()s off a child to avoid blocking. -""" -class FeedReader: - def __init__(self, feed): - self.feed = feed - - def reap_child(self, pid, status): - result = feedparser.parse(self.tmpfile.name) - self.tmpfile.close() - self.feed.set_result(result) - - def run(self): - self.tmpfile = tempfile.NamedTemporaryFile() - self.pid = os.fork() - if self.pid == 0: - tmp = urllib2.urlopen(self.feed.url) - content = tmp.read() - tmp.close() - self.tmpfile.write(content) - self.tmpfile.flush() - # Do NOT close tmpfile here - os._exit(os.EX_OK) - gobject.child_watch_add(self.pid, self.reap_child) - -feeds = [] -urls = ( - {'name': '/.', - 'link': "http://rss.slashdot.org/Slashdot/slashdot"}, - {'name': 'KernelTrap', - 'link': "http://kerneltrap.org/node/feed"}, - {'name': None, - 'link': "http://pidgin.im/rss.php"}, - {'name': "F1", - 'link': "http://www.formula1.com/rss/news/latest.rss"}, - {'name': "Freshmeat", - 'link': "http://www.pheedo.com/f/freshmeatnet_announcements_unix"}, - {'name': "Cricinfo", - 'link': "http://www.cricinfo.com/rss/livescores.xml"} -) - -for url in urls: - feed = Feed(url) - feeds.append(feed) - diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/file.py --- a/finch/libgnt/pygnt/file.py Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -#!/usr/bin/env python - -import gnt, sys - -def file_selected(widget, path, file, null): - sys.stderr.write(path + " " + file) - list = widget.get_selected_multi_files() - for i in list: - sys.stderr.write(i) - -gnt.gnt_init() - -win = gnt.Window() - -files = gnt.FileSel() -files.set_multi_select(True) -files.set_title("Files") -files.connect("file_selected", file_selected, None) - -files.show() - -gnt.gnt_main() - -gnt.gnt_quit() diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/gendef.sh --- a/finch/libgnt/pygnt/gendef.sh Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -#!/bin/sh -FILES=" - gntwidget.h - gntbindable.h - gntbox.h - gntbutton.h - gntcheckbox.h - gntclipboard.h - gntcolors.h - gntcombobox.h - gntentry.h - gntfilesel.h - gntkeys.h - gntlabel.h - gntline.h - gntmarshal.h - gntmenu.h - gntmenuitem.h - gntmenuitemcheck.h - gntslider.h - gntstyle.h - gnttextview.h - gnttree.h - gntutils.h - gntwindow.h - gntwm.h - gntws.h - gnt.h" - -# Generate the def file -rm -f gnt.def -for file in $FILES -do - echo -n "Generating definitions for ${file} ... " - python /usr/share/pygtk/2.0/codegen/h2def.py ../$file >> gnt.def - echo "Done" -done - -# Remove the definitions about the enums -ENUMS=" -GNT_TYPE_ALIGNMENT -GNT_TYPE_COLOR_TYPE -GNT_TYPE_MENU_TYPE -GNT_TYPE_STYLE -GNT_TYPE_KEY_PRESS_MODE -GNT_TYPE_ENTRY_FLAG -GNT_TYPE_TEXT_FORMAT_FLAGS -GNT_TYPE_TEXT_VIEW_FLAG -" - -for enum in $ENUMS -do - sed -ie s/^.*gtype-id\ \"$enum\".*$//g gnt.def -done - - diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/gnt.override --- a/finch/libgnt/pygnt/gnt.override Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,194 +0,0 @@ -%% -headers -#include -#include "pygobject.h" -#include "gnt.h" -#include "gntbindable.h" -#include "gntwidget.h" -#include "gntbox.h" -#include "gntbutton.h" -#include "gntcheckbox.h" -#include "gntcolors.h" -#include "gntcombobox.h" -#include "gntentry.h" -#include "gntfilesel.h" -#include "gntkeys.h" -#include "gntlabel.h" -#include "gntline.h" -#include "gntmenu.h" -#include "gntmenuitem.h" -#include "gntmenuitemcheck.h" -#include "gntslider.h" -#include "gntstyle.h" -#include "gnttextview.h" -#include "gnttree.h" -#include "gntutils.h" -#include "gntwindow.h" -#include "gntwm.h" -#include "gntws.h" -#include "common.h" -%% -include - gntbox.override - gntfilesel.override - gnttree.override - gntwidget.override -%% -modulename gnt -%% -import gobject.GObject as PyGObject_Type -%% -ignore-glob - *_get_gtype -%% -define set_flag -static PyObject * -_wrap_set_flag(PyGObject *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = {"flags", NULL}; - PyGObject *widget; - int flags; - - if (!PyArg_ParseTuple(args, "O!i:gnt.set_flag", &PyGntWidget_Type, &widget, - &flags)) { - return NULL; - } - - GNT_WIDGET_SET_FLAGS(widget->obj, flags); - - Py_INCREF(Py_None); - return Py_None; -} -%% -define unset_flag -static PyObject * -_wrap_unset_flag(PyGObject *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = {"flags", NULL}; - PyGObject *widget; - int flags; - - if (!PyArg_ParseTuple(args, "O!i:gnt.unset_flag", &PyGntWidget_Type, &widget, - &flags)) { - return NULL; - } - - GNT_WIDGET_UNSET_FLAGS(widget->obj, flags); - - Py_INCREF(Py_None); - return Py_None; -} -%% -define screen_size noargs -static PyObject * -_wrap_screen_size(PyObject *self) -{ - PyObject *list = PyList_New(0); - - if (list == NULL) - return NULL; - - PyList_Append(list, PyInt_FromLong((long)getmaxx(stdscr))); - PyList_Append(list, PyInt_FromLong((long)getmaxy(stdscr))); - - return list; -} -%% -override gnt_register_action -static GHashTable *actions; - - - -static PyObject * -_wrap_gnt_register_action(PyGObject *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = {"name", "callback", NULL}; - PyGObject *callback; - GClosure *closure; - char *name; - - if (!PyArg_ParseTuple(args, "sO:gnt.gnt_register_action", &name, &callback)) { - return NULL; - } - - if (!PyCallable_Check(callback)) { - PyErr_SetString(PyExc_TypeError, "the callback must be callable ... doh!"); - return NULL; - } - - gnt_register_action(name, callback->obj); - - Py_INCREF(Py_None); - return Py_None; -} -%% -define register_bindings - -static gboolean -pygnt_binding_callback(GntBindable *bindable, GList *list) -{ - PyObject *wrapper = pygobject_new(G_OBJECT(bindable)); - PyObject_CallMethod(wrapper, list->data, "O", Py_None); - Py_DECREF(wrapper); - return TRUE; -} - -static PyObject * -_wrap_register_bindings(PyObject *self, PyObject *args) -{ - PyTypeObject *class; - int pos = 0; - PyObject *key, *value, *gbindings; - GntBindableClass *bindable; - - if (!PyArg_ParseTuple(args, "O!:gnt.register_bindings", - &PyType_Type, &class)) { - /* Make sure it's a GntBindableClass subclass */ - PyErr_SetString(PyExc_TypeError, - "argument must be a GntBindable subclass"); - return NULL; - } - - gbindings = PyDict_GetItemString(class->tp_dict, "__gntbindings__"); - if (!gbindings) - goto end; - - if (!PyDict_Check(gbindings)) { - PyErr_SetString(PyExc_TypeError, - "__gntbindings__ attribute not a dict!"); - return NULL; - } - - bindable = g_type_class_ref(pyg_type_from_object((PyObject *)class)); - while (PyDict_Next(gbindings, &pos, &key, &value)) { - const char *trigger, *callback, *name; - GList *list = NULL; - - if (!PyString_Check(key)) { - PyErr_SetString(PyExc_TypeError, - "__gntbindings__ keys must be strings"); - g_type_class_unref(bindable); - return NULL; - } - name = PyString_AsString(key); - - if (!PyTuple_Check(value) || - !PyArg_ParseTuple(value, "ss", &callback, &trigger)) { - PyErr_SetString(PyExc_TypeError, - "__gntbindings__ values must be (callback, trigger) tupples"); - g_type_class_unref(bindable); - return NULL; - } - - gnt_bindable_class_register_action(bindable, name, pygnt_binding_callback, - trigger, g_strdup(callback), NULL); - } - if (gbindings) - PyDict_DelItemString(class->tp_dict, "__gntbindings__"); - g_type_class_unref(bindable); - -end: - Py_INCREF(Py_None); - return Py_None; -} - diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/gntbox.override --- a/finch/libgnt/pygnt/gntbox.override Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -/** - * pygnt- Python bindings for the GNT toolkit. - * Copyright (C) 2007 Sadrul Habib Chowdhury - * - * gntbox.override: overrides for the box widget. - * - * This library 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.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 - * USA - */ -%% -override gnt_box_add_widget kwargs -static PyObject * -_wrap_gnt_box_add_widget(PyGObject *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = { "widget", NULL }; - PyGObject *widget; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!:GntBox.add_widget", kwlist, &PyGntWidget_Type, &widget)) - return NULL; - - gnt_box_add_widget(GNT_BOX(self->obj), GNT_WIDGET(widget->obj)); - Py_INCREF(widget); - - Py_INCREF(Py_None); - return Py_None; -} diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/gntfilesel.override --- a/finch/libgnt/pygnt/gntfilesel.override Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -/** - * pygnt- Python bindings for the GNT toolkit. - * Copyright (C) 2007 Sadrul Habib Chowdhury - * - * gntfilesel.override: overrides for the file selector. - * - * This library 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.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 - * USA - */ -%% -headrs -#include "common.h" -%% -override gnt_file_sel_get_selected_multi_files noargs -static PyObject * -_wrap_gnt_file_sel_get_selected_multi_files(PyGObject *self) -{ - GList *list = gnt_file_sel_get_selected_multi_files(GNT_FILE_SEL(self->obj)); - return create_pyobject_from_string_list(list); -} - diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/gntmodule.c --- a/finch/libgnt/pygnt/gntmodule.c Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,93 +0,0 @@ -#include -#include "gnt.h" - -void gnt_register_classes (PyObject *d); -extern PyMethodDef gnt_functions[]; - -static void -gnt_add_string_constants(PyObject *module) -{ -#define define_key(x) if (GNT_KEY_##x && *(GNT_KEY_##x)) PyModule_AddStringConstant(module, "KEY_" #x, GNT_KEY_##x) - - define_key(POPUP); - - define_key(LEFT); - define_key(RIGHT); - define_key(UP); - define_key(DOWN); - - define_key(CTRL_UP); - define_key(CTRL_DOWN); - define_key(CTRL_RIGHT); - define_key(CTRL_LEFT); - - define_key(PGUP); - define_key(PGDOWN); - define_key(HOME); - define_key(END); - - define_key(ENTER); - - define_key(BACKSPACE); - define_key(DEL); - define_key(INS); - define_key(BACK_TAB); - - define_key(CTRL_A); - define_key(CTRL_B); - define_key(CTRL_D); - define_key(CTRL_E); - define_key(CTRL_F); - define_key(CTRL_G); - define_key(CTRL_H); - define_key(CTRL_I); - define_key(CTRL_J); - define_key(CTRL_K); - define_key(CTRL_L); - define_key(CTRL_M); - define_key(CTRL_N); - define_key(CTRL_O); - define_key(CTRL_P); - define_key(CTRL_R); - define_key(CTRL_T); - define_key(CTRL_U); - define_key(CTRL_V); - define_key(CTRL_W); - define_key(CTRL_X); - define_key(CTRL_Y); - - define_key(F1); - define_key(F2); - define_key(F3); - define_key(F4); - define_key(F5); - define_key(F6); - define_key(F7); - define_key(F8); - define_key(F9); - define_key(F10); - define_key(F11); - define_key(F12); -} - -DL_EXPORT(void) -initgnt(void) -{ - PyObject *m, *d; - - init_pygobject (); - - m = Py_InitModule ("gnt", gnt_functions); - d = PyModule_GetDict (m); - - gnt_register_classes (d); - gnt_add_constants(m, "GNT_"); - - if (PyErr_Occurred ()) { - Py_FatalError ("can't initialise module sad"); - } - - gnt_init(); - gnt_add_string_constants(m); -} - diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/gnttree.override --- a/finch/libgnt/pygnt/gnttree.override Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,213 +0,0 @@ -/** - * pygnt- Python bindings for the GNT toolkit. - * Copyright (C) 2007 Sadrul Habib Chowdhury - * - * gnttree.override: overrides for the tree widget. - * - * This library 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.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 - * USA - */ -%% -headers -#include "common.h" -%% -ignore -gnt_tree_create_row -gnt_tree_create_row_from_list -%% -override gnt_tree_get_selection_text_list noargs -static PyObject * -_wrap_gnt_tree_get_selection_text_list(PyGObject *self) -{ - GList *list = gnt_tree_get_selection_text_list(GNT_TREE(self->obj)); - return create_pyobject_from_string_list(list); -} -%% -override gnt_tree_get_rows noargs -static PyObject * -_wrap_gnt_tree_get_rows(PyGObject *self) -{ - GList *list = gnt_tree_get_rows(GNT_TREE(self->obj)); - PyObject *py_list; - if (list == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - if ((py_list = PyList_New(0)) == NULL) { - return NULL; - } - while (list) { - PyObject *obj = list->data; - PyList_Append(py_list, obj); - list = list->next; - } - return py_list; -} -%% -override gnt_tree_add_row_after -static PyObject * -_wrap_gnt_tree_add_row_after(PyGObject *self, PyObject *args) -{ - static char *kwlist[] = {"key", "row", "parent", "bigbro", NULL}; - PyObject *py_list; - gpointer key, parent, bigbro = NULL; - int len, i; - GList *list = NULL; - GntTreeRow *row; - gboolean insert_last = FALSE; - - if (!PyArg_ParseTuple(args, - "OOO|O:GntTree.add_row_after", - &key, - &py_list, - &parent, - &bigbro)) - return NULL; - - len = PySequence_Length(py_list); - for (i = 0; i < len; i++) { - PyObject *item = PySequence_GetItem(py_list, i); - if (!pygobject_check(item, &PyString_Type)) { - PyErr_SetString(PyExc_TypeError, - "column_list members must be strings"); - Py_DECREF(item); - return NULL; - } - list = g_list_prepend(list, PyString_AsString(item)); - Py_DECREF(item); - } - - if (parent == Py_None) - parent = NULL; - if (bigbro == Py_None) - bigbro = NULL; - else if (bigbro == NULL) - insert_last = TRUE; - - Py_INCREF((PyObject*)key); - - list = g_list_reverse(list); - row = gnt_tree_create_row_from_list(GNT_TREE(self->obj), list); - if (insert_last) - gnt_tree_add_row_last(GNT_TREE(self->obj), - key, row, parent); - else - gnt_tree_add_row_after(GNT_TREE(self->obj), - key, row, - parent, bigbro); - g_list_free(list); - - Py_INCREF(Py_None); - return Py_None; -} -%% -override gnt_tree_get_selection_data noargs -static PyObject * -_wrap_gnt_tree_get_selection_data(PyGObject *self) -{ - PyObject *ret = gnt_tree_get_selection_data(GNT_TREE(self->obj)); - if (!ret) - ret = Py_None; - Py_INCREF(ret); - return ret; -} -%% -override gnt_tree_change_text -static PyObject * -_wrap_gnt_tree_change_text(PyGObject *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = { "key", "colno", "text", NULL }; - char *text; - int colno; - gpointer key; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs,"Ois:GntTree.change_text", kwlist, &key, &colno, &text)) - return NULL; - - gnt_tree_change_text(GNT_TREE(self->obj), key, colno, text); - - Py_INCREF(Py_None); - return Py_None; -} -%% -override gnt_tree_set_row_flags -static PyObject * -_wrap_gnt_tree_set_row_flags(PyGObject *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = { "key", "flag", NULL }; - int flag; - gpointer key; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs,"Oi:GntTree.set_row_flags", kwlist, &key, &flag)) - return NULL; - - gnt_tree_set_row_flags(GNT_TREE(self->obj), key, flag); - - Py_INCREF(Py_None); - return Py_None; -} -%% -override gnt_tree_remove -static PyObject * -_wrap_gnt_tree_remove(PyGObject *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = { "key", NULL }; - gpointer key; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs,"O:GntTree.remove", kwlist, &key)) - return NULL; - - gnt_tree_remove(GNT_TREE(self->obj), key); - - Py_INCREF(Py_None); - return Py_None; -} -%% -override gnt_tree_set_selected -static PyObject * -_wrap_gnt_tree_set_selected(PyGObject *self, PyObject *args) -{ - gpointer key; - if (!PyArg_ParseTuple(args, "O:GntTree.set_selected", &key)) { - return NULL; - } - gnt_tree_set_selected(GNT_TREE(self->obj), key); - Py_INCREF(Py_None); - return Py_None; -} -%% -override gnt_tree_set_compare_func -static PyObject * -_wrap_gnt_tree_set_compare_func(PyGObject *self, PyObject *args) -{ - static char *kwlist[] = {"compare_func", NULL}; - PyGObject *compare; - - if (!PyArg_ParseTuple(args, "O:GntTree.set_compare_func", &compare)) { - return NULL; - } - - if (!PyCallable_Check(compare)) { - PyErr_SetString(PyExc_TypeError, "the callback must be callable ... doh!"); - return NULL; - } - - Py_INCREF(compare); - gnt_tree_set_compare_func(GNT_TREE(self->obj), (GCompareFunc)compare->obj); - - Py_INCREF(Py_None); - return Py_None; -} - diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/gntwidget.override --- a/finch/libgnt/pygnt/gntwidget.override Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -/** - * pygnt- Python bindings for the GNT toolkit. - * Copyright (C) 2007 Sadrul Habib Chowdhury - * - * gntwidget.override: overrides for generic widgets. - * - * This library 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.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 - * USA - */ -%% -override gnt_widget_get_size args -static PyObject * -_wrap_gnt_widget_get_size(PyGObject *self) -{ - PyObject *list = PyList_New(0); - int x = 0, y = 0; - - gnt_widget_get_size(GNT_WIDGET(self->obj), &x, &y); - PyList_Append(list, PyInt_FromLong((long)x)); - PyList_Append(list, PyInt_FromLong((long)y)); - - return list; -} - diff -r 116a1483d554 -r 35621ae24544 finch/libgnt/pygnt/test.py --- a/finch/libgnt/pygnt/test.py Sat Apr 26 00:46:20 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,93 +0,0 @@ -#!/usr/bin/env python -import gobject -import gnt - -class MyObject(gobject.GObject): - __gproperties__ = { - 'mytype': (gobject.TYPE_INT, 'mytype', 'the type of the object', - 0, 10000, 0, gobject.PARAM_READWRITE), - 'string': (gobject.TYPE_STRING, 'string property', 'the string', - None, gobject.PARAM_READWRITE), - 'gobject': (gobject.TYPE_OBJECT, 'object property', 'the object', - gobject.PARAM_READWRITE), - } - - def __init__(self, type = 'string', value = None): - self.__gobject_init__() - self.set_property(type, value) - - def __del__(self): - pass - - def do_set_property(self, pspec, value): - if pspec.name == 'string': - self.string = value - self.type = gobject.TYPE_STRING - elif pspec.name == 'gobject': - self.gobject = value - self.type = gobject.TYPE_OBJECT - else: - raise AttributeError, 'unknown property %s' % pspec.name - def do_get_property(self, pspec): - if pspec.name == 'string': - return self.string - elif pspec.name == 'gobject': - return self.gobject - elif pspec.name == 'mytype': - return self.type - else: - raise AttributeError, 'unknown property %s' % pspec.name -gobject.type_register(MyObject) - -def button_activate(button, tree): - list = tree.get_selection_text_list() - ent = tree.get_selection_data() - if ent.type == gobject.TYPE_STRING: - str = "" - for i in list: - str = str + i - entry.set_text("clicked!!!" + str) - elif ent.type == gobject.TYPE_OBJECT: - ent.gobject.set_text("mwhahaha!!!") - -gnt.gnt_init() - -win = gnt.Window() - -entry = gnt.Entry("") -obj = MyObject() -obj.set_property('gobject', entry) - -win.add_widget(entry) -win.set_title("Entry") - -button = gnt.Button("Click!") -win.add_widget(button) - -tree = gnt.Tree() -tree.set_property("columns", 1) -win.add_widget(tree) - -# so random non-string values can be used as the key for a row in a GntTree! -last = None -for i in range(1, 100): - key = MyObject('string', str(i)) - tree.add_row_after(key, [str(i)], None, last) - last = key - -tree.add_row_after(MyObject('gobject', entry), ["asd"], None, None) -tree.add_row_after(MyObject('string', "b"), ["123"], MyObject('gobject', entry), None) - -button.connect("activate", button_activate, tree) - -tv = gnt.TextView() - -win.add_widget(tv) -tv.append_text_with_flags("What up!!", gnt.TEXT_FLAG_BOLD) - -win.show() - -gnt.gnt_main() - -gnt.gnt_quit() -