fossfreedom / desktop-art Goto Github PK
View Code? Open in Web Editor NEWrhythmbox v2.9x/v3.x plugin to display the coverart and control rhythmbox from your desktop
License: GNU General Public License v3.0
rhythmbox v2.9x/v3.x plugin to display the coverart and control rhythmbox from your desktop
License: GNU General Public License v3.0
This is quite a recent issue that was introduced with commit 68790b4.
Changing the property "type_hint" on desktop-art.ui to desktop instead of dock makes the plugin disappear when you click anywhere on the desktop.
This obviously reverts the fix for issue #3. Would be nice if there is an alternative fix that doesn't break the plugin.
OS: Ubuntu 14.04, on trusty-proposed.
Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.
The position of the Rhythmbox Destkop Art plugin can be changed by pressing Alt + moving around the Art, but the new location is not saved. In order to do so, I need to adapt the settings using either Gconf or the preferences. (like you already noticed, there's a bug when editing these preferences too much).
However, when using multiple screens, the maximum of 1000 pixels as Y component is too low when using multiple screens and stacking the screens on top of each other. The X-component might have the same issue when putitng the screens next to each other.
System: Ubuntu 14.04 x64 Unity
Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.
It seems that the Rhythmbox Desktop Art plugin is seen by the Unity launcher as a separate program.
This causes the following annoying thing: when another program is opened and I press the Rhythmbox icon in the launcher, nothing happens. The Rhythmbox icon gets a 'glow', indicating that it is selected, but the Rhythmbox screen isn't shown.
I need to right-click the icon and then select the first 'Rhythmbox' entry to show Rhythmbox (see image). Selecting the second 'Rhythmbox' entry (that is, I think, the Desktop Art plugin), doesn't do a thing.
Thanks for looking into this!
OS = Ubuntu 14.04 x64
/home/dad/.local/share/rhythmbox/plugins/desktop-art/desktop-art.py:56: Warning: The property GtkWindow:has-resize-grip is deprecated and shouldn't be used anymore. It will be removed in a future version. 'desktop-art.ui')) /usr/lib/python3/dist-packages/gi/overrides/Gtk.py:567: Warning: The property GtkButton:use-stock is deprecated and shouldn't be used anymore. It will be removed in a future version. self.add_button(text, response) /usr/lib/python3/dist-packages/gi/overrides/Gtk.py:567: Warning: The property GtkSettings:gtk-button-images is deprecated and shouldn't be used anymore. It will be removed in a future version. self.add_button(text, response) /home/dad/.local/share/rhythmbox/plugins/desktop-art/ConfigDialog.py:57: Warning: The property GtkColorButton:color is deprecated and shouldn't be used anymore. It will be removed in a future version. ui.add_from_file(rb.find_plugin_file(self.plugin, glade_file)) /home/dad/.local/share/rhythmbox/plugins/desktop-art/ConfigDialog.py:57: Warning: The property GtkAlignment:xscale is deprecated and shouldn't be used anymore. It will be removed in a future version. ui.add_from_file(rb.find_plugin_file(self.plugin, glade_file)) /home/dad/.local/share/rhythmbox/plugins/desktop-art/ConfigDialog.py:57: Warning: The property GtkAlignment:yscale is deprecated and shouldn't be used anymore. It will be removed in a future version. ui.add_from_file(rb.find_plugin_file(self.plugin, glade_file))
Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.
I just upgraded Rhythmbox to 3.2 and cover art is no longer displayed for some tracks.
Running Rhythmbox from the console and playing a track that won't show cover art returns this:
File "/home/user/.local/share/rhythmbox/plugins/desktop-art/desktop-art.py", line 129, in playing_changed
c, s = cover_manager.get_cover_and_song_info(player.get_playing_entry())
File "/home/user/.local/share/rhythmbox/plugins/desktop-art/CoverManager.py", line 48, in get_cover_and_song_info
return (self.get_cover(db_entry), self.get_song_info(db_entry))
File "/home/user/.local/share/rhythmbox/plugins/desktop-art/CoverManager.py", line 84, in get_cover
if art_location and path.exists(art_location):
File "/usr/lib/python3.4/genericpath.py", line 19, in exists
os.stat(path)
TypeError: argument should be string, bytes or integer, not tuple
Feature Request: Visualizer on Desktop for Rhythmbox with customizable position and size.
Recently I upgraded to Ubuntu 14.10 and I noticed that Rhythmbox would crash on startup.
I am using Rhythmbox 3.1 from this PPA https://launchpad.net/~fossfreedom/+archive/ubuntu/rhythmbox but I also tried compiling from source.
This worked perfectly on Ubuntu 14.04 before the upgrade.
I ended up finding out that it is the desktop-art plugin causing the issue as rhythmbox starts up and works fine when the plugin is not installed.
Running rhythmbox with gdb (bt full) and the plugin present returned the following
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff2b523d5 in cairo_region_reference ()
from /usr/lib/x86_64-linux-gnu/libcairo.so.2
(gdb) bt full
#0 0x00007ffff2b523d5 in cairo_region_reference ()
from /usr/lib/x86_64-linux-gnu/libcairo.so.2
No symbol table info available.
#1 0x00007fffcad7a4bc in ?? ()
from /usr/lib/python3/dist-packages/gi/_gi_cairo.cpython-34m-x86_64-linux-gnu.so
No symbol table info available.
#2 0x00007fffb98dc552 in ?? ()
from /usr/lib/python3/dist-packages/gi/_gi.cpython-34m-x86_64-linux-gnu.so
No symbol table info available.
#3 0x00007fffb98d3f9a in ?? ()
from /usr/lib/python3/dist-packages/gi/_gi.cpython-34m-x86_64-linux-gnu.so
No symbol table info available.
#4 0x00007fffb98d53e8 in ?? ()
from /usr/lib/python3/dist-packages/gi/_gi.cpython-34m-x86_64-linux-gnu.so
No symbol table info available.
#5 0x00007fffb9e08cd8 in PyObject_Call ()
from /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0
No symbol table info available.
#6 0x00007fffb9ee1d82 in PyEval_EvalFrameEx ()
from /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0
No symbol table info available.
#7 0x00007fffb9ee58c3 in PyEval_EvalCodeEx ()
---Type <return> to continue, or q <return> to quit---
from /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0
No symbol table info available.
#8 0x00007fffb9dd1ff9 in ?? ()
from /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0
No symbol table info available.
#9 0x00007fffb9e08cd8 in PyObject_Call ()
from /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0
No symbol table info available.
#10 0x00007fffb9eeba5d in ?? ()
from /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0
No symbol table info available.
#11 0x00007fffb9e08cd8 in PyObject_Call ()
from /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0
No symbol table info available.
#12 0x00007fffb9edc5a7 in PyEval_CallObjectWithKeywords ()
from /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0
No symbol table info available.
#13 0x00007fffb98d2dd0 in ?? ()
from /usr/lib/python3/dist-packages/gi/_gi.cpython-34m-x86_64-linux-gnu.so
No symbol table info available.
#14 0x00007ffff6dd3245 in g_closure_invoke ()
from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
No symbol table info available.
---Type <return> to continue, or q <return> to quit---
#15 0x00007ffff6de4f3c in ?? ()
from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
No symbol table info available.
#16 0x00007ffff6ded255 in g_signal_emit_valist ()
from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
No symbol table info available.
#17 0x00007ffff6ded9af in g_signal_emit ()
from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
No symbol table info available.
#18 0x00007ffff730cd96 in _gtk_widget_draw_internal (
widget=widget@entry=0x9b71d0, cr=cr@entry=0xb895d0,
clip_to_size=clip_to_size@entry=1, window=window@entry=0x7eba20)
at /build/buildd/gtk+3.0-3.12.2/./gtk/gtkwidget.c:6503
result = -2147483648
tmp_event_window = 0x7eb900
#19 0x00007ffff730e4ef in _gtk_widget_draw_internal (window=0x7eba20,
clip_to_size=1, cr=0xb895d0, widget=0x9b71d0)
at /build/buildd/gtk+3.0-3.12.2/./gtk/gtkwidget.c:6482
No locals.
#20 _gtk_widget_draw_windows (window=window@entry=0x7eba20,
cr=cr@entry=0xb895d0, window_x=window_x@entry=0, window_y=window_y@entry=0)
at /build/buildd/gtk+3.0-3.12.2/./gtk/gtkwidget.c:6604
pattern = <optimized out>
---Type <return> to continue, or q <return> to quit---
do_clip = 1
widget = 0x9b71d0
children = <optimized out>
l = <optimized out>
current_clip = {x = 0, y = 0, width = 1000, height = 250}
window_clip = {x = 0, y = 0, width = 1000, height = 250}
x = 0
y = 0
#21 0x00007ffff730e76f in _gtk_widget_draw (widget=widget@entry=0x9b71d0,
cr=cr@entry=0xb895d0)
at /build/buildd/gtk+3.0-3.12.2/./gtk/gtkwidget.c:6674
window = 0x7eba20
child_window = <optimized out>
children = <optimized out>
l = <optimized out>
wx = 0
wy = 0
push_group = <optimized out>
type = <optimized out>
#22 0x00007ffff712a745 in gtk_container_propagate_draw (
container=container@entry=0x10c9930, child=0x9b71d0, cr=cr@entry=0xb895d0)
at /build/buildd/gtk+3.0-3.12.2/./gtk/gtkcontainer.c:3588
allocation = {x = -149795680, y = 32767, width = 0, height = 0}
---Type <return> to continue, or q <return> to quit---
window = 0x7eb900
w = 0x7eb900
x = 0
y = 0
__FUNCTION__ = "gtk_container_propagate_draw"
#23 0x00007ffff712a812 in gtk_container_draw (widget=0x10c9930, cr=0xb895d0)
at /build/buildd/gtk+3.0-3.12.2/./gtk/gtkcontainer.c:3423
container = 0x10c9930
child_infos = 0x1b7f600
i = 0
child_info = <optimized out>
data = {container = 0x10c9930, child_infos = 0x1b7f600, cr = 0xb895d0}
#24 0x00007ffff731fe34 in gtk_window_draw (widget=0x10c9930, cr=0xb895d0)
at /build/buildd/gtk+3.0-3.12.2/./gtk/gtkwindow.c:9960
priv = 0x10c9720
context = 0xa732f0
ret = 0
allocation = {x = 0, y = 0, width = 1000, height = 250}
window_border = {left = 0, right = 0, top = 0, bottom = 0}
title_height = <optimized out>
#25 0x00007ffff71ca86e in _gtk_marshal_BOOLEAN__BOXEDv (
closure=closure@entry=0x794290,
return_value=return_value@entry=0x7fffffffd100,
---Type <return> to continue, or q <return> to quit---
instance=instance@entry=0x10c9930, args=args@entry=0x7fffffffd200,
marshal_data=marshal_data@entry=0x7ffff731fdc0 <gtk_window_draw>,
n_params=n_params@entry=1, param_types=0x794580) at gtkmarshalers.c:130
cc = <optimized out>
data1 = <optimized out>
data2 = <optimized out>
callback = <optimized out>
arg0 = 0xb895d0
args_copy = {{gp_offset = 32, fp_offset = 48,
overflow_arg_area = 0x7fffffffd2e0,
reg_save_area = 0x7fffffffd220}}
v_return = <optimized out>
__FUNCTION__ = "_gtk_marshal_BOOLEAN__BOXEDv"
#26 0x00007ffff72ff510 in gtk_widget_draw_marshallerv (closure=0x794290,
return_value=0x7fffffffd100, instance=0x10c9930, args=0x7fffffffd200,
marshal_data=0x7ffff731fdc0 <gtk_window_draw>, n_params=1,
param_types=0x794580) at /build/buildd/gtk+3.0-3.12.2/./gtk/gtkwidget.c:994
cr = 0xb895d0
args_copy = {{gp_offset = 32, fp_offset = 48,
overflow_arg_area = 0x7fffffffd2e0,
reg_save_area = 0x7fffffffd220}}
#27 0x00007ffff6dd3474 in ?? ()
from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
---Type <return> to continue, or q <return> to quit---
No symbol table info available.
#28 0x00007ffff6decb00 in g_signal_emit_valist ()
from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
No symbol table info available.
#29 0x00007ffff6ded9af in g_signal_emit ()
from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
No symbol table info available.
#30 0x00007ffff730cd96 in _gtk_widget_draw_internal (
widget=widget@entry=0x10c9930, cr=cr@entry=0xb895d0,
clip_to_size=clip_to_size@entry=1, window=window@entry=0x7eb900)
at /build/buildd/gtk+3.0-3.12.2/./gtk/gtkwidget.c:6503
result = -2147483648
tmp_event_window = 0x0
#31 0x00007ffff730e4ef in _gtk_widget_draw_internal (window=0x7eb900,
clip_to_size=1, cr=0xb895d0, widget=0x10c9930)
at /build/buildd/gtk+3.0-3.12.2/./gtk/gtkwidget.c:6482
No locals.
#32 _gtk_widget_draw_windows (window=window@entry=0x7eb900,
cr=cr@entry=0xb895d0, window_x=window_x@entry=0, window_y=window_y@entry=0)
at /build/buildd/gtk+3.0-3.12.2/./gtk/gtkwidget.c:6604
pattern = <optimized out>
do_clip = 1
widget = 0x10c9930
---Type <return> to continue, or q <return> to quit---
children = <optimized out>
l = <optimized out>
current_clip = {x = 0, y = 0, width = 1000, height = 250}
window_clip = {x = 0, y = 0, width = 1000, height = 250}
x = 0
y = 0
#33 0x00007ffff730e76f in _gtk_widget_draw (widget=widget@entry=0x10c9930,
cr=cr@entry=0xb895d0)
at /build/buildd/gtk+3.0-3.12.2/./gtk/gtkwidget.c:6674
window = 0x7eb900
child_window = <optimized out>
children = <optimized out>
l = <optimized out>
wx = -143270688
wy = 32767
push_group = <optimized out>
type = <optimized out>
#34 0x00007ffff730eaab in gtk_widget_send_expose (
widget=widget@entry=0x10c9930, event=event@entry=0x7fffffffd4e0)
at /build/buildd/gtk+3.0-3.12.2/./gtk/gtkwidget.c:7059
cr = 0xb895d0
__FUNCTION__ = "gtk_widget_send_expose"
#35 0x00007ffff71c9db4 in gtk_main_do_event (event=0x7fffffffd4e0)
---Type <return> to continue, or q <return> to quit---
at /build/buildd/gtk+3.0-3.12.2/./gtk/gtkmain.c:1647
event_widget = 0x10c9930
grab_widget = <optimized out>
topmost_widget = <optimized out>
window_group = 0x1b12440
rewritten_event = <optimized out>
device = 0x0
tmp_list = <optimized out>
__FUNCTION__ = "gtk_main_do_event"
#36 0x00007ffff34b2c94 in _gdk_window_process_updates_recurse_helper (
window=0x7eb900, expose_region=<optimized out>, dx=<optimized out>, dy=0)
at /build/buildd/gtk+3.0-3.12.2/./gdk/gdkwindow.c:3392
event = {type = GDK_EXPOSE, any = {type = GDK_EXPOSE,
window = 0x7eb900, send_event = 0 '\000'}, expose = {
type = GDK_EXPOSE, window = 0x7eb900, send_event = 0 '\000',
area = {x = 0, y = 0, width = 1000, height = 250},
region = 0x1b41960, count = 0}, visibility = {type = GDK_EXPOSE,
window = 0x7eb900, send_event = 0 '\000',
state = GDK_VISIBILITY_UNOBSCURED}, motion = {type = GDK_EXPOSE,
window = 0x7eb900, send_event = 0 '\000', time = 0,
x = 2,1219957909652723e-311, y = 1,2351641146031164e-321,
axes = 0x1b41960, state = 0, is_hint = 0, device = 0x7fffffffd848,
x_root = 0, y_root = 6,9533477948443706e-310}, button = {
---Type <return> to continue, or q <return> to quit---
type = GDK_EXPOSE, window = 0x7eb900, send_event = 0 '\000',
time = 0, x = 2,1219957909652723e-311,
y = 1,2351641146031164e-321, axes = 0x1b41960, state = 0,
button = 0, device = 0x7fffffffd848, x_root = 0,
y_root = 6,9533477948443706e-310}, touch = {type = GDK_EXPOSE,
window = 0x7eb900, send_event = 0 '\000', time = 0,
x = 2,1219957909652723e-311, y = 1,2351641146031164e-321,
axes = 0x1b41960, state = 0, sequence = 0x7fffffffd848,
emulating_pointer = 0,
device = 0x7ffff65541e0 <__GI___libc_malloc+96>,
x_root = 8,6969703708156285e-317,
y_root = -1,0624836935936012e-300}, scroll = {type = GDK_EXPOSE,
window = 0x7eb900, send_event = 0 '\000', time = 0,
x = 2,1219957909652723e-311, y = 1,2351641146031164e-321,
state = 28580192, direction = GDK_SCROLL_UP, device = 0x0,
x_root = 6,9533558073326384e-310, y_root = 0,
delta_x = 6,9533477948443706e-310,
delta_y = 8,6969703708156285e-317}, key = {type = GDK_EXPOSE,
window = 0x7eb900, send_event = 0 '\000', time = 0, state = 0,
keyval = 1000, length = 250, string = 0x1b41960 "\001",
hardware_keycode = 0, group = 0 '\000', is_modifier = 0},
crossing = {type = GDK_EXPOSE, window = 0x7eb900,
send_event = 0 '\000', subwindow = 0x3e800000000, time = 250,
---Type <return> to continue, or q <return> to quit---
x = 1,4120491018746828e-316, y = 0,
x_root = 6,9533558073326384e-310, y_root = 0, mode = 4132782560,
detail = 32767, focus = 17602864, state = 0}, focus_change = {
type = GDK_EXPOSE, window = 0x7eb900, send_event = 0 '\000',
in = 280}, configure = {type = GDK_EXPOSE, window = 0x7eb900,
send_event = 0 '\000', x = 0, y = 0, width = 1000, height = 250},
property = {type = GDK_EXPOSE, window = 0x7eb900,
send_event = 0 '\000', atom = 0x3e800000000, time = 250,
state = 0}, selection = {type = GDK_EXPOSE, window = 0x7eb900,
send_event = 0 '\000', selection = 0x3e800000000, target = 0xfa,
property = 0x1b41960, time = 0, requestor = 0x7fffffffd848},
owner_change = {type = GDK_EXPOSE, window = 0x7eb900,
send_event = 0 '\000', owner = 0x3e800000000,
reason = (GDK_OWNER_CHANGE_CLOSE | unknown: 248),
selection = 0x1b41960, time = 0, selection_time = 0}, proximity = {
type = GDK_EXPOSE, window = 0x7eb900, send_event = 0 '\000',
time = 0, device = 0x3e800000000}, dnd = {type = GDK_EXPOSE,
window = 0x7eb900, send_event = 0 '\000', context = 0x3e800000000,
time = 250, x_root = 0, y_root = 0}, window_state = {
type = GDK_EXPOSE, window = 0x7eb900, send_event = 0 '\000',
changed_mask = (unknown: 0), new_window_state = (unknown: 0)},
setting = {type = GDK_EXPOSE, window = 0x7eb900,
send_event = 0 '\000', action = GDK_SETTING_ACTION_NEW,
---Type <return> to continue, or q <return> to quit---
name = 0x3e800000000 <error: Cannot access memory at address 0x3e800000000>}, grab_broken = {type = GDK_EXPOSE, window = 0x7eb900,
send_event = 0 '\000', keyboard = 0, implicit = 0,
grab_window = 0xfa}}
child = <optimized out>
clipped_expose_region = 0x1b41960
clip_box = {x = 1863569575, y = 2, width = 18395984, height = 0}
l = <optimized out>
children = <optimized out>
#37 0x00007ffff34b0f25 in gdk_window_process_updates_internal (
window=window@entry=0x7eb900)
at /build/buildd/gtk+3.0-3.12.2/./gdk/gdkwindow.c:3500
expose_region = 0x1b31900
update_area = 0x16ea660
impl_class = 0x7e4710
save_region = 1
clip_box = {x = 0, y = 0, width = 1000, height = 250}
toplevel = <optimized out>
#38 0x00007ffff34b104d in gdk_window_process_updates_with_mode (
window=<optimized out>, recurse_mode=<optimized out>)
at /build/buildd/gtk+3.0-3.12.2/./gdk/gdkwindow.c:3697
impl_window = 0x7eb900
list = 0x8cc940
---Type <return> to continue, or q <return> to quit---
node = 0x8cc940
recurse_mode = <optimized out>
window = <optimized out>
#39 0x00007ffff6dd3474 in ?? ()
from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
No symbol table info available.
#40 0x00007ffff6ded057 in g_signal_emit_valist ()
from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
No symbol table info available.
#41 0x00007ffff6dedefa in g_signal_emit_by_name ()
from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
No symbol table info available.
#42 0x00007ffff34ab08a in gdk_frame_clock_paint_idle (data=0x118b350)
at /build/buildd/gtk+3.0-3.12.2/./gdk/gdkframeclockidle.c:430
clock = 0x118b350
clock_idle = 0x118b350
priv = 0x118b270
skip_to_resume_events = 0
timings = 0x1b36860
#43 0x00007ffff349d278 in gdk_threads_dispatch (data=0x1b120a0)
at /build/buildd/gtk+3.0-3.12.2/./gdk/gdk.c:655
dispatch = 0x1b120a0
ret = 0
---Type <return> to continue, or q <return> to quit---
#44 0x00007ffff6afe613 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
No symbol table info available.
#45 0x00007ffff6afdb6d in g_main_context_dispatch ()
from /lib/x86_64-linux-gnu/libglib-2.0.so.0
No symbol table info available.
#46 0x00007ffff6afdf48 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
No symbol table info available.
#47 0x00007ffff6afdffc in g_main_context_iteration ()
from /lib/x86_64-linux-gnu/libglib-2.0.so.0
No symbol table info available.
#48 0x00007ffff1a151bc in g_application_run ()
from /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0
No symbol table info available.
#49 0x00007ffff7ad3c65 in rb_application_run ()
from /usr/lib/librhythmbox-core.so.8
No symbol table info available.
#50 0x0000000000400d3a in main ()
No symbol table info available.
(gdb)
Version of libcairo is 1.13.0~20140204-0ubuntu1 from the official 14.10 repos.
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.