<div dir="ltr"><div dir="ltr"><div>A Theme is a base class object that is created and customized as ThemeName.</div><div>It is constructed during program initialization in a theme plugin PluginTClient,</div><div>defined in a plugins/theme_name source directory.<br></div><div><br></div><div>theme_name.C and theme_name.h are derived "Theme" class object constructors.</div><div>A Theme is constructed during initialization in init_theme (mwindow.C).  The theme</div><div> plugin is accessed using the "name" from preferences, and that theme plugin is loaded,</div><div>and it contains the code to construct that theme.  A Theme object has functions and data</div><div>that cinelerra uses to do a variety of customizations, such as default_window_positions,</div><div>and it can modify gui defaults, like default_text_color, when it is initialized.  The theme</div><div>plugin contains a "new_theme" function, that allocates and constructs a ThemeName</div><div>object, with a base classes of BC_Theme (gui setup), Theme (cin defaults), and</div><div>ThemeName, with definitions and overrides that create the custom theme.</div><div><br></div><div>To create a new theme, a new plugin is needed:</div><div>==== Code:<br></div><span style="font-family:monospace"><font size="1"><br></font></span><div style="margin-left:40px"><span style="font-family:monospace"><font size="1">#include "header files.h"</font></span></div><div style="margin-left:40px"><span style="font-family:monospace"><font size="1">PluginClient* new_plugin(PluginServer *server)</font></span><br><span style="font-family:monospace"><font size="1">{</font></span><br><span style="font-family:monospace"><font size="1">        return new NameMain(server);</font></span><br><span style="font-family:monospace">}</span><br><span style="font-family:monospace"></span><br><span style="font-family:monospace"><font size="1">NameMain::NameMain(PluginServer *server)</font></span><br><span style="font-family:monospace"><font size="1"> : PluginTClient(server)</font></span><br><span style="font-family:monospace"><font size="1">{</font></span><br><span style="font-family:monospace"><font size="1">}</font></span><br><span style="font-family:monospace"></span><br><span style="font-family:monospace"><font size="1">NameMain::~NameMain()</font></span><br><span style="font-family:monospace"><font size="1">{</font></span><br><span style="font-family:monospace"><font size="1">}</font></span><br><span style="font-family:monospace"><font size="1">const char* NameMain::plugin_title() { return N_("Name"); }</font></span><br><span style="font-family:monospace"></span><br><span style="font-family:monospace"><font size="1">Theme* NameMain::new_theme()</font></span><br><span style="font-family:monospace"><font size="1">{</font></span><br><span style="font-family:monospace"><font size="1">        theme = new ThemeName;</font></span><br><span style="font-family:monospace"><font size="1">        extern unsigned char _binary_theme_name_data_start[];</font></span><br><span style="font-family:monospace"><font size="1">        theme->set_data(_binary_theme_name_data_start);</font></span><br><span style="font-family:monospace"><font size="1">        return theme;</font></span><br><span style="font-family:monospace"><font size="1">}</font></span><br><span style="font-family:monospace"></span><br><span style="font-family:monospace"><font size="1">Name::Name()</font></span><br></div><div style="margin-left:40px"><span style="font-family:monospace"></span></div><div style="margin-left:40px"><span style="font-family:monospace"><font size="1"> : Theme()</font></span><br><span style="font-family:monospace"><font size="1">{</font></span><br><span style="font-family:monospace"><font size="1">}</font></span><br><span style="font-family:monospace"></span><br><span style="font-family:monospace"><font size="1">Name::~Name()</font></span><br><span style="font-family:monospace"><font size="1">{</font></span></div><div style="margin-left:40px"><span style="font-family:monospace"><font size="1">        delete stuff;</font></span></div><div style="margin-left:40px"><span style="font-family:monospace"><font size="1">}</font></span></div><span style="font-family:monospace"></span><div><font size="2"><span style="font-family:arial,sans-serif"><br></span></font></div><div><font size="1"><font size="2"><span style="font-family:arial,sans-serif">When a theme is constructed by NameMain::new_theme(), </span>it sets a pointer to a</font></font></div><div><font size="1"><font size="2">block of data created in the plugin build that contains all of the png data files in the</font></font></div><div><font size="1"><font size="2">plugins/theme_name/data directory.  These images may define or override the</font></font></div><div><font size="1"><font size="2">appearance of gui images, such as "ok.png" (the ok button).  There are usually</font></font></div><div><font size="1"><font size="2">a large number of images that need to be defined.  The theme plugin adds them<br></font></font></div><div><font size="1"><font size="2">to the theme image data in the theme->initialize() function.  The best list</font></font></div><div><font size="1"><font size="2">of theme image setup is probably in SUV (plugins/theme_suv/suv.[Ch]).</font></font></div><div><font size="1"><font size="2"><br></font></font></div><div><font size="1"><font size="2">The easy way to create a new theme is to copy an existing theme and change its</font></font></div><div><font size="1"><font size="2">name to ThemeName, and be sure to change <span style="font-family:arial,sans-serif">plugin_title() to the new name,</span></font></font></div><div><font size="1"><font size="2"><span style="font-family:arial,sans-serif">then tweak the definitions until you are happy with the results.   The file names</span></font></font></div><div><font size="1"><font size="2"><span style="font-family:arial,sans-serif">and Makefile also need to be updated to the new theme "name".  The source<br></span></font></font></div><div><font size="1"><font size="2"><span style="font-family:arial,sans-serif">can by manually re/built by invoking make in the plugins/theme_name directory.</span></font></font></div><div><font size="1"><font size="2"><span style="font-family:arial,sans-serif">Once it is built into the plugin library, i</span></font></font><font size="1"><font size="2"><span style="font-family:arial,sans-serif">t will be discovered by the plugin probe,</span></font></font></div><div><font size="1"><font size="2"><span style="font-family:arial,sans-serif">and it will become an available theme in the preferences.<br></span></font></font></div><div><font size="1"><font size="2"><span style="font-family:arial,sans-serif"></span></font></font><br></div><div><font size="1"><font size="2"><span style="font-family:arial,sans-serif">If you are ready to add it to the main build, then theme_name should be included</span></font></font></div><div><font size="1"><font size="2"><span style="font-family:arial,sans-serif">in the DIRS targets of the plugins/Makefile, and the plugin_defs needs theme_name</span></font></font></div><div><font size="1"><font size="2"><span style="font-family:arial,sans-serif">in the themes list.</span></font></font></div><div><font size="1"><font size="2"><span style="font-family:arial,sans-serif"><br></span></font></font></div><div><font size="1"><font size="2"><span style="font-family:arial,sans-serif">Themes usually require considerable time to create from scratch.  For example,</span></font></font></div><div><font size="1"><font size="2"><span style="font-family:arial,sans-serif">the SUV theme has over 800 lines in the initialize function, and has over 500</span></font></font></div><div><font size="1"><font size="2"><span style="font-family:arial,sans-serif">png images in the data directory.  Most of these images and data values are</span></font></font></div><div><font size="1"><font size="2"><span style="font-family:arial,sans-serif">required to be initialized by the custom theme constructor; very tedious and</span></font></font></div><div><font size="1"><font size="2"><span style="font-family:arial,sans-serif">time consuming work.  Creating a new theme is usually a lot of work.<br></span></font></font></div><div><font size="1"><font size="2"><span style="font-family:arial,sans-serif"><br></span></font></font></div></div><div>gg</div><div><br></div><div><div><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Sep 10, 2020 at 11:06 AM Andrew Randrianasulu via Cin <<a href="mailto:cin@lists.cinelerra-gg.org">cin@lists.cinelerra-gg.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi, all!<br>
<br>
User asked me how to make new themes for CinelerraGG. While I was unable to answer this question, I at least tried few themes more, and found theme "Bright" to have  too-coloriful (IMO, for mostly-b/w theme) icon for 'locklablels'. I tried to GIMP them into something acceptable, but I literally can't make straight line (checkmark for activated icon) even with automatic line drawing!<br>
<br>
Attached are png files I de-colorized. I uncheked all of 'exif' stuff in GIMP"s png export dialog - this made files smaller, and I also run 'optipng' over them, and compile-tested them:<br>
<br>
<br>
root@slax:/dev/shm/tmp/cinelerra-goodguy-20200905/cinelerra-5.1/plugins/theme_bright# make clean && make        <br>
<br>
cp ../../bin/plugins/themes/theme_bright.plugin /usr/lib/cin/plugins/themes/<br>
<br>
cin launched without libpng's CRC errors (I had some if I left GIMP to write exif to png, as it did by default). And those icons kinda ..less-coloriful now.<br>
<br>
I think artistic user can start from copying existing theme and just modifying icons one by one, but what to do with hypothetical mytheme_theme.c and h  files? They can remain the same if line colors not changed?<br>
-- <br>
Cin mailing list<br>
<a href="mailto:Cin@lists.cinelerra-gg.org" target="_blank">Cin@lists.cinelerra-gg.org</a><br>
<a href="https://lists.cinelerra-gg.org/mailman/listinfo/cin" rel="noreferrer" target="_blank">https://lists.cinelerra-gg.org/mailman/listinfo/cin</a><br>
</blockquote></div></div></div></div>