[metacity] window: add missing window types



commit d51846b5f3b69f8c140faed6b113c0b2d1fb5370
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Tue Feb 28 00:54:49 2017 +0200

    window: add missing window types

 src/core/core.c           |    7 +++++
 src/core/place.c          |   21 +++++++++++++++++
 src/core/session.c        |   28 +++++++++++++++++++++++
 src/core/stack.c          |   10 ++++++++
 src/core/window-private.h |    9 ++++++-
 src/core/window.c         |   54 ++++++++++++++++++++++++++++++++++++++++-----
 6 files changed, 122 insertions(+), 7 deletions(-)
---
diff --git a/src/core/core.c b/src/core/core.c
index 50a0b09..da8ee0e 100644
--- a/src/core/core.c
+++ b/src/core/core.c
@@ -148,6 +148,13 @@ meta_core_get (Display *xdisplay,
             case META_WINDOW_DOCK:
             case META_WINDOW_TOOLBAR:
             case META_WINDOW_SPLASHSCREEN:
+            case META_WINDOW_DROPDOWN_MENU:
+            case META_WINDOW_POPUP_MENU:
+            case META_WINDOW_TOOLTIP:
+            case META_WINDOW_NOTIFICATION:
+            case META_WINDOW_COMBO:
+            case META_WINDOW_DND:
+            case META_WINDOW_OVERRIDE_OTHER:
               /* No frame */
               base_type = META_FRAME_TYPE_LAST;
               break;
diff --git a/src/core/place.c b/src/core/place.c
index 525e93d..02a5bb4 100644
--- a/src/core/place.c
+++ b/src/core/place.c
@@ -394,6 +394,13 @@ rectangle_overlaps_some_window (MetaRectangle *rect,
         case META_WINDOW_DESKTOP:
         case META_WINDOW_DIALOG:
         case META_WINDOW_MODAL_DIALOG:
+        case META_WINDOW_DROPDOWN_MENU:
+        case META_WINDOW_POPUP_MENU:
+        case META_WINDOW_TOOLTIP:
+        case META_WINDOW_NOTIFICATION:
+        case META_WINDOW_COMBO:
+        case META_WINDOW_DND:
+        case META_WINDOW_OVERRIDE_OTHER:
           break;
 
         case META_WINDOW_NORMAL:
@@ -779,6 +786,13 @@ meta_window_place (MetaWindow        *window,
     case META_WINDOW_TOOLBAR:
     case META_WINDOW_MENU:
     case META_WINDOW_UTILITY:
+    case META_WINDOW_DROPDOWN_MENU:
+    case META_WINDOW_POPUP_MENU:
+    case META_WINDOW_TOOLTIP:
+    case META_WINDOW_NOTIFICATION:
+    case META_WINDOW_COMBO:
+    case META_WINDOW_DND:
+    case META_WINDOW_OVERRIDE_OTHER:
       goto done_no_constraints;
 
     default:
@@ -815,6 +829,13 @@ meta_window_place (MetaWindow        *window,
         case META_WINDOW_TOOLBAR:
         case META_WINDOW_MENU:
         case META_WINDOW_UTILITY:
+        case META_WINDOW_DROPDOWN_MENU:
+        case META_WINDOW_POPUP_MENU:
+        case META_WINDOW_TOOLTIP:
+        case META_WINDOW_NOTIFICATION:
+        case META_WINDOW_COMBO:
+        case META_WINDOW_DND:
+        case META_WINDOW_OVERRIDE_OTHER:
           if (window->size_hints.flags & PPosition)
             {
               meta_topic (META_DEBUG_PLACEMENT,
diff --git a/src/core/session.c b/src/core/session.c
index b88302d..9234a25 100644
--- a/src/core/session.c
+++ b/src/core/session.c
@@ -701,6 +701,20 @@ window_type_to_string (MetaWindowType type)
       return "splashscreen";
     case META_WINDOW_UTILITY:
       return "utility";
+    case META_WINDOW_DROPDOWN_MENU:
+      return "dropdown_menu";
+    case META_WINDOW_POPUP_MENU:
+      return "popup_menu";
+    case META_WINDOW_TOOLTIP:
+      return "tooltip";
+    case META_WINDOW_NOTIFICATION:
+      return "notification";
+    case META_WINDOW_COMBO:
+      return "combo";
+    case META_WINDOW_DND:
+      return "dnd";
+    case META_WINDOW_OVERRIDE_OTHER:
+      return "override_redirect";
     default:
       break;
     }
@@ -729,6 +743,20 @@ window_type_from_string (const char *str)
     return META_WINDOW_UTILITY;
   else if (strcmp (str, "splashscreen") == 0)
     return META_WINDOW_SPLASHSCREEN;
+  else if (strcmp (str, "dropdown_menu") == 0)
+    return META_WINDOW_DROPDOWN_MENU;
+  else if (strcmp (str, "popup_menu") == 0)
+    return META_WINDOW_POPUP_MENU;
+  else if (strcmp (str, "tooltip") == 0)
+    return META_WINDOW_TOOLTIP;
+  else if (strcmp (str, "notification") == 0)
+    return META_WINDOW_NOTIFICATION;
+  else if (strcmp (str, "combo") == 0)
+    return META_WINDOW_COMBO;
+  else if (strcmp (str, "dnd") == 0)
+    return META_WINDOW_DND;
+  else if (strcmp (str, "override_redirect") == 0)
+    return META_WINDOW_OVERRIDE_OTHER;
   else
     return META_WINDOW_NORMAL;
 }
diff --git a/src/core/stack.c b/src/core/stack.c
index 9a229e0..31971ad 100644
--- a/src/core/stack.c
+++ b/src/core/stack.c
@@ -286,6 +286,16 @@ get_standalone_layer (MetaWindow *window)
       else
         layer = META_LAYER_DOCK;
     }
+  else if (window->type == META_WINDOW_DROPDOWN_MENU ||
+           window->type == META_WINDOW_POPUP_MENU ||
+           window->type == META_WINDOW_TOOLTIP ||
+           window->type == META_WINDOW_NOTIFICATION ||
+           window->type == META_WINDOW_COMBO ||
+           window->type == META_WINDOW_DND ||
+           window->type == META_WINDOW_OVERRIDE_OTHER)
+    {
+      layer = META_LAYER_OVERRIDE_REDIRECT;
+    }
   else
     {
       meta_window_foreach_transient (window,
diff --git a/src/core/window-private.h b/src/core/window-private.h
index 9567487..da336a3 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -58,7 +58,14 @@ typedef enum
   META_WINDOW_TOOLBAR,
   META_WINDOW_MENU,
   META_WINDOW_UTILITY,
-  META_WINDOW_SPLASHSCREEN
+  META_WINDOW_SPLASHSCREEN,
+  META_WINDOW_DROPDOWN_MENU,
+  META_WINDOW_POPUP_MENU,
+  META_WINDOW_TOOLTIP,
+  META_WINDOW_NOTIFICATION,
+  META_WINDOW_COMBO,
+  META_WINDOW_DND,
+  META_WINDOW_OVERRIDE_OTHER
 } MetaWindowType;
 
 typedef enum
diff --git a/src/core/window.c b/src/core/window.c
index a82d1e9..798f4d9 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -2060,6 +2060,13 @@ window_state_on_map (MetaWindow *window,
     case META_WINDOW_DESKTOP:
     case META_WINDOW_SPLASHSCREEN:
     case META_WINDOW_MENU:
+    case META_WINDOW_DROPDOWN_MENU:
+    case META_WINDOW_POPUP_MENU:
+    case META_WINDOW_TOOLTIP:
+    case META_WINDOW_NOTIFICATION:
+    case META_WINDOW_COMBO:
+    case META_WINDOW_DND:
+    case META_WINDOW_OVERRIDE_OTHER:
       /* don't focus any of these; places_on_top may be irrelevant for some of
        * these (e.g. dock)--but you never know--the focus window might also be
        * of the same type in some weird situation...
@@ -6386,17 +6393,45 @@ recalc_window_type (MetaWindow *window)
         window->type = META_WINDOW_TOOLBAR;
       else if (window->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_MENU)
         window->type = META_WINDOW_MENU;
-      else if (window->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_DIALOG)
-        window->type = META_WINDOW_DIALOG;
-      else if (window->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_NORMAL)
-        window->type = META_WINDOW_NORMAL;
       else if (window->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_UTILITY)
         window->type = META_WINDOW_UTILITY;
       else if (window->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_SPLASH)
         window->type = META_WINDOW_SPLASHSCREEN;
+      else if (window->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_DIALOG)
+        window->type = META_WINDOW_DIALOG;
+      else if (window->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_NORMAL)
+        window->type = META_WINDOW_NORMAL;
+      else if (window->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_DROPDOWN_MENU)
+        window->type = META_WINDOW_DROPDOWN_MENU;
+      else if (window->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_POPUP_MENU)
+        window->type = META_WINDOW_POPUP_MENU;
+      else if (window->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_TOOLTIP)
+        window->type = META_WINDOW_TOOLTIP;
+      else if (window->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_NOTIFICATION)
+        window->type = META_WINDOW_NOTIFICATION;
+      else if (window->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_COMBO)
+        window->type = META_WINDOW_COMBO;
+      else if (window->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_DND)
+        window->type = META_WINDOW_DND;
+      else if (window->override_redirect)
+        window->type = META_WINDOW_OVERRIDE_OTHER;
       else
-        meta_bug ("Set a type atom for %s that wasn't handled in recalc_window_type\n",
-                  window->desc);
+        {
+          char *atom_name;
+
+          /* Fallback on a normal type, and print warning. Don't abort. */
+          window->type = META_WINDOW_NORMAL;
+
+          meta_error_trap_push (window->display);
+          atom_name = XGetAtomName (window->display->xdisplay, window->type_atom);
+          meta_error_trap_pop (window->display);
+
+          meta_warning ("Unrecognized type atom [%s] set for %s \n",
+                        atom_name ? atom_name : "unknown", window->desc);
+
+          if (atom_name)
+            XFree (atom_name);
+        }
     }
   else if (window->xtransient_for != None)
     {
@@ -6679,6 +6714,13 @@ recalc_window_features (MetaWindow *window)
     case META_WINDOW_MENU:
     case META_WINDOW_UTILITY:
     case META_WINDOW_SPLASHSCREEN:
+    case META_WINDOW_DROPDOWN_MENU:
+    case META_WINDOW_POPUP_MENU:
+    case META_WINDOW_TOOLTIP:
+    case META_WINDOW_NOTIFICATION:
+    case META_WINDOW_COMBO:
+    case META_WINDOW_DND:
+    case META_WINDOW_OVERRIDE_OTHER:
       window->skip_taskbar = TRUE;
       window->skip_pager = TRUE;
       break;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]