Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(407)

Side by Side Diff: ui/views/win/hwnd_message_handler.cc

Issue 440793002: Fix the painting problems seen in the tabstrip when switching from a theme to glass on Windows. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/views/win/hwnd_message_handler.h" 5 #include "ui/views/win/hwnd_message_handler.h"
6 6
7 #include <dwmapi.h> 7 #include <dwmapi.h>
8 #include <oleacc.h> 8 #include <oleacc.h>
9 #include <shellapi.h> 9 #include <shellapi.h>
10 #include <wtsapi32.h> 10 #include <wtsapi32.h>
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after
810 // frame to a native frame. If we don't, the client area will be filled 810 // frame to a native frame. If we don't, the client area will be filled
811 // with black. This seems to be related to an interaction between DWM and 811 // with black. This seems to be related to an interaction between DWM and
812 // SetWindowRgn, but the details aren't clear. Additionally, we need to 812 // SetWindowRgn, but the details aren't clear. Additionally, we need to
813 // specify SWP_NOZORDER here, otherwise if you have multiple chrome windows 813 // specify SWP_NOZORDER here, otherwise if you have multiple chrome windows
814 // open they will re-appear with a non-deterministic Z-order. 814 // open they will re-appear with a non-deterministic Z-order.
815 UINT flags = SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER; 815 UINT flags = SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER;
816 SetWindowPos(hwnd(), NULL, 0, 0, 0, 0, flags | SWP_HIDEWINDOW); 816 SetWindowPos(hwnd(), NULL, 0, 0, 0, 0, flags | SWP_HIDEWINDOW);
817 SetWindowPos(hwnd(), NULL, 0, 0, 0, 0, flags | SWP_SHOWWINDOW); 817 SetWindowPos(hwnd(), NULL, 0, 0, 0, 0, flags | SWP_SHOWWINDOW);
818 // Invalidate the window to force a paint. There may be child windows which 818 // Invalidate the window to force a paint. There may be child windows which
819 // could resize in this context. Don't paint right away. 819 // could resize in this context. Don't paint right away.
820 ::InvalidateRect(hwnd(), NULL, FALSE); 820 base::MessageLoop::current()->PostDelayedTask(
821 FROM_HERE,
822 base::Bind(base::IgnoreResult(&::InvalidateRect), hwnd(),
823 reinterpret_cast<const RECT*>(NULL), FALSE),
824 base::TimeDelta::FromMilliseconds(500));
ananta 2014/08/05 00:24:03 It now appears that the bug was never fixed. We ne
sky 2014/08/05 01:30:56 This is a total hack. Why do we need to delay? Als
821 } 825 }
822 826
823 // WM_DWMCOMPOSITIONCHANGED is only sent to top level windows, however we want 827 // WM_DWMCOMPOSITIONCHANGED is only sent to top level windows, however we want
824 // to notify our children too, since we can have MDI child windows who need to 828 // to notify our children too, since we can have MDI child windows who need to
825 // update their appearance. 829 // update their appearance.
826 EnumChildWindows(hwnd(), &SendDwmCompositionChanged, NULL); 830 EnumChildWindows(hwnd(), &SendDwmCompositionChanged, NULL);
827 } 831 }
828 832
829 void HWNDMessageHandler::SchedulePaintInRect(const gfx::Rect& rect) { 833 void HWNDMessageHandler::SchedulePaintInRect(const gfx::Rect& rect) {
830 if (use_layered_buffer_) { 834 if (use_layered_buffer_) {
831 // We must update the back-buffer immediately, since Windows' handling of 835 // We must update the back-buffer immediately, since Windows' handling of
832 // invalid rects is somewhat mysterious. 836 // invalid rects is somewhat mysterious.
833 invalid_rect_.Union(rect); 837 invalid_rect_.Union(rect);
834 838
835 // In some situations, such as drag and drop, when Windows itself runs a 839 // In some situations, such as drag and drop, when Windows itself runs a
836 // nested message loop our message loop appears to be starved and we don't 840 // nested message loop our message loop appears to be starved and we don't
837 // receive calls to DidProcessMessage(). This only seems to affect layered 841 // receive calls to DidProcessMessage(). This only seems to affect layered
838 // windows, so we schedule a redraw manually using a task, since those never 842 // windows, so we schedule a redraw manually using a task, since those never
839 // seem to be starved. Also, wtf. 843 // seem to be starved. Also, wtf.
840 if (!waiting_for_redraw_layered_window_contents_) { 844 if (!waiting_for_redraw_layered_window_contents_) {
841 waiting_for_redraw_layered_window_contents_ = true; 845 waiting_for_redraw_layered_window_contents_ = true;
842 base::MessageLoop::current()->PostTask( 846 base::MessageLoop::current()->PostTask(
843 FROM_HERE, 847 FROM_HERE,
844 base::Bind(&HWNDMessageHandler::RedrawLayeredWindowContents, 848 base::Bind(base::IgnoreResult(&HWNDMessageHandler::RedrawLayeredWindow Contents),
845 weak_factory_.GetWeakPtr())); 849 weak_factory_.GetWeakPtr()));
846 } 850 }
847 } else { 851 } else {
848 // InvalidateRect() expects client coordinates. 852 // InvalidateRect() expects client coordinates.
849 RECT r = rect.ToRECT(); 853 RECT r = rect.ToRECT();
850 InvalidateRect(hwnd(), &r, FALSE); 854 InvalidateRect(hwnd(), &r, FALSE);
851 } 855 }
852 } 856 }
853 857
854 void HWNDMessageHandler::SetOpacity(BYTE opacity) { 858 void HWNDMessageHandler::SetOpacity(BYTE opacity) {
(...skipping 1582 matching lines...) Expand 10 before | Expand all | Expand 10 after
2437 POINT cursor_pos = {0}; 2441 POINT cursor_pos = {0};
2438 ::GetCursorPos(&cursor_pos); 2442 ::GetCursorPos(&cursor_pos);
2439 if (memcmp(&cursor_pos, &mouse_location, sizeof(POINT))) 2443 if (memcmp(&cursor_pos, &mouse_location, sizeof(POINT)))
2440 return false; 2444 return false;
2441 return true; 2445 return true;
2442 } 2446 }
2443 return false; 2447 return false;
2444 } 2448 }
2445 2449
2446 } // namespace views 2450 } // namespace views
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698