ibboard / cawbird Goto Github PK
View Code? Open in Web Editor NEWA fork of the Corebird GTK Twitter client that continues to work with Twitter
Home Page: https://ibboard.co.uk/cawbird/
License: GNU General Public License v3.0
A fork of the Corebird GTK Twitter client that continues to work with Twitter
Home Page: https://ibboard.co.uk/cawbird/
License: GNU General Public License v3.0
TweetListEntry
currently has a function key_released_cb
that (in debug builds) lets you dump the JSON for a selected tweet to stdout. There's not currently matching functionality in TweetInfoPage
, but it would be useful.
Something somewhere is doing a g_object_unref
on something that isn't a gobject
.
(cawbird:14911): GLib-GObject-CRITICAL **: 13:24:15.291: g_object_unref: assertion 'G_IS_OBJECT (object)' failed
This may be related to clearing tweet-related items from the cache, as it seems to happen most around "Removing avatar" debug messages, but that could be a red herring.
(cawbird:15146): GLib-GObject-CRITICAL **: 13:31:54.966: g_object_unref: assertion 'G_IS_OBJECT (object)' failed
(cawbird:15146): GLib-GObject-CRITICAL **: 13:31:54.966: g_object_unref: assertion 'G_IS_OBJECT (object)' failed
(cawbird:15146): GLib-GObject-CRITICAL **: 13:31:54.971: g_object_unref: assertion 'G_IS_OBJECT (object)' failed
(cawbird:15146): cawbird-DEBUG: 13:31:54.975: Removing avatar with id 86626845 from cache
(cawbird:15146): cawbird-DEBUG: 13:31:54.975: Removing avatar with id 1023072078 from cache
People on OMGUbuntu are asking about Snaps. As per #24, if someone can make it then we can include it, but my focus is on native packaging and the "official" repos on the Open Build Service.
For accessibility, we should support adding image descriptions.
The API is documented at https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-metadata-create
(Reported by @lucaswerkmeister as baedert/corebird#678)
Twitter web interface does "cards" for YouTube videos. Since Cawbird already pulls Flickr and others independently of the data that Twitter supplies, it'd be nice to get media previews/thumbnails of YouTube videos.
Cawbird is obviously unlikely to be able to play videos from YouTube inline, so it might need different behaviour to either not make it clickable or to make clicking the image go to the YouTube page instead.
(Transfers my own baedert/corebird#468)
Twitter lets you attach images to DMs. We should be able to show them (ideally in-line, a bit like tweets).
(Reported by @LakesGeek as baedert/corebird#626)
As it says in the Readme, we're currently still using Corebird's Transifex translations. As the UI changes then we will need updated translations.
We need to:
In baedert/corebird#712, Baedert pointed out that replying to deleted tweets would fail. This could be caught with the streaming API for users we follow (because we'd see the deletion message) but the non-streaming API doesn't get informed about deletions.
I need to check what Cawbird does when replying to a deleted tweet. We shouldn't lose the text. Because that's annoying.
Originally posted as baedert/corebird#106 by @ryanlerch: "When a user has "scroll to top on new tweets" disabled, it would be awesome if we could also tell the user how many tweets are remaining in the scrollback. The blue circle icon that appears on the toolbar icon tells the user if they have unread tweets, but not how many are remaining."
Corebird used to do something like this with a horizontal bar as per the mock-up at https://camo.githubusercontent.com/ea60bedf6ef33afd383f14beb1a2f10ec04c13e3/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f3539323235392f323130333335382f34396630363934612d386636622d313165332d386634372d3663356635366533623737392e676966 (but might not show a count, just a "load newer"), or we can more easily do it with the notification and show "99+" to limit the size when Cawbird is left open.
We would need to do the same for replies and DMs as well, for consistency.
Links and handles in DMs currently do not linkify. This may be a Twitter API/JSON limitation, but it seems odd to do that. We should linkify if possible.
Currently, if you're viewing your timeline and un-RT something then the RT remains.
We should probably send a "Delete" message and make sure that the RT disappears.
Please provide a flatpak through flathub.
CoreBird used to be available this way.
See the archived project https://github.com/flathub/org.baedert.corebird
I find that displaying cropped images in the timeline is not useful for me; it invariably leads me to click on the image to view the full image, in case the cropping has cut off something interesting about it. It's faster for me to skim my timeline when I can immediately see the full image and so judge on the spot if I want to see it in full size or if the reduced size on the timeline is sufficient.
As a result, I would like a preference to control this behavior, so that I could set it to always show full images (and other people, such as @IBBoard, could have the current behavior).
As per the code, we currently load the latest page of DMs and nothing more. As I don't use DMs that often then this hasn't been a problem, but we should support it for users who do use DMs more.
I'm currently still using Corebird's translations and assuming that it is working okay. The UI hasn't changed yet, so this isn't a problem. However, we need to set up translations for all of the non-English speakers!
From @Lyude: "Right now there's no way on Corebird to tell if someone's account is set as private or not. It might be a good idea to add a lock or something of the sort on the person's profile and/or their posts on the timeline."
We should put a padlock in the bottom-right of the avatar (where Twitter puts it) in the timeline, tweet info and profile views.
(Transfers baedert/corebird#331)
Hi, first of all, thanks for carrying the torch!
Since you're familiar with the code base, could you maybe give me a hint where to look in the sources to be able to log all tweets in the timeline?
I tried following the instructions for Ubuntu 19.04 here, but get an invalid key error message.
Any ideas?
Sometimes (possibly just on one network) I get TLS connection errors. Normally this happens when RTing, but occasionally it happens when tweeting. Normally, Corebird/Cawbird keeps the last tweet, but in one specific situation that I think is related to the TLS errors then it forgets it. My assumption is that it doesn't handle the error correctly and treats it as posted.
Cawbird currently shows the following CSS warnings on start-up:
(cawbird:14911): Gtk-WARNING **: 13:24:12.801: Theme parsing error: style.css:20:13: The 'icon-shadow' property has been renamed to '-gtk-icon-shadow'
(cawbird:14911): Gtk-WARNING **: 13:24:12.801: Theme parsing error: style.css:231:16: The 'outline-radius' property has been renamed to '-gtk-outline-radius'
(cawbird:14911): Gtk-WARNING **: 13:24:12.801: Theme parsing error: style.css:237:19: The :insensitive pseudo-class is deprecated. Use :disabled instead.
(cawbird:14911): Gtk-WARNING **: 13:24:12.801: Theme parsing error: style.css:238:25: The :insensitive pseudo-class is deprecated. Use :disabled instead.
(cawbird:14911): Gtk-WARNING **: 13:24:12.801: Theme parsing error: style.css:243:36: The :insensitive pseudo-class is deprecated. Use :disabled instead.
This is due to changes in GTK3 over the years. As we depend on a recent GTK then we should update out styles.
related issue but on Linux: bilelmoussaoui/nautilus-git#25
this appears to be the cause mesonbuild/meson#1565
[3/43] Generating uk.co.ibboard.cawbird.appdata.xml_data_merge with a custom command.
FAILED: data/uk.co.ibboard.cawbird.appdata.xml
/usr/bin/meson --internal msgfmthelper ../data/uk.co.ibboard.cawbird.appdata.xml.in data/uk.co.ibboard.cawbird.appdata.xml xml ../data/../po/
msgfmt: cannot locate ITS rules for ../data/uk.co.ibboard.cawbird.appdata.xml.in
otherwise works fine on my Sun π
Deleting your own tweets with right-click in the timeline will make them insensitive (disabled). Deleting them in the TweetInfo view (single tweet view) doesn't. This isn't helpful.
Steps to recreate:
Expected behaviour:
Actual behaviour:
If you tweet and then retweet it and then look at your user timeline then you can interact with both the tweet and the RT. The RT shows the correct RT status (starts RTed), but if you un-RT the RT (rather than un-RTing the original) then things start to go a bit wrong!
Steps to recreate:
Expected behaviour:
Better behaviour:
Actual behaviour:
Related to #10 - since Twitter provides image descriptions (somewhere in the JSON) we should add them to the images when we display them.
Unless anyone has any better options, I'd plan to put them in as a tooltip.
Originally reported by @hfiguiere as baedert/corebird#234: "Retweet should also show the @-handle in addition to the name. Because people often change the name to annoy other users making this info "useless"."
I already made a quick patch in IBBoard/corebird@ebea9e00434 but it isn't included yet. We might need to be clearer on name vs handle, though.
That's what GNOME moves to, and what the web version of Twitter does.
Gnome discourages GTK "themes" (blogβ ). We can extrapolate from there to "don't do arbitrary custom themeing within an app unless you absolutely need to".
I'm also sure I saw someone complain about the dark bar looking out of place in a stock Gnome/Adwaita system, which is true. It looks fine on my custom Adwaita Dark Green themeβ‘, but then I have dark title bars.
I've had a look at how we could reduce our bespoke themeing to fit in better with each desktop. The initial code is in the native-topbar-styling branch.
(Cawbird native themeing in Adwaita, Adwaita Dark, High Contrast and my Adwaita Dark Green)
Thoughts?
.
β Adwaita means βthe only oneβ in Sanskrit
β‘ Yes, I understand there's an irony in saying "we should do less custom themeing because Gnome/GTK doesn't really support it" while also using my own theme! But that's why I keep it so close to Adwaita.
Normally, Cawbird silently attempts to position an over-large image (one that you'll have to scroll around in) based on where in the image you clicked in your timeline view. I find this to be completely unpredictable and irritating behavior, because I don't precisely control where I click in timeline images; I just click somewhere on the image, wherever is convenient given my mouse position at the time. Thus I think it would be more predictable and less surprising (and puzzling) to always position over-large images at the top left.
Sometimes, Twitter will error.
For some situations (e.g. "144: No status found with that ID." when un-RTing a tweet that has been un-RTed elsewhere), the libraries will thrown an exception (probably because Twitter gives a 4xx status code), Cawbird will handle that, and the user will get an error dialog.
For other situations (e.g. "you've already RTed that") then Twitter returns an error object but not an exception. Cawbird assumes it succeeded, streams that tweet, and then chokes because it's not a tweet. This causes many critical
log messages followed by a segfault.
(cawbird:9447): cawbird-DEBUG: 10:52:38.574: TweetUtils.vala:85: POST 1.1/statuses/retweet/1173185595121786880.json
(cawbird:9447): cawbird-CRITICAL **: 10:52:38.764: Utils.vala:257: {"errors":[{"code":327,"message":"You have already retweeted this Tweet."}]}
(cawbird:9447): Json-CRITICAL **: 10:52:38.769: json_object_get_int_member: assertion 'node != NULL' failed
Message with type 10 on stream @IBBTwtr
{
"errors" : [
{
"code" : 327,
"message" : "You have already retweeted this Tweet."
}
]
}
(cawbird:9447): Json-CRITICAL **: 10:52:38.769: json_object_get_object_member: assertion 'node != NULL' failed
(cawbird:9447): Json-CRITICAL **: 10:52:38.770: json_object_get_int_member: assertion 'node != NULL' failed
(cawbird:9447): Json-CRITICAL **: 10:52:38.770: json_object_get_int_member: assertion 'node != NULL' failed
(cawbird:9447): Json-CRITICAL **: 10:52:38.770: json_object_get_int_member: assertion 'node != NULL' failed
(cawbird:9447): Json-CRITICAL **: 10:52:38.770: json_object_get_string_member: assertion 'node != NULL' failed
(cawbird:9447): Json-CRITICAL **: 10:52:38.770: json_object_get_int_member: assertion 'node != NULL' failed
(cawbird:9447): Json-CRITICAL **: 10:52:38.770: json_object_get_string_member: assertion 'node != NULL' failed
(cawbird:9447): Json-CRITICAL **: 10:52:38.770: json_object_get_object_member: assertion 'node != NULL' failed
(cawbird:9447): Json-CRITICAL **: 10:52:38.770: json_object_get_int_member: assertion 'object != NULL' failed
(cawbird:9447): Json-CRITICAL **: 10:52:38.770: json_object_get_string_member: assertion 'object != NULL' failed
(cawbird:9447): Json-CRITICAL **: 10:52:38.770: json_object_get_string_member: assertion 'object != NULL' failed
Segmentation fault (core dumped)
Found while working on #23 without the fixes from #9, so an un-RT failed (but the app removed the RT flag) and then the RT errored.
Twitter now supports quoted tweets and images in the same post. Corebird currently shows the image in preference to the tweet, but there's no reason that it has to. It just did it because that's what Twitter used to do.
Example: https://twitter.com/IBBTwtr/status/1171490230056054786
Compare that to https://twitter.com/IBBTwtr/status/1171497487858728960
The Twitter web interface lets you add images to DMs. Apparently this uses a similar process to attaching images to tweets: https://developer.twitter.com/en/docs/direct-messages/message-attachments/guides/attaching-media
Build is failing with this error:
valac -C --debug --debug --enable-deprecated -D GTK322 -g -D DEBUG -D VIDEO -D SPELLCHECK --pkg gspell-1 --pkg gstreamer-video-1.0 --pkg libsoup-2.4 --pkg sqlite3 --pkg json-glib-1.0 --pkg gtk+-3.0 --target-glib 2.44 --pkg glib-2.0 --color=always --directory cawbird@sta --basedir ../ --library cawbird --header cawbird.h --vapi ../cawbird.vapi /home/gnumdk/aur/cawbird/src/cawbird-1.0.1/vapi/config.vapi --target-glib=2.44 --vapidir=/home/gnumdk/aur/cawbird/src/cawbird-1.0.1/vapi/ --gresources=/home/gnumdk/aur/cawbird/src/cawbird-1.0.1/cawbird.gresource.xml ../vapi/cawbird-internal.vapi ../vapi/rest-0.7.vapi ../vapi/libtl.vapi ../src/Account.vala ../src/Cawbird.vala ../src/DMManager.vala ../src/DMPage.vala ../src/DMThreadsPage.vala ../src/DefaultTimeline.vala ../src/FavoritesTimeline.vala ../src/FilterPage.vala ../src/HomeTimeline.vala ../src/IPage.vala ../src/ListStatusesPage.vala ../src/ListsPage.vala ../src/MainWidget.vala ../src/MainWindow.vala ../src/MentionsTimeline.vala ../src/NotificationManager.vala ../src/OAuthProxyCallWithBody.vala ../src/ProfilePage.vala ../src/SearchPage.vala ../src/Settings.vala ../src/TweetInfoPage.vala ../src/Twitter.vala ../src/UserEventReceiver.vala ../src/async/Collect.vala ../src/list/AddListEntry.vala ../src/list/DMListEntry.vala ../src/list/DMThreadEntry.vala ../src/list/FilterListEntry.vala ../src/list/ListListEntry.vala ../src/list/NewListEntry.vala ../src/list/SnippetListEntry.vala ../src/list/StartConversationEntry.vala ../src/list/TweetListEntry.vala ../src/list/UserFilterEntry.vala ../src/list/UserListEntry.vala ../src/list/FavImageRow.vala ../src/model/DMThreadsModel.vala ../src/sql/Database.vala ../src/sql/InsertStatement.vala ../src/sql/SelectStatement.vala ../src/sql/UpdateStatement.vala ../src/util/Benchmark.vala ../src/util/Dirs.vala ../src/util/TweetUtils.vala ../src/util/UserCompletion.vala ../src/util/UserUtils.vala ../src/util/Utils.vala ../src/widgets/AccountCreateWidget.vala ../src/widgets/AddImageButton.vala ../src/widgets/AspectImage.vala ../src/widgets/AvatarBannerWidget.vala ../src/widgets/AvatarWidget.vala ../src/widgets/BadgeRadioButton.vala ../src/widgets/ChildSizedScroller.vala ../src/widgets/CompletionTextView.vala ../src/widgets/ComposeImageManager.vala ../src/widgets/CropWidget.vala ../src/widgets/DMPlaceholderBox.vala ../src/widgets/DoubleTapButton.vala ../src/widgets/FollowButton.vala ../src/widgets/ImpostorWidget.vala ../src/widgets/LazyMenuButton.vala ../src/widgets/MaxSizeContainer.vala ../src/widgets/MediaButton.vala ../src/widgets/MultiMediaWidget.vala ../src/widgets/PixbufButton.vala ../src/widgets/ReplyEntry.vala ../src/widgets/ReplyIndicator.vala ../src/widgets/ScrollWidget.vala ../src/widgets/TextButton.vala ../src/widgets/TweetListBox.vala ../src/widgets/UserListsWidget.vala ../src/widgets/FavImageView.vala ../src/window/AboutDialog.vala ../src/window/AccountDialog.vala ../src/window/ComposeTweetWindow.vala ../src/window/MediaDialog.vala ../src/window/ModifyFilterDialog.vala ../src/window/ModifySnippetDialog.vala ../src/window/SettingsDialog.vala ../src/window/UserListDialog.vala
../src/DefaultTimeline.vala:51.3-51.24: error: Creation method of abstract class cannot be public.
public DefaultTimeline (int id) {
^^^^^^^^^^^^^^^^^^^^^^
Compilation failed: 1 error(s), 0 warning(s)
When viewing a tweet, the replies don't match those shown on Twitter Web. Apps like Twidere manage to show something that looks much closer to Twitter (e.g. the down-stream thread from the same author is generally at the top of the list).
This would prevent you having to either go to Twitter web to view a thread, or clicking through tweet by tweet and hoping that it finds the right tweet first in the replies each time.
any chance ?
Currently Cawbird is a bit too wide to work on phones, I can think of a few things which could make it work:
HdyViewSwitcher
for Home, Mentions, Direct messages and Search views(like on the web version of Twitter)GtkStack
The main timeline has a DeltaUpdater that updates the time delta on each tweet as time moves on. We don't currently appear to do that with DMs, so the DMs always show their delta compared to the first time you saw them.
This results in two behaviours if you keep the DM thread open:
Well of course it doesn't exist, I didn't use Corebird, and I am currently using Cawbird. π€·ββοΈ
This was master, just after compiling it on Debian stable and running it.
Tweets can be deleted from right-click, but DMs can't be deleted.
The API is documented at https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/delete-message-event
(Reported by @monstorr as baedert/corebird#839)
Currently, if you attach the same image twice then the ComposeImageManager.set_image_progress ()
function uses (btn.image_path == image_path)
to check when it has found the right button and so always hits the first image and updates the status of that.
Twitter allows multiple copies of the same image (and the upload works through Cawbird, if you ignore the incorrect UI feedback). This means that ComposeJob.image_upload_progress
needs reworking so that it doesn't just use the local path.
Baedert chose to put replies above the tweet in tweet view, so you have to scroll up to see them. This seems odd and is the opposite of what Twitter (and almost every other threaded UI) does.
I should finally get round to making the change to flip it so that it reads the "right" way (scroll up to see previous posts in thread, replies are automatically visible).
(Reported by @jacobmischka as baedert/corebird#369 and backed by me but rejected in Corebird)
When you follow a user, Cawbird doesn't currently add any of their tweets to your timeline, so you will only see new tweets by them.
If we loaded their timeline for all tweets less than the earliest tweet we currently hold then we could inject those tweets into our main timeline. Somehow. Hopefully.
(Originally recorded as an enhancement by Baedert as baedert/corebird#321)
When installing cawbird_1.0-1+60.1_amd64.deb on 18.04, apt spits
cawbird : Depends: libgstreamer-plugins-base1.0 but it is not installable
Depends: libglib2.0 but it is not installable
Depends: libgspell-1 but it is not installable
Depends: libgtk-3 (>= 3.20) but it is not installable
Depends: libjson-glib but it is not installable
Depends: libsoup2.4 but it is not installable
Depends: libsqlite3 but it is not installable
Whereas all these libs are installed but having different names
libgstreamer-plugins-base1.0-0/bionic-updates,now 1.14.5-0ubuntu1~18.04.1 amd64 [installed]
libglib2.0-0/bionic-updates,bionic-security,now 2.56.4-0ubuntu0.18.04.4 amd64 [installed]
libgspell-1-1/bionic,now 1.6.1-1 amd64 [installed]
libgtk-3-0/bionic-updates,now 3.22.30-1ubuntu4 amd64 [installed]
libjson-glib-1.0-0/bionic,now 1.4.2-3 amd64 [installed]
libsoup2.4-1/bionic-updates,bionic-security,now 2.62.1-1ubuntu0.1 amd64 [installed]
libsqlite3-0/bionic-updates,bionic-security,now 3.22.0-1ubuntu0.1 amd64 [installed]
After that apt install doesn't work unless you --fix-broken which removes cawbird.
As a workaround had to manually edit Dependencies of cawbird in /var/lib/dpkg/status.
I know 19.10 just released so I'm not upset about this, just filing a bug so adding a corresponding repo is on the to-do list. Thanks :)
Would you consider adding the ability to adjust the default font size for Tweets' text? Thanks!
Both the cawbird
and cawbird-git
AUR packages fail to build for me with the following error:
../src/DefaultTimeline.vala:51.3-51.24: error: Creation method of abstract class cannot be public.
public DefaultTimeline (int id) {
^^^^^^^^^^^^^^^^^^^^^^
I have Vala 0.46.0 installed. This seems to be a relatively new error; the two other occurrences I found are from August 3rd (pdfpc/pdfpc#446) and 8th (ueno/libkkc#23).
I just built the latest git tip (tagged as v1.0.3), and it core dumps on startup for me but in a weird spot. Gdb says that the crash is:
#0 0x00005555555a35ae in multi_media_widget_set_all_media
(self=0x5555570266b0, medias=0x56fbe4e0, medias_length1=<optimized out>)
at cawbird@sta/src/widgets/MultiMediaWidget.c:192
#1 0x000055555558f529 in tweet_list_entry_construct
(object_type=<optimized out>, tweet=0x555556f63300, main_window=main_window@entry=0x555555bd03d0, account=account@entry=0x555555aeb850, restrict_height=restrict_height@entry=0) at cawbird@sta/src/list/TweetListEntry.c:1384
#2 0x000055555559070c in tweet_list_entry_new
(tweet=<optimized out>, main_window=main_window@entry=0x555555bd03d0, account=account@entry=0x555555aeb850, restrict_height=restrict_height@entry=0)
at cawbird@sta/src/list/TweetListEntry.c:1473
#3 0x00005555555a5762 in tweet_list_box_widget_create_func
(obj=0x555556f63300, self=0x555555c3c7e0)
at cawbird@sta/src/widgets/TweetListBox.c:227
This is translated Vala code:
(gdb) list
187 }
188 _tmp1_ = FALSE;
189 if (!(i < medias_length1)) {
190 break;
191 }
192 _tmp3_ = medias[i];
193 _vala_assert (_tmp3_ != NULL, "medias[i] != null");
194 _tmp4_ = medias[i];
195 multi_media_widget_set_media (self, i, _tmp4_);
196 }
This corresponds to set_all_media
in src/widgets/MultiMediaWidget.vala but it appears impossible for this to happen, because the for loop looks like it should always constrain the value of i
here so that it's a valid index. In the translated C code, though, it looks like medias
itself could become corrupted without the length being bad, because they're passed as separate parameters and they're generated from separate pieces of information in src/CbTweet.c.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
π Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. πππ
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google β€οΈ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.