]> Pileus Git - ~andy/gtk/blob - gtk/gtkprint-win32.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / gtk / gtkprint-win32.c
1 /* GTK - The GIMP Toolkit
2  * gtkprintoperation.c: Print Operation
3  * Copyright (C) 2006, Red Hat, Inc.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #ifndef _MSC_VER
20 #define _WIN32_WINNT 0x0500
21 #define WINVER _WIN32_WINNT
22 #endif
23
24 #include "config.h"
25 #include "gtkprint-win32.h"
26
27 void
28 gtk_print_win32_devnames_free (GtkPrintWin32Devnames *devnames)
29 {
30   g_free (devnames->driver);
31   g_free (devnames->device);
32   g_free (devnames->output);
33   g_free (devnames);
34 }
35
36 GtkPrintWin32Devnames *
37 gtk_print_win32_devnames_from_win32 (HGLOBAL global)
38 {
39   LPDEVNAMES win = GlobalLock (global);
40   gunichar2 *data = (gunichar2 *)win;
41   GtkPrintWin32Devnames *devnames = g_new (GtkPrintWin32Devnames, 1);
42   
43   devnames->driver = g_utf16_to_utf8 (data + win->wDriverOffset, 
44                                       -1, NULL, NULL, NULL);
45   devnames->device = g_utf16_to_utf8 (data + win->wDeviceOffset, 
46                                       -1, NULL, NULL, NULL);
47   devnames->output = g_utf16_to_utf8 (data + win->wOutputOffset, 
48                                       -1, NULL, NULL, NULL);
49   devnames->flags = win->wDefault;
50   
51   GlobalUnlock (global);
52
53   return devnames;
54 }
55
56 HGLOBAL 
57 gtk_print_win32_devnames_to_win32 (const GtkPrintWin32Devnames *devnames)
58 {
59   HGLOBAL global;
60   LPDEVNAMES windevnames;
61   gunichar2 *data;
62   gunichar2 *driver, *device, *output;
63   glong driver_len, device_len, output_len;
64   int i;
65
66   driver = g_utf8_to_utf16 (devnames->driver, -1, NULL, &driver_len, NULL);
67   device = g_utf8_to_utf16 (devnames->device, -1, NULL, &device_len, NULL);
68   output = g_utf8_to_utf16 (devnames->output, -1, NULL, &output_len, NULL);
69
70   global = GlobalAlloc (GMEM_MOVEABLE, 
71                         sizeof (DEVNAMES) + 
72                         (driver_len + 1) * 2 + 
73                         (device_len + 1) * 2 +
74                         (output_len + 1) * 2);
75
76   windevnames = GlobalLock (global);
77   data = (gunichar2 *)windevnames;
78   i = sizeof(DEVNAMES) / sizeof (gunichar2);
79
80   windevnames->wDriverOffset = i;
81   memcpy (data + i, driver, (driver_len + 1) * sizeof (gunichar2));
82   i += driver_len + 1;
83   windevnames->wDeviceOffset = i;
84   memcpy (data + i, device, (device_len + 1) * sizeof (gunichar2));
85   i += device_len + 1;
86   windevnames->wOutputOffset = i;
87   memcpy (data + i, output, (output_len + 1) * sizeof (gunichar2));
88   i += output_len + 1;
89   windevnames->wDefault = devnames->flags;
90   GlobalUnlock (global);
91
92   g_free (driver);
93   g_free (device);
94   g_free (output);
95
96   return global;
97 }
98
99 HGLOBAL 
100 gtk_print_win32_devnames_to_win32_from_printer_name (const char *printer_name)
101 {
102   HGLOBAL global;
103   GtkPrintWin32Devnames *devnames;
104
105   devnames = gtk_print_win32_devnames_from_printer_name(printer_name);
106   if (devnames)
107     {
108       global = gtk_print_win32_devnames_to_win32 (devnames);
109       gtk_print_win32_devnames_free (devnames);
110     }
111   else
112     global = NULL;
113
114   return global;
115 }
116
117 /*
118  * Used to get printer device information from a printer name.  This
119  * can fail if the user has no right to read printer properties, so
120  * this function can return NULL.
121  */
122 GtkPrintWin32Devnames *
123 gtk_print_win32_devnames_from_printer_name (const char *printer_name)
124 {
125   HANDLE hprinter;
126   gunichar2* win32_printer_name;
127   GtkPrintWin32Devnames *devnames;
128
129   win32_printer_name = g_utf8_to_utf16 (printer_name, -1, NULL, NULL, NULL);
130   if (OpenPrinterW (win32_printer_name, &hprinter, NULL))
131     {
132       DWORD needed;
133       PRINTER_INFO_2W* printer_info;
134
135       GetPrinterW (hprinter, 2, NULL, 0, &needed);
136       printer_info = (PRINTER_INFO_2W* )g_malloc ((gsize) needed);
137       GetPrinterW (hprinter, 2, (LPBYTE) printer_info, needed, &needed);
138       devnames = g_new (GtkPrintWin32Devnames, 1);
139       devnames->driver = g_utf16_to_utf8 (printer_info->pDriverName, -1, NULL, NULL, NULL);
140       devnames->device = g_strdup (printer_name);
141       devnames->output = g_utf16_to_utf8 (printer_info->pPortName, -1, NULL, NULL, NULL);
142       devnames->flags  = 0;
143       ClosePrinter (hprinter);
144       g_free (printer_info);
145     }
146   else
147     {
148       /* Could not open printer */
149       devnames = NULL;
150     }
151   g_free (win32_printer_name);
152
153   return devnames;
154 }