TitleHTML5 "autofocus" tag for input element in dillo
Authorrodarima
CreatedThu, 21 Dec 2023 11:43:16 +0000
State open

We may want to integrate a patch to support autofocus from https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1033320 :

The attached patch adds support for HTML5's autofocus tag to Dillo: this allows to automatically focus certain input fields as soon as the page with the form loads. We're using this to implement a barcode scanner on a raspberry pi 3, so that the browser is immediately ready to scan, without a need to touch into the input field first.

Here is the diff:

diff -ur dillo-3.0.5.orig/dw/fltkplatform.cc dillo-3.0.5/dw/fltkplatform.cc
--- dillo-3.0.5.orig/dw/fltkplatform.cc	2015-06-10 23:48:53.000000000 +0200
+++ dillo-3.0.5/dw/fltkplatform.cc	2023-03-18 12:41:21.910464773 +0100
@@ -370,6 +370,10 @@
 {
 }
 
+void FltkView::focusFltkWidget (Fl_Widget *widget)
+{
+}
+
 void FltkView::allocateFltkWidget (Fl_Widget *widget,
                                    core::Allocation *allocation)
 {
diff -ur dillo-3.0.5.orig/dw/fltkplatform.hh dillo-3.0.5/dw/fltkplatform.hh
--- dillo-3.0.5.orig/dw/fltkplatform.hh	2015-06-30 16:06:08.000000000 +0200
+++ dillo-3.0.5/dw/fltkplatform.hh	2023-03-18 12:46:12.542094720 +0100
@@ -86,6 +86,7 @@
    virtual void allocateFltkWidget (Fl_Widget *widget,
                                     core::Allocation *allocation);
    virtual void drawFltkWidget (Fl_Widget *widget, core::Rectangle *area);
+   virtual void focusFltkWidget (Fl_Widget *widget);
 };
 
 
diff -ur dillo-3.0.5.orig/dw/fltkui.cc dillo-3.0.5/dw/fltkui.cc
--- dillo-3.0.5.orig/dw/fltkui.cc	2015-06-30 16:06:08.000000000 +0200
+++ dillo-3.0.5/dw/fltkui.cc	2023-03-18 12:33:36.914259944 +0100
@@ -460,6 +460,11 @@
    this->view = NULL;
 }
 
+void FltkResource::focus ()
+{
+    view->focusFltkWidget (widget);
+}
+	
 void FltkResource::sizeAllocate (core::Allocation *allocation)
 {
    this->allocation = *allocation;
@@ -574,6 +579,11 @@
    FltkResource::setEnabled (enabled);
 }
 
+template <class I> void FltkSpecificResource<I>::focus ()
+{
+   FltkResource::focus ();
+}
+	
 // ----------------------------------------------------------------------
 
 class EnterButton : public Fl_Button {
diff -ur dillo-3.0.5.orig/dw/fltkui.hh dillo-3.0.5/dw/fltkui.hh
--- dillo-3.0.5.orig/dw/fltkui.hh	2015-06-30 16:06:09.000000000 +0200
+++ dillo-3.0.5/dw/fltkui.hh	2023-03-18 12:38:41.898264236 +0100
@@ -217,6 +217,8 @@
 
    bool isEnabled ();
    void setEnabled (bool enabled);
+
+   void focus ();
 };
 
 
@@ -232,6 +234,8 @@
 
    bool isEnabled ();
    void setEnabled (bool enabled);
+
+   void focus ();
 };
 
 
diff -ur dillo-3.0.5.orig/dw/fltkviewbase.cc dillo-3.0.5/dw/fltkviewbase.cc
--- dillo-3.0.5.orig/dw/fltkviewbase.cc	2015-06-30 16:06:09.000000000 +0200
+++ dillo-3.0.5/dw/fltkviewbase.cc	2023-03-18 12:18:12.234001790 +0100
@@ -711,6 +711,12 @@
    add (widget);
 }
 
+void FltkWidgetView::focusFltkWidget (Fl_Widget *widget)
+{
+	focused_child=widget;
+	widget->take_focus();
+}
+
 void FltkWidgetView::removeFltkWidget (Fl_Widget *widget)
 {
    remove (widget);
diff -ur dillo-3.0.5.orig/dw/fltkviewbase.hh dillo-3.0.5/dw/fltkviewbase.hh
--- dillo-3.0.5.orig/dw/fltkviewbase.hh	2015-06-30 16:06:09.000000000 +0200
+++ dillo-3.0.5/dw/fltkviewbase.hh	2023-03-18 12:39:07.514936690 +0100
@@ -132,6 +132,7 @@
    void allocateFltkWidget (Fl_Widget *widget,
                             core::Allocation *allocation);
    void drawFltkWidget (Fl_Widget *widget, core::Rectangle *area);
+   void focusFltkWidget (Fl_Widget *widget);
 };
 
 } // namespace fltk
diff -ur dillo-3.0.5.orig/dw/ui.cc dillo-3.0.5/dw/ui.cc
--- dillo-3.0.5.orig/dw/ui.cc	2015-06-30 16:06:09.000000000 +0200
+++ dillo-3.0.5/dw/ui.cc	2023-03-18 12:41:55.403344022 +0100
@@ -223,6 +223,10 @@
 {
 }
 
+void Resource::focus ()
+{
+}
+	
 void Resource::emitEnter ()
 {
    activateEmitter.emitEnter(this);
diff -ur dillo-3.0.5.orig/dw/ui.hh dillo-3.0.5/dw/ui.hh
--- dillo-3.0.5.orig/dw/ui.hh	2015-06-30 16:06:09.000000000 +0200
+++ dillo-3.0.5/dw/ui.hh	2023-03-18 12:33:20.465828321 +0100
@@ -347,6 +347,8 @@
    virtual bool isEnabled () = 0;
    virtual void setEnabled (bool enabled) = 0;
 
+   virtual void focus () = 0;
+
    inline void connectActivate (ActivateReceiver *receiver) {
       activateEmitter.connectActivate (receiver); }
    inline void connectClicked (ClickedReceiver *receiver) {
diff -ur dillo-3.0.5.orig/src/form.cc dillo-3.0.5/src/form.cc
--- dillo-3.0.5.orig/src/form.cc	2015-06-30 16:06:09.000000000 +0200
+++ dillo-3.0.5/src/form.cc	2023-03-18 12:40:04.192424547 +0100
@@ -431,7 +431,7 @@
    DilloHtmlInputType inp_type;
    Resource *resource = NULL;
    Embed *embed = NULL;
-   char *value, *name, *type, *init_str, *placeholder = NULL;
+   char *value, *name, *type, *init_str, *placeholder = NULL, *autofocus;
    const char *attrbuf, *label;
    bool init_val = false;
    ResourceFactory *factory;
@@ -451,6 +451,7 @@
    value = a_Html_get_attr_wdef(html, tag, tagsize, "value", NULL);
    name = a_Html_get_attr_wdef(html, tag, tagsize, "name", NULL);
    type = a_Html_get_attr_wdef(html, tag, tagsize, "type", "");
+   autofocus = a_Html_get_attr_wdef(html, tag, tagsize, "autofocus", NULL);
 
    init_str = NULL;
    inp_type = DILLO_HTML_INPUT_UNKNOWN;
@@ -541,6 +542,9 @@
    if (resource)
       embed = new Embed (resource);
 
+   if (resource && autofocus)
+      resource->focus();
+
    if (inp_type != DILLO_HTML_INPUT_UNKNOWN) {
       Html_add_input(html, inp_type, embed, name,
                      (init_str) ? init_str : "", init_val);