Author: cazfi
Date: Fri Jan  9 05:44:36 2015
New Revision: 27585

URL: http://svn.gna.org/viewcvs/freeciv?rev=27585&view=rev
Log:
Handle SDL_TEXTINPUT for sdl2-client edit widgets.

See patch #4766

Modified:
    branches/S2_6/client/gui-sdl2/cma_fe.c
    branches/S2_6/client/gui-sdl2/gui_main.c
    branches/S2_6/client/gui-sdl2/gui_main.h
    branches/S2_6/client/gui-sdl2/repodlgs.c
    branches/S2_6/client/gui-sdl2/widget_edit.c
    branches/S2_6/client/gui-sdl2/widget_scrollbar.c
    branches/S2_6/client/gui-sdl2/widget_window.c

Modified: branches/S2_6/client/gui-sdl2/cma_fe.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/gui-sdl2/cma_fe.c?rev=27585&r1=27584&r2=27585&view=diff
==============================================================================
--- branches/S2_6/client/gui-sdl2/cma_fe.c      (original)
+++ branches/S2_6/client/gui-sdl2/cma_fe.c      Fri Jan  9 05:44:36 2015
@@ -162,7 +162,7 @@
     MOVE_STEP_Y = 0;
     /* Filter mouse motion events */
     SDL_SetEventFilter(FilterMouseMotionEvents, NULL);
-    gui_event_loop((void *)(&pMotion), NULL, NULL, NULL, NULL,
+    gui_event_loop((void *)(&pMotion), NULL, NULL, NULL, NULL, NULL,
                    scroll_mouse_button_up, scroll_mouse_motion_handler);
     /* Turn off Filter mouse motion events */
     SDL_SetEventFilter(NULL, NULL);
@@ -201,7 +201,7 @@
     MOVE_STEP_Y = 0;
     /* Filter mouse motion events */
     SDL_SetEventFilter(FilterMouseMotionEvents, NULL);
-    gui_event_loop((void *)(&pMotion), NULL, NULL, NULL, NULL,
+    gui_event_loop((void *)(&pMotion), NULL, NULL, NULL, NULL, NULL,
                    scroll_mouse_button_up, scroll_mouse_motion_handler);
     /* Turn off Filter mouse motion events */
     SDL_SetEventFilter(NULL, NULL);

Modified: branches/S2_6/client/gui-sdl2/gui_main.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/gui-sdl2/gui_main.c?rev=27585&r1=27584&r2=27585&view=diff
==============================================================================
--- branches/S2_6/client/gui-sdl2/gui_main.c    (original)
+++ branches/S2_6/client/gui-sdl2/gui_main.c    Fri Jan  9 05:44:36 2015
@@ -512,12 +512,16 @@
   SDL2-client main loop.
 **************************************************************************/
 Uint16 gui_event_loop(void *pData,
-       void (*loop_action)(void *pData),
-       Uint16 (*key_down_handler)(SDL_Keysym Key, void *pData),
-       Uint16 (*key_up_handler)(SDL_Keysym Key, void *pData),
-       Uint16 (*mouse_button_down_handler)(SDL_MouseButtonEvent *pButtonEvent, 
void *pData),
-       Uint16 (*mouse_button_up_handler)(SDL_MouseButtonEvent *pButtonEvent, 
void *pData),
-       Uint16 (*mouse_motion_handler)(SDL_MouseMotionEvent *pMotionEvent, void 
*pData))
+                      void (*loop_action)(void *pData),
+                      Uint16 (*key_down_handler)(SDL_Keysym Key, void *pData),
+                      Uint16 (*key_up_handler)(SDL_Keysym Key, void *pData),
+                      Uint16 (*textinput_handler)(char *text, void *pData),
+                      Uint16 (*mouse_button_down_handler)(SDL_MouseButtonEvent 
*pButtonEvent,
+                                                          void *pData),
+                      Uint16 (*mouse_button_up_handler)(SDL_MouseButtonEvent 
*pButtonEvent,
+                                                        void *pData),
+                      Uint16 (*mouse_motion_handler)(SDL_MouseMotionEvent 
*pMotionEvent,
+                                                     void *pData))
 {
   Uint16 ID;
   static struct timeval tv;
@@ -676,6 +680,12 @@
           }
         break;
 
+        case SDL_TEXTINPUT:
+          if (textinput_handler) {
+            ID = textinput_handler(Main.event.text.text, pData);
+          }
+        break;
+
         case SDL_MOUSEBUTTONDOWN:
           if (mouse_button_down_handler) {
             ID = mouse_button_down_handler(&Main.event.button, pData);
@@ -963,7 +973,7 @@
   set_client_state(C_S_DISCONNECTED);
 
   /* Main game loop */
-  gui_event_loop(NULL, NULL, main_key_down_handler, main_key_up_handler,
+  gui_event_loop(NULL, NULL, main_key_down_handler, main_key_up_handler, NULL,
                  main_mouse_button_down_handler, main_mouse_button_up_handler,
                  main_mouse_motion_handler);
 }

Modified: branches/S2_6/client/gui-sdl2/gui_main.h
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/gui-sdl2/gui_main.h?rev=27585&r1=27584&r2=27585&view=diff
==============================================================================
--- branches/S2_6/client/gui-sdl2/gui_main.h    (original)
+++ branches/S2_6/client/gui-sdl2/gui_main.h    Fri Jan  9 05:44:36 2015
@@ -92,11 +92,15 @@
 int FilterMouseMotionEvents(void *data, SDL_Event *event);
 
 Uint16 gui_event_loop(void *pData, void (*loop_action)(void *pData),
-       Uint16 (*key_down_handler)(SDL_Keysym Key, void *pData),
-        Uint16 (*key_up_handler)(SDL_Keysym Key, void *pData),
-       Uint16 (*mouse_button_down_handler)(SDL_MouseButtonEvent *pButtonEvent, 
void *pData),
-        Uint16 (*mouse_button_up_handler)(SDL_MouseButtonEvent *pButtonEvent, 
void *pData),
-        Uint16 (*mouse_motion_handler)(SDL_MouseMotionEvent *pMotionEvent, 
void *pData));
+                      Uint16 (*key_down_handler)(SDL_Keysym Key, void *pData),
+                      Uint16 (*key_up_handler)(SDL_Keysym Key, void *pData),
+                      Uint16 (*textinput_handler)(char *text, void *pData),
+                      Uint16 (*mouse_button_down_handler)(SDL_MouseButtonEvent 
*pButtonEvent,
+                                                          void *pData),
+                      Uint16 (*mouse_button_up_handler)(SDL_MouseButtonEvent 
*pButtonEvent,
+                                                        void *pData),
+                      Uint16 (*mouse_motion_handler)(SDL_MouseMotionEvent 
*pMotionEvent,
+                                                     void *pData));
 
 /* shrink sizes for 320x240 screen */
 #ifdef SMALL_SCREEN

Modified: branches/S2_6/client/gui-sdl2/repodlgs.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/gui-sdl2/repodlgs.c?rev=27585&r1=27584&r2=27585&view=diff
==============================================================================
--- branches/S2_6/client/gui-sdl2/repodlgs.c    (original)
+++ branches/S2_6/client/gui-sdl2/repodlgs.c    Fri Jan  9 05:44:36 2015
@@ -1337,7 +1337,7 @@
     MOVE_STEP_Y = 0;
     /* Filter mouse motion events */
     SDL_SetEventFilter(FilterMouseMotionEvents, NULL);
-    gui_event_loop((void *)(&pMotion), NULL, NULL, NULL, NULL,
+    gui_event_loop((void *)(&pMotion), NULL, NULL, NULL, NULL, NULL,
                    report_scroll_mouse_button_up,
                    report_scroll_mouse_motion_handler);
     /* Turn off Filter mouse motion events */

Modified: branches/S2_6/client/gui-sdl2/widget_edit.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/gui-sdl2/widget_edit.c?rev=27585&r1=27584&r2=27585&view=diff
==============================================================================
--- branches/S2_6/client/gui-sdl2/widget_edit.c (original)
+++ branches/S2_6/client/gui-sdl2/widget_edit.c Fri Jan  9 05:44:36 2015
@@ -552,64 +552,73 @@
       }
     }
     break;
-    default:
-    {
-
-      /* add new element of chain (and move cursor right) */
-      if (pEdt->pInputChain != pEdt->pBeginTextChain) {
-        pInputChain_TMP = pEdt->pInputChain->prev;
-        pEdt->pInputChain->prev = fc_calloc(1, sizeof(struct UniChar));
-        pEdt->pInputChain->prev->next = pEdt->pInputChain;
-        pEdt->pInputChain->prev->prev = pInputChain_TMP;
-        pInputChain_TMP->next = pEdt->pInputChain->prev;
-      } else {
-        pEdt->pInputChain->prev = fc_calloc(1, sizeof(struct UniChar));
-        pEdt->pInputChain->prev->next = pEdt->pInputChain;
-        pEdt->pBeginTextChain = pEdt->pInputChain->prev;
-      }
-
-      if (LSHIFT || RSHIFT) {
-        pEdt->pInputChain->prev->chr[0] = toupper(key.sym);
-      } else {
-        pEdt->pInputChain->prev->chr[0] = key.sym;
-      }
-      pEdt->pInputChain->prev->chr[1] = '\0';
-
-      if (pEdt->pInputChain->prev->chr) {
-        if (get_wflags(pEdt->pWidget) & WF_PASSWD_EDIT) {
-          Uint16 passwd_chr[2] = {'*', '\0'};
-
-          pEdt->pInputChain->prev->pTsurf =
-            TTF_RenderUNICODE_Blended(pEdt->pWidget->string16->font,
-                                      passwd_chr,
-                                      pEdt->pWidget->string16->fgcol);
-        } else {
-          pEdt->pInputChain->prev->pTsurf =
-            TTF_RenderUNICODE_Blended(pEdt->pWidget->string16->font,
-                                      pEdt->pInputChain->prev->chr,
-                                      pEdt->pWidget->string16->fgcol);
-        }
-        pEdt->Truelength += pEdt->pInputChain->prev->pTsurf->w;
-      }
-
-      if (pEdt->InputChain_X >= pEdt->pWidget->size.x + pEdt->pBg->w - 
adj_size(10)) {
-        if (pEdt->pInputChain == pEdt->pEndTextChain) {
-          pEdt->Start_X = pEdt->pBg->w - adj_size(5) - pEdt->Truelength;
-        } else {
-          pEdt->Start_X -= pEdt->pInputChain->prev->pTsurf->w -
-            (pEdt->pWidget->size.x + pEdt->pBg->w - adj_size(5) - 
pEdt->InputChain_X);
-        }
-      }
-
-      pEdt->ChainLen++;
-      Redraw = TRUE;
-    }
+  default:
     break;
   } /* key pressed switch */
 
   if (Redraw) {
     redraw_edit_chain(pEdt);
   }
+
+  return ID_ERROR;
+}
+
+/**************************************************************************
+  Handle textinput strings coming to the edit widget
+**************************************************************************/
+static Uint16 edit_textinput(char *text, void *pData)
+{
+  struct EDIT *pEdt = (struct EDIT *)pData;
+  struct UniChar *pInputChain_TMP;
+  int i;
+
+  for (i = 0; text[i] != '\0'; i++) {
+    /* add new element of chain (and move cursor right) */
+    if (pEdt->pInputChain != pEdt->pBeginTextChain) {
+      pInputChain_TMP = pEdt->pInputChain->prev;
+      pEdt->pInputChain->prev = fc_calloc(1, sizeof(struct UniChar));
+      pEdt->pInputChain->prev->next = pEdt->pInputChain;
+      pEdt->pInputChain->prev->prev = pInputChain_TMP;
+      pInputChain_TMP->next = pEdt->pInputChain->prev;
+    } else {
+      pEdt->pInputChain->prev = fc_calloc(1, sizeof(struct UniChar));
+      pEdt->pInputChain->prev->next = pEdt->pInputChain;
+      pEdt->pBeginTextChain = pEdt->pInputChain->prev;
+    }
+
+    pEdt->pInputChain->prev->chr[0] = text[i];
+    pEdt->pInputChain->prev->chr[1] = '\0';
+
+    if (pEdt->pInputChain->prev->chr) {
+      if (get_wflags(pEdt->pWidget) & WF_PASSWD_EDIT) {
+        Uint16 passwd_chr[2] = {'*', '\0'};
+
+        pEdt->pInputChain->prev->pTsurf =
+          TTF_RenderUNICODE_Blended(pEdt->pWidget->string16->font,
+                                    passwd_chr,
+                                    pEdt->pWidget->string16->fgcol);
+      } else {
+        pEdt->pInputChain->prev->pTsurf =
+          TTF_RenderUNICODE_Blended(pEdt->pWidget->string16->font,
+                                    pEdt->pInputChain->prev->chr,
+                                    pEdt->pWidget->string16->fgcol);
+      }
+      pEdt->Truelength += pEdt->pInputChain->prev->pTsurf->w;
+    }
+
+    if (pEdt->InputChain_X >= pEdt->pWidget->size.x + pEdt->pBg->w - 
adj_size(10)) {
+      if (pEdt->pInputChain == pEdt->pEndTextChain) {
+        pEdt->Start_X = pEdt->pBg->w - adj_size(5) - pEdt->Truelength;
+      } else {
+        pEdt->Start_X -= pEdt->pInputChain->prev->pTsurf->w -
+          (pEdt->pWidget->size.x + pEdt->pBg->w - adj_size(5) - 
pEdt->InputChain_X);
+      }
+    }
+
+    pEdt->ChainLen++;
+  }
+
+  redraw_edit_chain(pEdt);
 
   return ID_ERROR;
 }
@@ -720,7 +729,7 @@
   {
     /* local loop */  
     Uint16 rety = gui_event_loop((void *)&pEdt, NULL,
-                                 edit_key_down, NULL,
+                                 edit_key_down, NULL, edit_textinput,
                                  edit_mouse_button_down, NULL, NULL);
 
     if (pEdt.pBeginTextChain == pEdt.pEndTextChain) {

Modified: branches/S2_6/client/gui-sdl2/widget_scrollbar.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/gui-sdl2/widget_scrollbar.c?rev=27585&r1=27584&r2=27585&view=diff
==============================================================================
--- branches/S2_6/client/gui-sdl2/widget_scrollbar.c    (original)
+++ branches/S2_6/client/gui-sdl2/widget_scrollbar.c    Fri Jan  9 05:44:36 2015
@@ -1082,7 +1082,7 @@
   pDown.pVscroll = pVscroll;
 
   gui_event_loop((void *)&pDown, inside_scroll_down_loop,
-                 NULL, NULL, NULL, scroll_mouse_button_up, NULL);
+                 NULL, NULL, NULL, NULL, scroll_mouse_button_up, NULL);
 
   return pDown.pBegin;
 }
@@ -1104,7 +1104,7 @@
   pUp.pVscroll = pVscroll;
 
   gui_event_loop((void *)&pUp, inside_scroll_up_loop,
-                 NULL, NULL, NULL, scroll_mouse_button_up, NULL);
+                 NULL, NULL, NULL, NULL, scroll_mouse_button_up, NULL);
 
   return pUp.pBegin;
 }
@@ -1132,7 +1132,7 @@
   MOVE_STEP_Y = 3;
   /* Filter mouse motion events */
   SDL_SetEventFilter(FilterMouseMotionEvents, NULL);
-  gui_event_loop((void *)&pMotion, NULL, NULL, NULL, NULL,
+  gui_event_loop((void *)&pMotion, NULL, NULL, NULL, NULL, NULL,
                  scroll_mouse_button_up, scroll_mouse_motion_handler);
   /* Turn off Filter mouse motion events */
   SDL_SetEventFilter(NULL, NULL);

Modified: branches/S2_6/client/gui-sdl2/widget_window.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/gui-sdl2/widget_window.c?rev=27585&r1=27584&r2=27585&view=diff
==============================================================================
--- branches/S2_6/client/gui-sdl2/widget_window.c       (original)
+++ branches/S2_6/client/gui-sdl2/widget_window.c       Fri Jan  9 05:44:36 2015
@@ -355,7 +355,7 @@
   SDL_GetMouseState(&pMove.prev_x, &pMove.prev_y);
   /* Filter mouse motion events */
   SDL_SetEventFilter(FilterMouseMotionEvents, NULL);
-  ret = (gui_event_loop((void *)&pMove, NULL, NULL, NULL, NULL,
+  ret = (gui_event_loop((void *)&pMove, NULL, NULL, NULL, NULL, NULL,
          move_window_button_up, move_window_motion) == ID_MOVED_WINDOW);
   /* Turn off Filter mouse motion events */
   SDL_SetEventFilter(NULL, NULL);


_______________________________________________
Freeciv-commits mailing list
Freeciv-commits@gna.org
https://mail.gna.org/listinfo/freeciv-commits

Reply via email to