New files
Tue May 2 17:12:54 2006 Søren Sandmann <sandmann@redhat.com> * src/c-window.[ch]: New files * src/c-screen.c: Move WindowInfo struct to new c-window.[ch] files. Delete various bits of obsolete, commented-out code.
This commit is contained in:
parent
451c990dd5
commit
411fd3db44
@ -1,3 +1,10 @@
|
|||||||
|
Tue May 2 17:12:54 2006 Søren Sandmann <sandmann@redhat.com>
|
||||||
|
|
||||||
|
* src/c-window.[ch]: New files
|
||||||
|
|
||||||
|
* src/c-screen.c: Move WindowInfo struct to new c-window.[ch]
|
||||||
|
files. Delete various bits of obsolete, commented-out code.
|
||||||
|
|
||||||
Fri Apr 28 12:53:23 2006 Søren Sandmann <sandmann@redhat.com>
|
Fri Apr 28 12:53:23 2006 Søren Sandmann <sandmann@redhat.com>
|
||||||
|
|
||||||
* src/core.c (get_window): New function.
|
* src/core.c (get_window): New function.
|
||||||
|
@ -18,6 +18,8 @@ metacity_SOURCES= \
|
|||||||
common.h \
|
common.h \
|
||||||
c-screen.c \
|
c-screen.c \
|
||||||
c-screen.h \
|
c-screen.h \
|
||||||
|
c-window.c \
|
||||||
|
c-window.h \
|
||||||
compositor.c \
|
compositor.c \
|
||||||
compositor.h \
|
compositor.h \
|
||||||
constraints.c \
|
constraints.c \
|
||||||
|
235
src/c-screen.c
235
src/c-screen.c
@ -27,20 +27,11 @@
|
|||||||
#include <cm/state.h>
|
#include <cm/state.h>
|
||||||
#include <cm/magnifier.h>
|
#include <cm/magnifier.h>
|
||||||
#include <cm/square.h>
|
#include <cm/square.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
#include "c-screen.h"
|
#include "c-screen.h"
|
||||||
|
#include "c-window.h"
|
||||||
typedef struct WindowInfo WindowInfo;
|
|
||||||
|
|
||||||
struct WindowInfo
|
|
||||||
{
|
|
||||||
Window xwindow;
|
|
||||||
CmNode *node;
|
|
||||||
gboolean updates;
|
|
||||||
|
|
||||||
WsRectangle size;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct MetaScreenInfo
|
struct MetaScreenInfo
|
||||||
{
|
{
|
||||||
@ -54,8 +45,6 @@ struct MetaScreenInfo
|
|||||||
WsScreen *screen;
|
WsScreen *screen;
|
||||||
MetaScreen *meta_screen;
|
MetaScreen *meta_screen;
|
||||||
|
|
||||||
GHashTable *window_infos_by_xid;
|
|
||||||
|
|
||||||
int repaint_id;
|
int repaint_id;
|
||||||
int idle_id;
|
int idle_id;
|
||||||
|
|
||||||
@ -158,24 +147,21 @@ repaint (gpointer data)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static WindowInfo *
|
static MetaCompWindow *
|
||||||
find_win_info (MetaScreenInfo *info,
|
find_comp_window (MetaScreenInfo *info,
|
||||||
Window xwindow)
|
Window xwindow)
|
||||||
{
|
{
|
||||||
WindowInfo *win_info =
|
return meta_comp_window_lookup (xwindow);
|
||||||
g_hash_table_lookup (info->window_infos_by_xid, (gpointer)xwindow);
|
|
||||||
|
|
||||||
return win_info;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static CmNode *
|
static CmNode *
|
||||||
find_node (MetaScreenInfo *info,
|
find_node (MetaScreenInfo *info,
|
||||||
Window xwindow)
|
Window xwindow)
|
||||||
{
|
{
|
||||||
WindowInfo *win_info = find_win_info (info, xwindow);
|
MetaCompWindow *window = meta_comp_window_lookup (xwindow);
|
||||||
|
|
||||||
if (win_info)
|
if (window)
|
||||||
return win_info->node;
|
return meta_comp_window_get_node (window);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -208,9 +194,6 @@ meta_screen_info_new (WsDisplay *display,
|
|||||||
display, screen->number);
|
display, screen->number);
|
||||||
scr_info->root_window = ws_screen_get_root_window (scr_info->screen);
|
scr_info->root_window = ws_screen_get_root_window (scr_info->screen);
|
||||||
scr_info->display = display;
|
scr_info->display = display;
|
||||||
scr_info->window_infos_by_xid =
|
|
||||||
g_hash_table_new_full (g_direct_hash, g_direct_equal,
|
|
||||||
NULL, g_free);
|
|
||||||
scr_info->meta_screen = screen;
|
scr_info->meta_screen = screen;
|
||||||
|
|
||||||
all_screen_infos = g_list_prepend (all_screen_infos, scr_info);
|
all_screen_infos = g_list_prepend (all_screen_infos, scr_info);
|
||||||
@ -440,14 +423,16 @@ meta_screen_info_raise_window (MetaScreenInfo *info,
|
|||||||
|
|
||||||
void
|
void
|
||||||
meta_screen_info_set_size (MetaScreenInfo *info,
|
meta_screen_info_set_size (MetaScreenInfo *info,
|
||||||
Window window,
|
Window xwindow,
|
||||||
gint x,
|
gint x,
|
||||||
gint y,
|
gint y,
|
||||||
gint width,
|
gint width,
|
||||||
gint height)
|
gint height)
|
||||||
{
|
{
|
||||||
CmDrawableNode *node = CM_DRAWABLE_NODE (find_node (info, window));
|
MetaCompWindow *comp_window = meta_comp_window_lookup (xwindow);
|
||||||
WindowInfo *winfo = find_win_info (info, window);
|
|
||||||
|
if (comp_window)
|
||||||
|
{
|
||||||
WsRectangle rect;
|
WsRectangle rect;
|
||||||
|
|
||||||
rect.x = x;
|
rect.x = x;
|
||||||
@ -455,37 +440,7 @@ meta_screen_info_set_size (MetaScreenInfo *info,
|
|||||||
rect.width = width;
|
rect.width = width;
|
||||||
rect.height = height;
|
rect.height = height;
|
||||||
|
|
||||||
if (node)
|
meta_comp_window_set_size (comp_window, &rect);
|
||||||
{
|
|
||||||
WsRegion *shape;
|
|
||||||
|
|
||||||
if (winfo && winfo->updates)
|
|
||||||
{
|
|
||||||
WsWindow *window = WS_WINDOW (node->drawable);
|
|
||||||
WsDisplay *display = WS_RESOURCE (window)->display;
|
|
||||||
|
|
||||||
ws_display_begin_error_trap (display);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
g_print ("meta screen info set: %d %d %d %d\n",
|
|
||||||
x, y, width, height);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
cm_drawable_node_set_geometry (CM_DRAWABLE_NODE (node), &rect);
|
|
||||||
shape = ws_window_get_output_shape (window);
|
|
||||||
cm_drawable_node_set_shape (node, shape);
|
|
||||||
ws_region_destroy (shape);
|
|
||||||
|
|
||||||
if (rect.width != winfo->size.width ||
|
|
||||||
rect.height != winfo->size.height)
|
|
||||||
{
|
|
||||||
cm_drawable_node_update_pixmap (node);
|
|
||||||
}
|
|
||||||
|
|
||||||
winfo->size = rect;
|
|
||||||
|
|
||||||
ws_display_end_error_trap (display);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -507,66 +462,22 @@ print_child_titles (WsWindow *window)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static WindowInfo *
|
|
||||||
window_info_new (Window xwindow,
|
|
||||||
CmNode *node)
|
|
||||||
{
|
|
||||||
WindowInfo *win_info = g_new0 (WindowInfo, 1);
|
|
||||||
win_info->xwindow = xwindow;
|
|
||||||
win_info->node = node;
|
|
||||||
win_info->updates = TRUE;
|
|
||||||
return win_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
has_type (WsWindow *window, const char *check_type)
|
|
||||||
{
|
|
||||||
gchar **types = ws_window_get_property_atom_list (window, "_NET_WM_WINDOW_TYPE");
|
|
||||||
int i;
|
|
||||||
gboolean result;
|
|
||||||
|
|
||||||
if (!types)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
result = FALSE;
|
|
||||||
|
|
||||||
for (i = 0; types[i] != NULL; ++i)
|
|
||||||
{
|
|
||||||
gchar *type = types[i];
|
|
||||||
|
|
||||||
g_print ("type: %s\n", type);
|
|
||||||
|
|
||||||
if (strcmp (type, check_type) == 0)
|
|
||||||
{
|
|
||||||
result = TRUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
g_strfreev (types);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_screen_info_add_window (MetaScreenInfo *info,
|
meta_screen_info_add_window (MetaScreenInfo *info,
|
||||||
Window xwindow)
|
Window xwindow)
|
||||||
{
|
{
|
||||||
CmNode *node;
|
|
||||||
WsDrawable *drawable;
|
WsDrawable *drawable;
|
||||||
WsRectangle geometry;
|
MetaCompWindow *comp_window;
|
||||||
double alpha = 1.0;
|
|
||||||
|
|
||||||
ws_display_begin_error_trap (info->display);
|
ws_display_begin_error_trap (info->display);
|
||||||
|
|
||||||
node = find_node (info, xwindow);
|
comp_window = meta_comp_window_lookup (xwindow);
|
||||||
#if 0
|
|
||||||
g_print ("lookup %lx\n", xwindow);
|
|
||||||
#endif
|
|
||||||
drawable = WS_DRAWABLE (ws_window_lookup (info->display, xwindow));
|
|
||||||
|
|
||||||
if (node)
|
if (comp_window)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
drawable = WS_DRAWABLE (ws_window_lookup (info->display, xwindow));
|
||||||
|
|
||||||
if (ws_window_query_input_only (WS_WINDOW (drawable)))
|
if (ws_window_query_input_only (WS_WINDOW (drawable)))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@ -579,72 +490,13 @@ meta_screen_info_add_window (MetaScreenInfo *info,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ws_drawable_query_geometry (drawable, &geometry);
|
comp_window = meta_comp_window_new (drawable);
|
||||||
|
|
||||||
node = CM_NODE (cm_drawable_node_new (drawable, &geometry));
|
cm_stacker_add_child (info->stacker, meta_comp_window_get_node (comp_window));
|
||||||
|
|
||||||
#if 0
|
out:
|
||||||
g_print ("alpha: %f\n", alpha);
|
if (comp_window)
|
||||||
#endif
|
meta_comp_window_refresh_attrs (comp_window);
|
||||||
cm_drawable_node_set_alpha (node, alpha);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
print_child_titles (WS_WINDOW (drawable));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
cm_stacker_add_child (info->stacker, node);
|
|
||||||
|
|
||||||
g_hash_table_insert (info->window_infos_by_xid,
|
|
||||||
(gpointer)xwindow,
|
|
||||||
window_info_new (xwindow, node));
|
|
||||||
|
|
||||||
g_object_unref (node);
|
|
||||||
out:
|
|
||||||
if (node)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
g_print ("drawable %lx is now ", WS_RESOURCE_XID (drawable));
|
|
||||||
#endif
|
|
||||||
if (ws_window_query_mapped (WS_WINDOW (drawable)))
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
g_print ("mapped\n");
|
|
||||||
#endif
|
|
||||||
cm_drawable_node_unset_patch (node);
|
|
||||||
#if 0
|
|
||||||
g_print ("set alpha %f\n", alpha);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (has_type (drawable, "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU"))
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
g_print ("is menu\n");
|
|
||||||
#endif
|
|
||||||
alpha = 0.9;
|
|
||||||
}
|
|
||||||
else if (has_type (drawable, "_NET_WM_WINDOW_TYPE_POPUP_MENU"))
|
|
||||||
{
|
|
||||||
alpha = 0.9;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
g_print ("is not menu\n");
|
|
||||||
#endif
|
|
||||||
alpha = 1.0;
|
|
||||||
}
|
|
||||||
cm_drawable_node_set_alpha (node, alpha);
|
|
||||||
cm_drawable_node_set_viewable (node, TRUE);
|
|
||||||
cm_drawable_node_update_pixmap (node);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
g_print ("unmapped\n");
|
|
||||||
#endif
|
|
||||||
cm_drawable_node_set_viewable (node, FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ws_display_end_error_trap (info->display);
|
ws_display_end_error_trap (info->display);
|
||||||
|
|
||||||
@ -660,17 +512,14 @@ void
|
|||||||
meta_screen_info_remove_window (MetaScreenInfo *info,
|
meta_screen_info_remove_window (MetaScreenInfo *info,
|
||||||
Window xwindow)
|
Window xwindow)
|
||||||
{
|
{
|
||||||
CmNode *node = find_node (info, xwindow);
|
MetaCompWindow *comp_window = meta_comp_window_lookup (xwindow);
|
||||||
|
|
||||||
#if 0
|
if (comp_window)
|
||||||
g_print ("removing %lx\n", xwindow);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (node)
|
|
||||||
{
|
{
|
||||||
g_hash_table_remove (info->window_infos_by_xid, (gpointer)xwindow);
|
CmNode *node = meta_comp_window_get_node (comp_window);
|
||||||
|
|
||||||
cm_stacker_remove_child (info->stacker, node);
|
cm_stacker_remove_child (info->stacker, node);
|
||||||
|
meta_comp_window_free (comp_window);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -679,33 +528,9 @@ meta_screen_info_set_updates (MetaScreenInfo *info,
|
|||||||
Window xwindow,
|
Window xwindow,
|
||||||
gboolean updates)
|
gboolean updates)
|
||||||
{
|
{
|
||||||
WindowInfo *win_info = find_win_info (info, xwindow);
|
MetaCompWindow *comp_window = meta_comp_window_lookup (xwindow);
|
||||||
CmDrawableNode *node = CM_DRAWABLE_NODE (win_info->node);
|
|
||||||
|
|
||||||
#if 0
|
meta_comp_window_set_updates (comp_window, updates);
|
||||||
g_print ("setting updates to %s\n", updates? "on" : "off");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
win_info->updates = updates;
|
|
||||||
|
|
||||||
if (node)
|
|
||||||
cm_drawable_node_set_updates (node, updates);
|
|
||||||
|
|
||||||
if (updates)
|
|
||||||
{
|
|
||||||
WsRectangle rect;
|
|
||||||
WsRegion *shape;
|
|
||||||
WsDisplay *display = WS_RESOURCE (node->drawable)->display;
|
|
||||||
|
|
||||||
ws_display_begin_error_trap (display);
|
|
||||||
ws_drawable_query_geometry (node->drawable, &rect);
|
|
||||||
cm_drawable_node_update_pixmap (node);
|
|
||||||
cm_drawable_node_set_geometry (node, &rect);
|
|
||||||
shape = ws_window_get_output_shape (WS_WINDOW (node->drawable));
|
|
||||||
cm_drawable_node_set_shape (node, shape);
|
|
||||||
ws_region_destroy (shape);
|
|
||||||
ws_display_end_error_trap (display);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -47,3 +47,5 @@ void meta_screen_info_set_explode (MetaScreenInfo *info,
|
|||||||
gdouble level);
|
gdouble level);
|
||||||
void meta_screen_info_hide_window (MetaScreenInfo *info,
|
void meta_screen_info_hide_window (MetaScreenInfo *info,
|
||||||
Window xwindow);
|
Window xwindow);
|
||||||
|
void meta_screen_info_unmap (MetaScreenInfo *info,
|
||||||
|
Window xwindow);
|
||||||
|
231
src/c-window.c
Normal file
231
src/c-window.c
Normal file
@ -0,0 +1,231 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2006 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||||
|
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <glib.h>
|
||||||
|
#include <cm/ws.h>
|
||||||
|
#include <cm/wsint.h>
|
||||||
|
#include <cm/node.h>
|
||||||
|
#include <cm/drawable-node.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "c-window.h"
|
||||||
|
|
||||||
|
static GHashTable *windows_by_xid;
|
||||||
|
|
||||||
|
struct _MetaCompWindow
|
||||||
|
{
|
||||||
|
WsDrawable *drawable;
|
||||||
|
CmNode *node;
|
||||||
|
gboolean updates;
|
||||||
|
|
||||||
|
WsRectangle size;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
ensure_hash_table (void)
|
||||||
|
{
|
||||||
|
if (!windows_by_xid)
|
||||||
|
{
|
||||||
|
windows_by_xid = g_hash_table_new (
|
||||||
|
g_direct_hash, g_direct_equal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MetaCompWindow *
|
||||||
|
meta_comp_window_new (WsDrawable *drawable)
|
||||||
|
{
|
||||||
|
MetaCompWindow *window;
|
||||||
|
WsRectangle geometry;
|
||||||
|
|
||||||
|
ws_drawable_query_geometry (drawable, &geometry);
|
||||||
|
|
||||||
|
window = g_new0 (MetaCompWindow, 1);
|
||||||
|
|
||||||
|
window->drawable = g_object_ref (drawable);
|
||||||
|
window->node = CM_NODE (cm_drawable_node_new (drawable, &geometry));
|
||||||
|
window->updates = TRUE;
|
||||||
|
|
||||||
|
ensure_hash_table ();
|
||||||
|
|
||||||
|
g_hash_table_insert (windows_by_xid, (gpointer)WS_RESOURCE_XID (window->drawable), window);
|
||||||
|
|
||||||
|
return window;
|
||||||
|
}
|
||||||
|
|
||||||
|
MetaCompWindow *
|
||||||
|
meta_comp_window_lookup (Window xid)
|
||||||
|
{
|
||||||
|
MetaCompWindow *window;
|
||||||
|
|
||||||
|
ensure_hash_table ();
|
||||||
|
|
||||||
|
window = g_hash_table_lookup (windows_by_xid, (gpointer)xid);
|
||||||
|
|
||||||
|
return window;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_comp_window_free (MetaCompWindow *window)
|
||||||
|
{
|
||||||
|
ensure_hash_table ();
|
||||||
|
|
||||||
|
g_hash_table_remove (windows_by_xid, WS_RESOURCE_XID (window->drawable));
|
||||||
|
g_object_unref (window->drawable);
|
||||||
|
g_object_unref (window->node);
|
||||||
|
g_free (window);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_comp_window_set_size (MetaCompWindow *comp_window,
|
||||||
|
WsRectangle *rect)
|
||||||
|
{
|
||||||
|
if (comp_window->updates)
|
||||||
|
{
|
||||||
|
WsWindow *window = WS_WINDOW (comp_window->drawable);
|
||||||
|
WsDisplay *display = WS_RESOURCE (window)->display;
|
||||||
|
CmDrawableNode *dnode = CM_DRAWABLE_NODE (comp_window->node);
|
||||||
|
WsRegion *shape;
|
||||||
|
|
||||||
|
ws_display_begin_error_trap (display);
|
||||||
|
|
||||||
|
cm_drawable_node_set_geometry (dnode, rect);
|
||||||
|
shape = ws_window_get_output_shape (window);
|
||||||
|
cm_drawable_node_set_shape (dnode, shape);
|
||||||
|
ws_region_destroy (shape);
|
||||||
|
|
||||||
|
if (rect->width != comp_window->size.width ||
|
||||||
|
rect->height != comp_window->size.height)
|
||||||
|
{
|
||||||
|
cm_drawable_node_update_pixmap (dnode);
|
||||||
|
}
|
||||||
|
|
||||||
|
comp_window->size = *rect;
|
||||||
|
|
||||||
|
ws_display_end_error_trap (display);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
has_type (WsWindow *window, const char *check_type)
|
||||||
|
{
|
||||||
|
gchar **types = ws_window_get_property_atom_list (window, "_NET_WM_WINDOW_TYPE");
|
||||||
|
int i;
|
||||||
|
gboolean result;
|
||||||
|
|
||||||
|
if (!types)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
result = FALSE;
|
||||||
|
|
||||||
|
for (i = 0; types[i] != NULL; ++i)
|
||||||
|
{
|
||||||
|
gchar *type = types[i];
|
||||||
|
|
||||||
|
g_print ("type: %s\n", type);
|
||||||
|
|
||||||
|
if (strcmp (type, check_type) == 0)
|
||||||
|
{
|
||||||
|
result = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_strfreev (types);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_comp_window_refresh_attrs (MetaCompWindow *comp_window)
|
||||||
|
{
|
||||||
|
/* FIXME: this function should not exist - the real problem is
|
||||||
|
* probably in meta_screen_info_add_window() where it it called.
|
||||||
|
*/
|
||||||
|
|
||||||
|
double alpha = 1.0;
|
||||||
|
CmDrawableNode *node = CM_DRAWABLE_NODE (comp_window->node);
|
||||||
|
|
||||||
|
if (ws_window_query_mapped (WS_WINDOW (comp_window->drawable)))
|
||||||
|
{
|
||||||
|
WsWindow *window = WS_WINDOW (comp_window->drawable);
|
||||||
|
|
||||||
|
cm_drawable_node_unset_patch (CM_DRAWABLE_NODE (node));
|
||||||
|
|
||||||
|
if (has_type (window, "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU"))
|
||||||
|
{
|
||||||
|
alpha = 0.3;
|
||||||
|
}
|
||||||
|
else if (has_type (window, "_NET_WM_WINDOW_TYPE_POPUP_MENU"))
|
||||||
|
{
|
||||||
|
alpha = 0.9;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
alpha = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
cm_drawable_node_set_alpha (node, alpha);
|
||||||
|
cm_drawable_node_set_viewable (node, TRUE);
|
||||||
|
cm_drawable_node_update_pixmap (node);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cm_drawable_node_set_viewable (node, FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_comp_window_set_updates (MetaCompWindow *comp_window,
|
||||||
|
gboolean updates)
|
||||||
|
{
|
||||||
|
CmDrawableNode *node = CM_DRAWABLE_NODE (comp_window->node);
|
||||||
|
|
||||||
|
comp_window->updates = updates;
|
||||||
|
|
||||||
|
cm_drawable_node_set_updates (node, updates);
|
||||||
|
|
||||||
|
if (updates)
|
||||||
|
{
|
||||||
|
WsRectangle rect;
|
||||||
|
WsRegion *shape;
|
||||||
|
WsDisplay *display = WS_RESOURCE (node->drawable)->display;
|
||||||
|
|
||||||
|
ws_display_begin_error_trap (display);
|
||||||
|
ws_drawable_query_geometry (node->drawable, &rect);
|
||||||
|
cm_drawable_node_update_pixmap (node);
|
||||||
|
cm_drawable_node_set_geometry (node, &rect);
|
||||||
|
shape = ws_window_get_output_shape (WS_WINDOW (node->drawable));
|
||||||
|
cm_drawable_node_set_shape (node, shape);
|
||||||
|
ws_region_destroy (shape);
|
||||||
|
ws_display_end_error_trap (display);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CmNode *
|
||||||
|
meta_comp_window_get_node (MetaCompWindow *comp_window)
|
||||||
|
{
|
||||||
|
return comp_window->node;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
33
src/c-window.h
Normal file
33
src/c-window.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2006 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cm/node.h>
|
||||||
|
|
||||||
|
typedef struct _MetaCompWindow MetaCompWindow;
|
||||||
|
|
||||||
|
MetaCompWindow *meta_comp_window_new (WsDrawable *drawable);
|
||||||
|
CmNode *meta_comp_window_get_node (MetaCompWindow *window);
|
||||||
|
MetaCompWindow *meta_comp_window_lookup (Window xwindow);
|
||||||
|
void meta_comp_window_free (MetaCompWindow *window);
|
||||||
|
void meta_comp_window_set_size (MetaCompWindow *window,
|
||||||
|
WsRectangle *size);
|
||||||
|
|
||||||
|
void meta_comp_window_refresh_attrs (MetaCompWindow *comp_window);
|
||||||
|
void meta_comp_window_set_updates (MetaCompWindow *comp_window,
|
||||||
|
gboolean updates);
|
162
src/compositor.c
162
src/compositor.c
@ -90,7 +90,7 @@ handle_error (Display *dpy, XErrorEvent *ev, gpointer data)
|
|||||||
{
|
{
|
||||||
WsDisplay *display = data;
|
WsDisplay *display = data;
|
||||||
|
|
||||||
ws_display_process_error (display, ev);
|
ws_display_process_xerror (display, ev);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -181,25 +181,6 @@ meta_compositor_unref (MetaCompositor *compositor)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||||
static void
|
|
||||||
draw_windows (MetaScreen *screen,
|
|
||||||
GList *list)
|
|
||||||
{
|
|
||||||
CmNode *node;
|
|
||||||
|
|
||||||
if (!list)
|
|
||||||
return;
|
|
||||||
|
|
||||||
node = list->data;
|
|
||||||
|
|
||||||
draw_windows (screen, list->next);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
g_print ("rendering: %p\n", node);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
cm_node_render (node, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
process_configure_notify (MetaCompositor *compositor,
|
process_configure_notify (MetaCompositor *compositor,
|
||||||
@ -510,149 +491,8 @@ meta_compositor_process_event (MetaCompositor *compositor,
|
|||||||
#endif /* HAVE_COMPOSITE_EXTENSIONS */
|
#endif /* HAVE_COMPOSITE_EXTENSIONS */
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
|
||||||
static void
|
|
||||||
wavy (double time,
|
|
||||||
double in_x, double in_y,
|
|
||||||
double *out_x, double *out_y,
|
|
||||||
gpointer data)
|
|
||||||
{
|
|
||||||
static int m;
|
|
||||||
time = time * 5;
|
|
||||||
double dx = 0.0025 * sin (time + 35 * in_y);
|
|
||||||
double dy = 0.0025 * cos (time + 35 * in_x);
|
|
||||||
|
|
||||||
*out_x = in_x + dx;
|
|
||||||
*out_y = in_y + dy;
|
|
||||||
|
|
||||||
m++;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GTimer *timer;
|
static GTimer *timer;
|
||||||
|
|
||||||
#if 0
|
|
||||||
static gboolean
|
|
||||||
update (gpointer data)
|
|
||||||
{
|
|
||||||
MetaScreen *screen = data;
|
|
||||||
ScreenInfo *scr_info = screen->compositor_data;
|
|
||||||
WsWindow *gl_window = scr_info->glw;
|
|
||||||
gdouble angle;
|
|
||||||
|
|
||||||
glViewport (0, 0, screen->rect.width, screen->rect.height);
|
|
||||||
|
|
||||||
if (!timer)
|
|
||||||
timer = g_timer_new ();
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
g_print ("rotation: %f\n", 360 * g_timer_elapsed (timer, NULL));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
angle = g_timer_elapsed (timer, NULL) * 90;
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
angle = 180.0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
cm_rotation_set_rotation (screen->display->compositor->rotation,
|
|
||||||
angle,
|
|
||||||
0.0, 1.0, 0.0);
|
|
||||||
|
|
||||||
glClearColor (0.0, 0.0, 0.0, 0.0);
|
|
||||||
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
||||||
|
|
||||||
glDisable (GL_TEXTURE_2D);
|
|
||||||
glDisable (GL_DEPTH_TEST);
|
|
||||||
ws_window_raise (gl_window);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
glMatrixMode (GL_MODELVIEW);
|
|
||||||
|
|
||||||
glLoadIdentity();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
glTranslatef (-1.0, -1.0, 0.0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
glMatrixMode (GL_PROJECTION);
|
|
||||||
glLoadIdentity();
|
|
||||||
gluPerspective( 45.0f, 1.0, 0.1f, 10.0f );
|
|
||||||
|
|
||||||
glMatrixMode (GL_MODELVIEW);
|
|
||||||
glLoadIdentity();
|
|
||||||
glTranslatef (0, 0, -3);
|
|
||||||
|
|
||||||
glEnable (GL_DEPTH_TEST);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
draw_windows (screen, scr_info->compositor_nodes);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* FIXME: we should probably grab the server around the raise/swap
|
|
||||||
*/
|
|
||||||
|
|
||||||
CmState *state = cm_state_new ();
|
|
||||||
|
|
||||||
cm_state_disable_depth_buffer_update (state);
|
|
||||||
|
|
||||||
cm_node_render (CM_NODE (screen->display->compositor->stacker), state);
|
|
||||||
|
|
||||||
cm_state_enable_depth_buffer_update (state);
|
|
||||||
|
|
||||||
g_object_unref (state);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
ws_display_grab (ws_drawable_get_display ((WsDrawable *)gl_window));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ws_window_gl_swap_buffers (gl_window);
|
|
||||||
glFinish();
|
|
||||||
|
|
||||||
update_frame_counter ();
|
|
||||||
|
|
||||||
scr_info->idle_id = 0;
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
static void
|
|
||||||
queue_repaint (CmDrawableNode *node, gpointer data)
|
|
||||||
{
|
|
||||||
MetaScreen *screen = data;
|
|
||||||
ScreenInfo *scr_info = screen->compositor_data;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
g_print ("metacity queueing repaint for %p\n", node);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!scr_info)
|
|
||||||
{
|
|
||||||
/* compositor has been turned off */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!scr_info->idle_id)
|
|
||||||
{
|
|
||||||
scr_info->idle_id = g_idle_add (update, screen);
|
|
||||||
#if 0
|
|
||||||
g_print ("done\n");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
g_print ("one was queued already\n");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* HAVE_COMPOSITE_EXTENSIONS */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||||
static void
|
static void
|
||||||
dump_stacking_order (GList *nodes)
|
dump_stacking_order (GList *nodes)
|
||||||
|
Loading…
Reference in New Issue
Block a user