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

Side by Side Diff: plugin/linux/main_linux.cc

Issue 652076: Linux: make sure the fullscreen window always gets focus... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/o3d/
Patch Set: '' Created 10 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « plugin/cross/o3d_glue.h ('k') | 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 /* 1 /*
2 * Copyright 2009, Google Inc. 2 * Copyright 2009, Google Inc.
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are 6 * modification, are permitted provided that the following conditions are
7 * met: 7 * met:
8 * 8 *
9 * * Redistributions of source code must retain the above copyright 9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 obj->in_plugin()); 466 obj->in_plugin());
467 obj->client()->AddEventToQueue(event); 467 obj->client()->AddEventToQueue(event);
468 if (event.type() == Event::TYPE_MOUSEUP && obj->in_plugin() && 468 if (event.type() == Event::TYPE_MOUSEUP && obj->in_plugin() &&
469 obj->got_double_click_[button_event->button - 1]) { 469 obj->got_double_click_[button_event->button - 1]) {
470 obj->got_double_click_[button_event->button - 1] = false; 470 obj->got_double_click_[button_event->button - 1] = false;
471 event.set_type(Event::TYPE_DBLCLICK); 471 event.set_type(Event::TYPE_DBLCLICK);
472 obj->client()->AddEventToQueue(event); 472 obj->client()->AddEventToQueue(event);
473 } 473 }
474 if (event.in_plugin() && event.type() == Event::TYPE_MOUSEDOWN && 474 if (event.in_plugin() && event.type() == Event::TYPE_MOUSEDOWN &&
475 obj->HitFullscreenClickRegion(event.x(), event.y())) { 475 obj->HitFullscreenClickRegion(event.x(), event.y())) {
476 obj->RequestFullscreenDisplay(); 476 obj->RequestFullscreenDisplay(button_event->time);
477 } 477 }
478 return TRUE; 478 return TRUE;
479 } 479 }
480 480
481 static gboolean GtkHandleKey(GtkWidget *widget, 481 static gboolean GtkHandleKey(GtkWidget *widget,
482 GdkEventKey *key_event, 482 GdkEventKey *key_event,
483 PluginObject *obj) { 483 PluginObject *obj) {
484 Event::Type type; 484 Event::Type type;
485 switch (key_event->type) { 485 switch (key_event->type) {
486 case GDK_KEY_PRESS: 486 case GDK_KEY_PRESS:
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after
903 CancelFullscreenDisplay(); 903 CancelFullscreenDisplay();
904 return TRUE; 904 return TRUE;
905 } 905 }
906 906
907 bool PluginObject::GetDisplayMode(int id, o3d::DisplayMode *mode) { 907 bool PluginObject::GetDisplayMode(int id, o3d::DisplayMode *mode) {
908 return renderer()->GetDisplayMode(id, mode); 908 return renderer()->GetDisplayMode(id, mode);
909 } 909 }
910 910
911 // TODO: Where should this really live? It's platform-specific, but in 911 // TODO: Where should this really live? It's platform-specific, but in
912 // PluginObject, which mainly lives in cross/o3d_glue.h+cc. 912 // PluginObject, which mainly lives in cross/o3d_glue.h+cc.
913 bool PluginObject::RequestFullscreenDisplay() { 913 bool PluginObject::RequestFullscreenDisplay(guint32 timestamp) {
914 if (fullscreen_ || fullscreen_pending_) { 914 if (fullscreen_ || fullscreen_pending_) {
915 return false; 915 return false;
916 } 916 }
917 if (!g_xembed_support) { 917 if (!g_xembed_support) {
918 // I tested every Linux browser I could that worked with our plugin and not 918 // I tested every Linux browser I could that worked with our plugin and not
919 // a single one lacked XEmbed/Gtk2 support, so I don't think that case is 919 // a single one lacked XEmbed/Gtk2 support, so I don't think that case is
920 // worth implementing. 920 // worth implementing.
921 DLOG(ERROR) << "Fullscreen not supported without XEmbed/Gtk2; please use a " 921 DLOG(ERROR) << "Fullscreen not supported without XEmbed/Gtk2; please use a "
922 "modern web browser"; 922 "modern web browser";
923 return false; 923 return false;
(...skipping 22 matching lines...) Expand all
946 gtk_window_set_default_size(window, width, height); 946 gtk_window_set_default_size(window, width, height);
947 // This is probably superfluous since we have already set an appropriate 947 // This is probably superfluous since we have already set an appropriate
948 // size, but let's do it anyway. It could still be relevant for some window 948 // size, but let's do it anyway. It could still be relevant for some window
949 // managers. 949 // managers.
950 gtk_window_fullscreen(window); 950 gtk_window_fullscreen(window);
951 g_signal_connect(window, "configure-event", 951 g_signal_connect(window, "configure-event",
952 G_CALLBACK(GtkConfigureEventCallback), this); 952 G_CALLBACK(GtkConfigureEventCallback), this);
953 g_signal_connect(window, "delete-event", 953 g_signal_connect(window, "delete-event",
954 G_CALLBACK(GtkDeleteEventCallback), this); 954 G_CALLBACK(GtkDeleteEventCallback), this);
955 gtk_fullscreen_container_ = widget; 955 gtk_fullscreen_container_ = widget;
956 gtk_widget_show(widget); 956 // The timestamp here is optional. Presumably it is used by the window manager
957 // for obscure policy decisions (e.g., UI races).
piman 2010/02/22 22:41:53 FYI the timestamp is most likely used to properly
958 gtk_window_present_with_time(window, timestamp);
959 // Explicitly set focus, otherwise we may not get it depending on the window
960 // manager's policy for present.
961 gdk_window_focus(widget->window, timestamp);
957 // We defer switching to the new window until it gets displayed and assigned 962 // We defer switching to the new window until it gets displayed and assigned
958 // it's final dimensions in the configure-event. 963 // it's final dimensions in the configure-event.
959 fullscreen_pending_ = true; 964 fullscreen_pending_ = true;
960 return true; 965 return true;
961 } 966 }
962 967
963 void PluginObject::CancelFullscreenDisplay() { 968 void PluginObject::CancelFullscreenDisplay() {
964 if (!fullscreen_) { 969 if (!fullscreen_) {
965 return; 970 return;
966 } 971 }
967 o3d::DisplayWindowLinux default_display; 972 o3d::DisplayWindowLinux default_display;
968 default_display.set_display(display_); 973 default_display.set_display(display_);
969 default_display.set_window(drawable_); 974 default_display.set_window(drawable_);
970 if (!renderer()->CancelFullscreen(default_display, 975 if (!renderer()->CancelFullscreen(default_display,
971 prev_width_, 976 prev_width_,
972 prev_height_)) { 977 prev_height_)) {
973 return; 978 return;
974 } 979 }
975 renderer()->Resize(prev_width_, prev_height_); 980 renderer()->Resize(prev_width_, prev_height_);
976 client()->SendResizeEvent(renderer()->width(), renderer()->height(), 981 client()->SendResizeEvent(renderer()->width(), renderer()->height(),
977 false); 982 false);
978 SetGtkEventSource(gtk_container_); 983 SetGtkEventSource(gtk_container_);
979 gtk_widget_destroy(gtk_fullscreen_container_); 984 gtk_widget_destroy(gtk_fullscreen_container_);
980 gtk_fullscreen_container_ = NULL; 985 gtk_fullscreen_container_ = NULL;
981 fullscreen_window_ = 0; 986 fullscreen_window_ = 0;
982 fullscreen_ = false; 987 fullscreen_ = false;
983 } 988 }
984 } // namespace _o3d 989 } // namespace _o3d
985 } // namespace glue 990 } // namespace glue
OLDNEW
« no previous file with comments | « plugin/cross/o3d_glue.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698