static gboolean utf8_string_from_results (GetPropertyResults *results, char **str_p) { *str_p = NULL; if (!validate_or_free_results (results, 8, results->display->atom_UTF8_STRING, FALSE)) return FALSE; if (results->n_items > 0 && !g_utf8_validate ((gchar *)results->prop, results->n_items, NULL)) { char *name; name = XGetAtomName (results->display->xdisplay, results->xatom); meta_warning (_("Property %s on window 0x%lx contained invalid UTF-8\n"), name, results->xwindow); meta_XFree (name); XFree (results->prop); results->prop = NULL; return FALSE; } *str_p = (char*) results->prop; results->prop = NULL; return TRUE; }
static gboolean size_hints_from_results (GetPropertyResults *results, XSizeHints **hints_p, gulong *flags_p) { xPropSizeHints *raw; XSizeHints *hints; *hints_p = NULL; *flags_p = 0; if (!validate_or_free_results (results, 32, XA_WM_SIZE_HINTS, FALSE)) return FALSE; if (results->n_items < OldNumPropSizeElements) return FALSE; raw = (xPropSizeHints*) results->prop; hints = ag_Xmalloc (sizeof (XSizeHints)); /* XSizeHints misdeclares these as int instead of long */ hints->flags = raw->flags; hints->x = cvtINT32toInt (raw->x); hints->y = cvtINT32toInt (raw->y); hints->width = cvtINT32toInt (raw->width); hints->height = cvtINT32toInt (raw->height); hints->min_width = cvtINT32toInt (raw->minWidth); hints->min_height = cvtINT32toInt (raw->minHeight); hints->max_width = cvtINT32toInt (raw->maxWidth); hints->max_height = cvtINT32toInt (raw->maxHeight); hints->width_inc = cvtINT32toInt (raw->widthInc); hints->height_inc = cvtINT32toInt (raw->heightInc); hints->min_aspect.x = cvtINT32toInt (raw->minAspectX); hints->min_aspect.y = cvtINT32toInt (raw->minAspectY); hints->max_aspect.x = cvtINT32toInt (raw->maxAspectX); hints->max_aspect.y = cvtINT32toInt (raw->maxAspectY); *flags_p = (USPosition | USSize | PAllHints); if (results->n_items >= NumPropSizeElements) { hints->base_width= cvtINT32toInt (raw->baseWidth); hints->base_height= cvtINT32toInt (raw->baseHeight); hints->win_gravity= cvtINT32toInt (raw->winGravity); *flags_p |= (PBaseSize | PWinGravity); } hints->flags &= (*flags_p); /* get rid of unwanted bits */ XFree (results->prop); results->prop = NULL; *hints_p = hints; return TRUE; }
static gboolean wm_hints_from_results (GetPropertyResults *results, XWMHints **hints_p) { XWMHints *hints; xPropWMHints *raw; *hints_p = NULL; if (!validate_or_free_results (results, 32, XA_WM_HINTS, TRUE)) return FALSE; /* pre-R3 bogusly truncated window_group, don't fail on them */ if (results->n_items < (NumPropWMHintsElements - 1)) { meta_verbose ("WM_HINTS property too short: %d should be %d\n", (int) results->n_items, NumPropWMHintsElements - 1); if (results->prop) { XFree (results->prop); results->prop = NULL; } return FALSE; } hints = ag_Xmalloc0 (sizeof (XWMHints)); raw = (xPropWMHints*) results->prop; hints->flags = raw->flags; hints->input = (raw->input ? True : False); hints->initial_state = cvtINT32toInt (raw->initialState); hints->icon_pixmap = raw->iconPixmap; hints->icon_window = raw->iconWindow; hints->icon_x = cvtINT32toInt (raw->iconX); hints->icon_y = cvtINT32toInt (raw->iconY); hints->icon_mask = raw->iconMask; if (results->n_items >= NumPropWMHintsElements) hints->window_group = raw->windowGroup; else hints->window_group = 0; if (results->prop) { XFree (results->prop); results->prop = NULL; } *hints_p = hints; return TRUE; }
static gboolean window_from_results (GetPropertyResults *results, Window *window_p) { if (!validate_or_free_results (results, 32, XA_WINDOW, TRUE)) return FALSE; *window_p = *(Window*) results->prop; XFree (results->prop); results->prop = NULL; return TRUE; }
static gboolean cardinal_with_atom_type_from_results (GetPropertyResults *results, Atom prop_type, gulong *cardinal_p) { if (!validate_or_free_results (results, 32, prop_type, TRUE)) return FALSE; *cardinal_p = *(gulong*) results->prop; XFree (results->prop); results->prop = NULL; return TRUE; }
static gboolean latin1_string_from_results (GetPropertyResults *results, char **str_p) { *str_p = NULL; if (!validate_or_free_results (results, 8, XA_STRING, FALSE)) return FALSE; *str_p = (char*) results->prop; results->prop = NULL; return TRUE; }
static gboolean cardinal_list_from_results (GetPropertyResults *results, gulong **cardinals_p, int *n_cardinals_p) { if (!validate_or_free_results (results, 32, XA_CARDINAL, FALSE)) return FALSE; *cardinals_p = (gulong*) results->prop; *n_cardinals_p = results->n_items; results->prop = NULL; return TRUE; }
static gboolean atom_list_from_results (GetPropertyResults *results, Atom **atoms_p, int *n_atoms_p) { if (!validate_or_free_results (results, 32, XA_ATOM, FALSE)) return FALSE; *atoms_p = (Atom*) results->prop; *n_atoms_p = results->n_items; results->prop = NULL; return TRUE; }
static gboolean counter_from_results (GetPropertyResults *results, XSyncCounter *counter_p) { if (!validate_or_free_results (results, 32, XA_CARDINAL, TRUE)) return FALSE; *counter_p = *(XSyncCounter*) results->prop; XFree (results->prop); results->prop = NULL; return TRUE; }
static gboolean cardinal_with_atom_type_from_results (GetPropertyResults *results, Atom prop_type, gulong *cardinal_p) { if (!validate_or_free_results (results, 32, prop_type, TRUE)) return FALSE; *cardinal_p = *(gulong*) results->prop; #if GLIB_SIZEOF_LONG == 8 /* Xlib sign-extends format=32 items, but we want them unsigned */ *cardinal_p &= 0xffffffff; #endif XFree (results->prop); results->prop = NULL; return TRUE; }
static gboolean class_hint_from_results (GetPropertyResults *results, XClassHint *class_hint) { int len_name, len_class; class_hint->res_class = NULL; class_hint->res_name = NULL; if (!validate_or_free_results (results, 8, XA_STRING, FALSE)) return FALSE; len_name = strlen ((char *) results->prop); if (! (class_hint->res_name = ag_Xmalloc (len_name+1))) { XFree (results->prop); results->prop = NULL; return FALSE; } strcpy (class_hint->res_name, (char *)results->prop); if (len_name == (int) results->n_items) len_name--; len_class = strlen ((char *)results->prop + len_name + 1); if (! (class_hint->res_class = ag_Xmalloc(len_class+1))) { XFree(class_hint->res_name); class_hint->res_name = NULL; XFree (results->prop); results->prop = NULL; return FALSE; } strcpy (class_hint->res_class, (char *)results->prop + len_name + 1); XFree (results->prop); results->prop = NULL; return TRUE; }
static gboolean cardinal_list_from_results (GetPropertyResults *results, gulong **cardinals_p, int *n_cardinals_p) { if (!validate_or_free_results (results, 32, XA_CARDINAL, FALSE)) return FALSE; *cardinals_p = (gulong*) results->prop; *n_cardinals_p = results->n_items; results->prop = NULL; #if GLIB_SIZEOF_LONG == 8 /* Xlib sign-extends format=32 items, but we want them unsigned */ { int i; for (i = 0; i < *n_cardinals_p; i++) (*cardinals_p)[i] = (*cardinals_p)[i] & 0xffffffff; } #endif return TRUE; }
/* this one freakishly returns g_malloc memory */ static gboolean utf8_list_from_results (GetPropertyResults *results, char ***str_p, int *n_str_p) { int i; int n_strings; char **retval; const char *p; *str_p = NULL; *n_str_p = 0; if (!validate_or_free_results (results, 8, results->display->atom_UTF8_STRING, FALSE)) return FALSE; /* I'm not sure this is right, but I'm guessing the * property is nul-separated */ i = 0; n_strings = 0; while (i < (int) results->n_items) { if (results->prop[i] == '\0') ++n_strings; ++i; } if (results->prop[results->n_items - 1] != '\0') ++n_strings; /* we're guaranteed that results->prop has a nul on the end * by XGetWindowProperty */ retval = g_new0 (char*, n_strings + 1); p = (char *)results->prop; i = 0; while (i < n_strings) { if (!g_utf8_validate (p, -1, NULL)) { char *name; meta_error_trap_push (results->display); name = XGetAtomName (results->display->xdisplay, results->xatom); meta_error_trap_pop (results->display, TRUE); meta_warning (_("Property %s on window 0x%lx contained invalid UTF-8 for item %d in the list\n"), name, results->xwindow, i); meta_XFree (name); meta_XFree (results->prop); results->prop = NULL; g_strfreev (retval); return FALSE; } retval[i] = g_strdup (p); p = p + strlen (p) + 1; ++i; } *str_p = retval; *n_str_p = i; meta_XFree (results->prop); results->prop = NULL; return TRUE; }