So, well-known solutions no longer work on 1.9+, so I prepared an alternative that adds WYSIWYG, but uses an alternative editor.
I used this editor:
https://alex-d.imtqy.com/Trumbowyg/
while the final result is as follows:

STEP 1: Download the editor files and follow the steps in the adminhtml skin area:
In my example, I placed them in skin/adminhtml/default/js/wysiwyg

STEP 2. In your module, you need to determine the update of the administrator layout, and in your adminhtml layout file add directives for loading library files (and jquery)
Since I wanted this to be displayed only with editing CMS pages, I added through the appropriate descriptor:
<adminhtml_cms_page_edit> <reference name="head"> <action method="addJs"> <script>lib/jquery/jquery-1.12.0.js</script> </action> <action method="addJs"> <script>lib/jquery/noconflict.js</script> </action> <action method="addItem"><type>skin_js</type><name>js/wysiwyg/trumbowyg.min.js</name></action> <action method="addItem"><type>skin_css</type><name>js/wysiwyg/ui/trumbowyg.min.css</name></action> </reference> </adminhtml_cms_page_edit>
STEP 3. Create a new widget class to render the element:
In my example, I placed this module under BLOCKS
This basically takes the xml element defined by the widgets and wraps it on the textarea element and then attaches the necessary javascript (jquery) to initialize the wysiwyg editor.
You will see that thw options are passed to the editor defined in $ options
<?php class ProxiBlue_Landingpage_Block_Widgets_Wysiwyg extends Mage_Adminhtml_Block_Widget_Form_Renderer_Fieldset_Element { public function render(Varien_Data_Form_Element_Abstract $element) { $textarea = new Varien_Data_Form_Element_Textarea(); $textarea->setForm($element->getForm()) ->setId($element->getHtmlId()) ->setName($element->getName()) ->setLabel($element->getLabel()) ->setClass('widget-option input-area input-text'); if ($element->getRequired()) { $textarea->addClass('required-entry'); } if ($element->getValue()) { $textarea->setValue($element->getValue()); } $options = "btns: ['viewHTML', 'strong', 'em', 'del', 'undo', 'redo', 'formatting', 'superscript', 'subscript', 'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull', 'unorderedList', 'orderedList', 'horizontalRule', 'fullscreen'], semantic: true, removeformatPasted: true, autogrow: false"; $textarea->setData('after_element_html', "<script>jQuery(document).ready( function() { jQuery(" . $element->getHtmlId() .").trumbowyg({ " . $options . " }) .on('tbwblur', function(){ var html = jQuery(this).trumbowyg('html'); html = html.replace(/\"/g, '"'); jQuery(this).trumbowyg('html', html); }); });</script>"); $html = parent::render($textarea); return $html; } }
Here you can also mark this snippet:
.on('tbwblur', function(){ var html = jQuery(this).trumbowyg('html'); html = html.replace(/\"/g, '"'); jQuery(this).trumbowyg('html', html); });
The goal here is to change any double quotes (") to the corresponding html " object. This is done to prevent the storage of text data in widget parameters enclosed in double quotes.
Step 4: Define the widget element:
<text_blurb translate="label"> <sort_order>50</sort_order> <label>Textual Content</label> <visible>1</visible> <required>1</required> <type>landingpage/widgets_wysiwyg</type> </text_blurb>
Done.
Hope this is useful to someone.