summaryrefslogtreecommitdiff
path: root/src/core.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core.h')
-rw-r--r--src/core.h110
1 files changed, 62 insertions, 48 deletions
diff --git a/src/core.h b/src/core.h
index b28907db..c374429f 100644
--- a/src/core.h
+++ b/src/core.h
@@ -29,30 +29,68 @@
#include <gdk/gdkx.h>
#include "common.h"
-void meta_core_get_client_size (Display *xdisplay,
- Window frame_xwindow,
- int *width,
- int *height);
-
-gboolean meta_core_titlebar_is_onscreen (Display *xdisplay,
- Window frame_xwindow);
-
-gboolean meta_core_window_has_frame (Display *xdisplay,
- Window frame_xwindow);
-
-
-Window meta_core_get_client_xwindow (Display *xdisplay,
- Window frame_xwindow);
-
-MetaFrameFlags meta_core_get_frame_flags (Display *xdisplay,
- Window frame_xwindow);
-MetaFrameType meta_core_get_frame_type (Display *xdisplay,
- Window frame_xwindow);
-
-GdkPixbuf* meta_core_get_mini_icon (Display *xdisplay,
- Window frame_xwindow);
-GdkPixbuf* meta_core_get_icon (Display *xdisplay,
- Window frame_xwindow);
+typedef enum
+{
+ META_CORE_GET_END = 0,
+ META_CORE_WINDOW_HAS_FRAME,
+ META_CORE_GET_CLIENT_WIDTH,
+ META_CORE_GET_CLIENT_HEIGHT,
+ META_CORE_IS_TITLEBAR_ONSCREEN,
+ META_CORE_GET_CLIENT_XWINDOW,
+ META_CORE_GET_FRAME_FLAGS,
+ META_CORE_GET_FRAME_TYPE,
+ META_CORE_GET_MINI_ICON,
+ META_CORE_GET_ICON,
+ META_CORE_GET_X,
+ META_CORE_GET_Y,
+ META_CORE_GET_FRAME_WORKSPACE,
+ META_CORE_GET_FRAME_X,
+ META_CORE_GET_FRAME_Y,
+ META_CORE_GET_FRAME_WIDTH,
+ META_CORE_GET_FRAME_HEIGHT,
+ META_CORE_GET_SCREEN_WIDTH,
+ META_CORE_GET_SCREEN_HEIGHT,
+} MetaCoreGetType;
+
+/* General information function about the given window. Pass in a sequence of
+ * pairs of MetaCoreGetTypes and pointers to variables; the variables will be
+ * filled with the requested values. End the list with META_CORE_GET_END.
+ * For example:
+ *
+ * meta_core_get (my_display, my_window,
+ * META_CORE_GET_X, &x,
+ * META_CORE_GET_Y, &y,
+ * META_CORE_GET_END);
+ *
+ * If the window doesn't have a frame, this will raise a meta_bug. To suppress
+ * this behaviour, ask META_CORE_WINDOW_HAS_FRAME as the *first* question in
+ * the list. If the window has no frame, the answer to this question will be
+ * False, and anything else you asked will be undefined. Otherwise, the answer
+ * will be True. The answer will necessarily be True if you ask the question
+ * in any other position. The positions of all other questions don't matter.
+ *
+ * The reason for this function is that some parts of the program don't know
+ * about MetaWindows. But they *can* see core.h. So we used to have a whole
+ * load of functions which took a display and an X window, looked up the
+ * relevant MetaWindow, and returned information about it. The trouble with
+ * that is that looking up the MetaWindow is a nontrivial operation, and
+ * consolidating the calls in this way makes (for example) frame exposes
+ * 33% faster, according to valgrind.
+ *
+ * This function would perhaps be slightly better if the questions were
+ * represented by pointers, perhaps gchar*s, because then we could take
+ * advantage of gcc's automatic sentinel checking. On the other hand, this
+ * immediately suggests string comparison, and that's slow.
+ *
+ * Another possible improvement is that core.h still has a bunch of
+ * functions which can't be described by the formula "give a display and
+ * an X window, get a single value" (meta_core_user_move, for example), but
+ * which could theoretically be handled by this function if we relaxed the
+ * requirement that all questions should have exactly one argument.
+ */
+void meta_core_get (Display *xdisplay,
+ Window window,
+ ...);
void meta_core_queue_frame_resize (Display *xdisplay,
Window frame_xwindow);
@@ -78,17 +116,6 @@ void meta_core_user_focus (Display *xdisplay,
Window frame_xwindow,
guint32 timestamp);
-/* get position of client, same coord space expected by move */
-void meta_core_get_position (Display *xdisplay,
- Window frame_xwindow,
- int *x,
- int *y);
-
-void meta_core_get_size (Display *xdisplay,
- Window frame_xwindow,
- int *width,
- int *height);
-
void meta_core_minimize (Display *xdisplay,
Window frame_xwindow);
void meta_core_toggle_maximize (Display *xdisplay,
@@ -126,14 +153,6 @@ const char* meta_core_get_workspace_name_with_index (Display *xdisplay,
Window xroot,
int index);
-void meta_core_get_frame_extents (Display *xdisplay,
- Window frame_xwindow,
- int *x,
- int *y,
- int *width,
- int *height);
-
-
void meta_core_show_window_menu (Display *xdisplay,
Window frame_xwindow,
int root_x,
@@ -170,11 +189,6 @@ void meta_core_set_screen_cursor (Display *xdisplay,
Window frame_on_screen,
MetaCursor cursor);
-void meta_core_get_screen_size (Display *xdisplay,
- Window frame_on_screen,
- int *width,
- int *height);
-
/* Used because we ignore EnterNotify when a window is unmapped that
* really shouldn't cause focus changes, by comparing the event serial
* of the EnterNotify and the UnmapNotify.