xserver

xserver with xephyr scale patch
git clone https://git.neptards.moe/u3shit/xserver.git
Log | Files | Refs | README | LICENSE

sun_apm.c (7130B)


      1 /* Based on hw/xfree86/os-support/bsd/bsd_apm.c which bore no explicit
      2  * copyright notice, so is covered by the following notice:
      3  *
      4  * Copyright (C) 1994-2003 The XFree86 Project, Inc.  All Rights Reserved.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the "Software"),
      8  * to deal in the Software without restriction, including without limitation
      9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     10  * and/or sell copies of the Software, and to permit persons to whom the
     11  * Software is furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be included in
     14  * all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     19  * THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
     20  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
     21  * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     22  * SOFTWARE.
     23  *
     24  * Except as contained in this notice, the name of the XFree86 Project shall
     25  * not be used in advertising or otherwise to promote the sale, use or other
     26  * dealings in this Software without prior written authorization from the
     27  * XFree86 Project.
     28  */
     29 
     30 /* Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
     31  *
     32  * Permission is hereby granted, free of charge, to any person obtaining a
     33  * copy of this software and associated documentation files (the "Software"),
     34  * to deal in the Software without restriction, including without limitation
     35  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     36  * and/or sell copies of the Software, and to permit persons to whom the
     37  * Software is furnished to do so, subject to the following conditions:
     38  *
     39  * The above copyright notice and this permission notice (including the next
     40  * paragraph) shall be included in all copies or substantial portions of the
     41  * Software.
     42  *
     43  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     44  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     45  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     46  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     47  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     48  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     49  * DEALINGS IN THE SOFTWARE.
     50  */
     51 
     52 #ifdef HAVE_XORG_CONFIG_H
     53 #include <xorg-config.h>
     54 #endif
     55 
     56 #include <X11/X.h>
     57 #include "os.h"
     58 #include "xf86.h"
     59 #include "xf86Priv.h"
     60 #define XF86_OS_PRIVS
     61 #include "xf86_OSproc.h"
     62 #include "xf86_OSlib.h"
     63 
     64 #ifndef PLEASE_FIX_THIS
     65 #define APM_STANDBY_REQ 0xa01
     66 #define APM_SUSPEND_REQ 0xa02
     67 #define APM_NORMAL_RESUME 0xa03
     68 #define APM_CRIT_RESUME 0xa04
     69 #define APM_BATTERY_LOW 0xa05
     70 #define APM_POWER_CHANGE 0xa06
     71 #define APM_UPDATE_TIME 0xa07
     72 #define APM_CRIT_SUSPEND_REQ 0xa08
     73 #define APM_USER_STANDBY_REQ 0xa09
     74 #define APM_USER_SUSPEND_REQ 0xa0a
     75 #define APM_SYS_STANDBY_RESUME 0xa0b
     76 #define APM_IOC_NEXTEVENT 0xa0c
     77 #define APM_IOC_RESUME 0xa0d
     78 #define APM_IOC_SUSPEND 0xa0e
     79 #define APM_IOC_STANDBY 0xa0f
     80 #endif
     81 
     82 typedef struct apm_event_info {
     83     int type;
     84 } apm_event_info;
     85 
     86 /*
     87  This may be replaced with a better device name
     88  very soon...
     89 */
     90 #define APM_DEVICE "/dev/srn"
     91 #define APM_DEVICE1 "/dev/apm"
     92 
     93 static void *APMihPtr = NULL;
     94 static void sunCloseAPM(void);
     95 
     96 static struct {
     97     u_int apmBsd;
     98     pmEvent xf86;
     99 } sunToXF86Array[] = {
    100     {APM_STANDBY_REQ, XF86_APM_SYS_STANDBY},
    101     {APM_SUSPEND_REQ, XF86_APM_SYS_SUSPEND},
    102     {APM_NORMAL_RESUME, XF86_APM_NORMAL_RESUME},
    103     {APM_CRIT_RESUME, XF86_APM_CRITICAL_RESUME},
    104     {APM_BATTERY_LOW, XF86_APM_LOW_BATTERY},
    105     {APM_POWER_CHANGE, XF86_APM_POWER_STATUS_CHANGE},
    106     {APM_UPDATE_TIME, XF86_APM_UPDATE_TIME},
    107     {APM_CRIT_SUSPEND_REQ, XF86_APM_CRITICAL_SUSPEND},
    108     {APM_USER_STANDBY_REQ, XF86_APM_USER_STANDBY},
    109     {APM_USER_SUSPEND_REQ, XF86_APM_USER_SUSPEND},
    110     {APM_SYS_STANDBY_RESUME, XF86_APM_STANDBY_RESUME},
    111 #ifdef APM_CAPABILITY_CHANGE
    112     {APM_CAPABILITY_CHANGE, XF86_APM_CAPABILITY_CHANGED},
    113 #endif
    114 };
    115 
    116 static pmEvent
    117 sunToXF86(int type)
    118 {
    119     int i;
    120 
    121     for (i = 0; i < ARRAY_SIZE(sunToXF86Array); i++) {
    122         if (type == sunToXF86Array[i].apmBsd) {
    123             return sunToXF86Array[i].xf86;
    124         }
    125     }
    126     return XF86_APM_UNKNOWN;
    127 }
    128 
    129 /*
    130  * APM events can be requested directly from /dev/apm
    131  */
    132 static int
    133 sunPMGetEventFromOS(int fd, pmEvent * events, int num)
    134 {
    135     struct apm_event_info sunEvent;
    136     int i;
    137 
    138     for (i = 0; i < num; i++) {
    139 
    140         if (ioctl(fd, APM_IOC_NEXTEVENT, &sunEvent) < 0) {
    141             if (errno != EAGAIN) {
    142                 xf86Msg(X_WARNING, "sunPMGetEventFromOS: APM_IOC_NEXTEVENT"
    143                         " %s\n", strerror(errno));
    144             }
    145             break;
    146         }
    147         events[i] = sunToXF86(sunEvent.type);
    148     }
    149     xf86Msg(X_WARNING, "Got some events\n");
    150     return i;
    151 }
    152 
    153 static pmWait
    154 sunPMConfirmEventToOs(int fd, pmEvent event)
    155 {
    156     switch (event) {
    157 /* XXX: NOT CURRENTLY RETURNED FROM OS */
    158     case XF86_APM_SYS_STANDBY:
    159     case XF86_APM_USER_STANDBY:
    160         if (ioctl(fd, APM_IOC_STANDBY, NULL) == 0)
    161             return PM_WAIT;     /* should we stop the Xserver in standby, too? */
    162         else
    163             return PM_NONE;
    164     case XF86_APM_SYS_SUSPEND:
    165     case XF86_APM_CRITICAL_SUSPEND:
    166     case XF86_APM_USER_SUSPEND:
    167         xf86Msg(X_WARNING, "Got SUSPENDED\n");
    168         if (ioctl(fd, APM_IOC_SUSPEND, NULL) == 0)
    169             return PM_CONTINUE;
    170         else {
    171             xf86Msg(X_WARNING, "sunPMConfirmEventToOs: APM_IOC_SUSPEND"
    172                     " %s\n", strerror(errno));
    173             return PM_FAILED;
    174         }
    175     case XF86_APM_STANDBY_RESUME:
    176     case XF86_APM_NORMAL_RESUME:
    177     case XF86_APM_CRITICAL_RESUME:
    178     case XF86_APM_STANDBY_FAILED:
    179     case XF86_APM_SUSPEND_FAILED:
    180         xf86Msg(X_WARNING, "Got RESUME\n");
    181         if (ioctl(fd, APM_IOC_RESUME, NULL) == 0)
    182             return PM_CONTINUE;
    183         else {
    184             xf86Msg(X_WARNING, "sunPMConfirmEventToOs: APM_IOC_RESUME"
    185                     " %s\n", strerror(errno));
    186             return PM_FAILED;
    187         }
    188     default:
    189         return PM_NONE;
    190     }
    191 }
    192 
    193 PMClose
    194 xf86OSPMOpen(void)
    195 {
    196     int fd;
    197 
    198     if (APMihPtr || !xf86Info.pmFlag) {
    199         return NULL;
    200     }
    201 
    202     if ((fd = open(APM_DEVICE, O_RDWR)) == -1) {
    203         if ((fd = open(APM_DEVICE1, O_RDWR)) == -1) {
    204             return NULL;
    205         }
    206     }
    207     xf86PMGetEventFromOs = sunPMGetEventFromOS;
    208     xf86PMConfirmEventToOs = sunPMConfirmEventToOs;
    209     APMihPtr = xf86AddGeneralHandler(fd, xf86HandlePMEvents, NULL);
    210     return sunCloseAPM;
    211 }
    212 
    213 static void
    214 sunCloseAPM(void)
    215 {
    216     int fd;
    217 
    218     if (APMihPtr) {
    219         fd = xf86RemoveGeneralHandler(APMihPtr);
    220         close(fd);
    221         APMihPtr = NULL;
    222     }
    223 }