update.
[chise/xemacs-chise.git.1] / src / toolbar-msw.c
index ca86e9d..774e34f 100644 (file)
@@ -22,7 +22,7 @@ along with XEmacs; see the file COPYING.  If not, write to
 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.  */
 
-/* This implementation by Andy Piper <andyp@parallax.co.uk>, with bits
+/* This implementation by Andy Piper <andy@xemacs.org>, with bits
    borrowed from toolbar-x.c */
 
 /* Synched up with: Not in FSF. */
@@ -46,19 +46,14 @@ Boston, MA 02111-1307, USA.  */
 #define TOOLBAR_ID_BIAS 16
 #define TOOLBAR_HANDLE(f,p) \
 GetDlgItem(FRAME_MSWINDOWS_HANDLE(f), TOOLBAR_ID_BIAS + p)
-#ifndef TB_SETIMAGELIST
-#define TB_SETIMAGELIST (WM_USER + 48)
-#define TB_GETIMAGELIST (WM_USER + 49)
-#define TB_SETDISABLEDIMAGELIST (WM_USER + 54)
-#define TB_GETDISABLEDIMAGELIST (WM_USER + 55)
-#endif
-#ifndef TB_SETPADDING
-#define TB_SETPADDING   (WM_USER + 87)
-#endif
+
 #define MSWINDOWS_BUTTON_SHADOW_THICKNESS 2
 #define MSWINDOWS_BLANK_SIZE 5
 #define MSWINDOWS_MINIMUM_TOOLBAR_SIZE 8
 
+static void
+mswindows_move_toolbar (struct frame *f, enum toolbar_pos pos);
+
 #define SET_TOOLBAR_WAS_VISIBLE_FLAG(frame, pos, flag)                 \
   do {                                                                 \
     switch (pos)                                                       \
@@ -76,7 +71,7 @@ GetDlgItem(FRAME_MSWINDOWS_HANDLE(f), TOOLBAR_ID_BIAS + p)
        (frame)->right_toolbar_was_visible = flag;                      \
        break;                                                          \
       default:                                                         \
-       abort ();                                                       \
+       ABORT ();                                                       \
       }                                                                        \
   } while (0)
 
@@ -128,7 +123,7 @@ mswindows_clear_toolbar (struct frame *f, enum toolbar_pos pos,
       ShowWindow(toolbarwnd, SW_HIDE);
     }
 
-  FRAME_MSWINDOWS_TOOLBAR_CHECKSUM(f,pos)=0;
+  FRAME_MSWINDOWS_TOOLBAR_CHECKSUM (f, pos) = 0;
   SET_TOOLBAR_WAS_VISIBLE_FLAG (f, pos, 0);
 }
 
@@ -209,7 +204,7 @@ mswindows_output_toolbar (struct frame *f, enum toolbar_pos pos)
                        internal_hash (get_toolbar_button_glyph(w, tb), 0),
                        internal_hash (tb->callback, 0),
                        width,
-                       w->toolbar_buttons_captioned_p);
+                       LISP_HASH (w->toolbar_buttons_captioned_p));
       button = tb->next;
       nbuttons++;
     }
@@ -220,7 +215,7 @@ mswindows_output_toolbar (struct frame *f, enum toolbar_pos pos)
       /* remove the old one */
       mswindows_clear_toolbar (f, pos, 0);
 
-      FRAME_MSWINDOWS_TOOLBAR_CHECKSUM(f,pos)=checksum;
+      FRAME_MSWINDOWS_TOOLBAR_CHECKSUM (f, pos)=checksum;
 
       /* build up the data required by win32 fns. */
       button_tbl = xnew_array_and_zero (TBBUTTON, nbuttons);
@@ -259,7 +254,7 @@ mswindows_output_toolbar (struct frame *f, enum toolbar_pos pos)
              
              if (IMAGE_INSTANCEP (instance))
                {
-                 struct Lisp_Image_Instance* p = XIMAGE_INSTANCE (instance);
+                 Lisp_Image_Instance* p = XIMAGE_INSTANCE (instance);
                  
                  if (IMAGE_INSTANCE_PIXMAP_TYPE_P (p))
                    {
@@ -381,10 +376,12 @@ mswindows_output_toolbar (struct frame *f, enum toolbar_pos pos)
           CreateWindowEx ( WS_EX_WINDOWEDGE,
                            TOOLBARCLASSNAME,
                            NULL,
-                           WS_CHILD | WS_VISIBLE 
+                           WS_CHILD 
                            | (style_3d ? WS_DLGFRAME : 0)
-                           | TBSTYLE_TOOLTIPS | CCS_NORESIZE 
-                           | CCS_NOPARENTALIGN | CCS_NODIVIDER,
+                           | TBSTYLE_TOOLTIPS 
+                           | CCS_NORESIZE 
+                           | CCS_NOPARENTALIGN | CCS_NODIVIDER
+                           | CCS_ADJUSTABLE,
                            x, y, bar_width, bar_height,
                            FRAME_MSWINDOWS_HANDLE (f),
                            (HMENU)(TOOLBAR_ID_BIAS + pos),
@@ -460,6 +457,9 @@ mswindows_output_toolbar (struct frame *f, enum toolbar_pos pos)
 
       /* now display the window */
       ShowWindow (toolbarwnd, SW_SHOW);
+      /* no idea why this is necessary but initial display will not
+         happen otherwise. */
+      mswindows_move_toolbar (f, pos);
 
       if (button_tbl) xfree (button_tbl);
 
@@ -525,6 +525,13 @@ mswindows_redraw_exposed_toolbars (struct frame *f, int x, int y, int width,
 }
 
 static void
+mswindows_redraw_frame_toolbars (struct frame *f)
+{
+  mswindows_redraw_exposed_toolbars (f, 0, 0, FRAME_PIXWIDTH (f),
+                                    FRAME_PIXHEIGHT (f));
+}
+
+static void
 mswindows_initialize_frame_toolbars (struct frame *f)
 {
 
@@ -537,22 +544,30 @@ mswindows_output_frame_toolbars (struct frame *f)
 
   if (FRAME_REAL_TOP_TOOLBAR_VISIBLE (f))
     mswindows_output_toolbar (f, TOP_TOOLBAR);
-  else if (f->top_toolbar_was_visible)
-    mswindows_clear_toolbar (f, TOP_TOOLBAR, 0);
-
   if (FRAME_REAL_BOTTOM_TOOLBAR_VISIBLE (f))
     mswindows_output_toolbar (f, BOTTOM_TOOLBAR);
-  else if (f->bottom_toolbar_was_visible)
-    mswindows_clear_toolbar (f, BOTTOM_TOOLBAR, 0);
-
   if (FRAME_REAL_LEFT_TOOLBAR_VISIBLE (f))
     mswindows_output_toolbar (f, LEFT_TOOLBAR);
-  else if (f->left_toolbar_was_visible)
-    mswindows_clear_toolbar (f, LEFT_TOOLBAR, 0);
-
   if (FRAME_REAL_RIGHT_TOOLBAR_VISIBLE (f))
     mswindows_output_toolbar (f, RIGHT_TOOLBAR);
-  else if (f->right_toolbar_was_visible)
+}
+
+static void
+mswindows_clear_frame_toolbars (struct frame *f)
+{
+  assert (FRAME_MSWINDOWS_P (f));
+
+  if (f->top_toolbar_was_visible
+      && !FRAME_REAL_TOP_TOOLBAR_VISIBLE (f))
+    mswindows_clear_toolbar (f, TOP_TOOLBAR, 0);
+  if (f->bottom_toolbar_was_visible
+      && !FRAME_REAL_BOTTOM_TOOLBAR_VISIBLE (f))
+    mswindows_clear_toolbar (f, BOTTOM_TOOLBAR, 0);
+  if (f->left_toolbar_was_visible 
+      && !FRAME_REAL_LEFT_TOOLBAR_VISIBLE (f))
+    mswindows_clear_toolbar (f, LEFT_TOOLBAR, 0);
+  if (f->right_toolbar_was_visible 
+      && !FRAME_REAL_RIGHT_TOOLBAR_VISIBLE (f))
     mswindows_clear_toolbar (f, RIGHT_TOOLBAR, 0);
 }
 
@@ -560,9 +575,10 @@ static void
 mswindows_free_frame_toolbars (struct frame *f)
 {
   HWND twnd=NULL;
-#define DELETE_TOOLBAR(pos) \
-  mswindows_clear_toolbar(f, 0, pos); \
-  if ((twnd=GetDlgItem(FRAME_MSWINDOWS_HANDLE(f), TOOLBAR_ID_BIAS + pos))) \
+#define DELETE_TOOLBAR(pos)                            \
+  mswindows_clear_toolbar(f, pos, 0);                  \
+  if ((twnd=GetDlgItem(FRAME_MSWINDOWS_HANDLE(f),      \
+                      TOOLBAR_ID_BIAS + pos)))         \
       DestroyWindow(twnd)
 
   DELETE_TOOLBAR(TOP_TOOLBAR);
@@ -573,7 +589,7 @@ mswindows_free_frame_toolbars (struct frame *f)
 }
 
 /* map toolbar hwnd to pos*/
-int mswindows_find_toolbar_pos(struct frame* f, HWND ctrl)
+static int mswindows_find_toolbar_pos(struct frame* f, HWND ctrl)
 {
   int id = GetDlgCtrlID(ctrl);
   return id ? id - TOOLBAR_ID_BIAS : -1;
@@ -633,8 +649,10 @@ void
 console_type_create_toolbar_mswindows (void)
 {
   CONSOLE_HAS_METHOD (mswindows, output_frame_toolbars);
+  CONSOLE_HAS_METHOD (mswindows, clear_frame_toolbars);
   CONSOLE_HAS_METHOD (mswindows, initialize_frame_toolbars);
   CONSOLE_HAS_METHOD (mswindows, free_frame_toolbars);
   CONSOLE_HAS_METHOD (mswindows, redraw_exposed_toolbars);
+  CONSOLE_HAS_METHOD (mswindows, redraw_frame_toolbars);
 }