/**************************************************************************** * apps/examples/nxtext/nxtext_popup.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "nxtext_internal.h" /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ #define NBM_CACHE 8 #define NGLYPH_CACHE 8 /**************************************************************************** * Private Types ****************************************************************************/ /**************************************************************************** * Private Function Prototypes ****************************************************************************/ static void nxpu_redraw(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect, bool morem, FAR void *arg); static void nxpu_position(NXWINDOW hwnd, FAR const struct nxgl_size_s *size, FAR const struct nxgl_point_s *pos, FAR const struct nxgl_rect_s *bounds, FAR void *arg); #ifdef CONFIG_NX_XYINPUT static void nxpu_mousein(NXWINDOW hwnd, FAR const struct nxgl_point_s *pos, uint8_t buttons, FAR void *arg); #endif #ifdef CONFIG_NX_KBD static void nxpu_kbdin(NXWINDOW hwnd, uint8_t nch, FAR const uint8_t *ch, FAR void *arg); #endif /**************************************************************************** * Private Data ****************************************************************************/ /* Pop-up NX callbacks */ static const struct nx_callback_s g_pucb = { nxpu_redraw, /* redraw */ nxpu_position /* position */ #ifdef CONFIG_NX_XYINPUT , nxpu_mousein /* mousein */ #endif #ifdef CONFIG_NX_KBD , nxpu_kbdin /* kbdin */ #endif , NULL /* event */ }; /* Pop-up state information */ static struct nxtext_state_s g_pustate; #ifdef CONFIG_NX_KBD static struct nxtext_bitmap_s g_pubm[NBM_CACHE]; static struct nxtext_glyph_s g_puglyph[NGLYPH_CACHE]; #endif /* Some random numbers */ static const uint8_t g_rand8[9] = { 0x18, 0x8d, 0x60, 0x42, 0xb7, 0xc2, 0x2d, 0xea, 0x6b }; /**************************************************************************** * Public Data ****************************************************************************/ /**************************************************************************** * Private Functions ****************************************************************************/ /**************************************************************************** * Name: nxpu_randpos ****************************************************************************/ static fb_coord_t nxpu_randpos(fb_coord_t value) { static uint8_t ndx = 0; uint8_t rand8 = g_rand8[ndx]; if (++ndx >= 9) { ndx = 0; } return (fb_coord_t)(((uint32_t)value * (uint32_t)rand8) >> 8); } /**************************************************************************** * Name: nxpu_setsize ****************************************************************************/ static inline int nxpu_setsize(NXWINDOW hwnd, FAR struct nxgl_size_s *size) { int ret = nx_setsize(hwnd, size); if (ret < 0) { printf("nxpu_setsize: nx_setsize failed: %d\n", errno); g_exitcode = NXEXIT_NXSETSIZE; } return ret; } /**************************************************************************** * Name: nxpu_setposition ****************************************************************************/ static inline int nxpu_setposition(NXWINDOW hwnd, FAR struct nxgl_point_s *pos) { int ret = nx_setposition(hwnd, pos); if (ret < 0) { printf("nxpu_setposition: nx_setposition failed: %d\n", errno); g_exitcode = NXEXIT_NXSETPOSITION; } return ret; } /**************************************************************************** * Name: nxpu_fillwindow ****************************************************************************/ static inline void nxpu_fillwindow(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect, FAR struct nxtext_state_s *st) { int ret; #ifdef CONFIG_NX_KBD int i; #endif ret = nx_fill(hwnd, rect, st->wcolor); if (ret < 0) { printf("nxpu_fillwindow: nx_fill failed: %d\n", errno); } /* Fill each character on the display (Only the characters within rect * will actually be redrawn). */ #ifdef CONFIG_NX_KBD nxtext_home(st); for (i = 0; i < st->nchars; i++) { nxtext_fillchar(hwnd, rect, st, g_puhfont, &st->bm[i]); } #endif } /**************************************************************************** * Name: nxpu_redraw ****************************************************************************/ static void nxpu_redraw(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect, bool more, FAR void *arg) { FAR struct nxtext_state_s *st = (FAR struct nxtext_state_s *)arg; ginfo("hwnd=%p rect={(%d,%d),(%d,%d)} more=%s\n", hwnd, rect->pt1.x, rect->pt1.y, rect->pt2.x, rect->pt2.y, more ? "true" : "false"); nxpu_fillwindow(hwnd, rect, st); } /**************************************************************************** * Name: nxpu_position ****************************************************************************/ static void nxpu_position(NXWINDOW hwnd, FAR const struct nxgl_size_s *size, FAR const struct nxgl_point_s *pos, FAR const struct nxgl_rect_s *bounds, FAR void *arg) { FAR struct nxtext_state_s *st = (FAR struct nxtext_state_s *)arg; /* Report the position */ ginfo("hwnd=%p size=(%d,%d) pos=(%d,%d) bounds={(%d,%d),(%d,%d)}\n", hwnd, size->w, size->h, pos->x, pos->y, bounds->pt1.x, bounds->pt1.y, bounds->pt2.x, bounds->pt2.y); /* Save the window position and size */ st->wpos.x = pos->x; st->wpos.y = pos->y; st->wsize.w = size->w; st->wsize.h = size->h; } /**************************************************************************** * Name: nxpu_mousein ****************************************************************************/ #ifdef CONFIG_NX_XYINPUT static void nxpu_mousein(NXWINDOW hwnd, FAR const struct nxgl_point_s *pos, uint8_t buttons, FAR void *arg) { printf("nxpu_mousein: hwnd=%p pos=(%d,%d) button=%02x\n", hwnd, pos->x, pos->y, buttons); } #endif /**************************************************************************** * Name: nxpu_puts ****************************************************************************/ #ifdef CONFIG_NX_KBD static inline void nxpu_puts(NXWINDOW hwnd, FAR struct nxtext_state_s *st, uint8_t nch, FAR const uint8_t *ch) { nxtext_home(st); while (nch--) { nxtext_putc(hwnd, st, g_puhfont, *ch++); } } #endif /**************************************************************************** * Name: nxpu_kbdin ****************************************************************************/ #ifdef CONFIG_NX_KBD static void nxpu_kbdin(NXWINDOW hwnd, uint8_t nch, FAR const uint8_t *ch, FAR void *arg) { FAR struct nxtext_state_s *st = (FAR struct nxtext_state_s *)arg; ginfo("hwnd=%p nch=%d\n", hwnd, nch); nxpu_puts(hwnd, st, nch, ch); } #endif /**************************************************************************** * Name: nxpu_initstate ****************************************************************************/ static inline void nxpu_initstate(void) { #ifdef CONFIG_NX_KBD FAR const struct nx_font_s *fontset; #endif /* Initialize the color (used for redrawing the window) */ memset(&g_pustate, 0, sizeof(struct nxtext_state_s)); g_pustate.wcolor[0] = CONFIG_EXAMPLES_NXTEXT_PUCOLOR; g_pustate.fcolor[0] = CONFIG_EXAMPLES_NXTEXT_PUFONTCOLOR; /* Get information about the font set being used and save this in the * state structure */ #ifdef CONFIG_NX_KBD fontset = nxf_getfontset(g_puhfont); g_pustate.fheight = fontset->mxheight; g_pustate.fwidth = fontset->mxwidth; g_pustate.spwidth = fontset->spwidth; /* Set up the text caches */ g_pustate.maxchars = NBM_CACHE; g_pustate.maxglyphs = NGLYPH_CACHE; g_pustate.bm = g_pubm; g_pustate.glyph = g_puglyph; /* Set the first display position */ nxtext_home(&g_pustate); #endif } /**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** * Name: nxpu_open ****************************************************************************/ NXWINDOW nxpu_open(void) { NXWINDOW hwnd; struct nxgl_size_s size; struct nxgl_point_s pt; int ret; /* Create a pop-up window */ printf("nxpu_open: Create pop-up\n"); nxpu_initstate(); hwnd = nx_openwindow(g_hnx, 0, &g_pucb, (FAR void *)&g_pustate); ginfo("hwnd=%p\n", hwnd); if (!hwnd) { printf("nxpu_open: nx_openwindow failed: %d\n", errno); g_exitcode = NXEXIT_NXOPENWINDOW; goto errout_with_state; } /* Select the size of the pop-up window */ size.w = g_xres / 4; size.h = g_yres / 4; /* Select a random position for pop-up window */ pt.x = nxpu_randpos(g_xres - size.w); pt.y = nxpu_randpos(g_yres - size.h); /* Set the position for the pop-up window */ printf("nxpu_open: Set pop-up position to (%d,%d)\n", pt.x, pt.y); ret = nxpu_setposition(hwnd, &pt); if (ret < 0) { goto errout_with_hwnd; } /* Set the size of the pop-up window */ ginfo("Set pop-up size to (%d,%d)\n", size.w, size.h); ret = nxpu_setsize(hwnd, &size); if (ret < 0) { goto errout_with_hwnd; } return hwnd; errout_with_hwnd: nx_closewindow(hwnd); errout_with_state: return NULL; } /**************************************************************************** * Name: nxpu_close ****************************************************************************/ int nxpu_close(NXWINDOW hwnd) { int ret; ret = nx_closewindow(hwnd); if (ret < 0) { printf("nxpu_close: nx_closewindow failed: %d\n", errno); g_exitcode = NXEXIT_NXCLOSEWINDOW; return ret; } return OK; }